You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2020/10/15 14:04:17 UTC

[openmeetings] branch master updated: [OPENMEETINGS-2481] initial refactoring of IcalHandler

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new cde0394  [OPENMEETINGS-2481] initial refactoring of IcalHandler
cde0394 is described below

commit cde03944fbb9ec4e4bd95451673f3c75ac809536
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Oct 15 21:03:54 2020 +0700

    [OPENMEETINGS-2481] initial refactoring of IcalHandler
---
 .../db/dao/calendar/AppointmentDao.java            |   4 +-
 .../service/calendar/caldav/IcalUtils.java         |  12 +-
 .../service/room/InvitationManager.java            |  37 ++---
 .../apache/openmeetings/util/mail/IcalHandler.java | 130 ++++++-----------
 .../apache/openmeetings/util/mail/MailUtil.java    |   2 +
 .../openmeetings/calendar/TestSendIcalMessage.java | 161 ++++-----------------
 6 files changed, 97 insertions(+), 249 deletions(-)

diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
index 474df5d..c97654e 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/calendar/AppointmentDao.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.db.dao.calendar;
 
+import static java.util.UUID.randomUUID;
 import static org.apache.openmeetings.db.util.DaoHelper.UNSUPPORTED;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CALENDAR_ROOM_CAPACITY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_USER_ID;
@@ -100,8 +101,10 @@ public class AppointmentDao implements IDataProviderDao<Appointment>{
 		}
 		a.setRoom(roomDao.update(r, userId));
 		final boolean newApp = a.getId() == null;
