Class JcrRemotingServlet
- java.lang.Object
-
- javax.servlet.GenericServlet
-
- javax.servlet.http.HttpServlet
-
- org.apache.jackrabbit.webdav.server.AbstractWebdavServlet
-
- org.apache.jackrabbit.webdav.jcr.JCRWebdavServerServlet
-
- org.apache.jackrabbit.server.remoting.davex.JcrRemotingServlet
-
- All Implemented Interfaces:
Serializable
,javax.servlet.Servlet
,javax.servlet.ServletConfig
,DavConstants
- Direct Known Subclasses:
DavexServletService
,JcrRemotingServlet
public abstract class JcrRemotingServlet extends JCRWebdavServerServlet
JcrRemotingServlet
is an extended version of theJCR 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)
- 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-contextstatic String
INIT_PARAM_BATCHREAD_CONFIG
the 'temp-directory' init parameterstatic String
INIT_PARAM_HOME
the home init parameter.static String
INIT_PARAM_PROTECTED_HANDLERS_CONFIG
the 'protectedhandlers-config' init paramter.static String
INIT_PARAM_TMP_DIRECTORY
the 'temp-directory' init parameter-
Fields inherited from class org.apache.jackrabbit.webdav.jcr.JCRWebdavServerServlet
CTX_ATTR_RESOURCE_PATH_PREFIX, INIT_PARAM_CONCURRENCY_LEVEL, INIT_PARAM_RESOURCE_PATH_PREFIX, subscriptionMgr, txMgr
-
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
-
-
Constructor Summary
Constructors Constructor Description JcrRemotingServlet()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
doGet(WebdavRequest webdavRequest, WebdavResponse webdavResponse, DavResource davResource)
The GET methodprotected void
doPost(WebdavRequest webdavRequest, WebdavResponse webdavResponse, DavResource davResource)
The POST method.DavResourceFactory
getResourceFactory()
Returns theDavResourceFactory
.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.jcr.JCRWebdavServerServlet
getCredentialsProvider, getDavSessionProvider, getLocatorFactory, getPathPrefix, getRepository, getSessionProvider, isPreconditionValid, setDavSessionProvider, setLocatorFactory, setResourceFactory, validateDestination
-
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
-
-
-
-
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
-
-
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 classJCRWebdavServerServlet
- Throws:
javax.servlet.ServletException
-
getResourcePathPrefix
protected String getResourcePathPrefix()
-
getResourceFactory
public DavResourceFactory getResourceFactory()
Description copied from class:JCRWebdavServerServlet
Returns theDavResourceFactory
.- Overrides:
getResourceFactory
in classJCRWebdavServerServlet
- Returns:
- the resource factory
- See Also:
AbstractWebdavServlet.getResourceFactory()
-
doGet
protected void doGet(WebdavRequest webdavRequest, WebdavResponse webdavResponse, DavResource davResource) throws IOException, DavException
Description copied from class:AbstractWebdavServlet
The GET method- Overrides:
doGet
in classAbstractWebdavServlet
- Throws:
IOException
DavException
-
doPost
protected void doPost(WebdavRequest webdavRequest, WebdavResponse webdavResponse, DavResource davResource) throws IOException, DavException
Description copied from class:AbstractWebdavServlet
The POST method. Delegate to PUT- Overrides:
doPost
in classAbstractWebdavServlet
- Throws:
IOException
DavException
-
-