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.ExportImportPathUtil;
021 import com.liferay.portal.kernel.lar.PortletDataContext;
022 import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
023 import com.liferay.portal.kernel.lar.StagedModelType;
024 import com.liferay.portal.kernel.util.CalendarFactoryUtil;
025 import com.liferay.portal.kernel.util.LocaleUtil;
026 import com.liferay.portal.kernel.util.StringBundler;
027 import com.liferay.portal.kernel.util.StringPool;
028 import com.liferay.portal.kernel.util.TimeZoneUtil;
029 import com.liferay.portal.kernel.xml.Element;
030 import com.liferay.portal.model.User;
031 import com.liferay.portal.service.ServiceContext;
032 import com.liferay.portal.service.UserLocalServiceUtil;
033 import com.liferay.portal.util.PortletKeys;
034 import com.liferay.portal.util.PropsValues;
035 import com.liferay.portlet.calendar.model.CalEvent;
036 import com.liferay.portlet.calendar.service.CalEventLocalServiceUtil;
037 import com.liferay.portlet.calendar.service.permission.CalendarPermission;
038 import com.liferay.portlet.calendar.service.persistence.CalEventUtil;
039
040 import java.util.Calendar;
041 import java.util.Date;
042 import java.util.List;
043 import java.util.Locale;
044 import java.util.TimeZone;
045
046 import javax.portlet.PortletPreferences;
047
048
052 public class CalendarPortletDataHandler extends BasePortletDataHandler {
053
054 public static final String NAMESPACE = "calendar";
055
056 public CalendarPortletDataHandler() {
057 setDeletionSystemEventStagedModelTypes(
058 new StagedModelType(CalEvent.class));
059 setExportControls(
060 new PortletDataHandlerBoolean(
061 NAMESPACE, "events", true, true, null,
062 CalEvent.class.getName()));
063 setPublishToLiveByDefault(
064 PropsValues.CALENDAR_PUBLISH_TO_LIVE_BY_DEFAULT);
065 }
066
067 @Override
068 protected PortletPreferences doDeleteData(
069 PortletDataContext portletDataContext, String portletId,
070 PortletPreferences portletPreferences)
071 throws Exception {
072
073 if (portletDataContext.addPrimaryKey(
074 CalendarPortletDataHandler.class, "deleteData")) {
075
076 return portletPreferences;
077 }
078
079 CalEventLocalServiceUtil.deleteEvents(
080 portletDataContext.getScopeGroupId());
081
082 return portletPreferences;
083 }
084
085 @Override
086 protected String doExportData(
087 PortletDataContext portletDataContext, String portletId,
088 PortletPreferences portletPreferences)
089 throws Exception {
090
091 portletDataContext.addPermissions(
092 CalendarPermission.RESOURCE_NAME,
093 portletDataContext.getScopeGroupId());
094
095 Element rootElement = addExportDataRootElement(portletDataContext);
096
097 rootElement.addAttribute(
098 "group-id", String.valueOf(portletDataContext.getScopeGroupId()));
099
100 List<CalEvent> events = CalEventUtil.findByGroupId(
101 portletDataContext.getScopeGroupId());
102
103 for (CalEvent event : events) {
104 exportEvent(portletDataContext, rootElement, event);
105 }
106
107 return getExportDataRootElementString(rootElement);
108 }
109
110 @Override
111 protected PortletPreferences doImportData(
112 PortletDataContext portletDataContext, String portletId,
113 PortletPreferences portletPreferences, String data)
114 throws Exception {
115
116 portletDataContext.importPermissions(
117 CalendarPermission.RESOURCE_NAME,
118 portletDataContext.getSourceGroupId(),
119 portletDataContext.getScopeGroupId());
120
121 Element rootElement = portletDataContext.getImportDataRootElement();
122
123 for (Element eventElement : rootElement.elements("event")) {
124 String path = eventElement.attributeValue("path");
125
126 if (!portletDataContext.isPathNotProcessed(path)) {
127 continue;
128 }
129
130 CalEvent event = (CalEvent)portletDataContext.getZipEntryAsObject(
131 path);
132
133 importEvent(portletDataContext, eventElement, event);
134 }
135
136 return null;
137 }
138
139 protected void exportEvent(
140 PortletDataContext portletDataContext, Element rootElement,
141 CalEvent event)
142 throws PortalException, SystemException {
143
144 if (!portletDataContext.isWithinDateRange(event.getModifiedDate())) {
145 return;
146 }
147
148 String path = getEventPath(portletDataContext, event);
149
150 if (!portletDataContext.isPathNotProcessed(path)) {
151 return;
152 }
153
154 Element eventElement = rootElement.addElement("event");
155
156 portletDataContext.addClassedModel(eventElement, path, event);
157 }
158
159 protected String getEventPath(
160 PortletDataContext portletDataContext, CalEvent event) {
161
162 StringBundler sb = new StringBundler(4);
163
164 sb.append(
165 ExportImportPathUtil.getPortletPath(
166 portletDataContext, 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(
175 PortletDataContext portletDataContext, Element eventElement,
176 CalEvent event)
177 throws Exception {
178
179 long userId = portletDataContext.getUserId(event.getUserUuid());
180
181 Date startDate = event.getStartDate();
182
183 int startDateMonth = 0;
184 int startDateDay = 0;
185 int startDateYear = 0;
186 int startDateHour = 0;
187 int startDateMinute = 0;
188
189 if (startDate != null) {
190 Locale locale = null;
191 TimeZone timeZone = null;
192
193 if (event.getTimeZoneSensitive()) {
194 User user = UserLocalServiceUtil.getUser(userId);
195
196 locale = user.getLocale();
197 timeZone = user.getTimeZone();
198 }
199 else {
200 locale = LocaleUtil.getSiteDefault();
201 timeZone = TimeZoneUtil.getTimeZone(StringPool.UTC);
202 }
203
204 Calendar startCal = CalendarFactoryUtil.getCalendar(
205 timeZone, locale);
206
207 startCal.setTime(startDate);
208
209 startDateMonth = startCal.get(Calendar.MONTH);
210 startDateDay = startCal.get(Calendar.DATE);
211 startDateYear = startCal.get(Calendar.YEAR);
212 startDateHour = startCal.get(Calendar.HOUR);
213 startDateMinute = startCal.get(Calendar.MINUTE);
214
215 if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
216 startDateHour += 12;
217 }
218 }
219
220 ServiceContext serviceContext = portletDataContext.createServiceContext(
221 eventElement, event);
222
223 CalEvent importedEvent = null;
224
225 if (portletDataContext.isDataStrategyMirror()) {
226 CalEvent existingEvent = CalEventUtil.fetchByUUID_G(
227 event.getUuid(), portletDataContext.getScopeGroupId());
228
229 if (existingEvent == null) {
230 serviceContext.setUuid(event.getUuid());
231
232 importedEvent = CalEventLocalServiceUtil.addEvent(
233 userId, event.getTitle(), event.getDescription(),
234 event.getLocation(), startDateMonth, startDateDay,
235 startDateYear, startDateHour, startDateMinute,
236 event.getDurationHour(), event.getDurationMinute(),
237 event.isAllDay(), event.isTimeZoneSensitive(),
238 event.getType(), event.getRepeating(),
239 event.getRecurrenceObj(), event.getRemindBy(),
240 event.getFirstReminder(), event.getSecondReminder(),
241 serviceContext);
242 }
243 else {
244 importedEvent = CalEventLocalServiceUtil.updateEvent(
245 userId, existingEvent.getEventId(), event.getTitle(),
246 event.getDescription(), event.getLocation(), startDateMonth,
247 startDateDay, startDateYear, startDateHour, startDateMinute,
248 event.getDurationHour(), event.getDurationMinute(),
249 event.isAllDay(), event.isTimeZoneSensitive(),
250 event.getType(), event.getRepeating(),
251 event.getRecurrenceObj(), event.getRemindBy(),
252 event.getFirstReminder(), event.getSecondReminder(),
253 serviceContext);
254 }
255 }
256 else {
257 importedEvent = CalEventLocalServiceUtil.addEvent(
258 userId, event.getTitle(), event.getDescription(),
259 event.getLocation(), startDateMonth, startDateDay,
260 startDateYear, startDateHour, startDateMinute,
261 event.getDurationHour(), event.getDurationMinute(),
262 event.isAllDay(), event.isTimeZoneSensitive(), event.getType(),
263 event.getRepeating(), event.getRecurrenceObj(),
264 event.getRemindBy(), event.getFirstReminder(),
265 event.getSecondReminder(), serviceContext);
266 }
267
268 portletDataContext.importClassedModel(event, importedEvent);
269 }
270
271 }