1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.calendar.lar;
24  
25  import com.liferay.portal.SystemException;
26  import com.liferay.portal.kernel.util.CalendarFactoryUtil;
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.lar.BasePortletDataHandler;
31  import com.liferay.portal.lar.PortletDataContext;
32  import com.liferay.portal.lar.PortletDataException;
33  import com.liferay.portal.lar.PortletDataHandlerBoolean;
34  import com.liferay.portal.lar.PortletDataHandlerControl;
35  import com.liferay.portal.lar.PortletDataHandlerKeys;
36  import com.liferay.portal.service.ServiceContext;
37  import com.liferay.portal.util.PortletKeys;
38  import com.liferay.portlet.calendar.model.CalEvent;
39  import com.liferay.portlet.calendar.service.CalEventLocalServiceUtil;
40  import com.liferay.portlet.calendar.service.persistence.CalEventUtil;
41  
42  import java.util.Calendar;
43  import java.util.Date;
44  import java.util.List;
45  
46  import javax.portlet.PortletPreferences;
47  
48  /**
49   * <a href="CalendarPortletDataHandlerImpl.java.html"><b><i>View Source</i></b>
50   * </a>
51   *
52   * @author Bruno Farache
53   * @author Raymond Augé
54   *
55   */
56  public class CalendarPortletDataHandlerImpl extends BasePortletDataHandler {
57  
58      public PortletPreferences deleteData(
59              PortletDataContext context, String portletId,
60              PortletPreferences preferences)
61          throws PortletDataException {
62  
63          try {
64              if (!context.addPrimaryKey(
65                      CalendarPortletDataHandlerImpl.class, "deleteData")) {
66  
67                  CalEventLocalServiceUtil.deleteEvents(context.getGroupId());
68              }
69              return null;
70          }
71          catch (Exception e) {
72              throw new PortletDataException(e);
73          }
74      }
75  
76      public String exportData(
77              PortletDataContext context, String portletId,
78              PortletPreferences preferences)
79          throws PortletDataException {
80  
81          try {
82              Document doc = SAXReaderUtil.createDocument();
83  
84              Element root = doc.addElement("calendar-data");
85  
86              root.addAttribute("group-id", String.valueOf(context.getGroupId()));
87  
88              List<CalEvent> events = CalEventUtil.findByGroupId(
89                  context.getGroupId());
90  
91              for (CalEvent event : events) {
92                  exportEvent(context, root, event);
93              }
94  
95              return doc.formattedString();
96          }
97          catch (Exception e) {
98              throw new PortletDataException(e);
99          }
100     }
101 
102     public PortletDataHandlerControl[] getExportControls() {
103         return new PortletDataHandlerControl[] {_events};
104     }
105 
106     public PortletDataHandlerControl[] getImportControls() {
107         return new PortletDataHandlerControl[] {_events};
108     }
109 
110     public PortletPreferences importData(
111             PortletDataContext context, String portletId,
112             PortletPreferences preferences, String data)
113         throws PortletDataException {
114 
115         try {
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 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.addZipEntry(path, event);
162     }
163 
164     protected String getEventPath(PortletDataContext context, CalEvent event) {
165         StringBuilder sb = new StringBuilder();
166 
167         sb.append(context.getPortletPath(PortletKeys.CALENDAR));
168         sb.append("/events/");
169         sb.append(event.getEventId());
170         sb.append(".xml");
171 
172         return sb.toString();
173     }
174 
175     protected void importEvent(PortletDataContext context, CalEvent event)
176         throws Exception {
177 
178         long userId = context.getUserId(event.getUserUuid());
179 
180         Date startDate = event.getStartDate();
181 
182         int startDateMonth = 0;
183         int startDateDay = 0;
184         int startDateYear = 0;
185         int startDateHour = 0;
186         int startDateMinute = 0;
187 
188         if (startDate != null) {
189             Calendar startCal = CalendarFactoryUtil.getCalendar();
190 
191             startCal.setTime(startDate);
192 
193             startDateMonth = startCal.get(Calendar.MONTH);
194             startDateDay = startCal.get(Calendar.DATE);
195             startDateYear = startCal.get(Calendar.YEAR);
196             startDateHour = startCal.get(Calendar.HOUR);
197             startDateMinute = startCal.get(Calendar.MINUTE);
198 
199             if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
200                 startDateHour += 12;
201             }
202         }
203 
204         Date endDate = event.getEndDate();
205 
206         int endDateMonth = 0;
207         int endDateDay = 0;
208         int endDateYear = 0;
209 
210         if (endDate != null) {
211             Calendar endCal = CalendarFactoryUtil.getCalendar();
212 
213             endCal.setTime(endDate);
214 
215             endDateMonth = endCal.get(Calendar.MONTH);
216             endDateDay = endCal.get(Calendar.DATE);
217             endDateYear = endCal.get(Calendar.YEAR);
218         }
219 
220         ServiceContext serviceContext = new ServiceContext();
221 
222         serviceContext.setAddCommunityPermissions(true);
223         serviceContext.setAddGuestPermissions(true);
224         serviceContext.setScopeGroupId(context.getGroupId());
225 
226         CalEvent existingEvent = null;
227 
228         if (context.getDataStrategy().equals(
229                 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
230 
231             existingEvent = CalEventUtil.fetchByUUID_G(
232                 event.getUuid(), context.getGroupId());
233 
234             if (existingEvent == null) {
235                 CalEventLocalServiceUtil.addEvent(
236                     event.getUuid(), userId, event.getTitle(),
237                     event.getDescription(), startDateMonth, startDateDay,
238                     startDateYear, startDateHour, startDateMinute, endDateMonth,
239                     endDateDay, endDateYear, event.getDurationHour(),
240                     event.getDurationMinute(), event.getAllDay(),
241                     event.getTimeZoneSensitive(), event.getType(),
242                     event.getRepeating(), event.getRecurrenceObj(),
243                     event.getRemindBy(), event.getFirstReminder(),
244                     event.getSecondReminder(), serviceContext);
245             }
246             else {
247                 CalEventLocalServiceUtil.updateEvent(
248                     userId, existingEvent.getEventId(), event.getTitle(),
249                     event.getDescription(), startDateMonth, startDateDay,
250                     startDateYear, startDateHour, startDateMinute, endDateMonth,
251                     endDateDay, endDateYear, event.getDurationHour(),
252                     event.getDurationMinute(), event.getAllDay(),
253                     event.getTimeZoneSensitive(), event.getType(),
254                     event.getRepeating(), event.getRecurrenceObj(),
255                     event.getRemindBy(), event.getFirstReminder(),
256                     event.getSecondReminder());
257             }
258         }
259         else {
260             CalEventLocalServiceUtil.addEvent(
261                 userId, event.getTitle(), event.getDescription(),
262                 startDateMonth, startDateDay, startDateYear, startDateHour,
263                 startDateMinute, endDateMonth, endDateDay, endDateYear,
264                 event.getDurationHour(), event.getDurationMinute(),
265                 event.getAllDay(), event.getTimeZoneSensitive(),
266                 event.getType(), event.getRepeating(), event.getRecurrenceObj(),
267                 event.getRemindBy(), event.getFirstReminder(),
268                 event.getSecondReminder(), serviceContext);
269         }
270     }
271 
272     private static final String _NAMESPACE = "calendar";
273 
274     private static final PortletDataHandlerBoolean _events =
275         new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
276 
277 }