1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.calendar.lar;
16  
17  import com.liferay.portal.kernel.exception.PortalException;
18  import com.liferay.portal.kernel.exception.SystemException;
19  import com.liferay.portal.kernel.lar.BasePortletDataHandler;
20  import com.liferay.portal.kernel.lar.PortletDataContext;
21  import com.liferay.portal.kernel.lar.PortletDataException;
22  import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
23  import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
24  import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
25  import com.liferay.portal.kernel.util.CalendarFactoryUtil;
26  import com.liferay.portal.kernel.util.StringBundler;
27  import com.liferay.portal.kernel.xml.Document;
28  import com.liferay.portal.kernel.xml.Element;
29  import com.liferay.portal.kernel.xml.SAXReaderUtil;
30  import com.liferay.portal.service.ServiceContext;
31  import com.liferay.portal.util.PortletKeys;
32  import com.liferay.portlet.calendar.model.CalEvent;
33  import com.liferay.portlet.calendar.service.CalEventLocalServiceUtil;
34  import com.liferay.portlet.calendar.service.persistence.CalEventUtil;
35  
36  import java.util.Calendar;
37  import java.util.Date;
38  import java.util.List;
39  
40  import javax.portlet.PortletPreferences;
41  
42  /**
43   * <a href="CalendarPortletDataHandlerImpl.java.html"><b><i>View Source</i></b>
44   * </a>
45   *
46   * @author Bruno Farache
47   * @author Raymond Augé
48   */
49  public class CalendarPortletDataHandlerImpl extends BasePortletDataHandler {
50  
51      public PortletPreferences deleteData(
52              PortletDataContext context, String portletId,
53              PortletPreferences preferences)
54          throws PortletDataException {
55  
56          try {
57              if (!context.addPrimaryKey(
58                      CalendarPortletDataHandlerImpl.class, "deleteData")) {
59  
60                  CalEventLocalServiceUtil.deleteEvents(context.getGroupId());
61              }
62              return null;
63          }
64          catch (Exception e) {
65              throw new PortletDataException(e);
66          }
67      }
68  
69      public String exportData(
70              PortletDataContext context, String portletId,
71              PortletPreferences preferences)
72          throws PortletDataException {
73  
74          try {
75              context.addPermissions(
76                  "com.liferay.portlet.calendar", context.getGroupId());
77  
78              Document doc = SAXReaderUtil.createDocument();
79  
80              Element root = doc.addElement("calendar-data");
81  
82              root.addAttribute("group-id", String.valueOf(context.getGroupId()));
83  
84              List<CalEvent> events = CalEventUtil.findByGroupId(
85                  context.getGroupId());
86  
87              for (CalEvent event : events) {
88                  exportEvent(context, root, event);
89              }
90  
91              return doc.formattedString();
92          }
93          catch (Exception e) {
94              throw new PortletDataException(e);
95          }
96      }
97  
98      public PortletDataHandlerControl[] getExportControls() {
99          return new PortletDataHandlerControl[] {
100             _events, _categories, _comments, _tags
101         };
102     }
103 
104     public PortletDataHandlerControl[] getImportControls() {
105         return new PortletDataHandlerControl[] {
106             _events, _categories, _comments, _tags
107         };
108     }
109 
110     public PortletPreferences importData(
111             PortletDataContext context, String portletId,
112             PortletPreferences preferences, String data)
113         throws PortletDataException {
114 
115         try {
116             context.importPermissions(
117                 "com.liferay.portlet.calendar", context.getSourceGroupId(),
118                 context.getGroupId());
119 
120             Document doc = SAXReaderUtil.read(data);
121 
122             Element root = doc.getRootElement();
123 
124             List<Element> eventsEl = root.elements("event");
125 
126             for (Element eventEl : eventsEl) {
127                 String path = eventEl.attributeValue("path");
128 
129                 if (!context.isPathNotProcessed(path)) {
130                     continue;
131                 }
132 
133                 CalEvent event = (CalEvent)context.getZipEntryAsObject(path);
134 
135                 importEvent(context, event);
136             }
137 
138             return null;
139         }
140         catch (Exception e) {
141             throw new PortletDataException(e);
142         }
143     }
144 
145     protected void exportEvent(
146             PortletDataContext context, Element root, CalEvent event)
147         throws PortalException, SystemException {
148 
149         if (!context.isWithinDateRange(event.getModifiedDate())) {
150             return;
151         }
152 
153         String path = getEventPath(context, event);
154 
155         if (!context.isPathNotProcessed(path)) {
156             return;
157         }
158 
159         Element eventEl = root.addElement("event");
160 
161         eventEl.addAttribute("path", path);
162 
163         event.setUserUuid(event.getUserUuid());
164 
165         context.addPermissions(CalEvent.class, event.getEventId());
166 
167         if (context.getBooleanParameter(_NAMESPACE, "categories")) {
168             context.addAssetCategories(CalEvent.class, event.getEventId());
169         }
170 
171         if (context.getBooleanParameter(_NAMESPACE, "comments")) {
172             context.addComments(CalEvent.class, event.getEventId());
173         }
174 
175         if (context.getBooleanParameter(_NAMESPACE, "tags")) {
176             context.addAssetTags(CalEvent.class, event.getEventId());
177         }
178 
179         context.addZipEntry(path, event);
180     }
181 
182     protected String getEventPath(PortletDataContext context, CalEvent event) {
183         StringBundler sb = new StringBundler(4);
184 
185         sb.append(context.getPortletPath(PortletKeys.CALENDAR));
186         sb.append("/events/");
187         sb.append(event.getEventId());
188         sb.append(".xml");
189 
190         return sb.toString();
191     }
192 
193     protected void importEvent(PortletDataContext context, CalEvent event)
194         throws Exception {
195 
196         long userId = context.getUserId(event.getUserUuid());
197 
198         Date startDate = event.getStartDate();
199 
200         int startDateMonth = 0;
201         int startDateDay = 0;
202         int startDateYear = 0;
203         int startDateHour = 0;
204         int startDateMinute = 0;
205 
206         if (startDate != null) {
207             Calendar startCal = CalendarFactoryUtil.getCalendar();
208 
209             startCal.setTime(startDate);
210 
211             startDateMonth = startCal.get(Calendar.MONTH);
212             startDateDay = startCal.get(Calendar.DATE);
213             startDateYear = startCal.get(Calendar.YEAR);
214             startDateHour = startCal.get(Calendar.HOUR);
215             startDateMinute = startCal.get(Calendar.MINUTE);
216 
217             if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
218                 startDateHour += 12;
219             }
220         }
221 
222         Date endDate = event.getEndDate();
223 
224         int endDateMonth = 0;
225         int endDateDay = 0;
226         int endDateYear = 0;
227 
228         if (endDate != null) {
229             Calendar endCal = CalendarFactoryUtil.getCalendar();
230 
231             endCal.setTime(endDate);
232 
233             endDateMonth = endCal.get(Calendar.MONTH);
234             endDateDay = endCal.get(Calendar.DATE);
235             endDateYear = endCal.get(Calendar.YEAR);
236         }
237 
238         long[] assetCategoryIds = null;
239         String[] assetTagNames = null;
240 
241         if (context.getBooleanParameter(_NAMESPACE, "categories")) {
242             assetCategoryIds = context.getAssetCategoryIds(
243                 CalEvent.class, event.getEventId());
244         }
245 
246         if (context.getBooleanParameter(_NAMESPACE, "tags")) {
247             assetTagNames = context.getAssetTagNames(
248                 CalEvent.class, event.getEventId());
249         }
250 
251         ServiceContext serviceContext = new ServiceContext();
252 
253         serviceContext.setAddCommunityPermissions(true);
254         serviceContext.setAddGuestPermissions(true);
255         serviceContext.setAssetCategoryIds(assetCategoryIds);
256         serviceContext.setAssetTagNames(assetTagNames);
257         serviceContext.setCreateDate(event.getCreateDate());
258         serviceContext.setModifiedDate(event.getModifiedDate());
259         serviceContext.setScopeGroupId(context.getGroupId());
260 
261         CalEvent importedEvent = null;
262 
263         if (context.getDataStrategy().equals(
264                 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
265 
266             CalEvent existingEvent = CalEventUtil.fetchByUUID_G(
267                 event.getUuid(), context.getGroupId());
268 
269             if (existingEvent == null) {
270                 importedEvent = CalEventLocalServiceUtil.addEvent(
271                     event.getUuid(), userId, event.getTitle(),
272                     event.getDescription(), startDateMonth, startDateDay,
273                     startDateYear, startDateHour, startDateMinute, endDateMonth,
274                     endDateDay, endDateYear, event.getDurationHour(),
275                     event.getDurationMinute(), event.getAllDay(),
276                     event.getTimeZoneSensitive(), event.getType(),
277                     event.getRepeating(), event.getRecurrenceObj(),
278                     event.getRemindBy(), event.getFirstReminder(),
279                     event.getSecondReminder(), serviceContext);
280             }
281             else {
282                 importedEvent = CalEventLocalServiceUtil.updateEvent(
283                     userId, existingEvent.getEventId(), event.getTitle(),
284                     event.getDescription(), startDateMonth, startDateDay,
285                     startDateYear, startDateHour, startDateMinute, endDateMonth,
286                     endDateDay, endDateYear, event.getDurationHour(),
287                     event.getDurationMinute(), event.getAllDay(),
288                     event.getTimeZoneSensitive(), event.getType(),
289                     event.getRepeating(), event.getRecurrenceObj(),
290                     event.getRemindBy(), event.getFirstReminder(),
291                     event.getSecondReminder(), serviceContext);
292             }
293         }
294         else {
295             importedEvent = CalEventLocalServiceUtil.addEvent(
296                 null, userId, event.getTitle(), event.getDescription(),
297                 startDateMonth, startDateDay, startDateYear, startDateHour,
298                 startDateMinute, endDateMonth, endDateDay, endDateYear,
299                 event.getDurationHour(), event.getDurationMinute(),
300                 event.getAllDay(), event.getTimeZoneSensitive(),
301                 event.getType(), event.getRepeating(), event.getRecurrenceObj(),
302                 event.getRemindBy(), event.getFirstReminder(),
303                 event.getSecondReminder(), serviceContext);
304         }
305 
306         context.importPermissions(
307             CalEvent.class, event.getEventId(), importedEvent.getEventId());
308 
309         if (context.getBooleanParameter(_NAMESPACE, "comments")) {
310             context.importComments(
311                 CalEvent.class, event.getEventId(), importedEvent.getEventId(),
312                 context.getGroupId());
313         }
314     }
315 
316     private static final String _NAMESPACE = "calendar";
317 
318     private static PortletDataHandlerBoolean _categories =
319         new PortletDataHandlerBoolean(_NAMESPACE, "categories");
320 
321     private static PortletDataHandlerBoolean _comments =
322         new PortletDataHandlerBoolean(_NAMESPACE, "comments");
323 
324     private static PortletDataHandlerBoolean _events =
325         new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
326 
327     private static PortletDataHandlerBoolean _tags =
328         new PortletDataHandlerBoolean(_NAMESPACE, "tags");
329 
330 }