1
14
15 package com.liferay.portlet.calendar.lar;
16
17 import com.liferay.portal.kernel.exception.PortalException;
18 import com.liferay.portal.kernel.exception.SystemException;
19 import com.liferay.portal.kernel.lar.BasePortletDataHandler;
20 import com.liferay.portal.kernel.lar.PortletDataContext;
21 import com.liferay.portal.kernel.lar.PortletDataException;
22 import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
23 import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
24 import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
25 import com.liferay.portal.kernel.util.CalendarFactoryUtil;
26 import com.liferay.portal.kernel.util.StringBundler;
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.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
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(context.getGroupId());
61 }
62 return null;
63 }
64 catch (Exception e) {
65 throw new PortletDataException(e);
66 }
67 }
68
69 public String exportData(
70 PortletDataContext context, String portletId,
71 PortletPreferences preferences)
72 throws PortletDataException {
73
74 try {
75 context.addPermissions(
76 "com.liferay.portlet.calendar", context.getGroupId());
77
78 Document doc = SAXReaderUtil.createDocument();
79
80 Element root = doc.addElement("calendar-data");
81
82 root.addAttribute("group-id", String.valueOf(context.getGroupId()));
83
84 List<CalEvent> events = CalEventUtil.findByGroupId(
85 context.getGroupId());
86
87 for (CalEvent event : events) {
88 exportEvent(context, root, event);
89 }
90
91 return doc.formattedString();
92 }
93 catch (Exception e) {
94 throw new PortletDataException(e);
95 }
96 }
97
98 public PortletDataHandlerControl[] getExportControls() {
99 return new PortletDataHandlerControl[] {
100 _events, _categories, _comments, _tags
101 };
102 }
103
104 public PortletDataHandlerControl[] getImportControls() {
105 return new PortletDataHandlerControl[] {
106 _events, _categories, _comments, _tags
107 };
108 }
109
110 public PortletPreferences importData(
111 PortletDataContext context, String portletId,
112 PortletPreferences preferences, String data)
113 throws PortletDataException {
114
115 try {
116 context.importPermissions(
117 "com.liferay.portlet.calendar", context.getSourceGroupId(),
118 context.getGroupId());
119
120 Document doc = SAXReaderUtil.read(data);
121
122 Element root = doc.getRootElement();
123
124 List<Element> eventsEl = root.elements("event");
125
126 for (Element eventEl : eventsEl) {
127 String path = eventEl.attributeValue("path");
128
129 if (!context.isPathNotProcessed(path)) {
130 continue;
131 }
132
133 CalEvent event = (CalEvent)context.getZipEntryAsObject(path);
134
135 importEvent(context, event);
136 }
137
138 return null;
139 }
140 catch (Exception e) {
141 throw new PortletDataException(e);
142 }
143 }
144
145 protected void exportEvent(
146 PortletDataContext context, Element root, CalEvent event)
147 throws PortalException, SystemException {
148
149 if (!context.isWithinDateRange(event.getModifiedDate())) {
150 return;
151 }
152
153 String path = getEventPath(context, event);
154
155 if (!context.isPathNotProcessed(path)) {
156 return;
157 }
158
159 Element eventEl = root.addElement("event");
160
161 eventEl.addAttribute("path", path);
162
163 event.setUserUuid(event.getUserUuid());
164
165 context.addPermissions(CalEvent.class, event.getEventId());
166
167 if (context.getBooleanParameter(_NAMESPACE, "categories")) {
168 context.addAssetCategories(CalEvent.class, event.getEventId());
169 }
170
171 if (context.getBooleanParameter(_NAMESPACE, "comments")) {
172 context.addComments(CalEvent.class, event.getEventId());
173 }
174
175 if (context.getBooleanParameter(_NAMESPACE, "tags")) {
176 context.addAssetTags(CalEvent.class, event.getEventId());
177 }
178
179 context.addZipEntry(path, event);
180 }
181
182 protected String getEventPath(PortletDataContext context, CalEvent event) {
183 StringBundler sb = new StringBundler(4);
184
185 sb.append(context.getPortletPath(PortletKeys.CALENDAR));
186 sb.append("/events/");
187 sb.append(event.getEventId());
188 sb.append(".xml");
189
190 return sb.toString();
191 }
192
193 protected void importEvent(PortletDataContext context, CalEvent event)
194 throws Exception {
195
196 long userId = context.getUserId(event.getUserUuid());
197
198 Date startDate = event.getStartDate();
199
200 int startDateMonth = 0;
201 int startDateDay = 0;
202 int startDateYear = 0;
203 int startDateHour = 0;
204 int startDateMinute = 0;
205
206 if (startDate != null) {
207 Calendar startCal = CalendarFactoryUtil.getCalendar();
208
209 startCal.setTime(startDate);
210
211 startDateMonth = startCal.get(Calendar.MONTH);
212 startDateDay = startCal.get(Calendar.DATE);
213 startDateYear = startCal.get(Calendar.YEAR);
214 startDateHour = startCal.get(Calendar.HOUR);
215 startDateMinute = startCal.get(Calendar.MINUTE);
216
217 if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
218 startDateHour += 12;
219 }
220 }
221
222 Date endDate = event.getEndDate();
223
224 int endDateMonth = 0;
225 int endDateDay = 0;
226 int endDateYear = 0;
227
228 if (endDate != null) {
229 Calendar endCal = CalendarFactoryUtil.getCalendar();
230
231 endCal.setTime(endDate);
232
233 endDateMonth = endCal.get(Calendar.MONTH);
234 endDateDay = endCal.get(Calendar.DATE);
235 endDateYear = endCal.get(Calendar.YEAR);
236 }
237
238 long[] assetCategoryIds = null;
239 String[] assetTagNames = null;
240
241 if (context.getBooleanParameter(_NAMESPACE, "categories")) {
242 assetCategoryIds = context.getAssetCategoryIds(
243 CalEvent.class, event.getEventId());
244 }
245
246 if (context.getBooleanParameter(_NAMESPACE, "tags")) {
247 assetTagNames = context.getAssetTagNames(
248 CalEvent.class, event.getEventId());
249 }
250
251 ServiceContext serviceContext = new ServiceContext();
252
253 serviceContext.setAddCommunityPermissions(true);
254 serviceContext.setAddGuestPermissions(true);
255 serviceContext.setAssetCategoryIds(assetCategoryIds);
256 serviceContext.setAssetTagNames(assetTagNames);
257 serviceContext.setCreateDate(event.getCreateDate());
258 serviceContext.setModifiedDate(event.getModifiedDate());
259 serviceContext.setScopeGroupId(context.getGroupId());
260
261 CalEvent importedEvent = null;
262
263 if (context.getDataStrategy().equals(
264 PortletDataHandlerKeys.DATA_STRATEGY_MIRROR)) {
265
266 CalEvent existingEvent = CalEventUtil.fetchByUUID_G(
267 event.getUuid(), context.getGroupId());
268
269 if (existingEvent == null) {
270 importedEvent = CalEventLocalServiceUtil.addEvent(
271 event.getUuid(), userId, event.getTitle(),
272 event.getDescription(), startDateMonth, startDateDay,
273 startDateYear, startDateHour, startDateMinute, endDateMonth,
274 endDateDay, endDateYear, event.getDurationHour(),
275 event.getDurationMinute(), event.getAllDay(),
276 event.getTimeZoneSensitive(), event.getType(),
277 event.getRepeating(), event.getRecurrenceObj(),
278 event.getRemindBy(), event.getFirstReminder(),
279 event.getSecondReminder(), serviceContext);
280 }
281 else {
282 importedEvent = CalEventLocalServiceUtil.updateEvent(
283 userId, existingEvent.getEventId(), event.getTitle(),
284 event.getDescription(), startDateMonth, startDateDay,
285 startDateYear, startDateHour, startDateMinute, endDateMonth,
286 endDateDay, endDateYear, event.getDurationHour(),
287 event.getDurationMinute(), event.getAllDay(),
288 event.getTimeZoneSensitive(), event.getType(),
289 event.getRepeating(), event.getRecurrenceObj(),
290 event.getRemindBy(), event.getFirstReminder(),
291 event.getSecondReminder(), serviceContext);
292 }
293 }
294 else {
295 importedEvent = CalEventLocalServiceUtil.addEvent(
296 null, userId, event.getTitle(), event.getDescription(),
297 startDateMonth, startDateDay, startDateYear, startDateHour,
298 startDateMinute, endDateMonth, endDateDay, endDateYear,
299 event.getDurationHour(), event.getDurationMinute(),
300 event.getAllDay(), event.getTimeZoneSensitive(),
301 event.getType(), event.getRepeating(), event.getRecurrenceObj(),
302 event.getRemindBy(), event.getFirstReminder(),
303 event.getSecondReminder(), serviceContext);
304 }
305
306 context.importPermissions(
307 CalEvent.class, event.getEventId(), importedEvent.getEventId());
308
309 if (context.getBooleanParameter(_NAMESPACE, "comments")) {
310 context.importComments(
311 CalEvent.class, event.getEventId(), importedEvent.getEventId(),
312 context.getGroupId());
313 }
314 }
315
316 private static final String _NAMESPACE = "calendar";
317
318 private static PortletDataHandlerBoolean _categories =
319 new PortletDataHandlerBoolean(_NAMESPACE, "categories");
320
321 private static PortletDataHandlerBoolean _comments =
322 new PortletDataHandlerBoolean(_NAMESPACE, "comments");
323
324 private static PortletDataHandlerBoolean _events =
325 new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
326
327 private static PortletDataHandlerBoolean _tags =
328 new PortletDataHandlerBoolean(_NAMESPACE, "tags");
329
330 }