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.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    /**
067     * @author Mate Thurzo
068     */
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                            // This is a valid scenario in case of group level portlets
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                            // This is a valid scenario when publishing all
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    }