2 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
\r
4 * This library is free software; you can redistribute it and/or modify it under
\r
5 * the terms of the GNU Lesser General Public License as published by the Free
\r
6 * Software Foundation; either version 2.1 of the License, or (at your option)
\r
9 * This library is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
\r
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
\r
15 package com.liferay.portal.kernel.webdav;
\r
17 import com.liferay.portal.NoSuchGroupException;
\r
18 import com.liferay.portal.NoSuchUserException;
\r
19 import com.liferay.portal.kernel.dao.orm.QueryUtil;
\r
20 import com.liferay.portal.kernel.log.Log;
\r
21 import com.liferay.portal.kernel.log.LogFactoryUtil;
\r
22 import com.liferay.portal.kernel.security.pacl.permission.PortalRuntimePermission;
\r
23 import com.liferay.portal.kernel.util.CharPool;
\r
24 import com.liferay.portal.kernel.util.GetterUtil;
\r
25 import com.liferay.portal.kernel.util.HttpUtil;
\r
26 import com.liferay.portal.kernel.util.OrderByComparator;
\r
27 import com.liferay.portal.kernel.util.StringPool;
\r
28 import com.liferay.portal.kernel.util.StringUtil;
\r
29 import com.liferay.portal.kernel.util.Time;
\r
30 import com.liferay.portal.kernel.util.UniqueList;
\r
31 import com.liferay.portal.kernel.util.Validator;
\r
32 import com.liferay.portal.kernel.xml.Namespace;
\r
33 import com.liferay.portal.kernel.xml.SAXReaderUtil;
\r
34 import com.liferay.portal.model.Group;
\r
35 import com.liferay.portal.model.GroupConstants;
\r
36 import com.liferay.portal.model.User;
\r
37 import com.liferay.portal.service.GroupLocalServiceUtil;
\r
38 import com.liferay.portal.service.UserLocalServiceUtil;
\r
39 import com.liferay.portal.util.comparator.GroupFriendlyURLComparator;
\r
41 import java.util.ArrayList;
\r
42 import java.util.Collection;
\r
43 import java.util.Collections;
\r
44 import java.util.LinkedHashMap;
\r
45 import java.util.List;
\r
46 import java.util.Map;
\r
47 import java.util.TreeMap;
\r
49 import javax.servlet.http.HttpServletRequest;
\r
52 * @author Brian Wing Shun Chan
\r
53 * @author Alexander Chow
\r
54 * @author Raymond Augé
\r
56 public class WebDAVUtil {
\r
58 public static final Namespace DAV_URI = SAXReaderUtil.createNamespace(
\r
61 public static final int SC_LOCKED = 423;
\r
63 public static final int SC_MULTI_STATUS = 207;
\r
65 public static final String TOKEN_PREFIX = "opaquelocktoken:";
\r
67 public static String fixPath(String path) {
\r
68 if (path.endsWith(StringPool.SLASH)) {
\r
69 path = path.substring(0, path.length() - 1);
\r
75 public static String encodeURL(String url) {
\r
76 url = HttpUtil.encodeURL(url);
\r
77 url = StringUtil.replace(url, StringPool.PLUS, StringPool.SPACE);
\r
82 public static void addStorage(WebDAVStorage storage) {
\r
83 getInstance()._addStorage(storage);
\r
86 public static Namespace createNamespace(String prefix, String uri) {
\r
87 Namespace namespace = null;
\r
89 if (uri.equals(WebDAVUtil.DAV_URI.getURI())) {
\r
90 namespace = WebDAVUtil.DAV_URI;
\r
92 else if (Validator.isNull(prefix)) {
\r
93 namespace = SAXReaderUtil.createNamespace(uri);
\r
96 namespace = SAXReaderUtil.createNamespace(prefix, uri);
\r
102 public static void deleteStorage(WebDAVStorage storage) {
\r
103 getInstance()._deleteStorage(storage);
\r
106 public static long getDepth(HttpServletRequest request) {
\r
107 String value = GetterUtil.getString(request.getHeader("Depth"));
\r
109 if (_log.isDebugEnabled()) {
\r
110 _log.debug("\"Depth\" header is " + value);
\r
113 if (value.equals("0")) {
\r
121 public static String getDestination(
\r
122 HttpServletRequest request, String rootPath) {
\r
124 String headerDestination = request.getHeader("Destination");
\r
125 String[] pathSegments = StringUtil.split(headerDestination, rootPath);
\r
127 String destination = pathSegments[pathSegments.length - 1];
\r
129 destination = HttpUtil.decodePath(destination);
\r
131 if (_log.isDebugEnabled()) {
\r
132 _log.debug("Destination " + destination);
\r
135 return destination;
\r
138 public static long getGroupId(long companyId, String path)
\r
139 throws WebDAVException {
\r
141 String[] pathArray = getPathArray(path);
\r
143 return getGroupId(companyId, pathArray);
\r
146 public static long getGroupId(long companyId, String[] pathArray)
\r
147 throws WebDAVException {
\r
150 if (pathArray.length == 0) {
\r
154 String name = pathArray[0];
\r
157 Group group = GroupLocalServiceUtil.getFriendlyURLGroup(
\r
158 companyId, StringPool.SLASH + name);
\r
160 return group.getGroupId();
\r
162 catch (NoSuchGroupException nsge) {
\r
166 User user = UserLocalServiceUtil.getUserByScreenName(
\r
169 Group group = user.getGroup();
\r
171 return group.getGroupId();
\r
173 catch (NoSuchUserException nsue) {
\r
176 catch (Exception e) {
\r
177 throw new WebDAVException(e);
\r
183 public static List<Group> getGroups(long userId) throws Exception {
\r
184 User user = UserLocalServiceUtil.getUser(userId);
\r
186 return getGroups(user);
\r
189 public static List<Group> getGroups(User user) throws Exception {
\r
193 if (user.isDefaultUser()) {
\r
194 List<Group> groups = new ArrayList<Group>();
\r
196 Group group = GroupLocalServiceUtil.getGroup(
\r
197 user.getCompanyId(), GroupConstants.GUEST);
\r
206 List<Group> groups = new UniqueList<Group>();
\r
208 LinkedHashMap<String, Object> params =
\r
209 new LinkedHashMap<String, Object>();
\r
211 params.put("usersGroups", user.getUserId());
\r
213 OrderByComparator orderByComparator = new GroupFriendlyURLComparator(
\r
217 GroupLocalServiceUtil.search(
\r
218 user.getCompanyId(), null, null, params, QueryUtil.ALL_POS,
\r
219 QueryUtil.ALL_POS, orderByComparator));
\r
224 GroupLocalServiceUtil.getUserOrganizationsGroups(
\r
225 user.getUserId(), QueryUtil.ALL_POS, QueryUtil.ALL_POS));
\r
229 if (!user.isDefaultUser()) {
\r
230 groups.add(user.getGroup());
\r
233 Collections.sort(groups, orderByComparator);
\r
238 public static WebDAVUtil getInstance() {
\r
239 PortalRuntimePermission.checkGetBeanProperty(WebDAVUtil.class);
\r
244 public static String getLockUuid(HttpServletRequest request)
\r
245 throws WebDAVException {
\r
247 String token = StringPool.BLANK;
\r
249 String value = GetterUtil.getString(request.getHeader("If"));
\r
251 if (_log.isDebugEnabled()) {
\r
252 _log.debug("\"If\" header is " + value);
\r
255 if (value.contains("(<DAV:no-lock>)")) {
\r
256 if (_log.isWarnEnabled()) {
\r
257 _log.warn("Lock tokens can never be <DAV:no-lock>");
\r
260 throw new WebDAVException();
\r
263 int beg = value.indexOf(TOKEN_PREFIX);
\r
266 beg += TOKEN_PREFIX.length();
\r
268 if (beg < value.length()) {
\r
269 int end = value.indexOf(CharPool.GREATER_THAN, beg);
\r
271 token = GetterUtil.getString(value.substring(beg, end));
\r
278 public static String[] getPathArray(String path) {
\r
279 return getPathArray(path, false);
\r
282 public static String[] getPathArray(String path, boolean fixTrailing) {
\r
283 path = HttpUtil.fixPath(path, true, fixTrailing);
\r
285 return StringUtil.split(path, CharPool.SLASH);
\r
288 public static String getResourceName(String[] pathArray) {
\r
289 if (pathArray.length <= 2) {
\r
290 return StringPool.BLANK;
\r
293 return pathArray[pathArray.length - 1];
\r
297 public static WebDAVStorage getStorage(String token) {
\r
298 return getInstance()._getStorage(token);
\r
301 public static Collection<String> getStorageTokens() {
\r
302 return getInstance()._getStorageTokens();
\r
305 public static long getTimeout(HttpServletRequest request) {
\r
306 final String TIME_PREFIX = "Second-";
\r
310 String value = GetterUtil.getString(request.getHeader("Timeout"));
\r
312 if (_log.isDebugEnabled()) {
\r
313 _log.debug("\"Timeout\" header is " + value);
\r
316 int index = value.indexOf(TIME_PREFIX);
\r
319 index += TIME_PREFIX.length();
\r
321 if (index < value.length()) {
\r
322 timeout = GetterUtil.getLong(value.substring(index));
\r
326 return timeout * Time.SECOND;
\r
329 public static boolean isOverwrite(HttpServletRequest request) {
\r
330 return getInstance()._isOverwrite(request);
\r
333 private WebDAVUtil() {
\r
334 _storageMap = new TreeMap<String, WebDAVStorage>();
\r
337 private void _addStorage(WebDAVStorage storage) {
\r
338 _storageMap.put(storage.getToken(), storage);
\r
341 private void _deleteStorage(WebDAVStorage storage) {
\r
342 if (storage != null) {
\r
343 _storageMap.remove(storage.getToken());
\r
347 private WebDAVStorage _getStorage(String token) {
\r
348 return _storageMap.get(token);
\r
351 private Collection<String> _getStorageTokens() {
\r
352 return _storageMap.keySet();
\r
355 private boolean _isOverwrite(HttpServletRequest request) {
\r
356 String value = GetterUtil.getString(request.getHeader("Overwrite"));
\r
358 if (value.equalsIgnoreCase("F") || !GetterUtil.getBoolean(value)) {
\r
366 private static Log _log = LogFactoryUtil.getLog(WebDAVUtil.class);
\r
368 private static WebDAVUtil _instance = new WebDAVUtil();
\r
370 private Map<String, WebDAVStorage> _storageMap;
\r