001
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
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
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 }