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