001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
068     * @author Mate Thurzo
069     */
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                            // This is a valid scenario in case of group level portlets
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                            // This is a valid scenario when publishing all
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    }