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