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