1   /**
2    * Copyright (c) 2000-2008 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.lar.PortletDataContext;
27  import com.liferay.portal.kernel.lar.PortletDataException;
28  import com.liferay.portal.kernel.lar.PortletDataHandler;
29  import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
30  import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
31  import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
32  import com.liferay.portal.kernel.util.CalendarFactoryUtil;
33  import com.liferay.portal.util.DocumentUtil;
34  import com.liferay.portal.util.PortletKeys;
35  import com.liferay.portlet.calendar.model.CalEvent;
36  import com.liferay.portlet.calendar.service.CalEventLocalServiceUtil;
37  import com.liferay.portlet.calendar.service.persistence.CalEventUtil;
38  import com.liferay.util.xml.XMLFormatter;
39  
40  import java.util.Calendar;
41  import java.util.Date;
42  import java.util.List;
43  
44  import javax.portlet.PortletPreferences;
45  
46  import org.dom4j.Document;
47  import org.dom4j.DocumentHelper;
48  import org.dom4j.Element;
49  
50  /**
51   * <a href="CalendarPortletDataHandlerImpl.java.html"><b><i>View Source</i></b>
52   * </a>
53   *
54   * @author Bruno Farache
55   * @author Raymond Augé
56   *
57   */
58  public class CalendarPortletDataHandlerImpl implements PortletDataHandler {
59  
60      public PortletPreferences deleteData(
61              PortletDataContext context, String portletId,
62              PortletPreferences prefs)
63          throws PortletDataException {
64  
65          try {
66              if (!context.addPrimaryKey(
67                      CalendarPortletDataHandlerImpl.class, "deleteData")) {
68  
69                  CalEventLocalServiceUtil.deleteEvents(context.getGroupId());
70              }
71              return null;
72          }
73          catch (Exception e) {
74              throw new PortletDataException(e);
75          }
76      }
77  
78      public String exportData(
79              PortletDataContext context, String portletId,
80              PortletPreferences prefs)
81          throws PortletDataException {
82  
83          try {
84              Document doc = DocumentHelper.createDocument();
85  
86              Element root = doc.addElement("calendar-data");
87  
88              root.addAttribute("group-id", String.valueOf(context.getGroupId()));
89  
90              List<CalEvent> events = CalEventUtil.findByGroupId(
91                  context.getGroupId());
92  
93              for (CalEvent event : events) {
94                  exportEvent(context, root, event);
95              }
96  
97              return XMLFormatter.toString(doc);
98          }
99          catch (Exception e) {
100             throw new PortletDataException(e);
101         }
102     }
103 
104     public PortletDataHandlerControl[] getExportControls() {
105         return new PortletDataHandlerControl[] {_events};
106     }
107 
108     public PortletDataHandlerControl[] getImportControls() {
109         return new PortletDataHandlerControl[] {_events};
110     }
111 
112     public PortletPreferences importData(
113             PortletDataContext context, String portletId,
114             PortletPreferences prefs, String data)
115         throws PortletDataException {
116 
117         try {
118             Document doc = DocumentUtil.readDocumentFromXML(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                     CalEvent event = (CalEvent)context.getZipEntryAsObject(
129                         path);
130 
131                     importEvent(context, event);
132                 }
133             }
134 
135             return null;
136         }
137         catch (Exception e) {
138             throw new PortletDataException(e);
139         }
140     }
141 
142     public boolean isPublishToLiveByDefault() {
143         return false;
144     }
145 
146     protected void exportEvent(
147             PortletDataContext context, Element root, CalEvent event)
148         throws SystemException {
149 
150         if (!context.isWithinDateRange(event.getModifiedDate())) {
151             return;
152         }
153 
154         String path = getEventPath(context, event);
155 
156         Element eventEl = root.addElement("event");
157 
158         eventEl.addAttribute("path", path);
159 
160         if (context.isPathNotProcessed(path)) {
161             event.setUserUuid(event.getUserUuid());
162 
163             context.addZipEntry(path, event);
164         }
165     }
166 
167     protected String getEventPath(PortletDataContext context, CalEvent event) {
168         StringBuilder sb = new StringBuilder();
169 
170         sb.append(context.getPortletPath(PortletKeys.CALENDAR));
171         sb.append("/events/");
172         sb.append(event.getEventId());
173         sb.append(".xml");
174 
175         return sb.toString();
176     }
177 
178     protected void importEvent(PortletDataContext context, CalEvent event)
179         throws Exception {
180 
181         long userId = context.getUserId(event.getUserUuid());
182         long plid = context.getPlid();
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         boolean addCommunityPermissions = true;
225         boolean addGuestPermissions = true;
226 
227         CalEvent existingEvent = null;
228 
229         if (context.getDataStrategy().equals(
230                 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
231 
232             existingEvent = CalEventUtil.fetchByUUID_G(
233                 event.getUuid(), context.getGroupId());
234 
235             if (existingEvent == null) {
236                 CalEventLocalServiceUtil.addEvent(
237                     event.getUuid(), userId, plid, event.getTitle(),
238                     event.getDescription(), startDateMonth, startDateDay,
239                     startDateYear, startDateHour, startDateMinute, endDateMonth,
240                     endDateDay, endDateYear, event.getDurationHour(),
241                     event.getDurationMinute(), event.getAllDay(),
242                     event.getTimeZoneSensitive(), event.getType(),
243                     event.getRepeating(), event.getRecurrenceObj(),
244                     event.getRemindBy(), event.getFirstReminder(),
245                     event.getSecondReminder(), addCommunityPermissions,
246                     addGuestPermissions);
247             }
248             else {
249                 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());
259             }
260         }
261         else {
262             CalEventLocalServiceUtil.addEvent(
263                 userId, plid, 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(), addCommunityPermissions,
271                 addGuestPermissions);
272         }
273     }
274 
275     private static final String _NAMESPACE = "calendar";
276 
277     private static final PortletDataHandlerBoolean _events =
278         new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
279 
280 }