1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17   * SOFTWARE.
18   */
19  
20  package com.liferay.portlet.documentlibrary.util;
21  
22  import com.liferay.portal.SystemException;
23  import com.liferay.portal.kernel.language.LanguageUtil;
24  import com.liferay.portal.kernel.log.Log;
25  import com.liferay.portal.kernel.log.LogFactoryUtil;
26  import com.liferay.portal.kernel.portlet.LiferayWindowState;
27  import com.liferay.portal.kernel.util.ParamUtil;
28  import com.liferay.portal.kernel.util.StringPool;
29  import com.liferay.portal.kernel.util.Validator;
30  import com.liferay.portal.util.PrefsPropsUtil;
31  import com.liferay.portal.util.PropsKeys;
32  import com.liferay.portlet.documentlibrary.model.DLFileEntry;
33  import com.liferay.portlet.documentlibrary.model.DLFolder;
34  import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
35  import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
36  
37  import java.util.HashSet;
38  import java.util.Set;
39  
40  import javax.portlet.PortletURL;
41  import javax.portlet.RenderRequest;
42  import javax.portlet.RenderResponse;
43  import javax.portlet.WindowState;
44  
45  import javax.servlet.jsp.PageContext;
46  
47  /**
48   * <a href="DLUtil.java.html"><b><i>View Source</i></b></a>
49   *
50   * @author Brian Wing Shun Chan
51   * @author Julio Camarero
52   *
53   */
54  public class DLUtil {
55  
56      public static String getBreadcrumbs(
57              long folderId, String name, long rootFolderId,
58              PageContext pageContext, RenderRequest renderRequest,
59              RenderResponse renderResponse)
60          throws Exception {
61  
62          if ((folderId > 0) && Validator.isNotNull(name)) {
63              DLFileEntry fileEntry = DLFileEntryLocalServiceUtil.getFileEntry(
64                  folderId, name);
65  
66              return getBreadcrumbs(
67                  fileEntry.getFolder(), fileEntry, rootFolderId, pageContext,
68                  renderRequest, renderResponse);
69          }
70          else {
71              DLFolder folder = null;
72  
73              try {
74                  folder = DLFolderLocalServiceUtil.getFolder(folderId);
75              }
76              catch (Exception e) {
77              }
78  
79              return getBreadcrumbs(
80                  folder, null, rootFolderId, pageContext, renderRequest,
81                  renderResponse);
82          }
83      }
84  
85      public static String getBreadcrumbs(
86              DLFolder folder, DLFileEntry fileEntry, long rootFolderId,
87              PageContext pageContext, RenderRequest renderRequest,
88              RenderResponse renderResponse)
89          throws Exception {
90  
91          String strutsAction = ParamUtil.getString(
92              renderRequest, "struts_action");
93  
94          long groupId = ParamUtil.getLong(renderRequest, "groupId");
95  
96          if ((fileEntry != null) && (folder == null)) {
97              folder = fileEntry.getFolder();
98          }
99  
100         PortletURL foldersURL = renderResponse.createRenderURL();
101 
102         WindowState windowState = renderRequest.getWindowState();
103 
104         if (windowState.equals(LiferayWindowState.POP_UP)) {
105             foldersURL.setWindowState(LiferayWindowState.POP_UP);
106 
107             foldersURL.setParameter("struts_action", strutsAction);
108             foldersURL.setParameter("groupId", String.valueOf(groupId));
109         }
110         else {
111             //foldersURL.setWindowState(WindowState.MAXIMIZED);
112 
113             foldersURL.setParameter("struts_action", "/document_library/view");
114         }
115 
116         String foldersLink =
117             "<a href=\"" + foldersURL.toString() + "\">" +
118                 LanguageUtil.get(pageContext, "folders") + "</a>";
119 
120         if (folder == null) {
121             return "<span class=\"first last\">" + foldersLink + "</span>";
122         }
123 
124         String breadcrumbs = StringPool.BLANK;
125 
126         if (folder != null) {
127             for (int i = 0;; i++) {
128                 folder = folder.toEscapedModel();
129 
130                 PortletURL portletURL = renderResponse.createRenderURL();
131 
132                 if (windowState.equals(LiferayWindowState.POP_UP)) {
133                     portletURL.setWindowState(LiferayWindowState.POP_UP);
134 
135                     portletURL.setParameter("struts_action", strutsAction);
136                     portletURL.setParameter("groupId", String.valueOf(groupId));
137                     portletURL.setParameter(
138                         "folderId", String.valueOf(folder.getFolderId()));
139                 }
140                 else {
141                     //portletURL.setWindowState(WindowState.MAXIMIZED);
142 
143                     portletURL.setParameter(
144                         "struts_action", "/document_library/view");
145                     portletURL.setParameter(
146                         "folderId", String.valueOf(folder.getFolderId()));
147                 }
148 
149                 String folderLink =
150                     "<a href=\"" + portletURL.toString() + "\">" +
151                         folder.getName() + "</a>";
152 
153                 if (i == 0) {
154                     if (fileEntry != null) {
155                         breadcrumbs += folderLink;
156                     }
157                     else {
158                         breadcrumbs =
159                             "<span class=\"last\">" + folderLink + "</span>";
160                     }
161                 }
162                 else {
163                     breadcrumbs = folderLink + " &raquo; " + breadcrumbs;
164                 }
165 
166                 if (folder.isRoot() || (folder.getFolderId() == rootFolderId)) {
167                     break;
168                 }
169 
170                 folder = DLFolderLocalServiceUtil.getFolder(
171                     folder.getParentFolderId());
172             }
173         }
174 
175         breadcrumbs =
176             "<span class=\"first\">" + foldersLink + " &raquo; </span>" +
177                 breadcrumbs;
178 
179         if (fileEntry != null) {
180             fileEntry = fileEntry.toEscapedModel();
181 
182             PortletURL fileEntryURL = renderResponse.createRenderURL();
183 
184             //fileEntryURL.setWindowState(WindowState.MAXIMIZED);
185 
186             fileEntryURL.setParameter(
187                 "struts_action", "/document_library/edit_file_entry");
188             fileEntryURL.setParameter(
189                 "folderId", String.valueOf(fileEntry.getFolderId()));
190             fileEntryURL.setParameter("name", fileEntry.getName());
191 
192             String fileEntryLink =
193                 "<span class=\"last\"><a href=\"" + fileEntryURL.toString() +
194                     "\">" + fileEntry.getName() + "</a></span>";
195 
196             breadcrumbs = breadcrumbs + " &raquo; " + fileEntryLink;
197         }
198 
199         return breadcrumbs;
200     }
201 
202     public static String getFileExtension(String name) {
203         return _instance._getFileExtension(name);
204     }
205 
206     public static String getLockId(long folderId, String name) {
207         StringBuilder sb = new StringBuilder();
208 
209         sb.append(folderId);
210         sb.append(StringPool.POUND);
211         sb.append(name);
212 
213         return sb.toString();
214     }
215 
216     private DLUtil() {
217         _fileExtensions = new HashSet<String>();
218 
219         String[] fileExtensions = null;
220 
221         try {
222             fileExtensions = PrefsPropsUtil.getStringArray(
223                 PropsKeys.DL_FILE_EXTENSIONS, StringPool.COMMA);
224         }
225         catch (SystemException se) {
226             _log.error(se, se);
227 
228             fileExtensions = new String[] {StringPool.BLANK};
229         }
230 
231         for (int i = 0; i < fileExtensions.length; i++) {
232 
233             // Only process non wildcard extensions
234 
235             if (!StringPool.STAR.equals(fileExtensions[i])) {
236 
237                 // Strip starting period
238 
239                 String extension = fileExtensions[i];
240                 extension = extension.substring(1, extension.length());
241 
242                 _fileExtensions.add(extension);
243             }
244         }
245     }
246 
247     private String _getFileExtension(String name) {
248         String extension = StringPool.BLANK;
249 
250         int pos = name.lastIndexOf(StringPool.PERIOD);
251 
252         if (pos != -1) {
253             extension = name.substring(pos + 1, name.length()).toLowerCase();
254         }
255 
256         if (!_fileExtensions.contains(extension)) {
257             extension = _DEFAULT_FILE_EXTENSION;
258         }
259 
260         return extension;
261     }
262 
263     private static final String _DEFAULT_FILE_EXTENSION = "page";
264 
265     private static Log _log = LogFactoryUtil.getLog(DLUtil.class);
266 
267     private static DLUtil _instance = new DLUtil();
268 
269     private Set<String> _fileExtensions;
270 
271 }