001
014
015 package com.liferay.portlet.calendar.lar;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.lar.BasePortletDataHandler;
020 import com.liferay.portal.kernel.lar.PortletDataContext;
021 import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
022 import com.liferay.portal.kernel.lar.PortletDataHandlerControl;
023 import com.liferay.portal.kernel.util.CalendarFactoryUtil;
024 import com.liferay.portal.kernel.util.StringBundler;
025 import com.liferay.portal.kernel.xml.Document;
026 import com.liferay.portal.kernel.xml.Element;
027 import com.liferay.portal.kernel.xml.SAXReaderUtil;
028 import com.liferay.portal.service.ServiceContext;
029 import com.liferay.portal.util.PortletKeys;
030 import com.liferay.portlet.calendar.model.CalEvent;
031 import com.liferay.portlet.calendar.service.CalEventLocalServiceUtil;
032 import com.liferay.portlet.calendar.service.persistence.CalEventUtil;
033
034 import java.util.Calendar;
035 import java.util.Date;
036 import java.util.List;
037
038 import javax.portlet.PortletPreferences;
039
040
044 public class CalendarPortletDataHandlerImpl extends BasePortletDataHandler {
045
046 @Override
047 public PortletDataHandlerControl[] getExportControls() {
048 return new PortletDataHandlerControl[] {
049 _events, _categories, _comments, _ratings, _tags
050 };
051 }
052
053 @Override
054 public PortletDataHandlerControl[] getImportControls() {
055 return new PortletDataHandlerControl[] {
056 _events, _categories, _comments, _ratings, _tags
057 };
058 }
059
060 @Override
061 public boolean isAlwaysExportable() {
062 return _ALWAYS_EXPORTABLE;
063 }
064
065 @Override
066 public boolean isPublishToLiveByDefault() {
067 return _PUBLISH_TO_LIVE_BY_DEFAULT;
068 }
069
070 @Override
071 protected PortletPreferences doDeleteData(
072 PortletDataContext portletDataContext, String portletId,
073 PortletPreferences portletPreferences)
074 throws Exception {
075
076 if (!portletDataContext.addPrimaryKey(
077 CalendarPortletDataHandlerImpl.class, "deleteData")) {
078
079 CalEventLocalServiceUtil.deleteEvents(
080 portletDataContext.getScopeGroupId());
081 }
082
083 return null;
084 }
085
086 @Override
087 protected String doExportData(
088 PortletDataContext portletDataContext, String portletId,
089 PortletPreferences portletPreferences)
090 throws Exception {
091
092 portletDataContext.addPermissions(
093 "com.liferay.portlet.calendar",
094 portletDataContext.getScopeGroupId());
095
096 Document document = SAXReaderUtil.createDocument();
097
098 Element rootElement = document.addElement("calendar-data");
099
100 rootElement.addAttribute(
101 "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
102
103 List<CalEvent> events = CalEventUtil.findByGroupId(
104 portletDataContext.getScopeGroupId());
105
106 for (CalEvent event : events) {
107 exportEvent(portletDataContext, rootElement, event);
108 }
109
110 return document.formattedString();
111 }
112
113 @Override
114 protected PortletPreferences doImportData(
115 PortletDataContext portletDataContext, String portletId,
116 PortletPreferences portletPreferences, String data)
117 throws Exception {
118
119 portletDataContext.importPermissions(
120 "com.liferay.portlet.calendar",
121 portletDataContext.getSourceGroupId(),
122 portletDataContext.getScopeGroupId());
123
124 Document document = SAXReaderUtil.read(data);
125
126 Element rootElement = document.getRootElement();
127
128 for (Element eventElement : rootElement.elements("event")) {
129 String path = eventElement.attributeValue("path");
130
131 if (!portletDataContext.isPathNotProcessed(path)) {
132 continue;
133 }
134
135 CalEvent event = (CalEvent)portletDataContext.getZipEntryAsObject(
136 path);
137
138 importEvent(portletDataContext, eventElement, event);
139 }
140
141 return null;
142 }
143
144 protected void exportEvent(
145 PortletDataContext portletDataContext, Element rootElement,
146 CalEvent event)
147 throws PortalException, SystemException {
148
149 if (!portletDataContext.isWithinDateRange(event.getModifiedDate())) {
150 return;
151 }
152
153 String path = getEventPath(portletDataContext, event);
154
155 if (!portletDataContext.isPathNotProcessed(path)) {
156 return;
157 }
158
159 Element eventElement = rootElement.addElement("event");
160
161 portletDataContext.addClassedModel(
162 eventElement, path, event, _NAMESPACE);
163 }
164
165 protected String getEventPath(
166 PortletDataContext portletDataContext, CalEvent event) {
167
168 StringBundler sb = new StringBundler(4);
169
170 sb.append(portletDataContext.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(
179 PortletDataContext portletDataContext, Element eventElement,
180 CalEvent event)
181 throws Exception {
182
183 long userId = portletDataContext.getUserId(event.getUserUuid());
184
185 Date startDate = event.getStartDate();
186
187 int startDateMonth = 0;
188 int startDateDay = 0;
189 int startDateYear = 0;
190 int startDateHour = 0;
191 int startDateMinute = 0;
192
193 if (startDate != null) {
194 Calendar startCal = CalendarFactoryUtil.getCalendar();
195
196 startCal.setTime(startDate);
197
198 startDateMonth = startCal.get(Calendar.MONTH);
199 startDateDay = startCal.get(Calendar.DATE);
200 startDateYear = startCal.get(Calendar.YEAR);
201 startDateHour = startCal.get(Calendar.HOUR);
202 startDateMinute = startCal.get(Calendar.MINUTE);
203
204 if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
205 startDateHour += 12;
206 }
207 }
208
209 Date endDate = event.getEndDate();
210
211 int endDateMonth = 0;
212 int endDateDay = 0;
213 int endDateYear = 0;
214
215 if (endDate != null) {
216 Calendar endCal = CalendarFactoryUtil.getCalendar();
217
218 endCal.setTime(endDate);
219
220 endDateMonth = endCal.get(Calendar.MONTH);
221 endDateDay = endCal.get(Calendar.DATE);
222 endDateYear = endCal.get(Calendar.YEAR);
223 }
224
225 ServiceContext serviceContext = portletDataContext.createServiceContext(
226 eventElement, event, _NAMESPACE);
227
228 CalEvent importedEvent = null;
229
230 if (portletDataContext.isDataStrategyMirror()) {
231 CalEvent existingEvent = CalEventUtil.fetchByUUID_G(
232 event.getUuid(), portletDataContext.getScopeGroupId());
233
234 if (existingEvent == null) {
235 serviceContext.setUuid(event.getUuid());
236
237 importedEvent = CalEventLocalServiceUtil.addEvent(
238 userId, event.getTitle(), event.getDescription(),
239 event.getLocation(), startDateMonth, startDateDay,
240 startDateYear, startDateHour, startDateMinute, endDateMonth,
241 endDateDay, endDateYear, event.getDurationHour(),
242 event.getDurationMinute(), event.getAllDay(),
243 event.getTimeZoneSensitive(), event.getType(),
244 event.getRepeating(), event.getRecurrenceObj(),
245 event.getRemindBy(), event.getFirstReminder(),
246 event.getSecondReminder(), serviceContext);
247 }
248 else {
249 importedEvent = CalEventLocalServiceUtil.updateEvent(
250 userId, existingEvent.getEventId(), event.getTitle(),
251 event.getDescription(), event.getLocation(), startDateMonth,
252 startDateDay, startDateYear, startDateHour, startDateMinute,
253 endDateMonth, endDateDay, endDateYear,
254 event.getDurationHour(), event.getDurationMinute(),
255 event.getAllDay(), event.getTimeZoneSensitive(),
256 event.getType(), event.getRepeating(),
257 event.getRecurrenceObj(), event.getRemindBy(),
258 event.getFirstReminder(), event.getSecondReminder(),
259 serviceContext);
260 }
261 }
262 else {
263 importedEvent = CalEventLocalServiceUtil.addEvent(
264 userId, event.getTitle(), event.getDescription(),
265 event.getLocation(), startDateMonth, startDateDay,
266 startDateYear, startDateHour, startDateMinute, endDateMonth,
267 endDateDay, endDateYear, event.getDurationHour(),
268 event.getDurationMinute(), event.getAllDay(),
269 event.getTimeZoneSensitive(), event.getType(),
270 event.getRepeating(), event.getRecurrenceObj(),
271 event.getRemindBy(), event.getFirstReminder(),
272 event.getSecondReminder(), serviceContext);
273 }
274
275 portletDataContext.importClassedModel(event, importedEvent, _NAMESPACE);
276 }
277
278 private static final boolean _ALWAYS_EXPORTABLE = true;
279
280 private static final String _NAMESPACE = "calendar";
281
282 private static final boolean _PUBLISH_TO_LIVE_BY_DEFAULT = true;
283
284 private static PortletDataHandlerBoolean _categories =
285 new PortletDataHandlerBoolean(_NAMESPACE, "categories");
286
287 private static PortletDataHandlerBoolean _comments =
288 new PortletDataHandlerBoolean(_NAMESPACE, "comments");
289
290 private static PortletDataHandlerBoolean _events =
291 new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
292
293 private static PortletDataHandlerBoolean _ratings =
294 new PortletDataHandlerBoolean(_NAMESPACE, "ratings");
295
296 private static PortletDataHandlerBoolean _tags =
297 new PortletDataHandlerBoolean(_NAMESPACE, "tags");
298
299 }