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