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.util.CalendarFactoryUtil;
20  import com.liferay.portal.kernel.util.StringBundler;
21  import com.liferay.portal.kernel.xml.Document;
22  import com.liferay.portal.kernel.xml.Element;
23  import com.liferay.portal.kernel.xml.SAXReaderUtil;
24  import com.liferay.portal.lar.BasePortletDataHandler;
25  import com.liferay.portal.lar.PortletDataContext;
26  import com.liferay.portal.lar.PortletDataException;
27  import com.liferay.portal.lar.PortletDataHandlerBoolean;
28  import com.liferay.portal.lar.PortletDataHandlerControl;
29  import com.liferay.portal.lar.PortletDataHandlerKeys;
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[] {_events};
100     }
101 
102     public PortletDataHandlerControl[] getImportControls() {
103         return new PortletDataHandlerControl[] {_events};
104     }
105 
106     public PortletPreferences importData(
107             PortletDataContext context, String portletId,
108             PortletPreferences preferences, String data)
109         throws PortletDataException {
110 
111         try {
112             context.importPermissions(
113                 "com.liferay.portlet.calendar", context.getSourceGroupId(),
114                 context.getGroupId());
115 
116             Document doc = SAXReaderUtil.read(data);
117 
118             Element root = doc.getRootElement();
119 
120             List<Element> eventsEl = root.elements("event");
121 
122             for (Element eventEl : eventsEl) {
123                 String path = eventEl.attributeValue("path");
124 
125                 if (!context.isPathNotProcessed(path)) {
126                     continue;
127                 }
128 
129                 CalEvent event = (CalEvent)context.getZipEntryAsObject(path);
130 
131                 importEvent(context, event);
132             }
133 
134             return null;
135         }
136         catch (Exception e) {
137             throw new PortletDataException(e);
138         }
139     }
140 
141     protected void exportEvent(
142             PortletDataContext context, Element root, CalEvent event)
143         throws PortalException, SystemException {
144 
145         if (!context.isWithinDateRange(event.getModifiedDate())) {
146             return;
147         }
148 
149         String path = getEventPath(context, event);
150 
151         if (!context.isPathNotProcessed(path)) {
152             return;
153         }
154 
155         Element eventEl = root.addElement("event");
156 
157         eventEl.addAttribute("path", path);
158 
159         event.setUserUuid(event.getUserUuid());
160 
161         context.addPermissions(CalEvent.class, event.getEventId());
162 
163         context.addZipEntry(path, event);
164     }
165 
166     protected String getEventPath(PortletDataContext context, CalEvent event) {
167         StringBundler sb = new StringBundler(4);
168 
169         sb.append(context.getPortletPath(PortletKeys.CALENDAR));
170         sb.append("/events/");
171         sb.append(event.getEventId());
172         sb.append(".xml");
173 
174         return sb.toString();
175     }
176 
177     protected void importEvent(PortletDataContext context, CalEvent event)
178         throws Exception {
179 
180         long userId = context.getUserId(event.getUserUuid());
181 
182         Date startDate = event.getStartDate();
183 
184         int startDateMonth = 0;
185         int startDateDay = 0;
186         int startDateYear = 0;
187         int startDateHour = 0;
188         int startDateMinute = 0;
189 
190         if (startDate != null) {
191             Calendar startCal = CalendarFactoryUtil.getCalendar();
192 
193             startCal.setTime(startDate);
194 
195             startDateMonth = startCal.get(Calendar.MONTH);
196             startDateDay = startCal.get(Calendar.DATE);
197             startDateYear = startCal.get(Calendar.YEAR);
198             startDateHour = startCal.get(Calendar.HOUR);
199             startDateMinute = startCal.get(Calendar.MINUTE);
200 
201             if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
202                 startDateHour += 12;
203             }
204         }
205 
206         Date endDate = event.getEndDate();
207 
208         int endDateMonth = 0;
209         int endDateDay = 0;
210         int endDateYear = 0;
211 
212         if (endDate != null) {
213             Calendar endCal = CalendarFactoryUtil.getCalendar();
214 
215             endCal.setTime(endDate);
216 
217             endDateMonth = endCal.get(Calendar.MONTH);
218             endDateDay = endCal.get(Calendar.DATE);
219             endDateYear = endCal.get(Calendar.YEAR);
220         }
221 
222         ServiceContext serviceContext = new ServiceContext();
223 
224         serviceContext.setAddCommunityPermissions(true);
225         serviceContext.setAddGuestPermissions(true);
226         serviceContext.setScopeGroupId(context.getGroupId());
227 
228         CalEvent importedEvent = null;
229 
230         if (context.getDataStrategy().equals(
231                 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
232 
233             CalEvent existingEvent = CalEventUtil.fetchByUUID_G(
234                 event.getUuid(), context.getGroupId());
235 
236             if (existingEvent == null) {
237                 importedEvent = CalEventLocalServiceUtil.addEvent(
238                     event.getUuid(), userId, event.getTitle(),
239                     event.getDescription(), 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(), startDateMonth, startDateDay,
252                     startDateYear, startDateHour, startDateMinute, endDateMonth,
253                     endDateDay, endDateYear, event.getDurationHour(),
254                     event.getDurationMinute(), event.getAllDay(),
255                     event.getTimeZoneSensitive(), event.getType(),
256                     event.getRepeating(), event.getRecurrenceObj(),
257                     event.getRemindBy(), event.getFirstReminder(),
258                     event.getSecondReminder(), serviceContext);
259             }
260         }
261         else {
262             importedEvent = CalEventLocalServiceUtil.addEvent(
263                 null, userId, event.getTitle(), event.getDescription(),
264                 startDateMonth, startDateDay, startDateYear, startDateHour,
265                 startDateMinute, endDateMonth, endDateDay, endDateYear,
266                 event.getDurationHour(), event.getDurationMinute(),
267                 event.getAllDay(), event.getTimeZoneSensitive(),
268                 event.getType(), event.getRepeating(), event.getRecurrenceObj(),
269                 event.getRemindBy(), event.getFirstReminder(),
270                 event.getSecondReminder(), serviceContext);
271         }
272 
273         context.importPermissions(
274             CalEvent.class, event.getEventId(), importedEvent.getEventId());
275     }
276 
277     private static final String _NAMESPACE = "calendar";
278 
279     private static final PortletDataHandlerBoolean _events =
280         new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
281 
282 }