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 <solomax...@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:d...@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:d...@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.wag...@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 = "h...@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 = "h...@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 {