The
JCRURLConnection
is the
URLConnection
implementation to access the data addressed by a JCR Repository URL.
As the primary use of a URLConnection
and thus the JCRURLConnection
is to provide access to the content of a resource identified by the URL, it is the primary task of this class to identify and access a repository Property
based on the URL. This main task is executed in the {@link #connect()} method.
Basically the guideposts to access content from a JCR Repository URl are the following:
- The URL must ultimately resolve to a repository property to provide content.
- If the URL itself is the path to a property, that property is used to provide the content.
- If the URL is a path to a node, the primary item chain starting with this node is followed until no further primary items exist. If the final item is a property, that property is used to provide the content.
- If neither of the above methods resolve to a property, the {@link #connect()} fails and access to the content is not possible.
After having connected the property is available through the {@link #getProperty()} method. Other methods exist to retrieve repositoryrelated information defined when creating the URL: {@link #getSession()} toretrieve the session of the URL, {@link #getPath()} to retrieve the pathwith which the URL was created and {@link #getItem()} to retrieve the itemwith which the URL was created. The results of calling {@link #getProperty()}and {@link #getItem()} will be the same if the URL directly addressed theproperty. If the URL addressed the node whose primary item chain ultimately resolved to the property, the {@link #getItem()} will return the node and{@link #getProperty()} will return the resolved property.
A note on the InputStream
available from {@link #getInputStream()}: Unlike other implementations - for example for file:
or http:
URLs - which return the same stream on each call, this implementation returns a new stream on each invocation.
The following header fields are implemented by this class:
Content-Length
- The size of the content is filled from the
Property.getLength()
method, which returns the size in bytes of the property's value for binary values and the number of characters used for the string representation of the value for all other value types. Content-Type
- If the property is a child of a
nt:resource
node, the content type is retrieved from the jcr:mimeType
property of the parent node. If the parent node is not a nt:resource
, the guessContentTypeFromName
method is called on the {@link #getPath() path}. If this does not yield a content type, it is set to application/octet-stream
for binary properties and to text/plain
for other types. Content-Enconding
- If the property is a child of a
nt:resource
node, the content encoding is retrieved from the jcr:econding
property of the parent node. If the jcr:encoding
property is not set, this header field remains undefined (aka null
). Last-Modified
- If the property is a child of a
nt:resource
node, the last modified type is retrieved from the jcr:lastModified
property of the parent node. If the parent node is not a nt:resource
, the last modification time is set to zero.
This class is not intended to be subclassed or instantiated by clients.
@author Felix Meschberger