001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portlet.documentlibrary.util;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.log.LogFactoryUtil;
019    import com.liferay.portal.kernel.portlet.LiferayWindowState;
020    import com.liferay.portal.kernel.util.GetterUtil;
021    import com.liferay.portal.kernel.util.ParamUtil;
022    import com.liferay.portal.kernel.util.PrefsPropsUtil;
023    import com.liferay.portal.kernel.util.PropsKeys;
024    import com.liferay.portal.kernel.util.StringBundler;
025    import com.liferay.portal.kernel.util.StringPool;
026    import com.liferay.portal.kernel.util.StringUtil;
027    import com.liferay.portal.kernel.util.WebKeys;
028    import com.liferay.portal.theme.ThemeDisplay;
029    import com.liferay.portal.util.PortalUtil;
030    import com.liferay.portlet.PortletPreferencesFactoryUtil;
031    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
032    import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
033    import com.liferay.portlet.documentlibrary.model.DLFolder;
034    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
035    import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
036    
037    import java.util.Collections;
038    import java.util.HashMap;
039    import java.util.HashSet;
040    import java.util.List;
041    import java.util.Map;
042    import java.util.Set;
043    
044    import javax.portlet.PortletPreferences;
045    import javax.portlet.PortletURL;
046    import javax.portlet.RenderResponse;
047    
048    import javax.servlet.http.HttpServletRequest;
049    
050    /**
051     * @author Brian Wing Shun Chan
052     * @author Julio Camarero
053     */
054    public class DLUtil {
055    
056            public static void addPortletBreadcrumbEntries(
057                            DLFileEntry fileEntry, HttpServletRequest request,
058                            RenderResponse renderResponse)
059                    throws Exception {
060    
061                    DLFolder folder = fileEntry.getFolder();
062    
063                    if (folder.getFolderId() !=
064                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
065    
066                            addPortletBreadcrumbEntries(folder, request, renderResponse);
067                    }
068    
069                    PortletURL portletURL = renderResponse.createRenderURL();
070    
071                    portletURL.setParameter(
072                            "struts_action", "/document_library/view_file_entry");
073                    portletURL.setParameter(
074                            "folderId", String.valueOf(fileEntry.getFolderId()));
075                    portletURL.setParameter("name", fileEntry.getName());
076    
077                    PortalUtil.addPortletBreadcrumbEntry(
078                            request, fileEntry.getTitle(), portletURL.toString());
079            }
080    
081            public static void addPortletBreadcrumbEntries(
082                            DLFileShortcut fileShortcut, HttpServletRequest request,
083                            RenderResponse renderResponse)
084                    throws Exception {
085    
086                    DLFolder folder = fileShortcut.getFolder();
087    
088                    if (folder.getFolderId() !=
089                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
090    
091                            addPortletBreadcrumbEntries(folder, request, renderResponse);
092                    }
093    
094                    PortletURL portletURL = renderResponse.createRenderURL();
095    
096                    portletURL.setParameter(
097                            "struts_action", "/document_library/view_file_shortcut");
098                    portletURL.setParameter(
099                            "fileShortcutId", String.valueOf(fileShortcut.getFileShortcutId()));
100    
101                    PortalUtil.addPortletBreadcrumbEntry(
102                            request, fileShortcut.getToTitle(), portletURL.toString());
103            }
104    
105            public static void addPortletBreadcrumbEntries(
106                            long folderId, HttpServletRequest request,
107                            RenderResponse renderResponse)
108                    throws Exception {
109    
110                    if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
111                            DLFolder folder = DLFolderLocalServiceUtil.getFolder(folderId);
112    
113                            if (folder.getFolderId() !=
114                                            DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
115    
116                                    addPortletBreadcrumbEntries(folder, request, renderResponse);
117                            }
118                    }
119            }
120    
121            public static void addPortletBreadcrumbEntries(
122                            DLFolder folder, HttpServletRequest request,
123                            RenderResponse renderResponse)
124                    throws Exception {
125    
126                    String strutsAction = ParamUtil.getString(
127                            request, "struts_action");
128    
129                    long groupId = ParamUtil.getLong(request, "groupId");
130    
131                    PortletURL portletURL = renderResponse.createRenderURL();
132    
133                    if (strutsAction.equals("/journal/select_document_library") ||
134                            strutsAction.equals("/document_library/select_file_entry") ||
135                            strutsAction.equals("/document_library/select_folder") ||
136                            strutsAction.equals("/document_library_display/select_folder")) {
137    
138                            ThemeDisplay themeDisplay =     (ThemeDisplay)request.getAttribute(
139                                    WebKeys.THEME_DISPLAY);
140    
141                            portletURL.setWindowState(LiferayWindowState.POP_UP);
142    
143                            portletURL.setParameter("struts_action", strutsAction);
144                            portletURL.setParameter("groupId", String.valueOf(groupId));
145    
146                            PortalUtil.addPortletBreadcrumbEntry(
147                                    request, themeDisplay.translate("documents-home"),
148                                    portletURL.toString());
149                    }
150                    else {
151                            portletURL.setParameter("struts_action", "/document_library/view");
152                    }
153    
154                    PortletPreferences preferences =
155                            PortletPreferencesFactoryUtil.getPortletPreferences(
156                                    request, PortalUtil.getPortletId(request));
157    
158                    long defaultFolderId = GetterUtil.getLong(
159                            preferences.getValue(
160                                    "rootFolderId",
161                                    String.valueOf(DLFolderConstants.DEFAULT_PARENT_FOLDER_ID)));
162    
163                    List<DLFolder> ancestorFolders = Collections.EMPTY_LIST;
164    
165                    if (folder.getFolderId() != defaultFolderId) {
166                            ancestorFolders = folder.getAncestors();
167    
168                            int indexOfRootFolder = -1;
169    
170                            for (int i = 0; i < ancestorFolders.size(); i++) {
171                                    DLFolder ancestorFolder = ancestorFolders.get(i);
172    
173                                    if (defaultFolderId == ancestorFolder.getFolderId()) {
174                                            indexOfRootFolder = i;
175                                    }
176                            }
177    
178                            if (indexOfRootFolder > -1) {
179                                    ancestorFolders = ancestorFolders.subList(0, indexOfRootFolder);
180                            }
181                    }
182    
183                    Collections.reverse(ancestorFolders);
184    
185                    for (DLFolder ancestorFolder : ancestorFolders) {
186                            portletURL.setParameter(
187                                    "folderId", String.valueOf(ancestorFolder.getFolderId()));
188    
189                            PortalUtil.addPortletBreadcrumbEntry(
190                                    request, ancestorFolder.getName(), portletURL.toString());
191                    }
192    
193                    portletURL.setParameter(
194                            "folderId", String.valueOf(folder.getFolderId()));
195    
196                    if ((folder.getFolderId() !=
197                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) &&
198                            (folder.getFolderId() != defaultFolderId)) {
199    
200                            PortalUtil.addPortletBreadcrumbEntry(
201                                    request, folder.getName(), portletURL.toString());
202                    }
203            }
204    
205            public static int compareVersions(String version1, String version2) {
206                    int[] splitVersion1 = StringUtil.split(version1, StringPool.PERIOD, 0);
207                    int[] splitVersion2 = StringUtil.split(version2, StringPool.PERIOD, 0);
208    
209                    if ((splitVersion1.length != 2) && (splitVersion2.length != 2)) {
210                            return 0;
211                    }
212                    else if ((splitVersion1.length != 2)) {
213                            return -1;
214                    }
215                    else if ((splitVersion2.length != 2)) {
216                            return 1;
217                    }
218    
219                    if (splitVersion1[0] > splitVersion2[0]) {
220                            return 1;
221                    }
222                    else if (splitVersion1[0] < splitVersion2[0]) {
223                            return -1;
224                    }
225                    else if (splitVersion1[1] > splitVersion2[1]) {
226                            return 1;
227                    }
228                    else if (splitVersion1[1] < splitVersion2[1]) {
229                            return -1;
230                    }
231    
232                    return 0;
233            }
234    
235            public static String getFileIcon(String extension) {
236                    return _instance._getFileIcon(extension);
237            }
238    
239            public static String getGenericName(String extension) {
240                    return _instance._getGenericName(extension);
241            }
242    
243            public static String getLockId(long groupId, long folderId, String name) {
244                    StringBundler sb = new StringBundler(5);
245    
246                    sb.append(groupId);
247                    sb.append(StringPool.POUND);
248                    sb.append(folderId);
249                    sb.append(StringPool.POUND);
250                    sb.append(name);
251    
252                    return sb.toString();
253            }
254    
255            private DLUtil() {
256                    _fileIcons = new HashSet<String>();
257    
258                    String[] fileIcons = null;
259    
260                    try {
261                            fileIcons = PrefsPropsUtil.getStringArray(
262                                    PropsKeys.DL_FILE_ICONS, StringPool.COMMA);
263                    }
264                    catch (Exception e) {
265                            _log.error(e, e);
266    
267                            fileIcons = new String[] {StringPool.BLANK};
268                    }
269    
270                    for (int i = 0; i < fileIcons.length; i++) {
271    
272                            // Only process non wildcard extensions
273    
274                            if (!StringPool.STAR.equals(fileIcons[i])) {
275    
276                                    // Strip starting period
277    
278                                    String extension = fileIcons[i];
279                                    extension = extension.substring(1, extension.length());
280    
281                                    _fileIcons.add(extension);
282                            }
283                    }
284    
285                    _genericNames = new HashMap<String, String>();
286    
287                    _genericNames.put("lar", "compressed");
288                    _genericNames.put("rar", "compressed");
289                    _genericNames.put("zip", "compressed");
290    
291                    _genericNames.put("doc", "document");
292                    _genericNames.put("docx", "document");
293                    _genericNames.put("rtf", "document");
294                    _genericNames.put("odt", "document");
295    
296                    _genericNames.put("flv", "flash");
297                    _genericNames.put("swf", "flash");
298    
299                    _genericNames.put("bmp", "image");
300                    _genericNames.put("gif", "image");
301                    _genericNames.put("jpeg", "image");
302                    _genericNames.put("jpg", "image");
303                    _genericNames.put("odg", "image");
304                    _genericNames.put("png", "image");
305                    _genericNames.put("svg", "image");
306    
307                    _genericNames.put("acc", "music");
308                    _genericNames.put("mid", "music");
309                    _genericNames.put("mp3", "music");
310                    _genericNames.put("wav", "music");
311                    _genericNames.put("wma", "music");
312    
313                    _genericNames.put("pdf", "pdf");
314    
315                    _genericNames.put("key", "presentation");
316                    _genericNames.put("odp", "presentation");
317                    _genericNames.put("pps", "presentation");
318                    _genericNames.put("ppt", "presentation");
319                    _genericNames.put("pptx", "presentation");
320    
321                    _genericNames.put("csv", "spreadsheet");
322                    _genericNames.put("ods", "spreadsheet");
323                    _genericNames.put("xls", "spreadsheet");
324                    _genericNames.put("xlsx", "spreadsheet");
325    
326                    _genericNames.put("avi", "video");
327                    _genericNames.put("mov", "video");
328                    _genericNames.put("mp4", "video");
329                    _genericNames.put("mpg", "video");
330                    _genericNames.put("qt", "video");
331                    _genericNames.put("rm", "video");
332                    _genericNames.put("wmv", "video");
333            }
334    
335            private String _getFileIcon(String extension) {
336                    if (!_fileIcons.contains(extension)) {
337                            extension = _DEFAULT_FILE_ICON;
338                    }
339    
340                    return extension;
341            }
342    
343            private String _getGenericName(String extension) {
344                    String genericName = _genericNames.get(extension);
345    
346                    if (genericName == null) {
347                            genericName = _DEFAULT_GENERIC_NAME;
348                    }
349    
350                    return genericName;
351            }
352    
353            private static final String _DEFAULT_GENERIC_NAME = "default";
354    
355            private static final String _DEFAULT_FILE_ICON = "page";
356    
357            private static Log _log = LogFactoryUtil.getLog(DLUtil.class);
358    
359            private static DLUtil _instance = new DLUtil();
360    
361            private Map<String, String> _genericNames;
362            private Set<String> _fileIcons;
363    
364    }