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