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