1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.documentlibrary.util;
16  
17  import com.liferay.portal.kernel.log.Log;
18  import com.liferay.portal.kernel.log.LogFactoryUtil;
19  import com.liferay.portal.kernel.portlet.LiferayWindowState;
20  import com.liferay.portal.kernel.util.FileUtil;
21  import com.liferay.portal.kernel.util.ParamUtil;
22  import com.liferay.portal.kernel.util.PrefsPropsUtil;
23  import com.liferay.portal.kernel.util.PropsKeys;
24  import com.liferay.portal.kernel.util.StringBundler;
25  import com.liferay.portal.kernel.util.StringPool;
26  import com.liferay.portal.kernel.util.StringUtil;
27  import com.liferay.portal.kernel.util.WebKeys;
28  import com.liferay.portal.theme.ThemeDisplay;
29  import com.liferay.portal.util.PortalUtil;
30  import com.liferay.portlet.documentlibrary.model.DLFileEntry;
31  import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
32  import com.liferay.portlet.documentlibrary.model.DLFolder;
33  import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
34  import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
35  
36  import java.util.Collections;
37  import java.util.HashMap;
38  import java.util.HashSet;
39  import java.util.List;
40  import java.util.Map;
41  import java.util.Set;
42  
43  import javax.portlet.PortletURL;
44  import javax.portlet.RenderResponse;
45  
46  import javax.servlet.http.HttpServletRequest;
47  
48  /**
49   * <a href="DLUtil.java.html"><b><i>View Source</i></b></a>
50   *
51   * @author Brian Wing Shun Chan
52   * @author Julio Camarero
53   */
54  public class DLUtil {
55  
56      public static void addPortletBreadcrumbEntries(
57              DLFileEntry fileEntry, HttpServletRequest request,
58              RenderResponse renderResponse)
59          throws Exception {
60  
61          DLFolder folder = fileEntry.getFolder();
62  
63          addPortletBreadcrumbEntries(folder, request, renderResponse);
64  
65          PortletURL portletURL = renderResponse.createRenderURL();
66  
67          portletURL.setParameter(
68              "struts_action", "/document_library/view_file_entry");
69          portletURL.setParameter(
70              "folderId", String.valueOf(fileEntry.getFolderId()));
71          portletURL.setParameter("name", fileEntry.getName());
72  
73          PortalUtil.addPortletBreadcrumbEntry(
74              request, fileEntry.getTitle(), portletURL.toString());
75      }
76  
77      public static void addPortletBreadcrumbEntries(
78              DLFileShortcut fileShortcut, HttpServletRequest request,
79              RenderResponse renderResponse)
80          throws Exception {
81  
82          DLFolder folder = fileShortcut.getFolder();
83  
84          addPortletBreadcrumbEntries(folder, request, renderResponse);
85  
86          PortletURL portletURL = renderResponse.createRenderURL();
87  
88          portletURL.setParameter(
89              "struts_action", "/document_library/view_file_shortcut");
90          portletURL.setParameter(
91              "fileShortcutId", String.valueOf(fileShortcut.getFileShortcutId()));
92  
93          PortalUtil.addPortletBreadcrumbEntry(
94              request, fileShortcut.getToTitle(), portletURL.toString());
95      }
96  
97      public static void addPortletBreadcrumbEntries(
98              long folderId, HttpServletRequest request,
99              RenderResponse renderResponse)
100         throws Exception {
101 
102         if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
103             DLFolder folder = DLFolderLocalServiceUtil.getFolder(folderId);
104 
105             addPortletBreadcrumbEntries(folder, request, renderResponse);
106         }
107     }
108 
109     public static void addPortletBreadcrumbEntries(
110             DLFolder folder, HttpServletRequest request,
111             RenderResponse renderResponse)
112         throws Exception {
113 
114         String strutsAction = ParamUtil.getString(
115             request, "struts_action");
116 
117         long groupId = ParamUtil.getLong(request, "groupId");
118 
119         PortletURL portletURL = renderResponse.createRenderURL();
120 
121         if (strutsAction.equals("/journal/select_document_library") ||
122             strutsAction.equals("/document_library/select_file_entry") ||
123             strutsAction.equals("/document_library/select_folder")) {
124 
125             ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
126                 WebKeys.THEME_DISPLAY);
127 
128             portletURL.setWindowState(LiferayWindowState.POP_UP);
129 
130             portletURL.setParameter("struts_action", strutsAction);
131             portletURL.setParameter("groupId", String.valueOf(groupId));
132 
133             PortalUtil.addPortletBreadcrumbEntry(
134                 request, themeDisplay.translate("document-home"),
135                 portletURL.toString());
136         }
137         else {
138             portletURL.setParameter("struts_action", "/document_library/view");
139         }
140 
141         List<DLFolder> ancestorFolders = folder.getAncestors();
142 
143         Collections.reverse(ancestorFolders);
144 
145         for (DLFolder ancestorFolder : ancestorFolders) {
146             portletURL.setParameter(
147                 "folderId", String.valueOf(ancestorFolder.getFolderId()));
148 
149             PortalUtil.addPortletBreadcrumbEntry(
150                 request, ancestorFolder.getName(), portletURL.toString());
151         }
152 
153         portletURL.setParameter(
154             "folderId", String.valueOf(folder.getFolderId()));
155 
156         PortalUtil.addPortletBreadcrumbEntry(
157             request, folder.getName(), portletURL.toString());
158     }
159 
160     public static int compareVersions(String version1, String version2) {
161         int[] splitVersion1 = StringUtil.split(version1, StringPool.PERIOD, 0);
162         int[] splitVersion2 = StringUtil.split(version2, StringPool.PERIOD, 0);
163 
164         if ((splitVersion1.length != 2) && (splitVersion2.length != 2)) {
165             return 0;
166         }
167         else if ((splitVersion1.length != 2)) {
168             return -1;
169         }
170         else if ((splitVersion2.length != 2)) {
171             return 1;
172         }
173 
174         if (splitVersion1[0] > splitVersion2[0]) {
175             return 1;
176         }
177         else if (splitVersion1[0] < splitVersion2[0]) {
178             return -1;
179         }
180         else if (splitVersion1[1] > splitVersion2[1]) {
181             return 1;
182         }
183         else if (splitVersion1[1] < splitVersion2[1]) {
184             return -1;
185         }
186 
187         return 0;
188     }
189 
190     public static String getFileIcon(String title) {
191         return _instance._getFileIcon(title);
192     }
193 
194     public static String getGenericName(String extension) {
195         return _instance._getGenericName(extension);
196     }
197 
198     public static String getLockId(long groupId, long folderId, String name) {
199         StringBundler sb = new StringBundler(5);
200 
201         sb.append(groupId);
202         sb.append(StringPool.POUND);
203         sb.append(folderId);
204         sb.append(StringPool.POUND);
205         sb.append(name);
206 
207         return sb.toString();
208     }
209 
210     private DLUtil() {
211         _fileIcons = new HashSet<String>();
212 
213         String[] fileIcons = null;
214 
215         try {
216             fileIcons = PrefsPropsUtil.getStringArray(
217                 PropsKeys.DL_FILE_ICONS, StringPool.COMMA);
218         }
219         catch (Exception e) {
220             _log.error(e, e);
221 
222             fileIcons = new String[] {StringPool.BLANK};
223         }
224 
225         for (int i = 0; i < fileIcons.length; i++) {
226 
227             // Only process non wildcard extensions
228 
229             if (!StringPool.STAR.equals(fileIcons[i])) {
230 
231                 // Strip starting period
232 
233                 String extension = fileIcons[i];
234                 extension = extension.substring(1, extension.length());
235 
236                 _fileIcons.add(extension);
237             }
238         }
239 
240         _genericNames = new HashMap<String, String>();
241 
242         _genericNames.put("lar", "compressed");
243         _genericNames.put("rar", "compressed");
244         _genericNames.put("zip", "compressed");
245 
246         _genericNames.put("doc", "document");
247         _genericNames.put("docx", "document");
248         _genericNames.put("rtf", "document");
249         _genericNames.put("odt", "document");
250 
251         _genericNames.put("flv", "flash");
252         _genericNames.put("swf", "flash");
253 
254         _genericNames.put("bmp", "image");
255         _genericNames.put("gif", "image");
256         _genericNames.put("jpeg", "image");
257         _genericNames.put("jpg", "image");
258         _genericNames.put("odg", "image");
259         _genericNames.put("png", "image");
260         _genericNames.put("svg", "image");
261 
262         _genericNames.put("acc", "music");
263         _genericNames.put("mid", "music");
264         _genericNames.put("mp3", "music");
265         _genericNames.put("wav", "music");
266         _genericNames.put("wma", "music");
267 
268         _genericNames.put("pdf", "pdf");
269 
270         _genericNames.put("odp", "presentation");
271         _genericNames.put("ppt", "presentation");
272         _genericNames.put("pptx", "presentation");
273 
274         _genericNames.put("csv", "spreadsheet");
275         _genericNames.put("ods", "spreadsheet");
276         _genericNames.put("xls", "spreadsheet");
277         _genericNames.put("xlsx", "spreadsheet");
278 
279         _genericNames.put("avi", "video");
280         _genericNames.put("mov", "video");
281         _genericNames.put("mp4", "video");
282         _genericNames.put("mpg", "video");
283         _genericNames.put("qt", "video");
284         _genericNames.put("rm", "video");
285         _genericNames.put("wmv", "video");
286     }
287 
288     private String _getFileIcon(String title) {
289         String extension = FileUtil.getExtension(title);
290 
291         if (!_fileIcons.contains(extension)) {
292             extension = _DEFAULT_FILE_ICON;
293         }
294 
295         return extension;
296     }
297 
298     private String _getGenericName(String extension) {
299         String genericName = _genericNames.get(extension);
300 
301         if (genericName == null) {
302             genericName = _DEFAULT_GENERIC_NAME;
303         }
304 
305         return genericName;
306     }
307 
308     private static final String _DEFAULT_GENERIC_NAME = "default";
309 
310     private static final String _DEFAULT_FILE_ICON = "page";
311 
312     private static Log _log = LogFactoryUtil.getLog(DLUtil.class);
313 
314     private static DLUtil _instance = new DLUtil();
315 
316     private Map<String, String> _genericNames;
317     private Set<String> _fileIcons;
318 
319 }