001    /**
002     * Copyright (c) 2000-2011 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.configuration.Filter;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.portlet.LiferayWindowState;
021    import com.liferay.portal.kernel.util.GetterUtil;
022    import com.liferay.portal.kernel.util.ParamUtil;
023    import com.liferay.portal.kernel.util.PrefsPropsUtil;
024    import com.liferay.portal.kernel.util.PropsKeys;
025    import com.liferay.portal.kernel.util.PropsUtil;
026    import com.liferay.portal.kernel.util.StringBundler;
027    import com.liferay.portal.kernel.util.StringPool;
028    import com.liferay.portal.kernel.util.StringUtil;
029    import com.liferay.portal.kernel.util.WebKeys;
030    import com.liferay.portal.theme.ThemeDisplay;
031    import com.liferay.portal.util.PortalUtil;
032    import com.liferay.portlet.PortletPreferencesFactoryUtil;
033    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
034    import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
035    import com.liferay.portlet.documentlibrary.model.DLFolder;
036    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
037    import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
038    import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
039    
040    import java.util.Collections;
041    import java.util.HashMap;
042    import java.util.HashSet;
043    import java.util.List;
044    import java.util.Map;
045    import java.util.Set;
046    
047    import javax.portlet.PortletPreferences;
048    import javax.portlet.PortletURL;
049    import javax.portlet.RenderResponse;
050    
051    import javax.servlet.http.HttpServletRequest;
052    
053    /**
054     * @author Brian Wing Shun Chan
055     * @author Julio Camarero
056     */
057    public class DLUtil {
058    
059            public static void addPortletBreadcrumbEntries(
060                            DLFileEntry fileEntry, HttpServletRequest request,
061                            RenderResponse renderResponse)
062                    throws Exception {
063    
064                    DLFolder folder = fileEntry.getFolder();
065    
066                    if (folder.getFolderId() !=
067                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
068    
069                            addPortletBreadcrumbEntries(folder, request, renderResponse);
070                    }
071    
072                    PortletURL portletURL = renderResponse.createRenderURL();
073    
074                    portletURL.setParameter(
075                            "struts_action", "/document_library/view_file_entry");
076                    portletURL.setParameter(
077                            "folderId", String.valueOf(fileEntry.getFolderId()));
078                    portletURL.setParameter("name", fileEntry.getName());
079    
080                    PortalUtil.addPortletBreadcrumbEntry(
081                            request, fileEntry.getTitle(), portletURL.toString());
082            }
083    
084            public static void addPortletBreadcrumbEntries(
085                            DLFileShortcut fileShortcut, HttpServletRequest request,
086                            RenderResponse renderResponse)
087                    throws Exception {
088    
089                    DLFolder folder = fileShortcut.getFolder();
090    
091                    if (folder.getFolderId() !=
092                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
093    
094                            addPortletBreadcrumbEntries(folder, request, renderResponse);
095                    }
096    
097                    PortletURL portletURL = renderResponse.createRenderURL();
098    
099                    portletURL.setParameter(
100                            "struts_action", "/document_library/view_file_shortcut");
101                    portletURL.setParameter(
102                            "fileShortcutId", String.valueOf(fileShortcut.getFileShortcutId()));
103    
104                    PortalUtil.addPortletBreadcrumbEntry(
105                            request, fileShortcut.getToTitle(), portletURL.toString());
106            }
107    
108            public static void addPortletBreadcrumbEntries(
109                            long folderId, HttpServletRequest request,
110                            RenderResponse renderResponse)
111                    throws Exception {
112    
113                    if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
114                            DLFolder folder = DLFolderLocalServiceUtil.getFolder(folderId);
115    
116                            if (folder.getFolderId() !=
117                                            DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
118    
119                                    addPortletBreadcrumbEntries(folder, request, renderResponse);
120                            }
121                    }
122            }
123    
124            public static void addPortletBreadcrumbEntries(
125                            DLFolder folder, HttpServletRequest request,
126                            RenderResponse renderResponse)
127                    throws Exception {
128    
129                    String strutsAction = ParamUtil.getString(
130                            request, "struts_action");
131    
132                    long groupId = ParamUtil.getLong(request, "groupId");
133    
134                    PortletURL portletURL = renderResponse.createRenderURL();
135    
136                    if (strutsAction.equals("/journal/select_document_library") ||
137                            strutsAction.equals("/document_library/select_file_entry") ||
138                            strutsAction.equals("/document_library/select_folder") ||
139                            strutsAction.equals("/document_library_display/select_folder")) {
140    
141                            ThemeDisplay themeDisplay =     (ThemeDisplay)request.getAttribute(
142                                    WebKeys.THEME_DISPLAY);
143    
144                            portletURL.setWindowState(LiferayWindowState.POP_UP);
145    
146                            portletURL.setParameter("struts_action", strutsAction);
147                            portletURL.setParameter("groupId", String.valueOf(groupId));
148    
149                            PortalUtil.addPortletBreadcrumbEntry(
150                                    request, themeDisplay.translate("documents-home"),
151                                    portletURL.toString());
152                    }
153                    else {
154                            portletURL.setParameter("struts_action", "/document_library/view");
155                    }
156    
157                    PortletPreferences preferences =
158                            PortletPreferencesFactoryUtil.getPortletPreferences(
159                                    request, PortalUtil.getPortletId(request));
160    
161                    long defaultFolderId = GetterUtil.getLong(
162                            preferences.getValue(
163                                    "rootFolderId",
164                                    String.valueOf(DLFolderConstants.DEFAULT_PARENT_FOLDER_ID)));
165    
166                    List<DLFolder> ancestorFolders = Collections.emptyList();
167    
168                    if (folder.getFolderId() != defaultFolderId) {
169                            ancestorFolders = folder.getAncestors();
170    
171                            int indexOfRootFolder = -1;
172    
173                            for (int i = 0; i < ancestorFolders.size(); i++) {
174                                    DLFolder ancestorFolder = ancestorFolders.get(i);
175    
176                                    if (defaultFolderId == ancestorFolder.getFolderId()) {
177                                            indexOfRootFolder = i;
178                                    }
179                            }
180    
181                            if (indexOfRootFolder > -1) {
182                                    ancestorFolders = ancestorFolders.subList(0, indexOfRootFolder);
183                            }
184                    }
185    
186                    Collections.reverse(ancestorFolders);
187    
188                    for (DLFolder ancestorFolder : ancestorFolders) {
189                            portletURL.setParameter(
190                                    "folderId", String.valueOf(ancestorFolder.getFolderId()));
191    
192                            PortalUtil.addPortletBreadcrumbEntry(
193                                    request, ancestorFolder.getName(), portletURL.toString());
194                    }
195    
196                    portletURL.setParameter(
197                            "folderId", String.valueOf(folder.getFolderId()));
198    
199                    if ((folder.getFolderId() !=
200                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) &&
201                            (folder.getFolderId() != defaultFolderId)) {
202    
203                            PortalUtil.addPortletBreadcrumbEntry(
204                                    request, folder.getName(), portletURL.toString());
205                    }
206            }
207    
208            public static int compareVersions(String version1, String version2) {
209                    int[] splitVersion1 = StringUtil.split(version1, StringPool.PERIOD, 0);
210                    int[] splitVersion2 = StringUtil.split(version2, StringPool.PERIOD, 0);
211    
212                    if ((splitVersion1.length != 2) && (splitVersion2.length != 2)) {
213                            return 0;
214                    }
215                    else if ((splitVersion1.length != 2)) {
216                            return -1;
217                    }
218                    else if ((splitVersion2.length != 2)) {
219                            return 1;
220                    }
221    
222                    if (splitVersion1[0] > splitVersion2[0]) {
223                            return 1;
224                    }
225                    else if (splitVersion1[0] < splitVersion2[0]) {
226                            return -1;
227                    }
228                    else if (splitVersion1[1] > splitVersion2[1]) {
229                            return 1;
230                    }
231                    else if (splitVersion1[1] < splitVersion2[1]) {
232                            return -1;
233                    }
234    
235                    return 0;
236            }
237    
238            public static String getFileIcon(String extension) {
239                    return _instance._getFileIcon(extension);
240            }
241    
242            public static String getGenericName(String extension) {
243                    return _instance._getGenericName(extension);
244            }
245    
246            public static String getLockId(long groupId, long folderId, String name) {
247                    try {
248                            DLFileEntry fileEntry = DLFileEntryLocalServiceUtil.getFileEntry(
249                                    groupId, folderId, name);
250    
251                            return String.valueOf(fileEntry.getFileEntryId());
252                    }
253                    catch (Exception e) {
254                            StringBundler sb = new StringBundler(5);
255    
256                            sb.append(groupId);
257                            sb.append(StringPool.POUND);
258                            sb.append(folderId);
259                            sb.append(StringPool.POUND);
260                            sb.append(name);
261    
262                            return sb.toString();
263                    }
264            }
265    
266            private DLUtil() {
267                    String[] fileIcons = null;
268    
269                    try {
270                            fileIcons = PrefsPropsUtil.getStringArray(
271                                    PropsKeys.DL_FILE_ICONS, StringPool.COMMA);
272                    }
273                    catch (Exception e) {
274                            _log.error(e, e);
275    
276                            fileIcons = new String[] {StringPool.BLANK};
277                    }
278    
279                    for (int i = 0; i < fileIcons.length; i++) {
280    
281                            // Only process non wildcard extensions
282    
283                            if (!StringPool.STAR.equals(fileIcons[i])) {
284    
285                                    // Strip starting period
286    
287                                    String extension = fileIcons[i];
288                                    extension = extension.substring(1, extension.length());
289    
290                                    _fileIcons.add(extension);
291                            }
292                    }
293    
294                    String[] genericNames = PropsUtil.getArray(
295                            PropsKeys.DL_FILE_GENERIC_NAMES);
296    
297                    for (String genericName : genericNames) {
298                            _populateGenericNamesMap(genericName);
299                    }
300            }
301    
302            private String _getFileIcon(String extension) {
303                    if (!_fileIcons.contains(extension)) {
304                            extension = _DEFAULT_FILE_ICON;
305                    }
306    
307                    return extension;
308            }
309    
310            private String _getGenericName(String extension) {
311                    String genericName = _genericNames.get(extension);
312    
313                    if (genericName == null) {
314                            genericName = _DEFAULT_GENERIC_NAME;
315                    }
316    
317                    return genericName;
318            }
319    
320            private void _populateGenericNamesMap(String genericName) {
321                    String[] extensions = PropsUtil.getArray(
322                            PropsKeys.DL_FILE_GENERIC_EXTENSIONS, new Filter(genericName));
323    
324                    for (String extension : extensions) {
325                            _genericNames.put(extension, genericName);
326                    }
327            }
328    
329            private static final String _DEFAULT_GENERIC_NAME = "default";
330    
331            private static final String _DEFAULT_FILE_ICON = "page";
332    
333            private static Log _log = LogFactoryUtil.getLog(DLUtil.class);
334    
335            private static DLUtil _instance = new DLUtil();
336    
337            private Map<String, String> _genericNames = new HashMap<String, String>();
338            private Set<String> _fileIcons = new HashSet<String>();
339    
340    }