001
014
015 package com.liferay.portlet.exportimport.lar;
016
017 import static com.liferay.portlet.exportimport.configuration.ExportImportConfigurationConstants.TYPE_EXPORT_LAYOUT;
018 import static com.liferay.portlet.exportimport.configuration.ExportImportConfigurationConstants.TYPE_EXPORT_PORTLET;
019 import static com.liferay.portlet.exportimport.configuration.ExportImportConfigurationConstants.TYPE_IMPORT_LAYOUT;
020 import static com.liferay.portlet.exportimport.configuration.ExportImportConfigurationConstants.TYPE_IMPORT_PORTLET;
021 import static com.liferay.portlet.exportimport.configuration.ExportImportConfigurationConstants.TYPE_PUBLISH_LAYOUT_LOCAL;
022 import static com.liferay.portlet.exportimport.configuration.ExportImportConfigurationConstants.TYPE_PUBLISH_LAYOUT_REMOTE;
023 import static com.liferay.portlet.exportimport.configuration.ExportImportConfigurationConstants.TYPE_PUBLISH_PORTLET;
024 import static com.liferay.portlet.exportimport.configuration.ExportImportConfigurationConstants.TYPE_SCHEDULED_PUBLISH_LAYOUT_LOCAL;
025 import static com.liferay.portlet.exportimport.configuration.ExportImportConfigurationConstants.TYPE_SCHEDULED_PUBLISH_LAYOUT_REMOTE;
026
027 import aQute.bnd.annotation.ProviderType;
028
029 import com.liferay.portal.kernel.exception.PortalException;
030 import com.liferay.portal.kernel.log.Log;
031 import com.liferay.portal.kernel.log.LogFactoryUtil;
032 import com.liferay.portal.kernel.util.CalendarFactoryUtil;
033 import com.liferay.portal.kernel.util.DateRange;
034 import com.liferay.portal.kernel.util.GetterUtil;
035 import com.liferay.portal.kernel.util.LocaleUtil;
036 import com.liferay.portal.kernel.util.MapUtil;
037 import com.liferay.portal.kernel.util.ParamUtil;
038 import com.liferay.portal.kernel.util.StringPool;
039 import com.liferay.portal.kernel.util.Time;
040 import com.liferay.portal.kernel.util.TimeZoneUtil;
041 import com.liferay.portal.kernel.util.UnicodeProperties;
042 import com.liferay.portal.kernel.util.Validator;
043 import com.liferay.portal.kernel.util.WebKeys;
044 import com.liferay.portal.model.Group;
045 import com.liferay.portal.model.Layout;
046 import com.liferay.portal.model.LayoutSet;
047 import com.liferay.portal.service.GroupLocalServiceUtil;
048 import com.liferay.portal.service.LayoutLocalServiceUtil;
049 import com.liferay.portal.service.LayoutSetLocalServiceUtil;
050 import com.liferay.portal.theme.ThemeDisplay;
051 import com.liferay.portlet.PortletPreferencesFactoryUtil;
052 import com.liferay.portlet.exportimport.model.ExportImportConfiguration;
053 import com.liferay.portlet.exportimport.service.ExportImportConfigurationLocalServiceUtil;
054
055 import java.io.Serializable;
056
057 import java.util.Calendar;
058 import java.util.Date;
059 import java.util.Locale;
060 import java.util.Map;
061 import java.util.TimeZone;
062
063 import javax.portlet.PortletPreferences;
064 import javax.portlet.PortletRequest;
065
066
069 @ProviderType
070 public class ExportImportDateUtil {
071
072 public static final String RANGE = "range";
073
074 public static final String RANGE_ALL = "all";
075
076 public static final String RANGE_DATE_RANGE = "dateRange";
077
078 public static final String RANGE_FROM_LAST_PUBLISH_DATE =
079 "fromLastPublishDate";
080
081 public static final String RANGE_LAST = "last";
082
083 public static void clearLastPublishDate(long groupId, boolean privateLayout)
084 throws PortalException {
085
086 LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
087 groupId, privateLayout);
088
089 UnicodeProperties settingsProperties =
090 layoutSet.getSettingsProperties();
091
092 settingsProperties.remove(_LAST_PUBLISH_DATE);
093
094 LayoutSetLocalServiceUtil.updateSettings(
095 groupId, privateLayout, settingsProperties.toString());
096 }
097
098 public static Calendar getCalendar(
099 PortletRequest portletRequest, String paramPrefix,
100 boolean timeZoneSensitive) {
101
102 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
103 WebKeys.THEME_DISPLAY);
104
105 int dateMonth = ParamUtil.getInteger(
106 portletRequest, paramPrefix + "Month");
107 int dateDay = ParamUtil.getInteger(portletRequest, paramPrefix + "Day");
108 int dateYear = ParamUtil.getInteger(
109 portletRequest, paramPrefix + "Year");
110 int dateHour = ParamUtil.getInteger(
111 portletRequest, paramPrefix + "Hour");
112 int dateMinute = ParamUtil.getInteger(
113 portletRequest, paramPrefix + "Minute");
114 int dateAmPm = ParamUtil.getInteger(
115 portletRequest, paramPrefix + "AmPm");
116
117 return getCalendar(
118 dateAmPm, dateYear, dateMonth, dateDay, dateHour, dateMinute,
119 themeDisplay.getLocale(), themeDisplay.getTimeZone(),
120 timeZoneSensitive);
121 }
122
123 public static DateRange getDateRange(
124 ExportImportConfiguration exportImportConfiguration)
125 throws PortalException {
126
127 Map<String, Serializable> settingsMap =
128 exportImportConfiguration.getSettingsMap();
129
130 Date startDate = (Date)settingsMap.get("startDate");
131 Date endDate = (Date)settingsMap.get("endDate");
132
133 if ((startDate != null) && (endDate != null)) {
134 return new DateRange(startDate, endDate);
135 }
136
137 Map<String, String[]> parameterMap =
138 (Map<String, String[]>)settingsMap.get("parameterMap");
139
140 String range = MapUtil.getString(
141 parameterMap, RANGE,
142 getDefaultDateRange(exportImportConfiguration));
143 int rangeLast = MapUtil.getInteger(parameterMap, "last");
144 int startDateAmPm = MapUtil.getInteger(parameterMap, "startDateAmPm");
145 int startDateYear = MapUtil.getInteger(parameterMap, "startDateYear");
146 int startDateMonth = MapUtil.getInteger(parameterMap, "startDateMonth");
147 int startDateDay = MapUtil.getInteger(parameterMap, "startDateDay");
148 int startDateHour = MapUtil.getInteger(parameterMap, "startDateHour");
149 int startDateMinute = MapUtil.getInteger(
150 parameterMap, "startDateMinute");
151 int endDateAmPm = MapUtil.getInteger(parameterMap, "endDateAmPm");
152 int endDateYear = MapUtil.getInteger(parameterMap, "endDateYear");
153 int endDateMonth = MapUtil.getInteger(parameterMap, "endDateMonth");
154 int endDateDay = MapUtil.getInteger(parameterMap, "endDateDay");
155 int endDateHour = MapUtil.getInteger(parameterMap, "endDateHour");
156 int endDateMinute = MapUtil.getInteger(parameterMap, "endDateMinute");
157
158 String portletId = (String)settingsMap.get("portletId");
159 long groupId = MapUtil.getLong(settingsMap, "sourceGroupId");
160 long plid = MapUtil.getLong(settingsMap, "sourcePlid");
161 boolean privateLayout = MapUtil.getBoolean(
162 settingsMap, "privateLayout");
163 Locale locale = (Locale)settingsMap.get("locale");
164 TimeZone timeZone = (TimeZone)settingsMap.get("timezone");
165
166 return getDateRange(
167 range, rangeLast, startDateAmPm, startDateYear, startDateMonth,
168 startDateDay, startDateHour, startDateMinute, endDateAmPm,
169 endDateYear, endDateMonth, endDateDay, endDateHour, endDateMinute,
170 portletId, groupId, plid, privateLayout, locale, timeZone);
171 }
172
173 public static DateRange getDateRange(long exportImportConfigurationId)
174 throws PortalException {
175
176 ExportImportConfiguration exportImportConfiguration =
177 ExportImportConfigurationLocalServiceUtil.
178 getExportImportConfiguration(exportImportConfigurationId);
179
180 return getDateRange(exportImportConfiguration);
181 }
182
183 public static DateRange getDateRange(
184 PortletRequest portletRequest, long groupId, boolean privateLayout,
185 long plid, String portletId, String defaultRange)
186 throws PortalException {
187
188 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
189 WebKeys.THEME_DISPLAY);
190
191 String range = ParamUtil.getString(portletRequest, RANGE, defaultRange);
192 int rangeLast = ParamUtil.getInteger(portletRequest, "last");
193 int startDateAmPm = ParamUtil.getInteger(
194 portletRequest, "startDateAmPm");
195 int startDateYear = ParamUtil.getInteger(
196 portletRequest, "startDateYear");
197 int startDateMonth = ParamUtil.getInteger(
198 portletRequest, "startDateMonth");
199 int startDateDay = ParamUtil.getInteger(portletRequest, "startDateDay");
200 int startDateHour = ParamUtil.getInteger(
201 portletRequest, "startDateHour");
202 int startDateMinute = ParamUtil.getInteger(
203 portletRequest, "startDateMinute");
204 int endDateAmPm = ParamUtil.getInteger(portletRequest, "endDateAmPm");
205 int endDateYear = ParamUtil.getInteger(portletRequest, "endDateYear");
206 int endDateMonth = ParamUtil.getInteger(portletRequest, "endDateMonth");
207 int endDateDay = ParamUtil.getInteger(portletRequest, "endDateDay");
208 int endDateHour = ParamUtil.getInteger(portletRequest, "endDateHour");
209 int endDateMinute = ParamUtil.getInteger(
210 portletRequest, "endDateMinute");
211
212 return getDateRange(
213 range, rangeLast, startDateAmPm, startDateYear, startDateMonth,
214 startDateDay, startDateHour, startDateMinute, endDateAmPm,
215 endDateYear, endDateMonth, endDateDay, endDateHour, endDateMinute,
216 portletId, groupId, plid, privateLayout, themeDisplay.getLocale(),
217 themeDisplay.getTimeZone());
218 }
219
220 public static Date getLastPublishDate(LayoutSet layoutSet) {
221 long lastPublishDate = GetterUtil.getLong(
222 layoutSet.getSettingsProperty(_LAST_PUBLISH_DATE));
223
224 if (lastPublishDate == 0) {
225 return null;
226 }
227
228 return new Date(lastPublishDate);
229 }
230
231 public static Date getLastPublishDate(
232 PortletDataContext portletDataContext,
233 PortletPreferences jxPortletPreferences)
234 throws PortalException {
235
236 Group group = GroupLocalServiceUtil.getGroup(
237 portletDataContext.getGroupId());
238
239 String range = MapUtil.getString(
240 portletDataContext.getParameterMap(), RANGE);
241
242 if (!group.isStagedRemotely() &&
243 range.equals(RANGE_FROM_LAST_PUBLISH_DATE)) {
244
245 Date portletLastPublishDate = getLastPublishDate(
246 jxPortletPreferences);
247
248 if (portletLastPublishDate == null) {
249 return null;
250 }
251
252
253
254 if (portletDataContext.getStartDate() == null) {
255 return portletLastPublishDate;
256 }
257
258 if (portletLastPublishDate.before(
259 portletDataContext.getStartDate())) {
260
261 return portletLastPublishDate;
262 }
263 }
264
265 return portletDataContext.getStartDate();
266 }
267
268 public static Date getLastPublishDate(
269 PortletPreferences jxPortletPreferences) {
270
271 long lastPublishDate = GetterUtil.getLong(
272 jxPortletPreferences.getValue(
273 _LAST_PUBLISH_DATE, StringPool.BLANK));
274
275 if (lastPublishDate == 0) {
276 return null;
277 }
278
279 return new Date(lastPublishDate);
280 }
281
282 public static void updateLastPublishDate(
283 long groupId, boolean privateLayout, DateRange dateRange,
284 Date lastPublishDate)
285 throws PortalException {
286
287 LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
288 groupId, privateLayout);
289
290 Date originalLastPublishDate = getLastPublishDate(layoutSet);
291
292 if (!isValidDateRange(dateRange, originalLastPublishDate)) {
293 return;
294 }
295
296 if (lastPublishDate == null) {
297 lastPublishDate = new Date();
298 }
299
300 UnicodeProperties settingsProperties =
301 layoutSet.getSettingsProperties();
302
303 settingsProperties.setProperty(
304 _LAST_PUBLISH_DATE, String.valueOf(lastPublishDate.getTime()));
305
306 LayoutSetLocalServiceUtil.updateSettings(
307 layoutSet.getGroupId(), layoutSet.isPrivateLayout(),
308 settingsProperties.toString());
309 }
310
311 public static void updateLastPublishDate(
312 String portletId, PortletPreferences portletPreferences,
313 DateRange dateRange, Date lastPublishDate) {
314
315 Date originalLastPublishDate = getLastPublishDate(portletPreferences);
316
317 if (!isValidDateRange(dateRange, originalLastPublishDate)) {
318 return;
319 }
320
321 if (lastPublishDate == null) {
322 lastPublishDate = new Date();
323 }
324
325 try {
326 portletPreferences.setValue(
327 _LAST_PUBLISH_DATE, String.valueOf(lastPublishDate.getTime()));
328
329 portletPreferences.store();
330 }
331 catch (UnsupportedOperationException uoe) {
332 if (_log.isDebugEnabled()) {
333 _log.debug(
334 "Not updating the portlet setup for " + portletId +
335 " because no setup was returned for the current " +
336 "page");
337 }
338 }
339 catch (Exception e) {
340 _log.error(e, e);
341 }
342 }
343
344 protected static Calendar getCalendar(
345 int dateAmPm, int dateYear, int dateMonth, int dateDay, int dateHour,
346 int dateMinute, Locale locale, TimeZone timeZone,
347 boolean timeZoneSensitive) {
348
349 if (dateAmPm == Calendar.PM) {
350 dateHour += 12;
351 }
352
353 if (!timeZoneSensitive) {
354 locale = LocaleUtil.getDefault();
355 timeZone = TimeZoneUtil.getTimeZone(StringPool.UTC);
356 }
357
358 Calendar calendar = CalendarFactoryUtil.getCalendar(timeZone, locale);
359
360 calendar.set(Calendar.MONTH, dateMonth);
361 calendar.set(Calendar.DATE, dateDay);
362 calendar.set(Calendar.YEAR, dateYear);
363 calendar.set(Calendar.HOUR_OF_DAY, dateHour);
364 calendar.set(Calendar.MINUTE, dateMinute);
365 calendar.set(Calendar.SECOND, 0);
366 calendar.set(Calendar.MILLISECOND, 0);
367
368 return calendar;
369 }
370
371 protected static DateRange getDateRange(
372 String range, int rangeLast, int startDateAmPm, int startDateYear,
373 int startDateMonth, int startDateDay, int startDateHour,
374 int startDateMinute, int endDateAmPm, int endDateYear,
375 int endDateMonth, int endDateDay, int endDateHour,
376 int endDateMinute, String portletId, long groupId, long plid,
377 boolean privateLayout, Locale locale, TimeZone timeZone)
378 throws PortalException {
379
380 Date startDate = null;
381 Date endDate = null;
382
383 if (range.equals(RANGE_DATE_RANGE)) {
384 Calendar startCalendar = getCalendar(
385 startDateAmPm, startDateYear, startDateMonth, startDateDay,
386 startDateHour, startDateMinute, locale, timeZone, true);
387
388 startDate = startCalendar.getTime();
389
390 Calendar endCalendar = getCalendar(
391 endDateAmPm, endDateYear, endDateMonth, endDateDay, endDateHour,
392 endDateMinute, locale, timeZone, true);
393
394 endDate = endCalendar.getTime();
395 }
396 else if (range.equals(RANGE_FROM_LAST_PUBLISH_DATE)) {
397 Date lastPublishDate = null;
398
399 if (Validator.isNotNull(portletId) && (plid > 0)) {
400 Layout layout = LayoutLocalServiceUtil.getLayout(plid);
401
402 PortletPreferences preferences =
403 PortletPreferencesFactoryUtil.getStrictPortletSetup(
404 layout, portletId);
405
406 lastPublishDate = getLastPublishDate(preferences);
407 }
408 else {
409 LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
410 groupId, privateLayout);
411
412 lastPublishDate = getLastPublishDate(layoutSet);
413 }
414
415 if (lastPublishDate != null) {
416 endDate = new Date();
417
418 startDate = lastPublishDate;
419 }
420 }
421 else if (range.equals(RANGE_LAST)) {
422 Date now = new Date();
423
424 startDate = new Date(now.getTime() - (rangeLast * Time.HOUR));
425
426 endDate = now;
427 }
428
429 return new DateRange(startDate, endDate);
430 }
431
432 protected static String getDefaultDateRange(
433 ExportImportConfiguration exportImportConfiguration) {
434
435 if (exportImportConfiguration.getType() == TYPE_EXPORT_LAYOUT) {
436 return RANGE_ALL;
437 }
438 else if (exportImportConfiguration.getType() == TYPE_EXPORT_PORTLET) {
439 return RANGE_ALL;
440 }
441 else if (exportImportConfiguration.getType() == TYPE_IMPORT_LAYOUT) {
442 return RANGE_ALL;
443 }
444 else if (exportImportConfiguration.getType() == TYPE_IMPORT_PORTLET) {
445 return RANGE_ALL;
446 }
447 else if (exportImportConfiguration.getType() ==
448 TYPE_PUBLISH_LAYOUT_LOCAL) {
449
450 return RANGE_FROM_LAST_PUBLISH_DATE;
451 }
452 else if (exportImportConfiguration.getType() ==
453 TYPE_PUBLISH_LAYOUT_REMOTE) {
454
455 return RANGE_FROM_LAST_PUBLISH_DATE;
456 }
457 else if (exportImportConfiguration.getType() == TYPE_PUBLISH_PORTLET) {
458 return RANGE_FROM_LAST_PUBLISH_DATE;
459 }
460 else if (exportImportConfiguration.getType() ==
461 TYPE_SCHEDULED_PUBLISH_LAYOUT_LOCAL) {
462
463 return RANGE_FROM_LAST_PUBLISH_DATE;
464 }
465 else if (exportImportConfiguration.getType() ==
466 TYPE_SCHEDULED_PUBLISH_LAYOUT_REMOTE) {
467
468 return RANGE_FROM_LAST_PUBLISH_DATE;
469 }
470
471 return RANGE_ALL;
472 }
473
474 protected static boolean isValidDateRange(
475 DateRange dateRange, Date originalLastPublishDate) {
476
477 if (dateRange == null) {
478
479
480
481 return true;
482 }
483
484 Date startDate = dateRange.getStartDate();
485 Date endDate = dateRange.getEndDate();
486
487 if (originalLastPublishDate != null) {
488 if ((startDate != null) &&
489 startDate.after(originalLastPublishDate)) {
490
491 return false;
492 }
493
494 if ((endDate != null) && endDate.before(originalLastPublishDate)) {
495 return false;
496 }
497 }
498 else if ((startDate != null) || (endDate != null)) {
499 return false;
500 }
501
502 return true;
503 }
504
505 private static final String _LAST_PUBLISH_DATE = "last-publish-date";
506
507 private static final Log _log = LogFactoryUtil.getLog(
508 ExportImportDateUtil.class);
509
510 }