001
014
015 package com.liferay.portlet.documentlibrary.util;
016
017 import com.liferay.portal.kernel.configuration.Filter;
018 import com.liferay.portal.kernel.exception.PortalException;
019 import com.liferay.portal.kernel.exception.SystemException;
020 import com.liferay.portal.kernel.log.Log;
021 import com.liferay.portal.kernel.log.LogFactoryUtil;
022 import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
023 import com.liferay.portal.kernel.portlet.LiferayWindowState;
024 import com.liferay.portal.kernel.repository.model.FileEntry;
025 import com.liferay.portal.kernel.repository.model.Folder;
026 import com.liferay.portal.kernel.util.GetterUtil;
027 import com.liferay.portal.kernel.util.OrderByComparator;
028 import com.liferay.portal.kernel.util.ParamUtil;
029 import com.liferay.portal.kernel.util.PrefsPropsUtil;
030 import com.liferay.portal.kernel.util.PropsKeys;
031 import com.liferay.portal.kernel.util.PropsUtil;
032 import com.liferay.portal.kernel.util.StringBundler;
033 import com.liferay.portal.kernel.util.StringPool;
034 import com.liferay.portal.kernel.util.StringUtil;
035 import com.liferay.portal.kernel.util.Validator;
036 import com.liferay.portal.kernel.util.WebKeys;
037 import com.liferay.portal.model.Group;
038 import com.liferay.portal.service.GroupLocalServiceUtil;
039 import com.liferay.portal.theme.ThemeDisplay;
040 import com.liferay.portal.util.PortalUtil;
041 import com.liferay.portlet.PortletPreferencesFactoryUtil;
042 import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
043 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
044 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
045 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelCreateDateComparator;
046 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelModifiedDateComparator;
047 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelNameComparator;
048 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelReadCountComparator;
049 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelSizeComparator;
050
051 import java.util.Collections;
052 import java.util.HashMap;
053 import java.util.HashSet;
054 import java.util.List;
055 import java.util.Map;
056 import java.util.Set;
057
058 import javax.portlet.PortletPreferences;
059 import javax.portlet.PortletURL;
060 import javax.portlet.RenderResponse;
061
062 import javax.servlet.http.HttpServletRequest;
063
064
068 public class DLUtil {
069
070 public static void addPortletBreadcrumbEntries(
071 DLFileShortcut dlFileShortcut, HttpServletRequest request,
072 RenderResponse renderResponse, boolean showGlobally)
073 throws Exception {
074
075 Folder folder = dlFileShortcut.getFolder();
076
077 if (folder.getFolderId() !=
078 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
079
080 addPortletBreadcrumbEntries(
081 folder, request, renderResponse, showGlobally);
082 }
083
084 PortletURL portletURL = renderResponse.createRenderURL();
085
086 portletURL.setParameter(
087 "struts_action", "/document_library/view_file_entry");
088 portletURL.setParameter(
089 "fileEntryId",
090 String.valueOf(dlFileShortcut.getToFileEntryId()));
091
092 PortalUtil.addPortletBreadcrumbEntry(
093 request, dlFileShortcut.getToTitle(), portletURL.toString());
094 }
095
096 public static void addPortletBreadcrumbEntries(
097 FileEntry fileEntry, HttpServletRequest request,
098 RenderResponse renderResponse, boolean showGlobally)
099 throws Exception {
100
101 Folder folder = fileEntry.getFolder();
102
103 if (folder.getFolderId() !=
104 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
105
106 addPortletBreadcrumbEntries(
107 folder, request, renderResponse, showGlobally);
108 }
109
110 PortletURL portletURL = renderResponse.createRenderURL();
111
112 portletURL.setParameter(
113 "struts_action", "/document_library/view_file_entry");
114 portletURL.setParameter(
115 "folderId", String.valueOf(fileEntry.getFolderId()));
116 portletURL.setParameter("title", fileEntry.getTitle());
117
118 PortalUtil.addPortletBreadcrumbEntry(
119 request, fileEntry.getTitle(), portletURL.toString());
120 }
121
122 public static void addPortletBreadcrumbEntries(
123 Folder folder, HttpServletRequest request,
124 LiferayPortletResponse liferayPortletResponse, boolean showGlobally)
125 throws Exception {
126
127 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
128 WebKeys.THEME_DISPLAY);
129
130 PortletURL portletURL =
131 (PortletURL)liferayPortletResponse.createResourceURL();
132
133 portletURL.setParameter("struts_action", "/document_library/view");
134 portletURL.setParameter("showSiblings", Boolean.TRUE.toString());
135 portletURL.setParameter("viewAddButton", Boolean.TRUE.toString());
136 portletURL.setParameter("viewBreadcrumb", Boolean.TRUE.toString());
137 portletURL.setParameter(
138 "viewDisplayStyleButttons", Boolean.TRUE.toString());
139 portletURL.setParameter("viewEntries", Boolean.TRUE.toString());
140 portletURL.setParameter(
141 "viewFileEntrySearch", Boolean.TRUE.toString());
142 portletURL.setParameter("viewFolders", Boolean.TRUE.toString());
143 portletURL.setParameter("viewSortButton", Boolean.TRUE.toString());
144
145 Map<String, Object> data = new HashMap<String, Object>();
146
147 data.put("folder-id", _getDefaultFolderId(request));
148 data.put("refresh-folders", Boolean.TRUE.toString());
149
150 PortalUtil.addPortletBreadcrumbEntry(
151 request, themeDisplay.translate("documents-home"),
152 portletURL.toString(), data);
153
154 addPortletBreadcrumbEntries(folder, request, portletURL, showGlobally);
155 }
156
157 public static void addPortletBreadcrumbEntries(
158 Folder folder, HttpServletRequest request,
159 PortletURL portletURL, boolean showGlobally)
160 throws Exception {
161
162 long defaultFolderId = _getDefaultFolderId(request);
163
164 List<Folder> ancestorFolders = Collections.emptyList();
165
166 if ((folder != null) && (folder.getFolderId() != defaultFolderId)) {
167 ancestorFolders = folder.getAncestors();
168
169 int indexOfRootFolder = -1;
170
171 for (int i = 0; i < ancestorFolders.size(); i++) {
172 Folder ancestorFolder = ancestorFolders.get(i);
173
174 if (defaultFolderId == ancestorFolder.getFolderId()) {
175 indexOfRootFolder = i;
176 }
177 }
178
179 if (indexOfRootFolder > -1) {
180 ancestorFolders = ancestorFolders.subList(0, indexOfRootFolder);
181 }
182 }
183
184 Collections.reverse(ancestorFolders);
185
186 for (Folder ancestorFolder : ancestorFolders) {
187 portletURL.setParameter(
188 "folderId", String.valueOf(ancestorFolder.getFolderId()));
189
190 Map<String, Object> data = new HashMap<String, Object>();
191
192 data.put("folder-id", ancestorFolder.getFolderId());
193 data.put("refresh-folders", Boolean.TRUE.toString());
194 data.put("show-globally", String.valueOf(showGlobally));
195
196 PortalUtil.addPortletBreadcrumbEntry(
197 request, ancestorFolder.getName(), portletURL.toString(), data);
198 }
199
200 long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
201
202 if (folder != null) {
203 folderId = folder.getFolderId();
204 }
205
206 portletURL.setParameter("folderId", String.valueOf(folderId));
207
208 if ((folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) &&
209 (folderId != defaultFolderId)) {
210
211 Map<String, Object> data = new HashMap<String, Object>();
212
213 data.put("folder-id", folderId);
214 data.put("refresh-folders", Boolean.TRUE.toString());
215 data.put("show-globally", String.valueOf(showGlobally));
216
217 PortalUtil.addPortletBreadcrumbEntry(
218 request, folder.getName(), portletURL.toString(), data);
219 }
220 }
221
222 public static void addPortletBreadcrumbEntries(
223 Folder folder, HttpServletRequest request,
224 RenderResponse renderResponse, boolean showGlobally)
225 throws Exception {
226
227 String strutsAction = ParamUtil.getString(
228 request, "struts_action");
229
230 long groupId = ParamUtil.getLong(request, "groupId");
231
232 PortletURL portletURL = renderResponse.createRenderURL();
233
234 if (strutsAction.equals("/journal/select_document_library") ||
235 strutsAction.equals("/document_library/select_file_entry") ||
236 strutsAction.equals("/document_library/select_folder") ||
237 strutsAction.equals("/document_library_display/select_folder")) {
238
239 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
240 WebKeys.THEME_DISPLAY);
241
242 portletURL.setWindowState(LiferayWindowState.POP_UP);
243
244 portletURL.setParameter("struts_action", strutsAction);
245 portletURL.setParameter("groupId", String.valueOf(groupId));
246
247 Map<String, Object> data = new HashMap<String, Object>();
248
249 data.put("folder-id", _getDefaultFolderId(request));
250 data.put("refresh-folders", Boolean.TRUE.toString());
251
252 PortalUtil.addPortletBreadcrumbEntry(
253 request, themeDisplay.translate("documents-home"),
254 portletURL.toString(), data);
255 }
256 else {
257 portletURL.setParameter("struts_action", "/document_library/view");
258 }
259
260 addPortletBreadcrumbEntries(folder, request, portletURL, showGlobally);
261 }
262
263 public static void addPortletBreadcrumbEntries(
264 long folderId, HttpServletRequest request,
265 RenderResponse renderResponse, boolean showGlobally)
266 throws Exception {
267
268 if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
269 Folder folder = DLAppLocalServiceUtil.getFolder(folderId);
270
271 if (folder.getFolderId() !=
272 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
273
274 addPortletBreadcrumbEntries(
275 folder, request, renderResponse, showGlobally);
276 }
277 }
278 }
279
280 public static int compareVersions(String version1, String version2) {
281 int[] splitVersion1 = StringUtil.split(version1, StringPool.PERIOD, 0);
282 int[] splitVersion2 = StringUtil.split(version2, StringPool.PERIOD, 0);
283
284 if ((splitVersion1.length != 2) && (splitVersion2.length != 2)) {
285 return 0;
286 }
287 else if ((splitVersion1.length != 2)) {
288 return -1;
289 }
290 else if ((splitVersion2.length != 2)) {
291 return 1;
292 }
293
294 if (splitVersion1[0] > splitVersion2[0]) {
295 return 1;
296 }
297 else if (splitVersion1[0] < splitVersion2[0]) {
298 return -1;
299 }
300 else if (splitVersion1[1] > splitVersion2[1]) {
301 return 1;
302 }
303 else if (splitVersion1[1] < splitVersion2[1]) {
304 return -1;
305 }
306
307 return 0;
308 }
309
310 public static String getDividedPath(long id) {
311 StringBundler sb = new StringBundler(16);
312
313 long dividend = id;
314
315 while ((dividend / _DIVISOR) != 0) {
316 sb.append(StringPool.SLASH);
317 sb.append(dividend % _DIVISOR);
318
319 dividend = dividend / _DIVISOR;
320 }
321
322 sb.append(StringPool.SLASH);
323 sb.append(id);
324
325 return sb.toString();
326 }
327
328 public static String getFileIcon(String extension) {
329 return _instance._getFileIcon(extension);
330 }
331
332 public static String getGenericName(String extension) {
333 return _instance._getGenericName(extension);
334 }
335
336 public static long[] getGroupIds(long groupId)
337 throws PortalException, SystemException {
338
339 Group scopeGroup = GroupLocalServiceUtil.getGroup(groupId);
340
341 Group companyGroup = GroupLocalServiceUtil.getCompanyGroup(
342 scopeGroup.getCompanyId());
343
344 if (scopeGroup.isLayout()) {
345 return new long[] {
346 scopeGroup.getParentGroupId(), companyGroup.getGroupId()
347 };
348 }
349 else {
350 return new long[] {groupId, companyGroup.getGroupId()};
351 }
352 }
353
354 public static long[] getGroupIds(ThemeDisplay themeDisplay)
355 throws PortalException, SystemException {
356
357 return getGroupIds(themeDisplay.getScopeGroupId());
358 }
359
360 public static OrderByComparator getRepositoryModelOrderByComparator(
361 String orderByCol, String orderByType) {
362
363 boolean orderByAsc = true;
364
365 if (orderByType.equals("desc")) {
366 orderByAsc = false;
367 }
368
369 OrderByComparator orderByComparator = null;
370
371 if (orderByCol.equals("creationDate")) {
372 orderByComparator = new RepositoryModelCreateDateComparator(
373 orderByAsc);
374 }
375 else if (orderByCol.equals("downloads")) {
376 orderByComparator = new RepositoryModelReadCountComparator(
377 orderByAsc);
378 }
379 else if (orderByCol.equals("modifiedDate")) {
380 orderByComparator = new RepositoryModelModifiedDateComparator(
381 orderByAsc);
382 }
383 else if (orderByCol.equals("size")) {
384 orderByComparator = new RepositoryModelSizeComparator(orderByAsc);
385 }
386 else {
387 orderByComparator = new RepositoryModelNameComparator(orderByAsc);
388 }
389
390 return orderByComparator;
391 }
392
393 public static String getTempFileId(long id, String version) {
394 return getTempFileId(id, version, null);
395 }
396
397 public static String getTempFileId(
398 long id, String version, String languageId) {
399
400 if (Validator.isNull(languageId)) {
401 return String.valueOf(id).concat(StringPool.PERIOD).concat(version);
402 }
403
404 StringBundler sb = new StringBundler(5);
405
406 sb.append(id);
407 sb.append(StringPool.PERIOD);
408 sb.append(version);
409 sb.append(StringPool.PERIOD);
410 sb.append(languageId);
411
412 return sb.toString();
413 }
414
415 private static long _getDefaultFolderId(HttpServletRequest request)
416 throws Exception {
417
418 PortletPreferences portletPreferences =
419 PortletPreferencesFactoryUtil.getPortletPreferences(
420 request, PortalUtil.getPortletId(request));
421
422 return GetterUtil.getLong(
423 portletPreferences.getValue(
424 "rootFolderId",
425 String.valueOf(DLFolderConstants.DEFAULT_PARENT_FOLDER_ID)));
426 }
427
428 private DLUtil() {
429 String[] fileIcons = null;
430
431 try {
432 fileIcons = PrefsPropsUtil.getStringArray(
433 PropsKeys.DL_FILE_ICONS, StringPool.COMMA);
434 }
435 catch (Exception e) {
436 _log.error(e, e);
437
438 fileIcons = new String[] {StringPool.BLANK};
439 }
440
441 for (int i = 0; i < fileIcons.length; i++) {
442
443
444
445 if (!StringPool.STAR.equals(fileIcons[i])) {
446
447
448
449 String extension = fileIcons[i];
450 extension = extension.substring(1, extension.length());
451
452 _fileIcons.add(extension);
453 }
454 }
455
456 String[] genericNames = PropsUtil.getArray(
457 PropsKeys.DL_FILE_GENERIC_NAMES);
458
459 for (String genericName : genericNames) {
460 _populateGenericNamesMap(genericName);
461 }
462 }
463
464 private String _getFileIcon(String extension) {
465 if (!_fileIcons.contains(extension)) {
466 extension = _DEFAULT_FILE_ICON;
467 }
468
469 return extension;
470 }
471
472 private String _getGenericName(String extension) {
473 String genericName = _genericNames.get(extension);
474
475 if (genericName == null) {
476 genericName = _DEFAULT_GENERIC_NAME;
477 }
478
479 return genericName;
480 }
481
482 private void _populateGenericNamesMap(String genericName) {
483 String[] extensions = PropsUtil.getArray(
484 PropsKeys.DL_FILE_GENERIC_EXTENSIONS, new Filter(genericName));
485
486 for (String extension : extensions) {
487 _genericNames.put(extension, genericName);
488 }
489 }
490
491 private static final String _DEFAULT_FILE_ICON = "page";
492
493 private static final String _DEFAULT_GENERIC_NAME = "default";
494
495 private static final long _DIVISOR = 256;
496
497 private static Log _log = LogFactoryUtil.getLog(DLUtil.class);
498
499 private static DLUtil _instance = new DLUtil();
500
501 private Set<String> _fileIcons = new HashSet<String>();
502 private Map<String, String> _genericNames = new HashMap<String, String>();
503
504 }