+		Appointment a0 = newApp ? null : get(a.getId());
 		if (newApp) {
 			a.setInserted(new Date());
+			a.setIcalId(randomUUID().toString());
 			em.persist(a);
 		} else {
 			a.setUpdated(new Date());
@@ -111,7 +114,6 @@ public class AppointmentDao implements IDataProviderDao<Appointment>{
 			Set<Long> mmIds = newApp ? new HashSet<>()
 					: meetingMemberDao.getMeetingMemberIdsByAppointment(a.getId());
 			// update meeting members
-			Appointment a0 = newApp ? null : get(a.getId());
 			boolean sendMail = a0 == null || !a0.getTitle().equals(a.getTitle()) ||
 					!(a0.getDescription() != null ? a0.getDescription().equals(a.getDescription()) : true) ||
 					!(a0.getLocation() != null ? a0.getLocation().equals(a.getLocation()) : true) ||
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
index 53a8cae..57a3ce2 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
@@ -20,6 +20,8 @@ package org.apache.openmeetings.service.calendar.caldav;
 
 import static java.util.UUID.randomUUID;
 import static org.apache.openmeetings.db.util.TimezoneUtil.getTimeZone;
+import static org.apache.openmeetings.util.mail.MailUtil.MAILTO;
+import static org.apache.openmeetings.util.mail.MailUtil.SCHEME_MAILTO;
 
 import java.net.URI;
 import java.text.ParsePosition;
@@ -228,7 +230,7 @@ public class IcalUtils {
 			URI uri = URI.create(organizer.getValue());
 
 			//If the value of the organizer is an email
-			if ("mailto".equals(uri.getScheme())) {
+			if (SCHEME_MAILTO.equals(uri.getScheme())) {
 				String email = uri.getSchemeSpecificPart();
 
 				organizerEmail = email;
@@ -248,7 +250,7 @@ public class IcalUtils {
 		if (attendees != null && !attendees.isEmpty()) {
 			for (Property attendee : attendees) {
 				URI uri = URI.create(attendee.getValue());
-				if ("mailto".equals(uri.getScheme())) {
+				if (SCHEME_MAILTO.equals(uri.getScheme())) {
 					String email = uri.getSchemeSpecificPart();
 
 					Role role = attendee.getParameter(Role.CHAIR.getName());
@@ -439,14 +441,14 @@ public class IcalUtils {
 
 		if (appointment.getMeetingMembers() != null) {
 			for (MeetingMember meetingMember : appointment.getMeetingMembers()) {
-				Attendee attendee = new Attendee(URI.create("mailto:" +
-						meetingMember.getUser().getAddress().getEmail()));
+				Attendee attendee = new Attendee(URI.create(MAILTO
+						+ meetingMember.getUser().getAddress().getEmail()));
 				attendee.getParameters().add(Role.REQ_PARTICIPANT);
 				attendee.getParameters().add(new Cn(meetingMember.getUser().getLogin()));
 				meeting.getProperties().add(attendee);
 			}
 		}
-		URI orgUri = URI.create("mailto:" + appointment.getOwner().getAddress().getEmail());
+		URI orgUri = URI.create(MAILTO + appointment.getOwner().getAddress().getEmail());
 		Attendee orgAtt = new Attendee(orgUri);
 		orgAtt.getParameters().add(Role.CHAIR);
 		Cn orgCn = new Cn(appointment.getOwner().getLogin());
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/room/InvitationManager.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/room/InvitationManager.java
index 9dde6a5..0192d1b 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/room/InvitationManager.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/room/InvitationManager.java
@@ -23,10 +23,7 @@ import static org.apache.openmeetings.db.entity.calendar.Appointment.allowedStar
 import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
 import static org.apache.openmeetings.db.util.TimezoneUtil.getTimeZone;
 
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
-import java.util.Map;
 import java.util.TimeZone;
 
 import org.apache.openmeetings.IApplication;
@@ -50,7 +47,6 @@ import org.apache.openmeetings.service.mail.template.subject.SubjectEmailTemplat
 import org.apache.openmeetings.service.mail.template.subject.UpdatedAppointmentTemplate;
 import org.apache.openmeetings.util.crypt.CryptProvider;
 import org.apache.openmeetings.util.mail.IcalHandler;
-import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -116,29 +112,18 @@ public class InvitationManager implements IInvitationManager {
 		if (ical) {
 			String username = i.getInvitee().getLogin();
 			boolean isOwner = owner.getId().equals(i.getInvitee().getId());
-			IcalHandler handler = new IcalHandler(MessageType.CANCEL == type ? IcalHandler.ICAL_METHOD_CANCEL : IcalHandler.ICAL_METHOD_REQUEST);
-
-			Map<String, String> attendeeList = handler.getAttendeeData(email, username, isOwner);
-
-			List<Map<String, String>> atts = new ArrayList<>();
-			atts.add(attendeeList);
-
-			// Defining Organizer
-
-			Map<String, String> organizerAttendee = handler.getAttendeeData(replyToEmail, owner.getLogin(), isOwner);
-
 			Appointment a = i.getAppointment();
-			// Create ICal Message
-			String meetingId = handler.addNewMeeting(a.getStart(), a.getEnd(), a.getTitle(), atts, invitationLink,
-					organizerAttendee, a.getIcalId(), getTimeZone(owner).getID());
-
-			// Writing back meetingUid
-			if (Strings.isEmpty(a.getIcalId())) {
-				a.setIcalId(meetingId);
-			}
-
-			log.debug(handler.getICalDataAsString());
-			mailHandler.send(new MailMessage(email, replyToEmail, subject, template, handler.getIcalAsByteArray()));
+			IcalHandler handler = new IcalHandler(MessageType.CANCEL == type ? IcalHandler.ICAL_METHOD_CANCEL : IcalHandler.ICAL_METHOD_REQUEST)
+					.createVEvent(getTimeZone(owner).getID(), a.getStart(), a.getEnd(), a.getTitle())
+					.addOrganizer(replyToEmail, owner.getLogin())
+					.addAttendee(email, username, isOwner)
+					.setLocation(a.getLocation())
+					.setDescription(invitationLink)
+					.setUid(a.getIcalId())
+					.build();
+
+			log.debug(handler.toString());
+			mailHandler.send(new MailMessage(email, replyToEmail, subject, template, handler.toByteArray()));
 		} else {
 			mailHandler.send(email, replyToEmail, subject, template);
 		}
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/IcalHandler.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/IcalHandler.java
index 3ede26f..3d30ab7 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/IcalHandler.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/IcalHandler.java
@@ -18,18 +18,14 @@
  */
 package org.apache.openmeetings.util.mail;
 
-import static java.util.UUID.randomUUID;
+import static org.apache.openmeetings.util.mail.MailUtil.MAILTO;
 
 import java.io.ByteArrayOutputStream;
 import java.io.FileOutputStream;
 import java.net.URI;
 import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 import java.util.NoSuchElementException;
 
-import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -68,6 +64,8 @@ public class IcalHandler {
 
 	/** ICal instance */
 	private final Calendar icsCalendar;
+	private TimeZone timeZone;
+	private VEvent meeting;
 
 	/** Creation of a new Event */
 	public static final Method ICAL_METHOD_REQUEST = Method.REQUEST;
@@ -90,36 +88,12 @@ public class IcalHandler {
 		icsCalendar.getProperties().add(method);
 	}
 
-	/**
-	 *
-	 * @param startDate
-	 *            use standard TimeZone!!
-	 * @param endDate
-	 *            use standard time zone!!
-	 * @param name
-	 *            meeting name
-	 * @param attendees
-	 *            List of attendees (use getAttendeeData to retrieve valid records)
-	 * @param description
-	 *            containing the meeting description
-	 * @param organizer
-	 *            organizer
-	 * @param uid
-	 *            (maybe null)
-	 * @param javaTzId ID of owner's java time zone
-	 * @return UID of Meeting
-	 */
-	// ---------------------------------------------------------------------------------------
-	public String addNewMeeting(Date startDate, Date endDate, String name,
-			List<Map<String, String>> attendees, String description,
-			Map<String, String> organizer, String uid, String javaTzId)
-	{
-
+	public IcalHandler createVEvent(String tz, Date startDate, Date endDate, String name) {
 		TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
 
-		TimeZone timeZone = registry.getTimeZone(javaTzId);
+		timeZone = registry.getTimeZone(tz);
 		if (timeZone == null) {
-			throw new NoSuchElementException("Unable to get time zone by id provided: " + javaTzId);
+			throw new NoSuchElementException("Unable to get time zone by id provided: " + tz);
 		}
 
 		DateTime start = new DateTime(startDate);
@@ -127,63 +101,54 @@ public class IcalHandler {
 		DateTime end = new DateTime(endDate);
 		end.setTimeZone(timeZone);
 
-		VEvent meeting = new VEvent(start, end, name);
+		meeting = new VEvent(start, end, name);
+		meeting.getProperties().add(Transp.OPAQUE);
+		return this;
+	}
 
+	public IcalHandler setDescription(String description) {
 		meeting.getProperties().add(new Description(description));
-		meeting.getProperties().add(new Sequence(0));
-		meeting.getProperties().add(new Location(""));
-		meeting.getProperties().add(Transp.OPAQUE);
+		return this;
+	}
 
-		// generate unique identifier (if not submitted)
-		Uid ui;
-		if (Strings.isEmpty(uid)) {
-			ui = new Uid(randomUUID().toString());
-			log.debug("Generating Meeting UID : {}", ui.getValue());
-		} else {
-			ui = new Uid(uid);
-			log.debug("Using Meeting UID : {}", ui.getValue());
-		}
+	public IcalHandler setLocation(String location) {
+		meeting.getProperties().add(new Location(location));
+		return this;
+	}
 
-		meeting.getProperties().add(ui);
+	public IcalHandler setSequence(int seq) {
+		meeting.getProperties().add(new Sequence(seq));
+		return this;
+	}
 
-		for (Map<String, String> att : attendees) {
-			Attendee uno = new Attendee(URI.create(att.get("uri")));
-			String chair = att.get("chair");
-			uno.getParameters().add("0".equals(chair) ? Role.REQ_PARTICIPANT : Role.CHAIR);
-			uno.getParameters().add(new Cn(att.get("cn")));
-			meeting.getProperties().add(uno);
-		}
+	public IcalHandler setUid(String uid) {
+		meeting.getProperties().add(new Uid(uid));
+		return this;
+	}
 
-		Organizer orger = new Organizer(URI.create(organizer.get("uri")));
-		orger.getParameters().add(new Cn(organizer.get("cn")));
+	private static URI getMailto(String email) {
+		return URI.create(MAILTO + email);
+	}
 
+	public IcalHandler addOrganizer(String email, String name) {
+		Organizer orger = new Organizer(getMailto(email));
+		orger.getParameters().add(new Cn(name));
 		meeting.getProperties().add(orger);
-
-		icsCalendar.getComponents().add(timeZone.getVTimeZone());
-		icsCalendar.getComponents().add(meeting);
-
-		return ui.getValue();
+		return this;
 	}
 
-	/**
-	 * Use this function to build a valid record for the AttendeeList for
-	 * addMeetings Generate a Attendee
-	 *
-	 * @param emailAdress
-	 *            - email of attendee
-	 * @param displayName
-	 *            - name of attendee
-	 * @param chair
-	 *            - is this organizer
-	 * @return attendee data as {@link Map}
-	 */
-	public Map<String, String> getAttendeeData(String emailAdress, String displayName, boolean chair) {
-		Map<String, String> oneRecord = new HashMap<>();
-		oneRecord.put("uri", "mailto:" + emailAdress);
-		oneRecord.put("cn", displayName);
-		oneRecord.put("chair", chair ? "1" : "0");
+	public IcalHandler addAttendee(String email, String display, boolean chair) {
+		Attendee uno = new Attendee(URI.create(MAILTO + email));
+		uno.getParameters().add(chair ? Role.REQ_PARTICIPANT : Role.CHAIR);
+		uno.getParameters().add(new Cn(display));
+		meeting.getProperties().add(uno);
+		return this;
+	}
 
-		return oneRecord;
+	public IcalHandler build() {
+		icsCalendar.getComponents().add(timeZone.getVTimeZone());
+		icsCalendar.getComponents().add(meeting);
+		return this;
 	}
 
 	/**
@@ -194,7 +159,7 @@ public class IcalHandler {
 	 * @throws Exception
 	 *             - in case of error during writing to the file
 	 */
-	public void writeDataToFile(String inFilerPath) throws Exception {
+	public void toFile(String inFilerPath) throws Exception {
 		String filerPath = inFilerPath.endsWith(".ics") ? inFilerPath
 				: String.format("%s.ics", inFilerPath);
 
@@ -211,7 +176,7 @@ public class IcalHandler {
 	 * @throws Exception
 	 *             - in case of error during writing to byte array
 	 */
-	public byte[] getIcalAsByteArray() throws Exception {
+	public byte[] toByteArray() throws Exception {
 		ByteArrayOutputStream bout = new ByteArrayOutputStream();
 		CalendarOutputter outputter = new CalendarOutputter();
 		outputter.output(icsCalendar, bout);
@@ -221,7 +186,8 @@ public class IcalHandler {
 	/**
 	 * Retrieving Data as String
 	 */
-	public String getICalDataAsString() {
-		return icsCalendar.toString();
+	@Override
+	public String toString() {
+		return icsCalendar == null ? null : icsCalendar.toString();
 	}
 }
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/MailUtil.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/MailUtil.java
index c7ab2dd..a051d7f 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/MailUtil.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/mail/MailUtil.java
@@ -23,6 +23,8 @@ import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.validation.Validatable;
 
 public class MailUtil {
+	public static final String SCHEME_MAILTO = "mailto";
+	public static final String MAILTO = SCHEME_MAILTO + ":";
 	private MailUtil() {}
 
 	public static boolean isValid(String email) {
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
index 958db62..1b6926c 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/calendar/TestSendIcalMessage.java
@@ -19,15 +19,12 @@
 package org.apache.openmeetings.calendar;
 
 import static java.util.UUID.randomUUID;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.net.URI;
 import java.util.Calendar;
 import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.List;
-import java.util.Map;
+import java.util.TimeZone;
 
 import javax.activation.DataHandler;
 import javax.mail.BodyPart;
@@ -48,23 +45,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import net.fortuna.ical4j.data.CalendarOutputter;
-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.parameter.Cn;
-import net.fortuna.ical4j.model.parameter.Role;
-import net.fortuna.ical4j.model.property.Attendee;
-import net.fortuna.ical4j.model.property.CalScale;
-import net.fortuna.ical4j.model.property.Method;
-import net.fortuna.ical4j.model.property.Organizer;
-import net.fortuna.ical4j.model.property.ProdId;
-import net.fortuna.ical4j.model.property.Uid;
-import net.fortuna.ical4j.model.property.Version;
-
 class TestSendIcalMessage extends AbstractJUnitDefaults {
 	private static final Logger log = LoggerFactory.getLogger(TestSendIcalMessage.class);
 
@@ -78,120 +58,31 @@ class TestSendIcalMessage extends AbstractJUnitDefaults {
 	String htmlBody = "test";
 
 
-	public void simpleInvitionIcalLink() {
-		// Create a TimeZone
-		TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
-		TimeZone timezone = registry.getTimeZone("America/Mexico_City");
-		VTimeZone tz = timezone.getVTimeZone();
-
-		// Start Date is on: April 1, 2008, 9:00 am
-		java.util.Calendar startDate = new GregorianCalendar();
-		startDate.setTimeZone(timezone);
-		startDate.set(java.util.Calendar.MONTH, java.util.Calendar.APRIL);
-		startDate.set(java.util.Calendar.DAY_OF_MONTH, 1);
-		startDate.set(java.util.Calendar.YEAR, 2008);
-		startDate.set(java.util.Calendar.HOUR_OF_DAY, 9);
-		startDate.set(java.util.Calendar.MINUTE, 0);
-		startDate.set(java.util.Calendar.SECOND, 0);
-
-		// End Date is on: April 1, 2008, 13:00
-		java.util.Calendar endDate = new GregorianCalendar();
-		endDate.setTimeZone(timezone);
-		endDate.set(java.util.Calendar.MONTH, java.util.Calendar.APRIL);
-		endDate.set(java.util.Calendar.DAY_OF_MONTH, 1);
-		endDate.set(java.util.Calendar.YEAR, 2008);
-		endDate.set(java.util.Calendar.HOUR_OF_DAY, 13);
-		endDate.set(java.util.Calendar.MINUTE, 0);
-		endDate.set(java.util.Calendar.SECOND, 0);
-
-		// Create the event
-		String eventName = "Progress Meeting";
-		DateTime start = new DateTime(startDate.getTime());
-		DateTime end = new DateTime(endDate.getTime());
-		VEvent meeting = new VEvent(start, end, eventName);
-
-		// add timezone info..
-		meeting.getProperties().add(tz.getTimeZoneId());
-
-		// generate unique identifier..
-		Uid uid = new Uid(randomUUID().toString());
-		meeting.getProperties().add(uid);
-
-		// add attendees..
-		Attendee dev1 = new Attendee(URI.create("mailto:dev1@mycompany.com"));
-		dev1.getParameters().add(Role.REQ_PARTICIPANT);
-		dev1.getParameters().add(new Cn("Developer 1"));
-		meeting.getProperties().add(dev1);
-
-		Attendee dev2 = new Attendee(URI.create("mailto:dev2@mycompany.com"));
-		dev2.getParameters().add(Role.OPT_PARTICIPANT);
-		dev2.getParameters().add(new Cn("Developer 2"));
-		meeting.getProperties().add(dev2);
-
-		// Create a calendar
-		net.fortuna.ical4j.model.Calendar icsCalendar = new net.fortuna.ical4j.model.Calendar();
-		icsCalendar.getProperties().add(
-				new ProdId("-//Events Calendar//iCal4j 1.0//EN"));
-		icsCalendar.getProperties().add(CalScale.GREGORIAN);
-		icsCalendar.getProperties().add(Version.VERSION_2_0);
-
-		// Add the event and print
-		icsCalendar.getComponents().add(meeting);
-
-		Organizer orger = new Organizer(URI.create("seba.wagner@gmail.com"));
-		orger.getParameters().add(new Cn("Sebastian Wagner"));
-		meeting.getProperties().add(orger);
-
-		icsCalendar.getProperties().add(Method.REQUEST);
-
-		log.debug(icsCalendar.toString());
-
-		ByteArrayOutputStream bout = new ByteArrayOutputStream();
-		CalendarOutputter outputter = new CalendarOutputter();
-		try {
-			outputter.output(icsCalendar, bout);
-			iCalMimeBody = bout.toByteArray();
-
-			sendIcalMessage();
-		} catch (Exception e) {
-			log.error("Error", e);
-		}
-	}
-
 	@Test
-	void sendInvitionIcalLink() {
-		try {
-			String email = "hans@webbase-design.de";
-			String username = "shans";
-			boolean invitor = false;
-
-			Calendar start = Calendar.getInstance();
-			Calendar end = Calendar.getInstance();
-			IcalHandler handler = new IcalHandler(IcalHandler.ICAL_METHOD_REQUEST);
-
-			// Transforming Meeting Members
-
-			Map<String, String> attendeeList = handler.getAttendeeData(email, username, invitor);
-			Map<String, String> organizerAttendee = handler.getAttendeeData(recipients, "seba-test", true);
-
-			List<Map<String, String>> atts = List.of(attendeeList);
-
-			// Create ICal Message
-			String meetingId = handler.addNewMeeting(start.getTime(), end.getTime(), "test event",
-					atts, "localhost:5080/link_openmeetings",
-					organizerAttendee, "", java.util.TimeZone.getDefault().getID());
-
-			log.debug("meetingId " + meetingId);
-
-			iCalMimeBody = handler.getIcalAsByteArray();
-
-			sendIcalMessage();
-
-			// return MailHandler.sendMail(email, subject, template);
-
-		} catch (Exception err) {
-			log.error("sendInvitionIcalLink", err);
-		}
+	void sendInvitionIcalLink() throws Exception {
+		String email = "hans@webbase-design.de";
+		String username = "shans";
+		boolean invitor = false;
+
+		Date start = Calendar.getInstance().getTime();
+		Calendar endCal = Calendar.getInstance();
+		endCal.add(Calendar.HOUR_OF_DAY, 1);
+		Date end = endCal.getTime();
+		IcalHandler handler = new IcalHandler(IcalHandler.ICAL_METHOD_REQUEST)
+				.createVEvent(TimeZone.getDefault().getID(), start, end, "test event")
+				.addOrganizer(recipients, "seba-test")
+				.addAttendee(email, username, invitor)
+				.setDescription("localhost:5080/link_openmeetings")
+				.setLocation("")
+				.setUid(randomUUID().toString())
+				.build();
+
+		log.debug("ICS: {}", handler.toString());
+		assertNotNull(handler.toString(), "Valid ICS should be created");
+
+		iCalMimeBody = handler.toByteArray();
+
+		sendIcalMessage();
 	}
 
 	private void sendIcalMessage() throws Exception {