Wer mit Java ical Termine erzeugen will, kann das gut mit der ical4j Lib machen. Es muss dazu in der pom.xml dieser Eintrag hinzugefügt werden.
<dependency> <groupId>org.mnode.ical4j</groupId> <artifactId>ical4j</artifactId> <version>3.0.4</version> </dependency>

Dann wollen wir zuerst mal ein paar Zeilen für den JUnit Test dafür schreiben:
@Test
void testWriteKalenderInDatei() throws Exception {
Calendar icsCalendar = getTestkalenderMitEinTermin();
String icsDateinamen = "JUnit-Testdatei.ics";
Kalender.writeKalenderInDatei(icsCalendar, icsDateinamen);
}
private Calendar getTestkalenderMitEinTermin() {
Calendar icsCalendar = Kalender.createKalender();
TimeZone timezone = Kalender.createTimezoneEuropa();
LocalDateTime eventStartZeitpunkt = LocalDateTime.now();
String eventKommentar = "JUnit Test Kommentar";
String eventTitel = "JUnit Event Titel";
Kalender k = new Kalender();
k.addTermin(icsCalendar, timezone, eventStartZeitpunkt, eventTitel, eventKommentar);
return icsCalendar;
}
Wir brauchen noch die Kalender Klasse, die hier kopiert werden kann:
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.GregorianCalendar;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import net.fortuna.ical4j.data.CalendarOutputter;
import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.DateTime;
import net.fortuna.ical4j.model.TimeZone;
import net.fortuna.ical4j.model.TimeZoneRegistry;
import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.component.VTimeZone;
import net.fortuna.ical4j.model.property.CalScale;
import net.fortuna.ical4j.model.property.Description;
import net.fortuna.ical4j.model.property.ProdId;
import net.fortuna.ical4j.model.property.Uid;
import net.fortuna.ical4j.model.property.Version;
import net.fortuna.ical4j.util.RandomUidGenerator;
import net.fortuna.ical4j.util.UidGenerator;
/**
* Ein ics Kalender.
*
* @author Thomas Wenzlaff
*
*/
public class Kalender {
private static final Logger LOG = LogManager.getLogger(Kalender.class);
private static final String PRODUKT_ID = "-//Thomas Wenzlaff//www.wenzlaff.de 1.0//DE";
private static final int TERMIN_DAUER_IN_MINUTEN = 15;
private UidGenerator uidGenerator;
/**
* Konstruktor.
*/
public Kalender() {
LOG.debug("Konstruktor");
uidGenerator = new RandomUidGenerator(); // wir nutzen den Zufallsgenerator, möglich währe auch der FixedUidGenerator
}
/**
* Fügt einen Termin von 15 Minuten Dauer hinzu.
*
* @param icsCalendar der Kalender
* @param timezone die Zeitzone
* @param eventStartZeitpunkt der Zeitpunkt wo der Termin startet
* @param eventTitel der Titel des Termins
* @param eventKommentar der Kommentar des Termin
*/
public void addTermin(Calendar icsCalendar, TimeZone timezone, LocalDateTime eventStartZeitpunkt, String eventTitel, String eventKommentar) {
java.util.Calendar startDate = getZeitpunkt(eventStartZeitpunkt, timezone);
java.util.Calendar endDate = getZeitpunkt(eventStartZeitpunkt.plusMinutes(TERMIN_DAUER_IN_MINUTEN), timezone);
VEvent bibelleseTermin = erzeugeEvent(startDate, endDate, eventTitel, eventKommentar);
VTimeZone tz = timezone.getVTimeZone();
bibelleseTermin.getProperties().add(tz.getTimeZoneId());
setUid(bibelleseTermin);
icsCalendar.getComponents().add(bibelleseTermin);
}
/**
* Erzeugt einen Gregorianischen Kalender.
*
* @return Kalender
*/
public static Calendar createKalender() {
Calendar icsCalendar = new Calendar();
icsCalendar.getProperties().add(new ProdId(PRODUKT_ID));
icsCalendar.getProperties().add(Version.VERSION_2_0);
icsCalendar.getProperties().add(CalScale.GREGORIAN);
LOG.info("Kalender erzeugt mit ProduktId: " + icsCalendar.getProductId());
return icsCalendar;
}
/**
* Erzeugt eine Zeitzone für Europa.
*
* Wir brauchen das Propertie:
* net.fortuna.ical4j.timezone.cache.impl=net.fortuna.ical4j.util.MapTimeZoneCache
* in der ical4j.properties
*
* @return Zeitzone für Europa.
*/
public static TimeZone createTimezoneEuropa() {
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
TimeZone timezone = registry.getTimeZone("Europe/Berlin");
LOG.info("Timezone erzeugt: " + timezone.getDisplayName());
return timezone;
}
public static void writeKalenderInDatei(Calendar icsCalendar, String icsDateinamen) throws IOException {
LOG.debug("Schreibe icsCalendar in Datei: " + icsDateinamen);
FileOutputStream fout = new FileOutputStream(icsDateinamen);
CalendarOutputter outputter = new CalendarOutputter();
outputter.output(icsCalendar, fout);
}
private static VEvent erzeugeEvent(java.util.Calendar startDate, java.util.Calendar endDate, String eventTitel, String eventKommentar) {
DateTime start = new DateTime(startDate.getTime());
DateTime end = new DateTime(endDate.getTime());
VEvent bibelleseTermin = new VEvent(start, end, eventTitel);
bibelleseTermin.getProperties().add(new Description(eventKommentar));
LOG.debug("Erzeugter Start-Event: " + start + ", Event Titel: " + eventTitel + ", Kommentar: " + eventKommentar);
return bibelleseTermin;
}
private static java.util.Calendar getZeitpunkt(LocalDateTime eventZeitpunkt, TimeZone timezone) {
java.util.Calendar startDate = new GregorianCalendar();
startDate.setTimeZone(timezone);
startDate.set(java.util.Calendar.MONTH, eventZeitpunkt.getMonthValue() - 1);
startDate.set(java.util.Calendar.DAY_OF_MONTH, eventZeitpunkt.getDayOfMonth());
startDate.set(java.util.Calendar.YEAR, eventZeitpunkt.getYear());
startDate.set(java.util.Calendar.HOUR_OF_DAY, eventZeitpunkt.getHour());
startDate.set(java.util.Calendar.MINUTE, eventZeitpunkt.getMinute());
startDate.set(java.util.Calendar.SECOND, eventZeitpunkt.getSecond());
return startDate;
}
private void setUid(VEvent termin) {
Uid uid = uidGenerator.generateUid();
termin.getProperties().add(uid);
}
}
Damit der Test auch durchläuft, brauche wir auch noch eine ical4j.properties Datei mit folgenden Inhalt im /src/man/resources Verzeichnis, sonst klappt es nicht mit der Zeitzone:
ical4j.unfolding.relaxed=true ical4j.compatibility.outlook=true ical4j.compatibility.notes=true ical4j.parsing.relaxed=true ical4j.validation.relaxed=true net.fortuna.ical4j.timezone.cache.impl=net.fortuna.ical4j.util.MapTimeZoneCache
Wenn der Test erfolgreich durchgelaufen ist:

finden wir die isc-Datei mit dem Termin, der in jeden Kalender importiert werden kann:
BEGIN:VCALENDAR PRODID:-//Thomas Wenzlaff//www.wenzlaff.de 1.0//DE VERSION:2.0 CALSCALE:GREGORIAN BEGIN:VEVENT DTSTAMP:20190901T172105Z DTSTART:20190901T192104 DTEND:20190901T193604 SUMMARY:JUnit Event Titel DESCRIPTION:JUnit Test Kommentar TZID:Europe/Berlin UID:4cbf53d2-83e3-488d-b1c5-6e62e2335b56 END:VEVENT END:VCALENDAR
