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(
157 eventElement, path, event, NAMESPACE);
158 }
159
160 protected String getEventPath(
161 PortletDataContext portletDataContext, CalEvent event) {
162
163 StringBundler sb = new StringBundler(4);
164
165 sb.append(
166 ExportImportPathUtil.getPortletPath(
167 portletDataContext, PortletKeys.CALENDAR));
168 sb.append("/events/");
169 sb.append(event.getEventId());
170 sb.append(".xml");
171
172 return sb.toString();
173 }
174
175 protected void importEvent(
176 PortletDataContext portletDataContext, Element eventElement,
177 CalEvent event)
178 throws Exception {
179
180 long userId = portletDataContext.getUserId(event.getUserUuid());
181
182 Date startDate = event.getStartDate();
183
184 int startDateMonth = 0;
185 int startDateDay = 0;
186 int startDateYear = 0;
187 int startDateHour = 0;
188 int startDateMinute = 0;
189
190 if (startDate != null) {
191 Locale locale = null;
192 TimeZone timeZone = null;
193
194 if (event.getTimeZoneSensitive()) {
195 User user = UserLocalServiceUtil.getUser(userId);
196
197 locale = user.getLocale();
198 timeZone = user.getTimeZone();
199 }
200 else {
201 locale = LocaleUtil.getSiteDefault();
202 timeZone = TimeZoneUtil.getTimeZone(StringPool.UTC);
203 }
204
205 Calendar startCal = CalendarFactoryUtil.getCalendar(
206 timeZone, locale);
207
208 startCal.setTime(startDate);
209
210 startDateMonth = startCal.get(Calendar.MONTH);
211 startDateDay = startCal.get(Calendar.DATE);
212 startDateYear = startCal.get(Calendar.YEAR);
213 startDateHour = startCal.get(Calendar.HOUR);
214 startDateMinute = startCal.get(Calendar.MINUTE);
215
216 if (startCal.get(Calendar.AM_PM) == Calendar.PM) {
217 startDateHour += 12;
218 }
219 }
220
221 ServiceContext serviceContext = portletDataContext.createServiceContext(
222 eventElement, event, NAMESPACE);
223
224 CalEvent importedEvent = null;
225
226 if (portletDataContext.isDataStrategyMirror()) {
227 CalEvent existingEvent = CalEventUtil.fetchByUUID_G(
228 event.getUuid(), portletDataContext.getScopeGroupId());
229
230 if (existingEvent == null) {
231 serviceContext.setUuid(event.getUuid());
232
233 importedEvent = CalEventLocalServiceUtil.addEvent(
234 userId, event.getTitle(), event.getDescription(),
235 event.getLocation(), startDateMonth, startDateDay,
236 startDateYear, startDateHour, startDateMinute,
237 event.getDurationHour(), event.getDurationMinute(),
238 event.isAllDay(), event.isTimeZoneSensitive(),
239 event.getType(), event.getRepeating(),
240 event.getRecurrenceObj(), event.getRemindBy(),
241 event.getFirstReminder(), event.getSecondReminder(),
242 serviceContext);
243 }
244 else {
245 importedEvent = CalEventLocalServiceUtil.updateEvent(
246 userId, existingEvent.getEventId(), event.getTitle(),
247 event.getDescription(), event.getLocation(), startDateMonth,
248 startDateDay, startDateYear, startDateHour, startDateMinute,
249 event.getDurationHour(), event.getDurationMinute(),
250 event.isAllDay(), event.isTimeZoneSensitive(),
251 event.getType(), event.getRepeating(),
252 event.getRecurrenceObj(), event.getRemindBy(),
253 event.getFirstReminder(), event.getSecondReminder(),
254 serviceContext);
255 }
256 }
257 else {
258 importedEvent = CalEventLocalServiceUtil.addEvent(
259 userId, event.getTitle(), event.getDescription(),
260 event.getLocation(), startDateMonth, startDateDay,
261 startDateYear, startDateHour, startDateMinute,
262 event.getDurationHour(), event.getDurationMinute(),
263 event.isAllDay(), event.isTimeZoneSensitive(), event.getType(),
264 event.getRepeating(), event.getRecurrenceObj(),
265 event.getRemindBy(), event.getFirstReminder(),
266 event.getSecondReminder(), serviceContext);
267 }
268
269 portletDataContext.importClassedModel(event, importedEvent, NAMESPACE);
270 }
271
272 }