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.
1 2 3 4 5 |
<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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
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:
1 2 3 4 5 6 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 |