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                    Date endDate = event.getEndDate();
226    
227                    int endDateMonth = 0;
228                    int endDateDay = 0;
229                    int endDateYear = 0;
230    
231                    if (endDate != null) {
232                            Calendar endCal = CalendarFactoryUtil.getCalendar();
233    
234                            endCal.setTime(endDate);
235    
236                            endDateMonth = endCal.get(Calendar.MONTH);
237                            endDateDay = endCal.get(Calendar.DATE);
238                            endDateYear = endCal.get(Calendar.YEAR);
239                    }
240    
241                    ServiceContext serviceContext = portletDataContext.createServiceContext(
242                            eventElement, event, _NAMESPACE);
243    
244                    CalEvent importedEvent = null;
245    
246                    if (portletDataContext.isDataStrategyMirror()) {
247                            CalEvent existingEvent = CalEventUtil.fetchByUUID_G(
248                                    event.getUuid(), portletDataContext.getScopeGroupId());
249    
250                            if (existingEvent == null) {
251                                    serviceContext.setUuid(event.getUuid());
252    
253                                    importedEvent = CalEventLocalServiceUtil.addEvent(
254                                            userId, event.getTitle(), event.getDescription(),
255                                            event.getLocation(), startDateMonth, startDateDay,
256                                            startDateYear, startDateHour, startDateMinute, endDateMonth,
257                                            endDateDay, endDateYear, event.getDurationHour(),
258                                            event.getDurationMinute(), event.getAllDay(),
259                                            event.getTimeZoneSensitive(), event.getType(),
260                                            event.getRepeating(), event.getRecurrenceObj(),
261                                            event.getRemindBy(), event.getFirstReminder(),
262                                            event.getSecondReminder(), serviceContext);
263                            }
264                            else {
265                                    importedEvent = CalEventLocalServiceUtil.updateEvent(
266                                            userId, existingEvent.getEventId(), event.getTitle(),
267                                            event.getDescription(), event.getLocation(), startDateMonth,
268                                            startDateDay, startDateYear, startDateHour, startDateMinute,
269                                            endDateMonth, endDateDay, endDateYear,
270                                            event.getDurationHour(), event.getDurationMinute(),
271                                            event.getAllDay(), event.getTimeZoneSensitive(),
272                                            event.getType(), event.getRepeating(),
273                                            event.getRecurrenceObj(), event.getRemindBy(),
274                                            event.getFirstReminder(), event.getSecondReminder(),
275                                            serviceContext);
276                            }
277                    }
278                    else {
279                            importedEvent = CalEventLocalServiceUtil.addEvent(
280                                    userId, event.getTitle(), event.getDescription(),
281                                    event.getLocation(), startDateMonth, startDateDay,
282                                    startDateYear, startDateHour, startDateMinute, endDateMonth,
283                                    endDateDay, endDateYear, event.getDurationHour(),
284                                    event.getDurationMinute(), event.getAllDay(),
285                                    event.getTimeZoneSensitive(), event.getType(),
286                                    event.getRepeating(), event.getRecurrenceObj(),
287                                    event.getRemindBy(), event.getFirstReminder(),
288                                    event.getSecondReminder(), serviceContext);
289                    }
290    
291                    portletDataContext.importClassedModel(event, importedEvent, _NAMESPACE);
292            }
293    
294            private static final boolean _ALWAYS_EXPORTABLE = true;
295    
296            private static final String _NAMESPACE = "calendar";
297    
298            private static final boolean _PUBLISH_TO_LIVE_BY_DEFAULT = true;
299    
300            private static PortletDataHandlerBoolean _events =
301                    new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
302    
303            private static PortletDataHandlerControl[] _metadataControls =
304                    new PortletDataHandlerControl[] {
305                            new PortletDataHandlerBoolean(_NAMESPACE, "categories"),
306                            new PortletDataHandlerBoolean(_NAMESPACE, "comments"),
307                            new PortletDataHandlerBoolean(_NAMESPACE, "ratings"),
308                            new PortletDataHandlerBoolean(_NAMESPACE, "tags")
309                    };
310    
311    }