Class DownloadServiceImpl
- java.lang.Object
-
- org.nuxeo.runtime.model.DefaultComponent
-
- org.nuxeo.ecm.core.io.download.DownloadServiceImpl
-
- All Implemented Interfaces:
DownloadService
,Adaptable
,Component
,Extensible
,TimestampedService
public class DownloadServiceImpl extends DefaultComponent implements DownloadService
This service allows the download of blobs to a HTTP response.- Since:
- 7.3
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected static class
DownloadServiceImpl.Action
-
Nested classes/interfaces inherited from interface org.nuxeo.ecm.core.io.download.DownloadService
DownloadService.DownloadContext
-
-
Field Summary
Fields Modifier and Type Field Description protected static String
CHEMISTRY_HEAD_REQUEST_CLASS
protected static int
DOWNLOAD_BUFFER_SIZE
static String
DOWNLOAD_URL_FOLLOW_REDIRECT
protected RedirectResolver
redirectResolver
protected ScriptEngineManager
scriptEngineManager
static String
XP_PERMISSIONS
static String
XP_REDIRECT_RESOLVER
-
Fields inherited from class org.nuxeo.runtime.model.DefaultComponent
lastModified, name
-
Fields inherited from interface org.nuxeo.ecm.core.io.download.DownloadService
BLOBHOLDER_0, BLOBHOLDER_PREFIX, EVENT_NAME, EXTENDED_INFO_CLIENT_REASON, EXTENDED_INFO_RENDITION, NXBIGBLOB, NXBIGFILE, NXBIGZIPFILE, NXBLOBSTATUS, NXDOWNLOADINFO, NXFILE, REQUEST_ATTR_DOWNLOAD_REASON, REQUEST_ATTR_DOWNLOAD_RENDITION, REQUEST_HEADER_CLIENT_REASON, REQUEST_QUERY_PARAM_CLIENT_REASON, TRANSIENT_STORE_PARAM_ERROR, TRANSIENT_STORE_PARAM_PROGRESS, TRANSIENT_STORE_STORE_NAME
-
-
Constructor Summary
Constructors Constructor Description DownloadServiceImpl()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description protected void
addCacheControlHeaders(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
Internet Explorer file downloads over SSL do not work with certain HTTP cache control headersboolean
checkPermission(DocumentModel doc, String xpath, Blob blob, String reason, Map<String,Serializable> extendedInfos)
Checks whether the download of the blob is allowed.void
downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, String key, String reason)
Triggers a blobs download.protected void
downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, String key, String reason, boolean status)
void
downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, DocumentModel doc, String xpath, Blob blob, String filename, String reason)
Deprecated.void
downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, DocumentModel doc, String xpath, Blob blob, String filename, String reason, Map<String,Serializable> extendedInfos)
Deprecated.void
downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, DocumentModel doc, String xpath, Blob blob, String filename, String reason, Map<String,Serializable> extendedInfos, Boolean inline)
Deprecated.void
downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, DocumentModel doc, String xpath, Blob blob, String filename, String reason, Map<String,Serializable> extendedInfos, Boolean inline, Consumer<ByteRange> blobTransferer)
Deprecated.void
downloadBlob(DownloadService.DownloadContext context)
Triggers a blob download.void
downloadBlobStatus(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, String key, String reason)
Triggers aAsyncBlob
download which gives information about an asynchronous blob.protected String
fixXPath(String xpath)
protected static boolean
forceNoCacheOnMSIE()
protected ByteRange
getByteRange(javax.servlet.http.HttpServletRequest request, long length)
protected org.apache.commons.lang3.tuple.Pair<String,DownloadServiceImpl.Action>
getDownloadPathAndAction(String path)
Gets the download path and action of the URL to use to download blobs.String
getDownloadUrl(String storeKey)
Gets the URL to use to download the blobs identified by a storage key.String
getDownloadUrl(String repositoryName, String docId, String xpath, String filename)
Gets the URL to use to download the blob at the given xpath in the given document.String
getDownloadUrl(String repositoryName, String docId, String xpath, String filename, String changeToken)
Gets the URL to use to download the blob at the given xpath in the given document.String
getDownloadUrl(DocumentModel doc, String xpath, String filename)
Gets the URL to use to download the blob at the given xpath in the given document.String
getFullDownloadUrl(DocumentModel doc, String xpath, Blob blob, String baseUrl)
Gets the full download URL (after redirects if configured so) for the given blob.protected static NuxeoPrincipal
getPrincipal()
protected String
getSanitizedFilenameWithoutPath(String filename)
protected Set<String>
getWantDigests(javax.servlet.http.HttpServletRequest request)
void
handleDownload(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, String baseUrl, String path)
Handles the download of a document.protected void
handleDownload(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, String downloadPath, String baseUrl, boolean info)
protected static String
hexToBase64(String hexString)
protected static boolean
isHead(javax.servlet.http.HttpServletRequest request)
void
logDownload(javax.servlet.http.HttpServletRequest request, DocumentModel doc, String xpath, String filename, String reason, Map<String,Serializable> extendedInfos)
Logs a download.Blob
resolveBlob(DocumentModel doc)
Finds a document's blob.Blob
resolveBlob(DocumentModel doc, String xpath)
Finds a document's blob given an xpath or blobholder indexBlob
resolveBlobFromDownloadUrl(String downloadURL)
Finds a document's blob given the download URL returned byDownloadService.getDownloadUrl(org.nuxeo.ecm.core.api.DocumentModel, java.lang.String, java.lang.String)
.void
start(ComponentContext context)
Start the component.void
stop(ComponentContext context)
Stop the component.String
storeBlobs(List<Blob> blobs)
Stores the blobs for later download.void
transferBlobWithByteRange(Blob blob, ByteRange byteRange, Supplier<OutputStream> outputStreamSupplier)
Copies the blob stream at the given byte range into the suppliedOutputStream
.protected void
transferBlobWithByteRange(Blob blob, ByteRange byteRange, javax.servlet.http.HttpServletResponse response)
-
Methods inherited from class org.nuxeo.runtime.model.DefaultComponent
activate, addRuntimeMessage, addRuntimeMessage, deactivate, getAdapter, getDescriptor, getDescriptors, getLastModified, getRegistry, register, registerContribution, registerExtension, setLastModified, setModifiedNow, setName, unregister, unregisterContribution, unregisterExtension
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.nuxeo.runtime.model.Component
applicationStarted, getApplicationStartedOrder
-
Methods inherited from interface org.nuxeo.ecm.core.io.download.DownloadService
logDownload
-
-
-
-
Field Detail
-
XP_PERMISSIONS
public static final String XP_PERMISSIONS
- See Also:
- Constant Field Values
-
XP_REDIRECT_RESOLVER
public static final String XP_REDIRECT_RESOLVER
- See Also:
- Constant Field Values
-
DOWNLOAD_BUFFER_SIZE
protected static final int DOWNLOAD_BUFFER_SIZE
- See Also:
- Constant Field Values
-
DOWNLOAD_URL_FOLLOW_REDIRECT
public static final String DOWNLOAD_URL_FOLLOW_REDIRECT
- Since:
- 11.1
- See Also:
- Constant Field Values
-
scriptEngineManager
protected ScriptEngineManager scriptEngineManager
-
redirectResolver
protected RedirectResolver redirectResolver
-
CHEMISTRY_HEAD_REQUEST_CLASS
protected static final String CHEMISTRY_HEAD_REQUEST_CLASS
- See Also:
- Constant Field Values
-
-
Method Detail
-
start
public void start(ComponentContext context)
Description copied from interface:Component
Start the component. This method is called after all the components were resolved and activated- Specified by:
start
in interfaceComponent
- Overrides:
start
in classDefaultComponent
-
stop
public void stop(ComponentContext context) throws InterruptedException
Description copied from interface:Component
Stop the component.- Specified by:
stop
in interfaceComponent
- Overrides:
stop
in classDefaultComponent
- Throws:
InterruptedException
-
storeBlobs
public String storeBlobs(List<Blob> blobs)
Stores the blobs for later download. Multipart download are not yet supported. You can only provide a blob singleton at this time.- Specified by:
storeBlobs
in interfaceDownloadService
- Parameters:
blobs
- the list of blobs to store- Returns:
- the store key used for retrieving the blobs (@see
DownloadService.getDownloadUrl(String)
-
getFullDownloadUrl
public String getFullDownloadUrl(DocumentModel doc, String xpath, Blob blob, String baseUrl)
Description copied from interface:DownloadService
Gets the full download URL (after redirects if configured so) for the given blob.- Specified by:
getFullDownloadUrl
in interfaceDownloadService
- Parameters:
doc
- the documentxpath
- the blob's xpath or blobholder index, ornull
for defaultblob
- the blobbaseUrl
- the base URL to use for Nuxeo downloads (if there is no redirect)- Returns:
- the full URL (which may be to a redirected server)
-
getDownloadUrl
public String getDownloadUrl(DocumentModel doc, String xpath, String filename)
Description copied from interface:DownloadService
Gets the URL to use to download the blob at the given xpath in the given document.The URL is relative to the Nuxeo Web Application context.
Returns something like
nxfile/reponame/docuuid/blobholder:0/foo.jpg?changeToken=5-1
- Specified by:
getDownloadUrl
in interfaceDownloadService
- Parameters:
doc
- the documentxpath
- the blob's xpath or blobholder index, ornull
for defaultfilename
- the blob's filename, ornull
for default- Returns:
- the download URL with changeToken as query param for optimized http caching
-
getDownloadUrl
public String getDownloadUrl(String repositoryName, String docId, String xpath, String filename)
Description copied from interface:DownloadService
Gets the URL to use to download the blob at the given xpath in the given document.The URL is relative to the Nuxeo Web Application context.
Returns something like
nxfile/reponame/docuuid/blobholder:0/foo.jpg
- Specified by:
getDownloadUrl
in interfaceDownloadService
- Parameters:
repositoryName
- the document repositorydocId
- the document idxpath
- the blob's xpath or blobholder index, ornull
for defaultfilename
- the blob's filename, ornull
for default- Returns:
- the download URL
-
getDownloadUrl
public String getDownloadUrl(String repositoryName, String docId, String xpath, String filename, String changeToken)
Description copied from interface:DownloadService
Gets the URL to use to download the blob at the given xpath in the given document.The URL is relative to the Nuxeo Web Application context.
Returns something like
nxfile/reponame/docuuid/blobholder:0/foo.jpg?changeToken=5-1
- Specified by:
getDownloadUrl
in interfaceDownloadService
- Parameters:
repositoryName
- the document repositorydocId
- the document idxpath
- the blob's xpath or blobholder index, ornull
for defaultfilename
- the blob's filename, ornull
for defaultchangeToken
- the doc changeToken which will be appended as a query parameter for optimized http caching.- Returns:
- the download URL
-
getDownloadUrl
public String getDownloadUrl(String storeKey)
Description copied from interface:DownloadService
Gets the URL to use to download the blobs identified by a storage key.The URL is relative to the Nuxeo Web Application context.
Returns something like
nxbigblob/key
- Specified by:
getDownloadUrl
in interfaceDownloadService
- Parameters:
storeKey
- The key of stored blobs to download- Returns:
- the download URL
-
getDownloadPathAndAction
protected org.apache.commons.lang3.tuple.Pair<String,DownloadServiceImpl.Action> getDownloadPathAndAction(String path)
Gets the download path and action of the URL to use to download blobs. For instance, from the path "nxfile/default/3727ef6b-cf8c-4f27-ab2c-79de0171a2c8/files:files/0/file/image.png", the pair ("default/3727ef6b-cf8c-4f27-ab2c-79de0171a2c8/files:files/0/file/image.png", Action.DOWNLOAD_FROM_DOC) is returned.- Parameters:
path
- the path of the URL to use to download blobs- Returns:
- the pair download path and action
- Since:
- 9.1
-
resolveBlobFromDownloadUrl
public Blob resolveBlobFromDownloadUrl(String downloadURL)
Description copied from interface:DownloadService
Finds a document's blob given the download URL returned byDownloadService.getDownloadUrl(org.nuxeo.ecm.core.api.DocumentModel, java.lang.String, java.lang.String)
.The permissions are check whether the user can download the blob or not.
- Specified by:
resolveBlobFromDownloadUrl
in interfaceDownloadService
- Parameters:
downloadURL
- the URL to use to download the blob- Returns:
- the blob, or
null
if not found or if the user has no permission to download it
-
handleDownload
public void handleDownload(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, String baseUrl, String path) throws IOException
Description copied from interface:DownloadService
Handles the download of a document.- Specified by:
handleDownload
in interfaceDownloadService
- Parameters:
req
- the requestresp
- the responsebaseUrl
- the request baseUrlpath
- the request path, without the context- Throws:
IOException
-
isHead
protected static boolean isHead(javax.servlet.http.HttpServletRequest request)
-
handleDownload
protected void handleDownload(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, String downloadPath, String baseUrl, boolean info) throws IOException
- Throws:
IOException
-
downloadBlobStatus
public void downloadBlobStatus(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, String key, String reason) throws IOException
Description copied from interface:DownloadService
Triggers aAsyncBlob
download which gives information about an asynchronous blob.- Specified by:
downloadBlobStatus
in interfaceDownloadService
key
- the stored blobs keyreason
- the download reason- Throws:
IOException
-
downloadBlob
public void downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, String key, String reason) throws IOException
Description copied from interface:DownloadService
Triggers a blobs download. Once the temporary blobs are transfered from the store, they are automatically deleted. The returned HTTP Status Code is 200 if the blob is ready or 202 if it is still being processed.- Specified by:
downloadBlob
in interfaceDownloadService
key
- the stored blobs keyreason
- the download reason- Throws:
IOException
-
downloadBlob
protected void downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, String key, String reason, boolean status) throws IOException
- Throws:
IOException
-
downloadBlob
@Deprecated public void downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, DocumentModel doc, String xpath, Blob blob, String filename, String reason) throws IOException
Deprecated.Description copied from interface:DownloadService
Triggers a blob download.- Specified by:
downloadBlob
in interfaceDownloadService
doc
- the document, if availablexpath
- the blob's xpath or blobholder index, if availableblob
- the blob, if already fetchedfilename
- the filename to usereason
- the download reason- Throws:
IOException
-
downloadBlob
@Deprecated public void downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, DocumentModel doc, String xpath, Blob blob, String filename, String reason, Map<String,Serializable> extendedInfos) throws IOException
Deprecated.Description copied from interface:DownloadService
Triggers a blob download.- Specified by:
downloadBlob
in interfaceDownloadService
doc
- the document, if availablexpath
- the blob's xpath or blobholder index, if availableblob
- the blob, if already fetchedfilename
- the filename to usereason
- the download reasonextendedInfos
- an optional map of extended informations to log- Throws:
IOException
-
downloadBlob
@Deprecated public void downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, DocumentModel doc, String xpath, Blob blob, String filename, String reason, Map<String,Serializable> extendedInfos, Boolean inline) throws IOException
Deprecated.Description copied from interface:DownloadService
Triggers a blob download.- Specified by:
downloadBlob
in interfaceDownloadService
doc
- the document, if availablexpath
- the blob's xpath or blobholder index, if availableblob
- the blob, if already fetchedfilename
- the filename to usereason
- the download reasonextendedInfos
- an optional map of extended informations to loginline
- if not null, force the inline flag for content-disposition- Throws:
IOException
-
downloadBlob
@Deprecated public void downloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, DocumentModel doc, String xpath, Blob blob, String filename, String reason, Map<String,Serializable> extendedInfos, Boolean inline, Consumer<ByteRange> blobTransferer) throws IOException
Deprecated.Description copied from interface:DownloadService
Triggers a blob download.- Specified by:
downloadBlob
in interfaceDownloadService
doc
- the document, if availablexpath
- the blob's xpath or blobholder index, if availableblob
- the blob, if already fetchedfilename
- the filename to usereason
- the download reasonextendedInfos
- an optional map of extended informations to loginline
- if not null, force the inline flag for content-dispositionblobTransferer
- the transferer of the actual blob- Throws:
IOException
-
downloadBlob
public void downloadBlob(DownloadService.DownloadContext context) throws IOException
Description copied from interface:DownloadService
Triggers a blob download.- Specified by:
downloadBlob
in interfaceDownloadService
- Parameters:
context
- the download context- Throws:
IOException
-
getByteRange
protected ByteRange getByteRange(javax.servlet.http.HttpServletRequest request, long length)
-
transferBlobWithByteRange
protected void transferBlobWithByteRange(Blob blob, ByteRange byteRange, javax.servlet.http.HttpServletResponse response)
-
transferBlobWithByteRange
public void transferBlobWithByteRange(Blob blob, ByteRange byteRange, Supplier<OutputStream> outputStreamSupplier)
Description copied from interface:DownloadService
Copies the blob stream at the given byte range into the suppliedOutputStream
.- Specified by:
transferBlobWithByteRange
in interfaceDownloadService
- Parameters:
blob
- the blobbyteRange
- the byte rangeoutputStreamSupplier
- theOutputStream
supplier
-
resolveBlob
public Blob resolveBlob(DocumentModel doc)
Description copied from interface:DownloadService
Finds a document's blob.- Specified by:
resolveBlob
in interfaceDownloadService
- Parameters:
doc
- the document- Returns:
- the blob, or
null
if not available
-
resolveBlob
public Blob resolveBlob(DocumentModel doc, String xpath)
Description copied from interface:DownloadService
Finds a document's blob given an xpath or blobholder index- Specified by:
resolveBlob
in interfaceDownloadService
- Parameters:
doc
- the documentxpath
- the xpath or blobholder index- Returns:
- the blob, or
null
if not found
-
checkPermission
public boolean checkPermission(DocumentModel doc, String xpath, Blob blob, String reason, Map<String,Serializable> extendedInfos)
Description copied from interface:DownloadService
Checks whether the download of the blob is allowed.- Specified by:
checkPermission
in interfaceDownloadService
- Parameters:
doc
- the doc for which this download occurs, if availablexpath
- the blob's xpath or blobholder index, if availableblob
- the blobreason
- the download reasonextendedInfos
- an optional map of extended informations to log- Returns:
true
if download is allowed
-
addCacheControlHeaders
protected void addCacheControlHeaders(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
Internet Explorer file downloads over SSL do not work with certain HTTP cache control headersSee http://support.microsoft.com/kb/323308/
What is not mentioned in the above Knowledge Base is that "Pragma: no-cache" also breaks download in MSIE over SSL
-
forceNoCacheOnMSIE
protected static boolean forceNoCacheOnMSIE()
-
logDownload
public void logDownload(javax.servlet.http.HttpServletRequest request, DocumentModel doc, String xpath, String filename, String reason, Map<String,Serializable> extendedInfos)
Description copied from interface:DownloadService
Logs a download.- Specified by:
logDownload
in interfaceDownloadService
- Parameters:
request
- the HTTP request, if availabledoc
- the doc for which this download occurs, if availablexpath
- the blob's xpath or blobholder index, if availablefilename
- the filenamereason
- the download reasonextendedInfos
- an optional map of extended informations to log
-
getPrincipal
protected static NuxeoPrincipal getPrincipal()
-
-