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, _categories, _comments, _ratings, _tags
050                    };
051            }
052    
053            @Override
054            public PortletDataHandlerControl[] getImportControls() {
055                    return new PortletDataHandlerControl[] {
056                            _events, _categories, _comments, _ratings, _tags
057                    };
058            }
059    
060            @Override
061            public boolean isAlwaysExportable() {
062                    return _ALWAYS_EXPORTABLE;
063            }
064    
065            @Override
066            public boolean isPublishToLiveByDefault() {
067                    return _PUBLISH_TO_LIVE_BY_DEFAULT;
068            }
069    
070            @Override
071            protected PortletPreferences doDeleteData(
072                            PortletDataContext portletDataContext, String portletId,
073                            PortletPreferences portletPreferences)
074                    throws Exception {
075    
076                    if (!portletDataContext.addPrimaryKey(
077                                    CalendarPortletDataHandlerImpl.class, "deleteData")) {
078    
079                            CalEventLocalServiceUtil.deleteEvents(
080                                    portletDataContext.getScopeGroupId());
081                    }
082    
083                    return null;
084            }
085    
086            @Override
087            protected String doExportData(
088                            PortletDataContext portletDataContext, String portletId,
089                            PortletPreferences portletPreferences)
090                    throws Exception {
091    
092                    portletDataContext.addPermissions(
093                            "com.liferay.portlet.calendar",
094                            portletDataContext.getScopeGroupId());
095    
096                    Document document = SAXReaderUtil.createDocument();
097    
098                    Element rootElement = document.addElement("calendar-data");
099    
100                    rootElement.addAttribute(
101                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
102    
103                    List<CalEvent> events = CalEventUtil.findByGroupId(
104                            portletDataContext.getScopeGroupId());
105    
106                    for (CalEvent event : events) {
107                            exportEvent(portletDataContext, rootElement, event);
108                    }
109    
110                    return document.formattedString();
111            }
112    
113            @Override
114            protected PortletPreferences doImportData(
115                            PortletDataContext portletDataContext, String portletId,
116                            PortletPreferences portletPreferences, String data)
117                    throws Exception {
118    
119                    portletDataContext.importPermissions(
120                            "com.liferay.portlet.calendar",
121                            portletDataContext.getSourceGroupId(),
122                            portletDataContext.getScopeGroupId());
123    
124                    Document document = SAXReaderUtil.read(data);
125    
126                    Element rootElement = document.getRootElement();
127    
128                    for (Element eventElement : rootElement.elements("event")) {
129                            String path = eventElement.attributeValue("path");
130    
131                            if (!portletDataContext.isPathNotProcessed(path)) {
132                                    continue;
133                            }
134    
135                            CalEvent event = (CalEvent)portletDataContext.getZipEntryAsObject(
136                                    path);
137    
138                            importEvent(portletDataContext, eventElement, event);
139                    }
140    
141                    return null;
142            }
143    
144            protected void exportEvent(
145                            PortletDataContext portletDataContext, Element rootElement,
146                            CalEvent event)
147                    throws PortalException, SystemException {
148    
149                    if (!portletDataContext.isWithinDateRange(event.getModifiedDate())) {
150                            return;
151                    }
152    
153                    String path = getEventPath(portletDataContext, event);
154    
155                    if (!portletDataContext.isPathNotProcessed(path)) {
156                            return;
157                    }
158    
159                    Element eventElement = rootElement.addElement("event");
160    
161                    portletDataContext.addClassedModel(
162                            eventElement, path, event, _NAMESPACE);
163            }
164    
165            protected String getEventPath(
166                    PortletDataContext portletDataContext, CalEvent event) {
167    
168                    StringBundler sb = new StringBundler(4);
169    
170                    sb.append(portletDataContext.getPortletPath(PortletKeys.CALENDAR));
171                    sb.append("/events/");
172                    sb.append(event.getEventId());
173                    sb.append(".xml");
174    
175                    return sb.toString();
176            }
177    
178            protected void importEvent(
179                            PortletDataContext portletDataContext, Element eventElement,
180                            CalEvent event)
181                    throws Exception {
182    
183                    long userId = portletDataContext.getUserId(event.getUserUuid());
184    
185                    Date startDate = event.getStartDate();
186    
187                    int startDateMonth = 0;
188                    int startDateDay = 0;
189                    int startDateYear = 0;
190                    int startDateHour = 0;
191                    int startDateMinute = 0;
192    
193                    if (startDate != null) {
194                            Calendar startCal = CalendarFactoryUtil.getCalendar();
195    
196                            startCal.setTime(startDate);
197    
198                            startDateMonth = startCal.get(Calendar.MONTH);
199                            startDateDay = startCal.get(Calendar.DATE);
200                            startDateYear = startCal.get(Calendar.YEAR);
201                            startDateHour = startCal.get(Calendar.HOUR);
202                            startDateMinute = startCal.get(Calendar.MINUTE);
203    
204                            if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
205                                    startDateHour += 12;
206                            }
207                    }
208    
209                    Date endDate = event.getEndDate();
210    
211                    int endDateMonth = 0;
212                    int endDateDay = 0;
213                    int endDateYear = 0;
214    
215                    if (endDate != null) {
216                            Calendar endCal = CalendarFactoryUtil.getCalendar();
217    
218                            endCal.setTime(endDate);
219    
220                            endDateMonth = endCal.get(Calendar.MONTH);
221                            endDateDay = endCal.get(Calendar.DATE);
222                            endDateYear = endCal.get(Calendar.YEAR);
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, endDateMonth,
241                                            endDateDay, endDateYear, event.getDurationHour(),
242                                            event.getDurationMinute(), event.getAllDay(),
243                                            event.getTimeZoneSensitive(), event.getType(),
244                                            event.getRepeating(), event.getRecurrenceObj(),
245                                            event.getRemindBy(), event.getFirstReminder(),
246                                            event.getSecondReminder(), 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                                            endDateMonth, endDateDay, endDateYear,
254                                            event.getDurationHour(), event.getDurationMinute(),
255                                            event.getAllDay(), event.getTimeZoneSensitive(),
256                                            event.getType(), event.getRepeating(),
257                                            event.getRecurrenceObj(), event.getRemindBy(),
258                                            event.getFirstReminder(), event.getSecondReminder(),
259                                            serviceContext);
260                            }
261                    }
262                    else {
263                            importedEvent = CalEventLocalServiceUtil.addEvent(
264                                    userId, event.getTitle(), event.getDescription(),
265                                    event.getLocation(), startDateMonth, startDateDay,
266                                    startDateYear, startDateHour, startDateMinute, endDateMonth,
267                                    endDateDay, endDateYear, event.getDurationHour(),
268                                    event.getDurationMinute(), event.getAllDay(),
269                                    event.getTimeZoneSensitive(), event.getType(),
270                                    event.getRepeating(), event.getRecurrenceObj(),
271                                    event.getRemindBy(), event.getFirstReminder(),
272                                    event.getSecondReminder(), serviceContext);
273                    }
274    
275                    portletDataContext.importClassedModel(event, importedEvent, _NAMESPACE);
276            }
277    
278            private static final boolean _ALWAYS_EXPORTABLE = true;
279    
280            private static final String _NAMESPACE = "calendar";
281    
282            private static final boolean _PUBLISH_TO_LIVE_BY_DEFAULT = true;
283    
284            private static PortletDataHandlerBoolean _categories =
285                    new PortletDataHandlerBoolean(_NAMESPACE, "categories");
286    
287            private static PortletDataHandlerBoolean _comments =
288                    new PortletDataHandlerBoolean(_NAMESPACE, "comments");
289    
290            private static PortletDataHandlerBoolean _events =
291                    new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
292    
293            private static PortletDataHandlerBoolean _ratings =
294                    new PortletDataHandlerBoolean(_NAMESPACE, "ratings");
295    
296            private static PortletDataHandlerBoolean _tags =
297                    new PortletDataHandlerBoolean(_NAMESPACE, "tags");
298    
299    }