it.smc.calendar.sync.caldav.CalendarPropsProcessor.java Source code

Java tutorial

Introduction

Here is the source code for it.smc.calendar.sync.caldav.CalendarPropsProcessor.java

Source

/**
 * Copyright (c) 2013 SMC Treviso Srl. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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 Lesser General Public License for more
 * details.
 */

package it.smc.calendar.sync.caldav;

import com.liferay.calendar.model.Calendar;
import com.liferay.calendar.model.CalendarResource;
import com.liferay.calendar.service.permission.CalendarPermission;
import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.ReleaseInfo;
import com.liferay.portal.kernel.webdav.Resource;
import com.liferay.portal.kernel.webdav.WebDAVRequest;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.security.permission.ActionKeys;
import com.liferay.util.xml.DocUtil;

import it.smc.calendar.sync.caldav.util.CalDAVProps;
import it.smc.calendar.sync.caldav.util.CalDAVUtil;
import it.smc.calendar.sync.caldav.util.WebKeys;

import net.fortuna.ical4j.data.CalendarOutputter;
import net.fortuna.ical4j.model.ComponentList;
import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.model.TimeZone;
import net.fortuna.ical4j.model.TimeZoneRegistry;
import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
import net.fortuna.ical4j.model.component.VTimeZone;
import net.fortuna.ical4j.model.property.ProdId;
import net.fortuna.ical4j.model.property.Version;

/**
 * @author Fabio Pezzutto
 */
public class CalendarPropsProcessor extends BasePropsProcessor {

    public CalendarPropsProcessor(WebDAVRequest webDAVRequest, Resource resource, Element rootElement) {

        super(webDAVRequest, resource, rootElement);

        _calendar = (Calendar) resource.getModel();
    }

    @Override
    protected void processCalDAVCalendarColor() {
        DocUtil.add(successPropElement, CalDAVProps.CALDAV_CALENDAR_COLOR, CalDAVUtil.getCalendarColor(_calendar));
    }

    @Override
    protected void processCalDAVCalendarDescription() {
        DocUtil.add(successPropElement, CalDAVProps.CALDAV_CALENDAR_DESCRIPTION, _calendar.getDescription(locale));
    }

    @Override
    protected void processCalDAVCalendarHomeSet() {
        CalendarResource calendarResource;

        try {
            calendarResource = _calendar.getCalendarResource();
        } catch (Exception e) {
            _log.error(e);
            return;
        }

        Element calendarHomeSetElement = DocUtil.add(successPropElement, CalDAVProps.CALDAV_CALENDAR_HOME_SET);

        DocUtil.add(calendarHomeSetElement, CalDAVProps.createQName("href"),
                CalDAVUtil.getCalendarResourceURL(calendarResource));
    }

    @Override
    protected void processCalDAVCalendarTimeZone() {
        TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();

        TimeZone timeZone = registry.getTimeZone("GMT");

        VTimeZone vTimeZone = timeZone.getVTimeZone();

        net.fortuna.ical4j.model.Calendar iCalCalendar = new net.fortuna.ical4j.model.Calendar();

        PropertyList propertiesList = iCalCalendar.getProperties();

        ProdId prodId = new ProdId("-//Liferay Inc//Liferay Portal " + ReleaseInfo.getVersion() + "//EN");

        propertiesList.add(prodId);
        propertiesList.add(Version.VERSION_2_0);

        iCalCalendar.getComponents().add(vTimeZone);

        Element calendarTimeZoneElement = DocUtil.add(successPropElement, CalDAVProps.CALDAV_CALENDAR_TIMEZONE);

        try {
            calendarTimeZoneElement.addCDATA(vTimeZoneToString(iCalCalendar));
        } catch (Exception e) {
            _log.error(e, e);
        }
    }

    @Override
    protected void processCalDAVGetCTag() {
        DocUtil.add(successPropElement, CalDAVProps.CALDAV_GETCTAG, CalDAVUtil.getResourceETag(resource));
    }

    @Override
    protected void processCalDAVSupportedCalendarComponentSet() {
        Element supportedCalendarComponentSet = DocUtil.add(successPropElement,
                CalDAVProps.CALDAV_SUPPORTED_CALENDAR_COMPONENT_SET);

        if (!resource.isCollection()) {
            DocUtil.add(supportedCalendarComponentSet, CalDAVProps.DAV_COMP, WebKeys.VCALENDAR);
            DocUtil.add(supportedCalendarComponentSet, CalDAVProps.DAV_COMP, WebKeys.VEVENT);
        }
    }

    @Override
    protected void processCalDAVSupportedCalendarData() {
        Element supportedCalendarDataElement = DocUtil.add(successPropElement,
                CalDAVProps.CALDAV_SUPPORTED_CALENDAR_DATA);

        Element calendarDataElement = DocUtil.add(supportedCalendarDataElement,
                CalDAVProps.createCalendarQName("calendar-data"));

        calendarDataElement.addAttribute("content-type", resource.getContentType());

        calendarDataElement.addAttribute("version", "2.0");
    }

    @Override
    protected void processDAVCurrentUserPrivilegeSet() {
        Element currentUserPrivilegeSetElement = DocUtil.add(successPropElement,
                CalDAVProps.DAV_CURRENT_USER_PRIVILEGE_SET);

        Element readPrivilegeElement = DocUtil.add(currentUserPrivilegeSetElement,
                CalDAVProps.createQName("privilege"));

        DocUtil.add(readPrivilegeElement, CalDAVProps.createQName("read"));

        if (CalendarPermission.contains(webDAVRequest.getPermissionChecker(), _calendar, ActionKeys.UPDATE)) {

            DocUtil.add(readPrivilegeElement, CalDAVProps.createQName("write"));

            DocUtil.add(readPrivilegeElement, CalDAVProps.createQName("write-content"));
        }
    }

    @Override
    protected void processDAVGetContentLength() {
        DocUtil.add(successPropElement, CalDAVProps.DAV_GETCONTENTLENGTH, resource.getSize());
    }

    @Override
    protected void processDAVResourceType() {
        Element resourceTypeElement = DocUtil.add(successPropElement, CalDAVProps.DAV_RESOURCETYPE);

        if (!CalDAVUtil.isThunderbird(webDAVRequest)) {
            DocUtil.add(resourceTypeElement, CalDAVProps.createQName("collection"));
        }

        DocUtil.add(resourceTypeElement, CalDAVProps.createCalendarQName("calendar"));
    }

    protected String vTimeZoneToString(net.fortuna.ical4j.model.Calendar iCalCalendar) throws Exception {

        CalendarOutputter calendarOutputter = new CalendarOutputter();

        ComponentList componentList = iCalCalendar.getComponents();

        if (componentList.isEmpty()) {
            calendarOutputter.setValidating(false);
        }

        UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();

        calendarOutputter.output(iCalCalendar, unsyncStringWriter);

        unsyncStringWriter.flush();

        return unsyncStringWriter.toString();
    }

    private static Log _log = LogFactoryUtil.getLog(CalendarPropsProcessor.class);

    private Calendar _calendar;

}