001    /**
002     * Copyright (c) 2000-present 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.lar.BasePortletDataHandler;
019    import com.liferay.portal.kernel.lar.ExportImportPathUtil;
020    import com.liferay.portal.kernel.lar.PortletDataContext;
021    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
022    import com.liferay.portal.kernel.util.CalendarFactoryUtil;
023    import com.liferay.portal.kernel.util.LocaleUtil;
024    import com.liferay.portal.kernel.util.StringBundler;
025    import com.liferay.portal.kernel.util.StringPool;
026    import com.liferay.portal.kernel.util.TimeZoneUtil;
027    import com.liferay.portal.kernel.xml.Element;
028    import com.liferay.portal.model.User;
029    import com.liferay.portal.service.ServiceContext;
030    import com.liferay.portal.service.UserLocalServiceUtil;
031    import com.liferay.portal.util.PortletKeys;
032    import com.liferay.portal.util.PropsValues;
033    import com.liferay.portlet.calendar.model.CalEvent;
034    import com.liferay.portlet.calendar.service.CalEventLocalServiceUtil;
035    import com.liferay.portlet.calendar.service.permission.CalendarPermission;
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                    setExportControls(
056                            new PortletDataHandlerBoolean(
057                                    NAMESPACE, "events", true, true, null,
058                                    CalEvent.class.getName()));
059                    setPublishToLiveByDefault(
060                            PropsValues.CALENDAR_PUBLISH_TO_LIVE_BY_DEFAULT);
061            }
062    
063            @Override
064            protected PortletPreferences doDeleteData(
065                            PortletDataContext portletDataContext, String portletId,
066                            PortletPreferences portletPreferences)
067                    throws Exception {
068    
069                    if (portletDataContext.addPrimaryKey(
070                                    CalendarPortletDataHandler.class, "deleteData")) {
071    
072                            return portletPreferences;
073                    }
074    
075                    CalEventLocalServiceUtil.deleteEvents(
076                            portletDataContext.getScopeGroupId());
077    
078                    return portletPreferences;
079            }
080    
081            @Override
082            protected String doExportData(
083                            PortletDataContext portletDataContext, String portletId,
084                            PortletPreferences portletPreferences)
085                    throws Exception {
086    
087                    portletDataContext.addPermissions(
088                            CalendarPermission.RESOURCE_NAME,
089                            portletDataContext.getScopeGroupId());
090    
091                    Element rootElement = addExportDataRootElement(portletDataContext);
092    
093                    rootElement.addAttribute(
094                            "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
095    
096                    List<CalEvent> events = CalEventUtil.findByGroupId(
097                            portletDataContext.getScopeGroupId());
098    
099                    for (CalEvent event : events) {
100                            exportEvent(portletDataContext, rootElement, event);
101                    }
102    
103                    return getExportDataRootElementString(rootElement);
104            }
105    
106            @Override
107            protected PortletPreferences doImportData(
108                            PortletDataContext portletDataContext, String portletId,
109                            PortletPreferences portletPreferences, String data)
110                    throws Exception {
111    
112                    portletDataContext.importPermissions(
113                            CalendarPermission.RESOURCE_NAME,
114                            portletDataContext.getSourceGroupId(),
115                            portletDataContext.getScopeGroupId());
116    
117                    Element rootElement = portletDataContext.getImportDataRootElement();
118    
119                    for (Element eventElement : rootElement.elements("event")) {
120                            String path = eventElement.attributeValue("path");
121    
122                            if (!portletDataContext.isPathNotProcessed(path)) {
123                                    continue;
124                            }
125    
126                            CalEvent event = (CalEvent)portletDataContext.getZipEntryAsObject(
127                                    path);
128    
129                            importEvent(portletDataContext, eventElement, event);
130                    }
131    
132                    return null;
133            }
134    
135            protected void exportEvent(
136                            PortletDataContext portletDataContext, Element rootElement,
137                            CalEvent event)
138                    throws PortalException {
139    
140                    if (!portletDataContext.isWithinDateRange(event.getModifiedDate())) {
141                            return;
142                    }
143    
144                    String path = getEventPath(portletDataContext, event);
145    
146                    if (!portletDataContext.isPathNotProcessed(path)) {
147                            return;
148                    }
149    
150                    Element eventElement = rootElement.addElement("event");
151    
152                    portletDataContext.addClassedModel(eventElement, path, event);
153            }
154    
155            protected String getEventPath(
156                    PortletDataContext portletDataContext, CalEvent event) {
157    
158                    StringBundler sb = new StringBundler(4);
159    
160                    sb.append(
161                            ExportImportPathUtil.getPortletPath(
162                                    portletDataContext, PortletKeys.CALENDAR));
163                    sb.append("/events/");
164                    sb.append(event.getEventId());
165                    sb.append(".xml");
166    
167                    return sb.toString();
168            }
169    
170            protected void importEvent(
171                            PortletDataContext portletDataContext, Element eventElement,
172                            CalEvent event)
173                    throws Exception {
174    
175                    long userId = portletDataContext.getUserId(event.getUserUuid());
176    
177                    Date startDate = event.getStartDate();
178    
179                    int startDateMonth = 0;
180                    int startDateDay = 0;
181                    int startDateYear = 0;
182                    int startDateHour = 0;
183                    int startDateMinute = 0;
184    
185                    if (startDate != null) {
186                            Locale locale = null;
187                            TimeZone timeZone = null;
188    
189                            if (event.getTimeZoneSensitive()) {
190                                    User user = UserLocalServiceUtil.getUser(userId);
191    
192                                    locale = user.getLocale();
193                                    timeZone = user.getTimeZone();
194                            }
195                            else {
196                                    locale = LocaleUtil.getSiteDefault();
197                                    timeZone = TimeZoneUtil.getTimeZone(StringPool.UTC);
198                            }
199    
200                            Calendar startCal = CalendarFactoryUtil.getCalendar(
201                                    timeZone, locale);
202    
203                            startCal.setTime(startDate);
204    
205                            startDateMonth = startCal.get(Calendar.MONTH);
206                            startDateDay = startCal.get(Calendar.DATE);
207                            startDateYear = startCal.get(Calendar.YEAR);
208                            startDateHour = startCal.get(Calendar.HOUR);
209                            startDateMinute = startCal.get(Calendar.MINUTE);
210    
211                            if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
212                                    startDateHour += 12;
213                            }
214                    }
215    
216                    ServiceContext serviceContext = portletDataContext.createServiceContext(
217                            eventElement, event);
218    
219                    CalEvent importedEvent = null;
220    
221                    if (portletDataContext.isDataStrategyMirror()) {
222                            CalEvent existingEvent = CalEventUtil.fetchByUUID_G(
223                                    event.getUuid(), portletDataContext.getScopeGroupId());
224    
225                            if (existingEvent == null) {
226                                    serviceContext.setUuid(event.getUuid());
227    
228                                    importedEvent = CalEventLocalServiceUtil.addEvent(
229                                            userId, event.getTitle(), event.getDescription(),
230                                            event.getLocation(), startDateMonth, startDateDay,
231                                            startDateYear, startDateHour, startDateMinute,
232                                            event.getDurationHour(), event.getDurationMinute(),
233                                            event.isAllDay(), event.isTimeZoneSensitive(),
234                                            event.getType(), event.getRepeating(),
235                                            event.getRecurrenceObj(), event.getRemindBy(),
236                                            event.getFirstReminder(), event.getSecondReminder(),
237                                            serviceContext);
238                            }
239                            else {
240                                    importedEvent = CalEventLocalServiceUtil.updateEvent(
241                                            userId, existingEvent.getEventId(), event.getTitle(),
242                                            event.getDescription(), event.getLocation(), startDateMonth,
243                                            startDateDay, startDateYear, startDateHour, startDateMinute,
244                                            event.getDurationHour(), event.getDurationMinute(),
245                                            event.isAllDay(), event.isTimeZoneSensitive(),
246                                            event.getType(), event.getRepeating(),
247                                            event.getRecurrenceObj(), event.getRemindBy(),
248                                            event.getFirstReminder(), event.getSecondReminder(),
249                                            serviceContext);
250                            }
251                    }
252                    else {
253                            importedEvent = CalEventLocalServiceUtil.addEvent(
254                                    userId, event.getTitle(), event.getDescription(),
255                                    event.getLocation(), startDateMonth, startDateDay,
256                                    startDateYear, startDateHour, startDateMinute,
257                                    event.getDurationHour(), event.getDurationMinute(),
258                                    event.isAllDay(), event.isTimeZoneSensitive(), event.getType(),
259                                    event.getRepeating(), event.getRecurrenceObj(),
260                                    event.getRemindBy(), event.getFirstReminder(),
261                                    event.getSecondReminder(), serviceContext);
262                    }
263    
264                    portletDataContext.importClassedModel(event, importedEvent);
265            }
266    
267    }