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