001    /**
002     * Copyright (c) 2000-2013 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.ExportImportPathUtil;
021    import com.liferay.portal.kernel.lar.PortletDataContext;
022    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
023    import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
024    import com.liferay.portal.kernel.util.CalendarFactoryUtil;
025    import com.liferay.portal.kernel.util.LocaleUtil;
026    import com.liferay.portal.kernel.util.StringBundler;
027    import com.liferay.portal.kernel.util.StringPool;
028    import com.liferay.portal.kernel.util.TimeZoneUtil;
029    import com.liferay.portal.kernel.xml.Element;
030    import com.liferay.portal.model.User;
031    import com.liferay.portal.service.ServiceContext;
032    import com.liferay.portal.service.UserLocalServiceUtil;
033    import com.liferay.portal.util.PortletKeys;
034    import com.liferay.portlet.calendar.model.CalEvent;
035    import com.liferay.portlet.calendar.service.CalEventLocalServiceUtil;
036    import com.liferay.portlet.calendar.service.persistence.CalEventUtil;
037    
038    import java.util.Calendar;
039    import java.util.Date;
040    import java.util.List;
041    import java.util.Locale;
042    import java.util.TimeZone;
043    
044    import javax.portlet.PortletPreferences;
045    
046    /**
047     * @author Bruno Farache
048     * @author Raymond Augé
049     */
050    public class CalendarPortletDataHandler extends BasePortletDataHandler {
051    
052            public static final String NAMESPACE = "calendar";
053    
054            public CalendarPortletDataHandler() {
055                    setAlwaysExportable(true);
056                    setExportControls(
057                            new PortletDataHandlerBoolean(NAMESPACE, "events", true, true));
058                    setExportMetadataControls(
059                            new PortletDataHandlerBoolean(
060                                    NAMESPACE, "events", true,
061                                    new PortletDataHandlerControl[] {
062                                            new PortletDataHandlerBoolean(NAMESPACE, "categories"),
063                                            new PortletDataHandlerBoolean(NAMESPACE, "comments"),
064                                            new PortletDataHandlerBoolean(NAMESPACE, "ratings"),
065                                            new PortletDataHandlerBoolean(NAMESPACE, "tags")
066                                    }));
067                    setPublishToLiveByDefault(true);
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                                    CalendarPortletDataHandler.class, "deleteData")) {
078    
079                            return portletPreferences;
080                    }
081    
082                    CalEventLocalServiceUtil.deleteEvents(
083                            portletDataContext.getScopeGroupId());
084    
085                    return portletPreferences;
086            }
087    
088            @Override
089            protected String doExportData(
090                            PortletDataContext portletDataContext, String portletId,
091                            PortletPreferences portletPreferences)
092                    throws Exception {
093    
094                    portletDataContext.addPermissions(
095                            "com.liferay.portlet.calendar",
096                            portletDataContext.getScopeGroupId());
097    
098                    Element rootElement = addExportDataRootElement(portletDataContext);
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 getExportDataRootElementString(rootElement);
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                    Element rootElement = portletDataContext.getImportDataRootElement();
125    
126                    for (Element eventElement : rootElement.elements("event")) {
127                            String path = eventElement.attributeValue("path");
128    
129                            if (!portletDataContext.isPathNotProcessed(path)) {
130                                    continue;
131                            }
132    
133                            CalEvent event = (CalEvent)portletDataContext.getZipEntryAsObject(
134                                    path);
135    
136                            importEvent(portletDataContext, eventElement, event);
137                    }
138    
139                    return null;
140            }
141    
142            protected void exportEvent(
143                            PortletDataContext portletDataContext, Element rootElement,
144                            CalEvent event)
145                    throws PortalException, SystemException {
146    
147                    if (!portletDataContext.isWithinDateRange(event.getModifiedDate())) {
148                            return;
149                    }
150    
151                    String path = getEventPath(portletDataContext, event);
152    
153                    if (!portletDataContext.isPathNotProcessed(path)) {
154                            return;
155                    }
156    
157                    Element eventElement = rootElement.addElement("event");
158    
159                    portletDataContext.addClassedModel(
160                            eventElement, path, event, NAMESPACE);
161            }
162    
163            protected String getEventPath(
164                    PortletDataContext portletDataContext, CalEvent event) {
165    
166                    StringBundler sb = new StringBundler(4);
167    
168                    sb.append(
169                            ExportImportPathUtil.getPortletPath(
170                                    portletDataContext, 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                            Locale locale = null;
195                            TimeZone timeZone = null;
196    
197                            if (event.getTimeZoneSensitive()) {
198                                    User user = UserLocalServiceUtil.getUser(userId);
199    
200                                    locale = user.getLocale();
201                                    timeZone = user.getTimeZone();
202                            }
203                            else {
204                                    locale = LocaleUtil.getDefault();
205                                    timeZone = TimeZoneUtil.getTimeZone(StringPool.UTC);
206                            }
207    
208                            Calendar startCal = CalendarFactoryUtil.getCalendar(
209                                    timeZone, locale);
210    
211                            startCal.setTime(startDate);
212    
213                            startDateMonth = startCal.get(Calendar.MONTH);
214                            startDateDay = startCal.get(Calendar.DATE);
215                            startDateYear = startCal.get(Calendar.YEAR);
216                            startDateHour = startCal.get(Calendar.HOUR);
217                            startDateMinute = startCal.get(Calendar.MINUTE);
218    
219                            if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
220                                    startDateHour += 12;
221                            }
222                    }
223    
224                    ServiceContext serviceContext = portletDataContext.createServiceContext(
225                            eventElement, event, NAMESPACE);
226    
227                    CalEvent importedEvent = null;
228    
229                    if (portletDataContext.isDataStrategyMirror()) {
230                            CalEvent existingEvent = CalEventUtil.fetchByUUID_G(
231                                    event.getUuid(), portletDataContext.getScopeGroupId());
232    
233                            if (existingEvent == null) {
234                                    serviceContext.setUuid(event.getUuid());
235    
236                                    importedEvent = CalEventLocalServiceUtil.addEvent(
237                                            userId, event.getTitle(), event.getDescription(),
238                                            event.getLocation(), startDateMonth, startDateDay,
239                                            startDateYear, startDateHour, startDateMinute,
240                                            event.getDurationHour(), event.getDurationMinute(),
241                                            event.isAllDay(), event.isTimeZoneSensitive(),
242                                            event.getType(), event.getRepeating(),
243                                            event.getRecurrenceObj(), event.getRemindBy(),
244                                            event.getFirstReminder(), event.getSecondReminder(),
245                                            serviceContext);
246                            }
247                            else {
248                                    importedEvent = CalEventLocalServiceUtil.updateEvent(
249                                            userId, existingEvent.getEventId(), event.getTitle(),
250                                            event.getDescription(), event.getLocation(), startDateMonth,
251                                            startDateDay, startDateYear, startDateHour, startDateMinute,
252                                            event.getDurationHour(), event.getDurationMinute(),
253                                            event.isAllDay(), event.isTimeZoneSensitive(),
254                                            event.getType(), event.getRepeating(),
255                                            event.getRecurrenceObj(), event.getRemindBy(),
256                                            event.getFirstReminder(), event.getSecondReminder(),
257                                            serviceContext);
258                            }
259                    }
260                    else {
261                            importedEvent = CalEventLocalServiceUtil.addEvent(
262                                    userId, event.getTitle(), event.getDescription(),
263                                    event.getLocation(), startDateMonth, startDateDay,
264                                    startDateYear, startDateHour, startDateMinute,
265                                    event.getDurationHour(), event.getDurationMinute(),
266                                    event.isAllDay(), event.isTimeZoneSensitive(), event.getType(),
267                                    event.getRepeating(), event.getRecurrenceObj(),
268                                    event.getRemindBy(), event.getFirstReminder(),
269                                    event.getSecondReminder(), serviceContext);
270                    }
271    
272                    portletDataContext.importClassedModel(event, importedEvent, NAMESPACE);
273            }
274    
275    }