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