Class JcrRemotingServlet

  • All Implemented Interfaces:
    Serializable, javax.servlet.Servlet, javax.servlet.ServletConfig, org.apache.jackrabbit.webdav.DavConstants
    Direct Known Subclasses:
    DavexServletService

    public abstract class JcrRemotingServlet
    extends JCRWebdavServerServlet
    JcrRemotingServlet is an extended version of the JCR Remoting Servlet that provides improved functionality and supports cross workspace copy and cloning.

    Batch Read

    Upon RepositoryService.getItemInfos a JSON object is composed containing the information for the requested node and its child items up to a specified or configuration determined depth.

    Batch read is triggered by adding a '.json' extension to the resource href. Optionally the client may explicitly specify the desired batch read depth by appending '.depth.json' extension. If no json extension is present the GET request is processed by the base servlet.

    The JSON writer applies the following rules:

     - Nodes are represented as JSON objects.
    
     - Each Node has its properties included as JSON key/value pairs.
    
     - Single valued Properties are simple key/value pairs.
    
     - Multi valued Properties are represented as JSON array.
    
     - Each Node has its child nodes included as long a maximal depths is not reached.
     
     - Nodes without any child nodes get a special JSON member named
       ::NodeIteratorSize, whose value is zero.
    
     - If the maximal depth is reached only name, index and unique id of the
       direct child are included (incomplete node info). In order to obtain
       the complete information the client sends another GET with .json extension.
     
    Same name sibling nodes and properties whose type cannot be unambiguously be extracted from the JSON on the client side need some special handling:
     - Node with index > 1, get a JSON key consisting of
       Node.getName() + "[" + Node.getIndex() + "]" 
    
     - Binary Property
       JSON value = length of the JCR value.
       The JCR value must be retrieved separately.
    
     - Name, Path, Reference and Date Property
       The JSON member representing the Property (name, value) is preceded by a
       special member consisting of
       JSON key = ":" + Property.getName()
       JSON value = PropertyType.nameFromValue(Property.getType())
    
     - Multi valued properties with Property.getValues().length == 0 will be
       treated as special property types above (extra property indicating the
       type of the property).
    
     - Double Property
       JSON value must not have any trailing ".0" removed.
     

    Multi Read

    Since Jackrabbit 2.3.6 it is also possible to request multiple subtrees in a single request. This is done by adding one or more ":include" parameters to a batch read request describe above. These extra parameters specify the (relative) paths of all the nodes to be included in the response. The response is a JSON object whose "nodes" property contains all the selected nodes keyed by path. Missing nodes are not included in the response. Each included node is serialized as defined above for batch read.

    Example:

     $ curl 'http://.../parent.json?:path=child1&:path=child2'
     {"nodes":{"/parent/child1":{...},"/parent/child2":{...}}}
     

    Batch Write

    The complete SPI Batch is sent to the server in a single request, currently a POST request containing a custom ":diff" parameter.
    NOTE that this is targeted to be replaced by a PATCH request.

    Diff format

    The diff parameter currently consists of JSON-like key-value pairs with the following special requirements:
       diff       ::= members
       members    ::= pair | pairs
       pair       ::= key " : " value
       pairs      ::= pair line-end pair | pair line-end pairs
       line-end   ::= "\r\n" | "\n" | "\r"
       key        ::= diffchar path
       diffchar   ::= "+" | "^" | "-" | ">"
       path       ::= abspath | relpath
       abspath    ::= * absolute path to an item *
       relpath    ::= * relpath from item at request URI to an item *
       value      ::= value+ | value- | value^ | value>
       value+     ::= * a JSON object *
       value-     ::= ""
       value^     ::= * any JSON value except JSON object *
       value>     ::= path | path "#before" | path "#after" | "#first" | "#last"
     
    In other words:
    • diff consists of one or more key-value pair(s)
    • key must start with a diffchar followed by a rel. or abs. item path
    • diffchar being any of "+", "^", "-" or ">" representing the transient item modifications as follows
         "+" addNode
         "^" setProperty / setValue / removeProperty
         "-" remove Item
         ">" move / reorder Nodes
       
    • key must be separated from the value by a ":" surrounded by whitespace.
    • two pairs must be separated by a line end
    • the format of the value depends on the diffchar
    • for moving around node the value must consist of a abs. or rel. path. in contrast reordering of existing nodes is achieved by appending a trailing order position hint (#first, #last, #before or #after)
    NOTE the following special handling of JCR properties of type Binary, Name, Path, Date and Reference:
    • the JSON value must be missing
    • the POST request is expected to contain extra multipart(s) or request parameter(s) for the property value(s)
    • the content type of the extra parts/params must reflect the property type:"jcr-value/" + PropertyType.nameFromValue(Property.getType).toLowerCase()
    See Also:
    www.json.org for the definition of JSON object and JSON value., Serialized Form
    • Field Summary

      Fields 
      Modifier and Type Field Description
      static String ATTR_TMP_DIRECTORY
      temp-dir attribute to be set to the servlet-context
      static String INIT_PARAM_BATCHREAD_CONFIG
      the 'temp-directory' init parameter
      static String INIT_PARAM_HOME
      the home init parameter. other relative filesystem paths are relative to this location.
      static String INIT_PARAM_PROTECTED_HANDLERS_CONFIG
      the 'protectedhandlers-config' init paramter. this parameter contains the XML configuration file for protected item remove handlers.
      static String INIT_PARAM_TMP_DIRECTORY
      the 'temp-directory' init parameter
      • Fields inherited from class org.apache.jackrabbit.webdav.server.AbstractWebdavServlet

        DEFAULT_AUTHENTICATE_HEADER, INIT_PARAM_AUTHENTICATE_HEADER, INIT_PARAM_CREATE_ABSOLUTE_URI, INIT_PARAM_CSRF_PROTECTION, INIT_PARAM_MISSING_AUTH_MAPPING
      • Fields inherited from interface org.apache.jackrabbit.webdav.DavConstants

        creationDateFormat, DEPTH_0, DEPTH_1, DEPTH_INFINITY, DEPTH_INFINITY_S, HEADER_AUTHORIZATION, HEADER_CONTENT_LANGUAGE, HEADER_CONTENT_LENGTH, HEADER_CONTENT_TYPE, HEADER_DAV, HEADER_DEPTH, HEADER_DESTINATION, HEADER_ETAG, HEADER_IF, HEADER_LAST_MODIFIED, HEADER_LOCK_TOKEN, HEADER_OVERWRITE, HEADER_TIMEOUT, INFINITE_TIMEOUT, modificationDateFormat, NAMESPACE, OPAQUE_LOCK_TOKEN_PREFIX, PROPERTY_CREATIONDATE, PROPERTY_DISPLAYNAME, PROPERTY_GETCONTENTLANGUAGE, PROPERTY_GETCONTENTLENGTH, PROPERTY_GETCONTENTTYPE, PROPERTY_GETETAG, PROPERTY_GETLASTMODIFIED, PROPERTY_LOCKDISCOVERY, PROPERTY_RESOURCETYPE, PROPERTY_SOURCE, PROPERTY_SUPPORTEDLOCK, PROPFIND_ALL_PROP, PROPFIND_ALL_PROP_INCLUDE, PROPFIND_BY_PROPERTY, PROPFIND_PROPERTY_NAMES, TIMEOUT_INFINITE, UNDEFINED_TIME, UNDEFINED_TIMEOUT, XML_ACTIVELOCK, XML_ALLPROP, XML_COLLECTION, XML_DEPTH, XML_DST, XML_EXCLUSIVE, XML_HREF, XML_INCLUDE, XML_KEEPALIVE, XML_LINK, XML_LOCKENTRY, XML_LOCKINFO, XML_LOCKROOT, XML_LOCKSCOPE, XML_LOCKTOKEN, XML_LOCKTYPE, XML_MULTISTATUS, XML_OMIT, XML_OWNER, XML_PROP, XML_PROPERTYBEHAVIOR, XML_PROPERTYUPDATE, XML_PROPFIND, XML_PROPNAME, XML_PROPSTAT, XML_REMOVE, XML_RESPONSE, XML_RESPONSEDESCRIPTION, XML_SET, XML_SHARED, XML_SOURCE, XML_STATUS, XML_TIMEOUT, XML_WRITE
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected void doGet​(org.apache.jackrabbit.webdav.WebdavRequest webdavRequest, org.apache.jackrabbit.webdav.WebdavResponse webdavResponse, org.apache.jackrabbit.webdav.DavResource davResource)  
      protected void doPost​(org.apache.jackrabbit.webdav.WebdavRequest webdavRequest, org.apache.jackrabbit.webdav.WebdavResponse webdavResponse, org.apache.jackrabbit.webdav.DavResource davResource)  
      org.apache.jackrabbit.webdav.DavResourceFactory getResourceFactory()
      Returns the DavResourceFactory.
      protected String getResourcePathPrefix()  
      void init()
      Initializes the servlet set reads the following parameter from the servlet configuration: resource-path-prefix: optional prefix for all resources.
      • Methods inherited from class org.apache.jackrabbit.webdav.server.AbstractWebdavServlet

        doAcl, doBaselineControl, doBind, doCheckin, doCheckout, doCopy, doDelete, doHead, doLabel, doLock, doMerge, doMkActivity, doMkCol, doMkWorkspace, doMove, doOptions, doOrderPatch, doPoll, doPropFind, doPropPatch, doPut, doRebind, doReport, doSearch, doSubscribe, doUnbind, doUncheckout, doUnlock, doUnsubscribe, doUpdate, doVersionControl, execute, getAuthenticateHeaderValue, getContentCodings, getInputContext, getOutputContext, getSingletonField, isCreateAbsoluteURI, sendUnauthorized, service
      • Methods inherited from class javax.servlet.http.HttpServlet

        doDelete, doGet, doHead, doOptions, doPost, doPut, doTrace, getLastModified, service
      • Methods inherited from class javax.servlet.GenericServlet

        destroy, getInitParameter, getInitParameterNames, getServletConfig, getServletContext, getServletInfo, getServletName, init, log, log
    • Field Detail

      • INIT_PARAM_HOME

        public static final String INIT_PARAM_HOME
        the home init parameter. other relative filesystem paths are relative to this location.
        See Also:
        Constant Field Values
      • INIT_PARAM_TMP_DIRECTORY

        public static final String INIT_PARAM_TMP_DIRECTORY
        the 'temp-directory' init parameter
        See Also:
        Constant Field Values
      • ATTR_TMP_DIRECTORY

        public static final String ATTR_TMP_DIRECTORY
        temp-dir attribute to be set to the servlet-context
        See Also:
        Constant Field Values
      • INIT_PARAM_BATCHREAD_CONFIG

        public static final String INIT_PARAM_BATCHREAD_CONFIG
        the 'temp-directory' init parameter
        See Also:
        Constant Field Values
      • INIT_PARAM_PROTECTED_HANDLERS_CONFIG

        public static final String INIT_PARAM_PROTECTED_HANDLERS_CONFIG
        the 'protectedhandlers-config' init paramter. this parameter contains the XML configuration file for protected item remove handlers.
        See Also:
        Constant Field Values
    • Constructor Detail

      • JcrRemotingServlet

        public JcrRemotingServlet()
    • Method Detail

      • init

        public void init()
                  throws javax.servlet.ServletException
        Description copied from class: JCRWebdavServerServlet
        Initializes the servlet set reads the following parameter from the servlet configuration:
        • resource-path-prefix: optional prefix for all resources.
        Overrides:
        init in class JCRWebdavServerServlet
        Throws:
        javax.servlet.ServletException
      • getResourcePathPrefix

        protected String getResourcePathPrefix()
      • doGet

        protected void doGet​(org.apache.jackrabbit.webdav.WebdavRequest webdavRequest,
                             org.apache.jackrabbit.webdav.WebdavResponse webdavResponse,
                             org.apache.jackrabbit.webdav.DavResource davResource)
                      throws IOException,
                             org.apache.jackrabbit.webdav.DavException
        Overrides:
        doGet in class org.apache.jackrabbit.webdav.server.AbstractWebdavServlet
        Throws:
        IOException
        org.apache.jackrabbit.webdav.DavException
      • doPost

        protected void doPost​(org.apache.jackrabbit.webdav.WebdavRequest webdavRequest,
                              org.apache.jackrabbit.webdav.WebdavResponse webdavResponse,
                              org.apache.jackrabbit.webdav.DavResource davResource)
                       throws IOException,
                              org.apache.jackrabbit.webdav.DavException
        Overrides:
        doPost in class org.apache.jackrabbit.webdav.server.AbstractWebdavServlet
        Throws:
        IOException
        org.apache.jackrabbit.webdav.DavException