001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.calendar.lar;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.lar.BasePortletDataHandler;
020    import com.liferay.portal.kernel.lar.PortletDataContext;
021    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
022    import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
023    import com.liferay.portal.kernel.util.CalendarFactoryUtil;
024    import com.liferay.portal.kernel.util.StringBundler;
025    import com.liferay.portal.kernel.xml.Document;
026    import com.liferay.portal.kernel.xml.Element;
027    import com.liferay.portal.kernel.xml.SAXReaderUtil;
028    import com.liferay.portal.service.ServiceContext;
029    import com.liferay.portal.util.PortletKeys;
030    import com.liferay.portlet.calendar.model.CalEvent;
031    import com.liferay.portlet.calendar.service.CalEventLocalServiceUtil;
032    import com.liferay.portlet.calendar.service.persistence.CalEventUtil;
033    
034    import java.util.Calendar;
035    import java.util.Date;
036    import java.util.List;
037    
038    import javax.portlet.PortletPreferences;
039    
040    /**
041     * @author Bruno Farache
042     * @author Raymond Augé
043     */
044    public class CalendarPortletDataHandlerImpl extends BasePortletDataHandler {
045    
046            @Override
047            public PortletDataHandlerControl[] getExportControls() {
048                    return new PortletDataHandlerControl[] {
049                            _events
050                    };
051            }
052    
053            @Override
054            public PortletDataHandlerControl[] getExportMetadataControls() {
055                    return new PortletDataHandlerControl[] {
056                            new PortletDataHandlerBoolean(
057                                    _NAMESPACE, "events", true, _metadataControls)
058                    };
059            }
060    
061            @Override
062            public PortletDataHandlerControl[] getImportControls() {
063                    return new PortletDataHandlerControl[] {
064                            _events
065                    };
066            }
067    
068            @Override
069            public PortletDataHandlerControl[] getImportMetadataControls() {
070                    return new PortletDataHandlerControl[] {
071                            new PortletDataHandlerBoolean(
072                                    _NAMESPACE, "events", true, _metadataControls)
073                    };
074            }
075    
076            @Override
077            public boolean isAlwaysExportable() {
078                    return _ALWAYS_EXPORTABLE;
079            }
080    
081            @Override
082            public boolean isPublishToLiveByDefault() {
083                    return _PUBLISH_TO_LIVE_BY_DEFAULT;
084            }
085    
086            @Override
087            protected PortletPreferences doDeleteData(
088                            PortletDataContext portletDataContext, String portletId,
089                            PortletPreferences portletPreferences)
090                    throws Exception {
091    
092                    if (!portletDataContext.addPrimaryKey(
093                                    CalendarPortletDataHandlerImpl.class, "deleteData")) {
094    
095                            CalEventLocalServiceUtil.deleteEvents(
096                                    portletDataContext.getScopeGroupId());
097                    }
098    
099                    return null;
100            }
101    
102            @Override
103            protected String doExportData(
104                            PortletDataContext portletDataContext, String portletId,
105                            PortletPreferences portletPreferences)
106                    throws Exception {
107    
108                    portletDataContext.addPermissions(
109                            "com.liferay.portlet.calendar",
110                            portletDataContext.getScopeGroupId());
111    
112                    Document document = SAXReaderUtil.createDocument();
113    
114                    Element rootElement = document.addElement("calendar-data");
115    
116                    rootElement.addAttribute(
117                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
118    
119                    List<CalEvent> events = CalEventUtil.findByGroupId(
120                            portletDataContext.getScopeGroupId());
121    
122                    for (CalEvent event : events) {
123                            exportEvent(portletDataContext, rootElement, event);
124                    }
125    
126                    return document.formattedString();
127            }
128    
129            @Override
130            protected PortletPreferences doImportData(
131                            PortletDataContext portletDataContext, String portletId,
132                            PortletPreferences portletPreferences, String data)
133                    throws Exception {
134    
135                    portletDataContext.importPermissions(
136                            "com.liferay.portlet.calendar",
137                            portletDataContext.getSourceGroupId(),
138                            portletDataContext.getScopeGroupId());
139    
140                    Document document = SAXReaderUtil.read(data);
141    
142                    Element rootElement = document.getRootElement();
143    
144                    for (Element eventElement : rootElement.elements("event")) {
145                            String path = eventElement.attributeValue("path");
146    
147                            if (!portletDataContext.isPathNotProcessed(path)) {
148                                    continue;
149                            }
150    
151                            CalEvent event = (CalEvent)portletDataContext.getZipEntryAsObject(
152                                    path);
153    
154                            importEvent(portletDataContext, eventElement, event);
155                    }
156    
157                    return null;
158            }
159    
160            protected void exportEvent(
161                            PortletDataContext portletDataContext, Element rootElement,
162                            CalEvent event)
163                    throws PortalException, SystemException {
164    
165                    if (!portletDataContext.isWithinDateRange(event.getModifiedDate())) {
166                            return;
167                    }
168    
169                    String path = getEventPath(portletDataContext, event);
170    
171                    if (!portletDataContext.isPathNotProcessed(path)) {
172                            return;
173                    }
174    
175                    Element eventElement = rootElement.addElement("event");
176    
177                    portletDataContext.addClassedModel(
178                            eventElement, path, event, _NAMESPACE);
179            }
180    
181            protected String getEventPath(
182                    PortletDataContext portletDataContext, CalEvent event) {
183    
184                    StringBundler sb = new StringBundler(4);
185    
186                    sb.append(portletDataContext.getPortletPath(PortletKeys.CALENDAR));
187                    sb.append("/events/");
188                    sb.append(event.getEventId());
189                    sb.append(".xml");
190    
191                    return sb.toString();
192            }
193    
194            protected void importEvent(
195                            PortletDataContext portletDataContext, Element eventElement,
196                            CalEvent event)
197                    throws Exception {
198    
199                    long userId = portletDataContext.getUserId(event.getUserUuid());
200    
201                    Date startDate = event.getStartDate();
202    
203                    int startDateMonth = 0;
204                    int startDateDay = 0;
205                    int startDateYear = 0;
206                    int startDateHour = 0;
207                    int startDateMinute = 0;
208    
209                    if (startDate != null) {
210                            Calendar startCal = CalendarFactoryUtil.getCalendar();
211    
212                            startCal.setTime(startDate);
213    
214                            startDateMonth = startCal.get(Calendar.MONTH);
215                            startDateDay = startCal.get(Calendar.DATE);
216                            startDateYear = startCal.get(Calendar.YEAR);
217                            startDateHour = startCal.get(Calendar.HOUR);
218                            startDateMinute = startCal.get(Calendar.MINUTE);
219    
220                            if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
221                                    startDateHour += 12;
222                            }
223                    }
224    
225                    ServiceContext serviceContext = portletDataContext.createServiceContext(
226                            eventElement, event, _NAMESPACE);
227    
228                    CalEvent importedEvent = null;
229    
230                    if (portletDataContext.isDataStrategyMirror()) {
231                            CalEvent existingEvent = CalEventUtil.fetchByUUID_G(
232                                    event.getUuid(), portletDataContext.getScopeGroupId());
233    
234                            if (existingEvent == null) {
235                                    serviceContext.setUuid(event.getUuid());
236    
237                                    importedEvent = CalEventLocalServiceUtil.addEvent(
238                                            userId, event.getTitle(), event.getDescription(),
239                                            event.getLocation(), startDateMonth, startDateDay,
240                                            startDateYear, startDateHour, startDateMinute,
241                                            event.getDurationHour(), event.getDurationMinute(),
242                                            event.isAllDay(), event.isTimeZoneSensitive(),
243                                            event.getType(), event.getRepeating(),
244                                            event.getRecurrenceObj(), event.getRemindBy(),
245                                            event.getFirstReminder(), event.getSecondReminder(),
246                                            serviceContext);
247                            }
248                            else {
249                                    importedEvent = CalEventLocalServiceUtil.updateEvent(
250                                            userId, existingEvent.getEventId(), event.getTitle(),
251                                            event.getDescription(), event.getLocation(), startDateMonth,
252                                            startDateDay, startDateYear, startDateHour, startDateMinute,
253                                            event.getDurationHour(), event.getDurationMinute(),
254                                            event.isAllDay(), event.isTimeZoneSensitive(),
255                                            event.getType(), event.getRepeating(),
256                                            event.getRecurrenceObj(), event.getRemindBy(),
257                                            event.getFirstReminder(), event.getSecondReminder(),
258                                            serviceContext);
259                            }
260                    }
261                    else {
262                            importedEvent = CalEventLocalServiceUtil.addEvent(
263                                    userId, event.getTitle(), event.getDescription(),
264                                    event.getLocation(), startDateMonth, startDateDay,
265                                    startDateYear, startDateHour, startDateMinute,
266                                    event.getDurationHour(), event.getDurationMinute(),
267                                    event.isAllDay(), event.isTimeZoneSensitive(), event.getType(),
268                                    event.getRepeating(), event.getRecurrenceObj(),
269                                    event.getRemindBy(), event.getFirstReminder(),
270                                    event.getSecondReminder(), serviceContext);
271                    }
272    
273                    portletDataContext.importClassedModel(event, importedEvent, _NAMESPACE);
274            }
275    
276            private static final boolean _ALWAYS_EXPORTABLE = true;
277    
278            private static final String _NAMESPACE = "calendar";
279    
280            private static final boolean _PUBLISH_TO_LIVE_BY_DEFAULT = true;
281    
282            private static PortletDataHandlerBoolean _events =
283                    new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
284    
285            private static PortletDataHandlerControl[] _metadataControls =
286                    new PortletDataHandlerControl[] {
287                            new PortletDataHandlerBoolean(_NAMESPACE, "categories"),
288                            new PortletDataHandlerBoolean(_NAMESPACE, "comments"),
289                            new PortletDataHandlerBoolean(_NAMESPACE, "ratings"),
290                            new PortletDataHandlerBoolean(_NAMESPACE, "tags")
291                    };
292    
293    }