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