001    /**
002     * Copyright (c) 2000-2011 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.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    /**
065     * @author Brian Wing Shun Chan
066     * @author Julio Camarero
067     */
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                            // Only process non wildcard extensions
444    
445                            if (!StringPool.STAR.equals(fileIcons[i])) {
446    
447                                    // Strip starting period
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    }