com.silverpeas.export.ical.ical4j.ICal4JICalCodec.java Source code

Java tutorial

Introduction

Here is the source code for com.silverpeas.export.ical.ical4j.ICal4JICalCodec.java

Source

/**
 * Copyright (C) 2000 - 2013 Silverpeas
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the
 * GNU Affero General Public License as published by the Free Software Foundation, either version 3
 * of the License, or (at your option) any later version.
 *
 * As a special exception to the terms and conditions of version 3.0 of the GPL, you may
 * redistribute this Program in connection with Free/Libre Open Source Software ("FLOSS")
 * applications as described in Silverpeas's FLOSS exception. You should have received a copy of the
 * text describing the FLOSS exception, and it is also available here:
 * "http://www.silverpeas.org/docs/core/legal/floss_exception.html"
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with this program.
 * If not, see <http://www.gnu.org/licenses/>.
 */
package com.silverpeas.export.ical.ical4j;

import java.io.ByteArrayOutputStream;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Named;

import com.silverpeas.calendar.CalendarEvent;
import com.silverpeas.calendar.CalendarEventRecurrence;
import com.silverpeas.calendar.Datable;
import com.silverpeas.export.EncodingException;
import com.silverpeas.export.ical.ICalCodec;

import net.fortuna.ical4j.data.CalendarOutputter;
import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.Date;
import net.fortuna.ical4j.model.DateList;
import net.fortuna.ical4j.model.Recur;
import net.fortuna.ical4j.model.TextList;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.property.Attendee;
import net.fortuna.ical4j.model.property.CalScale;
import net.fortuna.ical4j.model.property.Categories;
import net.fortuna.ical4j.model.property.Clazz;
import net.fortuna.ical4j.model.property.Description;
import net.fortuna.ical4j.model.property.ExDate;
import net.fortuna.ical4j.model.property.Location;
import net.fortuna.ical4j.model.property.Priority;
import net.fortuna.ical4j.model.property.ProdId;
import net.fortuna.ical4j.model.property.RRule;
import net.fortuna.ical4j.model.property.Uid;
import net.fortuna.ical4j.model.property.Url;
import net.fortuna.ical4j.model.property.Version;
import net.fortuna.ical4j.util.UidGenerator;
import org.apache.commons.lang3.CharEncoding;
import org.apache.tika.io.IOUtils;

import static com.silverpeas.export.ical.ical4j.ICal4JDateCodec.anICal4JDateCodec;
import static com.silverpeas.export.ical.ical4j.ICal4JRecurrenceCodec.anICal4JRecurrenceCodec;

/**
 * An iCal encoder/decoder by using the iCal4J library.
 */
@Named("iCalCodec")
public class ICal4JICalCodec implements ICalCodec {

    private UidGenerator generator = new UidGenerator(new OffLineInetAddressHostInfo(), Uid.UID);

    @Override
    @SuppressWarnings("unchecked")
    public String encode(List<CalendarEvent> events) {

        if (events == null || events.isEmpty()) {
            throw new IllegalArgumentException("The calendar events must be defined to encode them");
        }
        Calendar calendarIcs = new Calendar();
        calendarIcs.getProperties().add(new ProdId("-//Silverpeas//iCal4j 1.1//FR"));
        calendarIcs.getProperties().add(Version.VERSION_2_0);
        calendarIcs.getProperties().add(CalScale.GREGORIAN);
        List<VEvent> iCalEvents = new ArrayList<VEvent>();
        ByteArrayOutputStream output = new ByteArrayOutputStream(10240);
        for (CalendarEvent event : events) {
            Date startDate = anICal4JDateCodec().encode(event.getStartDate());
            Date endDate = anICal4JDateCodec().encode(event.getEndDate());
            VEvent iCalEvent;
            if (event.isOnAllDay() && startDate.equals(endDate)) {
                iCalEvent = new VEvent(startDate, event.getTitle());
            } else {
                iCalEvent = new VEvent(startDate, endDate, event.getTitle());
            }

            // Generate UID
            iCalEvent.getProperties().add(generator.generateUid());

            // Add recurring data if any
            if (event.isRecurring()) {
                CalendarEventRecurrence eventRecurrence = event.getRecurrence();
                Recur recur = anICal4JRecurrenceCodec().encode(eventRecurrence);
                iCalEvent.getProperties().add(new RRule(recur));
                iCalEvent.getProperties().add(exceptionDatesFrom(eventRecurrence));
            }
            // Add Description
            iCalEvent.getProperties().add(new Description(event.getDescription()));
            // Add Classification
            iCalEvent.getProperties().add(new Clazz(event.getAccessLevel()));
            // Add Priority
            iCalEvent.getProperties().add(new Priority(event.getPriority()));

            // Add location if any
            if (!event.getLocation().isEmpty()) {
                iCalEvent.getProperties().add(new Location(event.getLocation()));
            }

            // Add event URL if any
            if (event.getUrl() != null) {
                try {
                    iCalEvent.getProperties().add(new Url(event.getUrl().toURI()));
                } catch (URISyntaxException ex) {
                    throw new EncodingException(ex.getMessage(), ex);
                }
            }

            // Add Categories
            TextList categoryList = new TextList(event.getCategories().asArray());
            if (!categoryList.isEmpty()) {
                iCalEvent.getProperties().add(new Categories(categoryList));
            }
            // Add attendees
            for (String attendee : event.getAttendees().asList()) {
                try {
                    iCalEvent.getProperties().add(new Attendee(attendee));
                } catch (URISyntaxException ex) {
                    throw new EncodingException("Malformed attendee URI: " + attendee, ex);
                }
            }

            iCalEvents.add(iCalEvent);
        }
        calendarIcs.getComponents().addAll(iCalEvents);
        CalendarOutputter outputter = new CalendarOutputter();
        try {
            outputter.output(calendarIcs, output);
            return output.toString(CharEncoding.UTF_8);
        } catch (Exception ex) {
            throw new EncodingException("The encoding of the events in iCal formatted text has failed!", ex);
        } finally {
            IOUtils.closeQuietly(output);
        }
    }

    private ExDate exceptionDatesFrom(final CalendarEventRecurrence recurrence) {
        List<Datable<?>> exceptionDates = recurrence.getExceptionDates();
        DateList exDatesList = new DateList();
        ICal4JDateCodec dateCodec = ICal4JDateCodec.anICal4JDateCodec();
        for (Datable<?> anExceptionDate : exceptionDates) {
            exDatesList.add(dateCodec.encode(anExceptionDate));
        }
        return new ExDate(exDatesList);
    }
}