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