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 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,
241 event.getDurationHour(), event.getDurationMinute(),
242 event.isAllDay(), event.isTimeZoneSensitive(),
243 event.getType(), event.getRepeating(),
244 event.getRecurrenceObj(), event.getRemindBy(),
245 event.getFirstReminder(), event.getSecondReminder(),
246 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 event.getDurationHour(), event.getDurationMinute(),
254 event.isAllDay(), event.isTimeZoneSensitive(),
255 event.getType(), event.getRepeating(),
256 event.getRecurrenceObj(), event.getRemindBy(),
257 event.getFirstReminder(), event.getSecondReminder(),
258 serviceContext);
259 }
260 }
261 else {
262 importedEvent = CalEventLocalServiceUtil.addEvent(
263 userId, event.getTitle(), event.getDescription(),
264 event.getLocation(), startDateMonth, startDateDay,
265 startDateYear, startDateHour, startDateMinute,
266 event.getDurationHour(), event.getDurationMinute(),
267 event.isAllDay(), event.isTimeZoneSensitive(), event.getType(),
268 event.getRepeating(), event.getRecurrenceObj(),
269 event.getRemindBy(), event.getFirstReminder(),
270 event.getSecondReminder(), serviceContext);
271 }
272
273 portletDataContext.importClassedModel(event, importedEvent, _NAMESPACE);
274 }
275
276 private static final boolean _ALWAYS_EXPORTABLE = true;
277
278 private static final String _NAMESPACE = "calendar";
279
280 private static final boolean _PUBLISH_TO_LIVE_BY_DEFAULT = true;
281
282 private static PortletDataHandlerBoolean _events =
283 new PortletDataHandlerBoolean(_NAMESPACE, "events", true, true);
284
285 private static PortletDataHandlerControl[] _metadataControls =
286 new PortletDataHandlerControl[] {
287 new PortletDataHandlerBoolean(_NAMESPACE, "categories"),
288 new PortletDataHandlerBoolean(_NAMESPACE, "comments"),
289 new PortletDataHandlerBoolean(_NAMESPACE, "ratings"),
290 new PortletDataHandlerBoolean(_NAMESPACE, "tags")
291 };
292
293 }