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.kernel.lar.PortletDataContext;
26  import com.liferay.portal.kernel.lar.PortletDataException;
27  import com.liferay.portal.kernel.lar.PortletDataHandler;
28  import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
29  import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
30  import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
31  import com.liferay.portal.kernel.util.CalendarFactoryUtil;
32  import com.liferay.portal.util.PortalUtil;
33  import com.liferay.portlet.calendar.model.CalEvent;
34  import com.liferay.portlet.calendar.service.CalEventLocalServiceUtil;
35  import com.liferay.portlet.calendar.service.persistence.CalEventUtil;
36  
37  import com.thoughtworks.xstream.XStream;
38  
39  import java.util.Calendar;
40  import java.util.Date;
41  import java.util.Iterator;
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   *
56   */
57  public class CalendarPortletDataHandlerImpl implements PortletDataHandler {
58  
59      public PortletPreferences deleteData(
60              PortletDataContext context, String portletId,
61              PortletPreferences prefs)
62          throws PortletDataException {
63  
64          try {
65  
66              // Events
67  
68              if (!context.addPrimaryKey(
69                      CalendarPortletDataHandlerImpl.class, "deleteData")) {
70  
71                  CalEventLocalServiceUtil.deleteEvents(context.getGroupId());
72              }
73              return null;
74          }
75          catch (Exception e) {
76              throw new PortletDataException(e);
77          }
78      }
79  
80      public String exportData(
81              PortletDataContext context, String portletId,
82              PortletPreferences prefs)
83          throws PortletDataException {
84  
85          try {
86              XStream xStream = new XStream();
87  
88              Document doc = DocumentHelper.createDocument();
89  
90              Element root = doc.addElement("calendar-data");
91  
92              root.addAttribute("group-id", String.valueOf(context.getGroupId()));
93  
94              // Events
95  
96              List events = CalEventUtil.findByGroupId(context.getGroupId());
97  
98              Iterator itr = events.iterator();
99  
100             while (itr.hasNext()) {
101                 CalEvent event = (CalEvent) itr.next();
102 
103                 if (context.addPrimaryKey(
104                         CalEvent.class, event.getPrimaryKeyObj())) {
105 
106                     itr.remove();
107                 }
108                 else {
109                     event.setUserUuid(event.getUserUuid());
110                 }
111             }
112 
113             String xml = xStream.toXML(events);
114 
115             Element el = root.addElement("calendar-events");
116 
117             Document tempDoc = PortalUtil.readDocumentFromXML(xml);
118 
119             el.content().add(tempDoc.getRootElement().createCopy());
120 
121             return doc.asXML();
122         }
123         catch (Exception e) {
124             throw new PortletDataException(e);
125         }
126     }
127 
128     public PortletDataHandlerControl[] getExportControls()
129         throws PortletDataException {
130 
131         return new PortletDataHandlerControl[] {_events};
132     }
133 
134     public PortletDataHandlerControl[] getImportControls()
135         throws PortletDataException {
136 
137         return new PortletDataHandlerControl[] {_events};
138     }
139 
140     public PortletPreferences importData(
141             PortletDataContext context, String portletId,
142             PortletPreferences prefs, String data)
143         throws PortletDataException {
144 
145         try {
146             XStream xStream = new XStream();
147 
148             Document doc = PortalUtil.readDocumentFromXML(data);
149 
150             Element root = doc.getRootElement();
151 
152             // Events
153 
154             Element el = root.element("calendar-events").element("list");
155 
156             Document tempDoc = DocumentHelper.createDocument();
157 
158             tempDoc.content().add(el.createCopy());
159 
160             List events = (List) xStream.fromXML(tempDoc.asXML());
161 
162             Iterator itr = events.iterator();
163 
164             while (itr.hasNext()) {
165                 CalEvent event = (CalEvent) itr.next();
166 
167                 importEvent(context, event);
168             }
169 
170             return null;
171         }
172         catch (Exception e) {
173             throw new PortletDataException(e);
174         }
175     }
176 
177     protected void importEvent(PortletDataContext context, CalEvent event)
178         throws Exception {
179 
180         long userId = context.getUserId(event.getUserUuid());
181         long plid = context.getPlid();
182 
183         Date startDate = event.getStartDate();
184 
185         int startDateMonth = 0;
186         int startDateDay = 0;
187         int startDateYear = 0;
188         int startDateHour = 0;
189         int startDateMinute = 0;
190 
191         if (startDate != null) {
192             Calendar startCal = CalendarFactoryUtil.getCalendar();
193 
194             startCal.setTime(startDate);
195 
196             startDateMonth = startCal.get(Calendar.MONTH);
197             startDateDay = startCal.get(Calendar.DATE);
198             startDateYear = startCal.get(Calendar.YEAR);
199             startDateHour = startCal.get(Calendar.HOUR);
200             startDateMinute = startCal.get(Calendar.MINUTE);
201         }
202 
203         Date endDate = event.getEndDate();
204 
205         int endDateMonth = 0;
206         int endDateDay = 0;
207         int endDateYear = 0;
208 
209         if (endDate != null) {
210             Calendar endCal = CalendarFactoryUtil.getCalendar();
211 
212             endCal.setTime(endDate);
213 
214             endDateMonth = endCal.get(Calendar.MONTH);
215             endDateDay = endCal.get(Calendar.DATE);
216             endDateYear = endCal.get(Calendar.YEAR);
217         }
218 
219         boolean addCommunityPermissions = true;
220         boolean addGuestPermissions = true;
221 
222         CalEvent existingEvent = null;
223 
224         if (context.getDataStrategy().equals(
225                 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
226 
227             existingEvent = CalEventUtil.fetchByUUID_G(
228                 event.getUuid(), context.getGroupId());
229 
230             if (existingEvent == null) {
231                 CalEventLocalServiceUtil.addEvent(
232                     event.getUuid(), userId, plid, event.getTitle(),
233                     event.getDescription(), startDateMonth, startDateDay,
234                     startDateYear, startDateHour, startDateMinute, endDateMonth,
235                     endDateDay, endDateYear, event.getDurationHour(),
236                     event.getDurationMinute(), event.getAllDay(),
237                     event.getTimeZoneSensitive(), event.getType(),
238                     event.getRepeating(), event.getRecurrenceObj(),
239                     event.getRemindBy(), event.getFirstReminder(),
240                     event.getSecondReminder(), addCommunityPermissions,
241                     addGuestPermissions);
242             }
243             else {
244                 CalEventLocalServiceUtil.updateEvent(
245                     userId, existingEvent.getEventId(), event.getTitle(),
246                     event.getDescription(), startDateMonth, startDateDay,
247                     startDateYear, startDateHour, startDateMinute, endDateMonth,
248                     endDateDay, endDateYear, event.getDurationHour(),
249                     event.getDurationMinute(), event.getAllDay(),
250                     event.getTimeZoneSensitive(), event.getType(),
251                     event.getRepeating(), event.getRecurrenceObj(),
252                     event.getRemindBy(), event.getFirstReminder(),
253                     event.getSecondReminder());
254             }
255         }
256         else {
257             CalEventLocalServiceUtil.addEvent(
258                 userId, plid, event.getTitle(), event.getDescription(),
259                 startDateMonth, startDateDay, startDateYear, startDateHour,
260                 startDateMinute, endDateMonth, endDateDay, endDateYear,
261                 event.getDurationHour(), event.getDurationMinute(),
262                 event.getAllDay(), event.getTimeZoneSensitive(),
263                 event.getType(), event.getRepeating(), event.getRecurrenceObj(),
264                 event.getRemindBy(), event.getFirstReminder(),
265                 event.getSecondReminder(), addCommunityPermissions,
266                 addGuestPermissions);
267         }
268     }
269 
270     private static final String _NAMESPACE = "calendar";
271 
272     private static final PortletDataHandlerBoolean _events =
273         new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
274 
275 }