1   /**
2    * Copyright (c) 2000-2009 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   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17   * SOFTWARE.
18   */
19  
20  package com.liferay.portlet.calendar.lar;
21  
22  import com.liferay.portal.SystemException;
23  import com.liferay.portal.kernel.util.CalendarFactoryUtil;
24  import com.liferay.portal.kernel.xml.Document;
25  import com.liferay.portal.kernel.xml.Element;
26  import com.liferay.portal.kernel.xml.SAXReaderUtil;
27  import com.liferay.portal.lar.BasePortletDataHandler;
28  import com.liferay.portal.lar.PortletDataContext;
29  import com.liferay.portal.lar.PortletDataException;
30  import com.liferay.portal.lar.PortletDataHandlerBoolean;
31  import com.liferay.portal.lar.PortletDataHandlerControl;
32  import com.liferay.portal.lar.PortletDataHandlerKeys;
33  import com.liferay.portal.service.ServiceContext;
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  
39  import java.util.Calendar;
40  import java.util.Date;
41  import java.util.List;
42  
43  import javax.portlet.PortletPreferences;
44  
45  /**
46   * <a href="CalendarPortletDataHandlerImpl.java.html"><b><i>View Source</i></b>
47   * </a>
48   *
49   * @author Bruno Farache
50   * @author Raymond Augé
51   *
52   */
53  public class CalendarPortletDataHandlerImpl extends BasePortletDataHandler {
54  
55      public PortletPreferences deleteData(
56              PortletDataContext context, String portletId,
57              PortletPreferences preferences)
58          throws PortletDataException {
59  
60          try {
61              if (!context.addPrimaryKey(
62                      CalendarPortletDataHandlerImpl.class, "deleteData")) {
63  
64                  CalEventLocalServiceUtil.deleteEvents(context.getGroupId());
65              }
66              return null;
67          }
68          catch (Exception e) {
69              throw new PortletDataException(e);
70          }
71      }
72  
73      public String exportData(
74              PortletDataContext context, String portletId,
75              PortletPreferences preferences)
76          throws PortletDataException {
77  
78          try {
79              Document doc = SAXReaderUtil.createDocument();
80  
81              Element root = doc.addElement("calendar-data");
82  
83              root.addAttribute("group-id", String.valueOf(context.getGroupId()));
84  
85              List<CalEvent> events = CalEventUtil.findByGroupId(
86                  context.getGroupId());
87  
88              for (CalEvent event : events) {
89                  exportEvent(context, root, event);
90              }
91  
92              return doc.formattedString();
93          }
94          catch (Exception e) {
95              throw new PortletDataException(e);
96          }
97      }
98  
99      public PortletDataHandlerControl[] getExportControls() {
100         return new PortletDataHandlerControl[] {_events};
101     }
102 
103     public PortletDataHandlerControl[] getImportControls() {
104         return new PortletDataHandlerControl[] {_events};
105     }
106 
107     public PortletPreferences importData(
108             PortletDataContext context, String portletId,
109             PortletPreferences preferences, String data)
110         throws PortletDataException {
111 
112         try {
113             Document doc = SAXReaderUtil.read(data);
114 
115             Element root = doc.getRootElement();
116 
117             List<Element> eventsEl = root.elements("event");
118 
119             for (Element eventEl : eventsEl) {
120                 String path = eventEl.attributeValue("path");
121 
122                 if (!context.isPathNotProcessed(path)) {
123                     continue;
124                 }
125 
126                 CalEvent event = (CalEvent)context.getZipEntryAsObject(path);
127 
128                 importEvent(context, event);
129             }
130 
131             return null;
132         }
133         catch (Exception e) {
134             throw new PortletDataException(e);
135         }
136     }
137 
138     protected void exportEvent(
139             PortletDataContext context, Element root, CalEvent event)
140         throws SystemException {
141 
142         if (!context.isWithinDateRange(event.getModifiedDate())) {
143             return;
144         }
145 
146         String path = getEventPath(context, event);
147 
148         if (!context.isPathNotProcessed(path)) {
149             return;
150         }
151 
152         Element eventEl = root.addElement("event");
153 
154         eventEl.addAttribute("path", path);
155 
156         event.setUserUuid(event.getUserUuid());
157 
158         context.addZipEntry(path, event);
159     }
160 
161     protected String getEventPath(PortletDataContext context, CalEvent event) {
162         StringBuilder sb = new StringBuilder();
163 
164         sb.append(context.getPortletPath(PortletKeys.CALENDAR));
165         sb.append("/events/");
166         sb.append(event.getEventId());
167         sb.append(".xml");
168 
169         return sb.toString();
170     }
171 
172     protected void importEvent(PortletDataContext context, CalEvent event)
173         throws Exception {
174 
175         long userId = context.getUserId(event.getUserUuid());
176 
177         Date startDate = event.getStartDate();
178 
179         int startDateMonth = 0;
180         int startDateDay = 0;
181         int startDateYear = 0;
182         int startDateHour = 0;
183         int startDateMinute = 0;
184 
185         if (startDate != null) {
186             Calendar startCal = CalendarFactoryUtil.getCalendar();
187 
188             startCal.setTime(startDate);
189 
190             startDateMonth = startCal.get(Calendar.MONTH);
191             startDateDay = startCal.get(Calendar.DATE);
192             startDateYear = startCal.get(Calendar.YEAR);
193             startDateHour = startCal.get(Calendar.HOUR);
194             startDateMinute = startCal.get(Calendar.MINUTE);
195 
196             if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
197                 startDateHour += 12;
198             }
199         }
200 
201         Date endDate = event.getEndDate();
202 
203         int endDateMonth = 0;
204         int endDateDay = 0;
205         int endDateYear = 0;
206 
207         if (endDate != null) {
208             Calendar endCal = CalendarFactoryUtil.getCalendar();
209 
210             endCal.setTime(endDate);
211 
212             endDateMonth = endCal.get(Calendar.MONTH);
213             endDateDay = endCal.get(Calendar.DATE);
214             endDateYear = endCal.get(Calendar.YEAR);
215         }
216 
217         ServiceContext serviceContext = new ServiceContext();
218 
219         serviceContext.setAddCommunityPermissions(true);
220         serviceContext.setAddGuestPermissions(true);
221         serviceContext.setScopeGroupId(context.getGroupId());
222 
223         CalEvent existingEvent = null;
224 
225         if (context.getDataStrategy().equals(
226                 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
227 
228             existingEvent = CalEventUtil.fetchByUUID_G(
229                 event.getUuid(), context.getGroupId());
230 
231             if (existingEvent == null) {
232                 CalEventLocalServiceUtil.addEvent(
233                     event.getUuid(), userId, event.getTitle(),
234                     event.getDescription(), startDateMonth, startDateDay,
235                     startDateYear, startDateHour, startDateMinute, endDateMonth,
236                     endDateDay, endDateYear, event.getDurationHour(),
237                     event.getDurationMinute(), event.getAllDay(),
238                     event.getTimeZoneSensitive(), event.getType(),
239                     event.getRepeating(), event.getRecurrenceObj(),
240                     event.getRemindBy(), event.getFirstReminder(),
241                     event.getSecondReminder(), serviceContext);
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(), serviceContext);
254             }
255         }
256         else {
257             CalEventLocalServiceUtil.addEvent(
258                 userId, 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(), serviceContext);
266         }
267     }
268 
269     private static final String _NAMESPACE = "calendar";
270 
271     private static final PortletDataHandlerBoolean _events =
272         new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
273 
274 }