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