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.SystemException;
18  import com.liferay.portal.kernel.util.CalendarFactoryUtil;
19  import com.liferay.portal.kernel.util.StringBundler;
20  import com.liferay.portal.kernel.xml.Document;
21  import com.liferay.portal.kernel.xml.Element;
22  import com.liferay.portal.kernel.xml.SAXReaderUtil;
23  import com.liferay.portal.lar.BasePortletDataHandler;
24  import com.liferay.portal.lar.PortletDataContext;
25  import com.liferay.portal.lar.PortletDataException;
26  import com.liferay.portal.lar.PortletDataHandlerBoolean;
27  import com.liferay.portal.lar.PortletDataHandlerControl;
28  import com.liferay.portal.lar.PortletDataHandlerKeys;
29  import com.liferay.portal.service.ServiceContext;
30  import com.liferay.portal.util.PortletKeys;
31  import com.liferay.portlet.calendar.model.CalEvent;
32  import com.liferay.portlet.calendar.service.CalEventLocalServiceUtil;
33  import com.liferay.portlet.calendar.service.persistence.CalEventUtil;
34  
35  import java.util.Calendar;
36  import java.util.Date;
37  import java.util.List;
38  
39  import javax.portlet.PortletPreferences;
40  
41  /**
42   * <a href="CalendarPortletDataHandlerImpl.java.html"><b><i>View Source</i></b>
43   * </a>
44   *
45   * @author Bruno Farache
46   * @author Raymond Augé
47   */
48  public class CalendarPortletDataHandlerImpl extends BasePortletDataHandler {
49  
50      public PortletPreferences deleteData(
51              PortletDataContext context, String portletId,
52              PortletPreferences preferences)
53          throws PortletDataException {
54  
55          try {
56              if (!context.addPrimaryKey(
57                      CalendarPortletDataHandlerImpl.class, "deleteData")) {
58  
59                  CalEventLocalServiceUtil.deleteEvents(context.getGroupId());
60              }
61              return null;
62          }
63          catch (Exception e) {
64              throw new PortletDataException(e);
65          }
66      }
67  
68      public String exportData(
69              PortletDataContext context, String portletId,
70              PortletPreferences preferences)
71          throws PortletDataException {
72  
73          try {
74              Document doc = SAXReaderUtil.createDocument();
75  
76              Element root = doc.addElement("calendar-data");
77  
78              root.addAttribute("group-id", String.valueOf(context.getGroupId()));
79  
80              List<CalEvent> events = CalEventUtil.findByGroupId(
81                  context.getGroupId());
82  
83              for (CalEvent event : events) {
84                  exportEvent(context, root, event);
85              }
86  
87              return doc.formattedString();
88          }
89          catch (Exception e) {
90              throw new PortletDataException(e);
91          }
92      }
93  
94      public PortletDataHandlerControl[] getExportControls() {
95          return new PortletDataHandlerControl[] {_events};
96      }
97  
98      public PortletDataHandlerControl[] getImportControls() {
99          return new PortletDataHandlerControl[] {_events};
100     }
101 
102     public PortletPreferences importData(
103             PortletDataContext context, String portletId,
104             PortletPreferences preferences, String data)
105         throws PortletDataException {
106 
107         try {
108             Document doc = SAXReaderUtil.read(data);
109 
110             Element root = doc.getRootElement();
111 
112             List<Element> eventsEl = root.elements("event");
113 
114             for (Element eventEl : eventsEl) {
115                 String path = eventEl.attributeValue("path");
116 
117                 if (!context.isPathNotProcessed(path)) {
118                     continue;
119                 }
120 
121                 CalEvent event = (CalEvent)context.getZipEntryAsObject(path);
122 
123                 importEvent(context, event);
124             }
125 
126             return null;
127         }
128         catch (Exception e) {
129             throw new PortletDataException(e);
130         }
131     }
132 
133     protected void exportEvent(
134             PortletDataContext context, Element root, CalEvent event)
135         throws SystemException {
136 
137         if (!context.isWithinDateRange(event.getModifiedDate())) {
138             return;
139         }
140 
141         String path = getEventPath(context, event);
142 
143         if (!context.isPathNotProcessed(path)) {
144             return;
145         }
146 
147         Element eventEl = root.addElement("event");
148 
149         eventEl.addAttribute("path", path);
150 
151         event.setUserUuid(event.getUserUuid());
152 
153         context.addZipEntry(path, event);
154     }
155 
156     protected String getEventPath(PortletDataContext context, CalEvent event) {
157         StringBundler sb = new StringBundler(4);
158 
159         sb.append(context.getPortletPath(PortletKeys.CALENDAR));
160         sb.append("/events/");
161         sb.append(event.getEventId());
162         sb.append(".xml");
163 
164         return sb.toString();
165     }
166 
167     protected void importEvent(PortletDataContext context, CalEvent event)
168         throws Exception {
169 
170         long userId = context.getUserId(event.getUserUuid());
171 
172         Date startDate = event.getStartDate();
173 
174         int startDateMonth = 0;
175         int startDateDay = 0;
176         int startDateYear = 0;
177         int startDateHour = 0;
178         int startDateMinute = 0;
179 
180         if (startDate != null) {
181             Calendar startCal = CalendarFactoryUtil.getCalendar();
182 
183             startCal.setTime(startDate);
184 
185             startDateMonth = startCal.get(Calendar.MONTH);
186             startDateDay = startCal.get(Calendar.DATE);
187             startDateYear = startCal.get(Calendar.YEAR);
188             startDateHour = startCal.get(Calendar.HOUR);
189             startDateMinute = startCal.get(Calendar.MINUTE);
190 
191             if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
192                 startDateHour += 12;
193             }
194         }
195 
196         Date endDate = event.getEndDate();
197 
198         int endDateMonth = 0;
199         int endDateDay = 0;
200         int endDateYear = 0;
201 
202         if (endDate != null) {
203             Calendar endCal = CalendarFactoryUtil.getCalendar();
204 
205             endCal.setTime(endDate);
206 
207             endDateMonth = endCal.get(Calendar.MONTH);
208             endDateDay = endCal.get(Calendar.DATE);
209             endDateYear = endCal.get(Calendar.YEAR);
210         }
211 
212         ServiceContext serviceContext = new ServiceContext();
213 
214         serviceContext.setAddCommunityPermissions(true);
215         serviceContext.setAddGuestPermissions(true);
216         serviceContext.setScopeGroupId(context.getGroupId());
217 
218         CalEvent existingEvent = null;
219 
220         if (context.getDataStrategy().equals(
221                 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
222 
223             existingEvent = CalEventUtil.fetchByUUID_G(
224                 event.getUuid(), context.getGroupId());
225 
226             if (existingEvent == null) {
227                 CalEventLocalServiceUtil.addEvent(
228                     event.getUuid(), userId, event.getTitle(),
229                     event.getDescription(), startDateMonth, startDateDay,
230                     startDateYear, startDateHour, startDateMinute, endDateMonth,
231                     endDateDay, endDateYear, event.getDurationHour(),
232                     event.getDurationMinute(), event.getAllDay(),
233                     event.getTimeZoneSensitive(), event.getType(),
234                     event.getRepeating(), event.getRecurrenceObj(),
235                     event.getRemindBy(), event.getFirstReminder(),
236                     event.getSecondReminder(), serviceContext);
237             }
238             else {
239                 CalEventLocalServiceUtil.updateEvent(
240                     userId, existingEvent.getEventId(), event.getTitle(),
241                     event.getDescription(), startDateMonth, startDateDay,
242                     startDateYear, startDateHour, startDateMinute, endDateMonth,
243                     endDateDay, endDateYear, event.getDurationHour(),
244                     event.getDurationMinute(), event.getAllDay(),
245                     event.getTimeZoneSensitive(), event.getType(),
246                     event.getRepeating(), event.getRecurrenceObj(),
247                     event.getRemindBy(), event.getFirstReminder(),
248                     event.getSecondReminder(), serviceContext);
249             }
250         }
251         else {
252             CalEventLocalServiceUtil.addEvent(
253                 null, userId, event.getTitle(), event.getDescription(),
254                 startDateMonth, startDateDay, startDateYear, startDateHour,
255                 startDateMinute, endDateMonth, endDateDay, endDateYear,
256                 event.getDurationHour(), event.getDurationMinute(),
257                 event.getAllDay(), event.getTimeZoneSensitive(),
258                 event.getType(), event.getRepeating(), event.getRecurrenceObj(),
259                 event.getRemindBy(), event.getFirstReminder(),
260                 event.getSecondReminder(), serviceContext);
261         }
262     }
263 
264     private static final String _NAMESPACE = "calendar";
265 
266     private static final PortletDataHandlerBoolean _events =
267         new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
268 
269 }