/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.webdav; import org.exoplatform.common.http.HTTPStatus; import java.util.Hashtable; /** * Constants used for webdav service implemetation. * * @author <a href="mailto:gavrik-vetal@gmail.com">Vitaly Guly</a> */ public final class WebDavConst { /** * Private constructor. */ private WebDavConst() { } /** * */ public static final String WDBDAV_COMMAND_CATALOG = "WEBDAV"; /** * HTTP-protocol version. */ public static final String HTTPVER = "HTTP/1.1"; /** * Some boundary const. */ public static final String BOUNDARY = "1234567890"; /** * WebDav "MS-Author-Via" header value. */ public static final String DAV_MSAUTHORVIA = "DAV"; /** * WebDav "DAV" namespace value. */ public static final String DAV_NAMESPACE = "DAV:"; /** * WebDav "eXo" namespace value. */ public static final String EXO_NAMESPACE = "http://exoplatform.com/jcr"; /** * WebDav "DAV" prefix. */ public static final String DAV_PREFIX = "D:"; /** * WebDav server version. */ public static final String DAV_SERVER = "eXo-Webdav Server /1.0"; /** * WebDav default header value. */ public static final String DAV_HEADER = "1, 2, ordered-collections"; /** * DAV Searching And Locating request value. */ public static final String DASL_VALUE = "<DAV:basicsearch>" + "<exo:sql xmlns:exo=\"http://exoplatform.com/jcr\"/>" + "<exo:xpath xmlns:exo=\"http://exoplatform.com/jcr\"/>"; /** * WebDav version identifier. */ public static final String DAV_VERSIONIDENTIFIER = "VERSIONID"; /** * WebDav version prefix. */ public static final String DAV_VERSIONPREFIX = "?" + DAV_VERSIONIDENTIFIER + "="; /** * WebDav default mime-type. */ public static final String DAV_DEFAULT_MIME_TYPE = "text/plain"; /** * Webdav document properties. * * @author <a href="mailto:dkatayev@gmail.com">Dmytro Katayev</a> */ public final class DavDocument { /** * Private constructor. */ private DavDocument() { } /** * Webdav document "acl-principal-props" property. See <a * href='http://tools.ietf.org/html/draft-ietf-webdav-acl-06'>WebDAV Access * Control Protocol</a> for more information. */ public static final String ACLPRINCIPALPROPS = "acl-principal-props"; /** * Webdav document "acl-principal-prop-set" property. See <a * href='http://tools.ietf.org/html/draft-ietf-webdav-acl-06'>WebDAV Access * Control Protocol</a> for more information. */ public static final String ACLPRINCIPALPROPSET = "acl-principal-prop-set"; /** * Webdav document "expand property" property. See <a * href='http://www.ietf.org/rfc/rfc3253.txt'>Versioning Extensions to * WebDAV</a> for more information. */ public static final String EXPANDPROPERTY = ""; /** * Webdav document "lockinfo" property. */ public static final String LOCKINFO = "lockinfo"; /** * Webdav document "property behavior" property. See <a * href='http://www.ietf.org/rfc/rfc2518.txt'>HTTP Extensions for * Distributed Authoring </a> for more information. */ public static final String PROPERTYBEHAVIOR = ""; /** * Webdav document "propertyupdate" property. See <a * href='http://www.ietf.org/rfc/rfc2518.txt'>HTTP Extensions for * Distributed Authoring </a> for more information. */ public static final String PROPERTYUPDATE = "propertyupdate"; /** * Webdav document "propfind" property. See <a * href='http://www.ietf.org/rfc/rfc2518.txt'>HTTP Extensions for * Distributed Authoring </a> for more information. */ public static final String PROPFIND = "propfind"; /** * Webdav document "version-tree" property. See <a * href='http://www.ietf.org/rfc/rfc2518.txt'>HTTP Extensions for * Distributed Authoring </a> for more information. */ public static final String VERSIONTREE = "version-tree"; /** * Webdav document "orderpatch" property. See <a * href='http://www.ietf.org/rfc/rfc2518.txt'>HTTP Extensions for * Distributed Authoring </a> for more information. */ public static final String ORDERPATCH = "orderpatch"; /** * Webdav document "searchrequest" property. See <a * href='http://www.ietf.org/rfc/rfc2518.txt'>HTTP Extensions for * Distributed Authoring </a> for more information. */ public static final String SEARCHREQUEST = "searchrequest"; } /** * Webdav custom properties. * * @author <a href="mailto:dkatayev@gmail.com">Dmytro Katayev</a> */ public final class DavProperty { /** * Private constructor. */ private DavProperty() { } /** * Webdav "depth" property. See <a * href='http://www.ietf.org/rfc/rfc2518.txt'>HTTP Extensions for * Distributed Authoring </a> for more information. */ public static final String DEPTH = "depth"; /** * Webdav "multistatus" property. See <a * href='http://www.ietf.org/rfc/rfc2518.txt'>HTTP Extensions for * Distributed Authoring </a> for more information. */ public static final String MULTISTATUS = "multistatus"; /** * Webdav "propfind" property. See <a * href='http://www.ietf.org/rfc/rfc2518.txt'>HTTP Extensions for * Distributed Authoring </a> for more information. */ public static final String PROPFIND = "propfind"; /** * Webdav "supported-method-set" property. See <a * href='http://www.ietf.org/rfc/rfc2518.txt'>HTTP Extensions for * Distributed Authoring </a> for more information. */ public static final String SUPPORDEDMETHODSET = "supported-method-set"; } /** * Webdav resource types. * * @author <a href="mailto:dkatayev@gmail.com">Dmytro Katayev</a> */ public final class ResourceType { /** * Private constructor. */ private ResourceType() { } /** * Webdav "collection" resource type. */ public static final String COLLECTION = "collection"; /** * Webdav "resource" resource type. */ public static final String RESOURCE = "resource"; } /** * Webdav Cache constants. * * @author <a href="mailto:dkatayev@gmail.com">Dmytro Katayev</a> */ public final class CacheConstants { /** * Private constructor. */ private CacheConstants() { } /** * Default Cache-Control header value. */ public static final String NO_CACHE = "no-cache"; } /** * Webdav locks types. * * @author <a href="mailto:dkatayev@gmail.com">Dmytro Katayev</a> */ public final class Lock { /** * Private constructor. */ private Lock() { } /** * Webdav "shared" lock type. */ public static final String SCOPE_SHARED = "shared"; /** * Webdav "exclusive" lock type. */ public static final String SCOPE_EXCLUSIVE = "exclusive"; /** * Webdav "write" lock type. */ public static final String TYPE_WRITE = "write"; /** * opaquelocktoken for LockToken generation. */ public static final String OPAQUE_LOCK_TOKEN = "opaquelocktoken"; } /** * Jcr node types used by webdav. * * @author <a href="mailto:dkatayev@gmail.com">Dmytro Katayev</a> */ public final class NodeTypes { /** * Private constructor. */ private NodeTypes() { } /** * JCR "jcr:content" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String JCR_CONTENT = "jcr:content"; /** * JCR "jcr:nodeType" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String JCR_NODE_TYPE = "jcr:nodeType"; /** * JCR "jcr:data" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String JCR_DATA = "jcr:data"; /** * JCR "jcr:frozenNode" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String JCR_FROZENNODE = "jcr:frozenNode"; /** * JCR "jcr:lockOwner" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String JCR_LOCKOWNER = "jcr:lockOwner"; /** * JCR "nt:version" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String NT_VERSION = "nt:version"; /** * JCR "jcr:created" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String JCR_CREATED = "jcr:created"; /** * JCR "nt:file" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String NT_FILE = "nt:file"; /** * JCR "jcr:rootVersion" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String JCR_ROOTVERSION = "jcr:rootVersion"; /** * JCR "jcr:lastModified" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String JCR_LASTMODIFIED = "jcr:lastModified"; /** * JCR "jcr:mimeType" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String JCR_MIMETYPE = "jcr:mimeType"; /** * JCR "nt:resource" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String NT_RESOURCE = "nt:resource"; /** * JCR "mix:lockable" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String MIX_LOCKABLE = "mix:lockable"; /** * JCR "mix:versionable" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String MIX_VERSIONABLE = "mix:versionable"; /** * JCR "nt:folder" NodeType. See <a * href='http://jcp.org/en/jsr/detail?id=170'> JSR 170: Content Repository * for JavaTM technology API</a> for more information. */ public static final String NT_FOLDER = "nt:folder"; } /** * Date format patterns used by webdav. * * @author <a href="mailto:dkatayev@gmail.com">Dmytro Katayev</a> */ public final class DateFormat { /** * Private constructor. */ private DateFormat() { } /** * Creation date pattern. */ public static final String CREATION = "yyyy-MM-dd'T'HH:mm:ss'Z'"; /** * Last modification date psttern. */ public static final String MODIFICATION = "EEE, dd MMM yyyy HH:mm:ss z"; /** * If-Modified-Since date psttern. */ public static final String IF_MODIFIED_SINCE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z"; } /** * Contains HTTP/1.1 status description. */ private static Hashtable<Integer, String> statusDescriptions = new Hashtable<Integer, String>(); /** * Registers Status code and it's description. * * @param status Status code * @param descr Description */ private static void registerDescr(int status, String descr) { statusDescriptions.put(new Integer(status), descr); } static { registerDescr(HTTPStatus.CONTINUE, "Continue"); registerDescr(HTTPStatus.SWITCHING_PROTOCOLS, "Switching Protocols"); registerDescr(HTTPStatus.OK, "OK"); registerDescr(HTTPStatus.CREATED, "Created"); registerDescr(HTTPStatus.ACCEPTED, "Accepted"); registerDescr(HTTPStatus.NOT_AUTHORITATIVE, "Non-Authoritative Information"); registerDescr(HTTPStatus.NO_CONTENT, "No Content"); registerDescr(HTTPStatus.RESET, "Reset Content"); registerDescr(HTTPStatus.PARTIAL, "Partial Content"); registerDescr(HTTPStatus.MULTISTATUS, "Multi Status"); registerDescr(HTTPStatus.MULT_CHOICE, "Multiple Choices"); registerDescr(HTTPStatus.MOVED_PERM, "Moved Permanently"); registerDescr(HTTPStatus.FOUND, "Found"); registerDescr(HTTPStatus.SEE_OTHER, "See Other"); registerDescr(HTTPStatus.NOT_MODIFIED, "Not Modified"); registerDescr(HTTPStatus.USE_PROXY, "Use Proxy"); registerDescr(HTTPStatus.TEMP_REDIRECT, "Temporary Redirect"); registerDescr(HTTPStatus.BAD_REQUEST, "Bad Request"); registerDescr(HTTPStatus.UNAUTHORIZED, "Unauthorized"); registerDescr(HTTPStatus.PAYMENT_REQUIRED, "Payment Required"); registerDescr(HTTPStatus.FORBIDDEN, "Forbidden"); registerDescr(HTTPStatus.NOT_FOUND, "Not Found"); registerDescr(HTTPStatus.METHOD_NOT_ALLOWED, "Method Not Allowed"); registerDescr(HTTPStatus.NOT_ACCEPTABLE, "Not Acceptable"); registerDescr(HTTPStatus.PROXY_AUTH, "Proxy Authentication Required"); registerDescr(HTTPStatus.REQUEST_TIMEOUT, "Request Timeout"); registerDescr(HTTPStatus.CONFLICT, "Conflict"); registerDescr(HTTPStatus.GONE, "Gone"); registerDescr(HTTPStatus.LENGTH_REQUIRED, "Length Required"); registerDescr(HTTPStatus.PRECON_FAILED, "Precondition Failed"); registerDescr(HTTPStatus.REQ_TOO_LONG, "Request Entity Too Large"); registerDescr(HTTPStatus.REQUEST_URI_TOO_LONG, "Request-URI Too Long"); registerDescr(HTTPStatus.UNSUPPORTED_TYPE, "Unsupported Media Type"); registerDescr(HTTPStatus.REQUESTED_RANGE_NOT_SATISFIABLE, "Requested Range Not Satisfiable"); registerDescr(HTTPStatus.EXPECTATION_FAILED, "Expectation Failed"); registerDescr(HTTPStatus.INTERNAL_ERROR, "Internal Server Error"); registerDescr(HTTPStatus.NOT_IMPLEMENTED, "Not Implemented"); registerDescr(HTTPStatus.BAD_GATEWAY, "Bad Gateway"); registerDescr(HTTPStatus.UNAVAILABLE, "Service Unavailable"); registerDescr(HTTPStatus.GATEWAY_TIMEOUT, "Gateway Timeout"); registerDescr(HTTPStatus.HTTP_VERSION_NOT_SUPPORTED, "HTTP Version Not Supported"); } /** * Returns status description by it's code. * * @param status Status code * @return Status Description */ public static String getStatusDescription(int status) { String description = ""; Integer statusKey = new Integer(status); if (statusDescriptions.containsKey(statusKey)) { description = statusDescriptions.get(statusKey); } return String.format("%s %d %s", WebDavConst.HTTPVER, status, description); } }