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 classDownloadServiceImpl.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 StringCHEMISTRY_HEAD_REQUEST_CLASSprotected static intDOWNLOAD_BUFFER_SIZEstatic StringDOWNLOAD_URL_FOLLOW_REDIRECTprotected RedirectResolverredirectResolverprotected ScriptEngineManagerscriptEngineManagerstatic StringXP_PERMISSIONSstatic StringXP_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 voidaddCacheControlHeaders(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)Internet Explorer file downloads over SSL do not work with certain HTTP cache control headersbooleancheckPermission(DocumentModel doc, String xpath, Blob blob, String reason, Map<String,Serializable> extendedInfos)Checks whether the download of the blob is allowed.voiddownloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, String key, String reason)Triggers a blobs download.protected voiddownloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, String key, String reason, boolean status)voiddownloadBlob(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, DocumentModel doc, String xpath, Blob blob, String filename, String reason)Deprecated.voiddownloadBlob(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.voiddownloadBlob(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.voiddownloadBlob(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.voiddownloadBlob(DownloadService.DownloadContext context)Triggers a blob download.voiddownloadBlobStatus(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, String key, String reason)Triggers aAsyncBlobdownload which gives information about an asynchronous blob.protected StringfixXPath(String xpath)protected static booleanforceNoCacheOnMSIE()protected ByteRangegetByteRange(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.StringgetDownloadUrl(String storeKey)Gets the URL to use to download the blobs identified by a storage key.StringgetDownloadUrl(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.StringgetDownloadUrl(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.StringgetDownloadUrl(DocumentModel doc, String xpath, String filename)Gets the URL to use to download the blob at the given xpath in the given document.StringgetFullDownloadUrl(DocumentModel doc, String xpath, Blob blob, String baseUrl)Gets the full download URL (after redirects if configured so) for the given blob.protected static NuxeoPrincipalgetPrincipal()protected StringgetSanitizedFilenameWithoutPath(String filename)protected Set<String>getWantDigests(javax.servlet.http.HttpServletRequest request)voidhandleDownload(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, String baseUrl, String path)Handles the download of a document.protected voidhandleDownload(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, String downloadPath, String baseUrl, boolean info)protected static StringhexToBase64(String hexString)protected static booleanisHead(javax.servlet.http.HttpServletRequest request)voidlogDownload(javax.servlet.http.HttpServletRequest request, DocumentModel doc, String xpath, String filename, String reason, Map<String,Serializable> extendedInfos)Logs a download.BlobresolveBlob(DocumentModel doc)Finds a document's blob.BlobresolveBlob(DocumentModel doc, String xpath)Finds a document's blob given an xpath or blobholder indexBlobresolveBlobFromDownloadUrl(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).voidstart(ComponentContext context)Start the component.voidstop(ComponentContext context)Stop the component.StringstoreBlobs(List<Blob> blobs)Stores the blobs for later download.voidtransferBlobWithByteRange(Blob blob, ByteRange byteRange, Supplier<OutputStream> outputStreamSupplier)Copies the blob stream at the given byte range into the suppliedOutputStream.protected voidtransferBlobWithByteRange(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:ComponentStart the component. This method is called after all the components were resolved and activated- Specified by:
startin interfaceComponent- Overrides:
startin classDefaultComponent
-
stop
public void stop(ComponentContext context) throws InterruptedException
Description copied from interface:ComponentStop the component.- Specified by:
stopin interfaceComponent- Overrides:
stopin 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:
storeBlobsin 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:DownloadServiceGets the full download URL (after redirects if configured so) for the given blob.- Specified by:
getFullDownloadUrlin interfaceDownloadService- Parameters:
doc- the documentxpath- the blob's xpath or blobholder index, ornullfor 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:DownloadServiceGets 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:
getDownloadUrlin interfaceDownloadService- Parameters:
doc- the documentxpath- the blob's xpath or blobholder index, ornullfor defaultfilename- the blob's filename, ornullfor 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:DownloadServiceGets 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:
getDownloadUrlin interfaceDownloadService- Parameters:
repositoryName- the document repositorydocId- the document idxpath- the blob's xpath or blobholder index, ornullfor defaultfilename- the blob's filename, ornullfor default- Returns:
- the download URL
-
getDownloadUrl
public String getDownloadUrl(String repositoryName, String docId, String xpath, String filename, String changeToken)
Description copied from interface:DownloadServiceGets 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:
getDownloadUrlin interfaceDownloadService- Parameters:
repositoryName- the document repositorydocId- the document idxpath- the blob's xpath or blobholder index, ornullfor defaultfilename- the blob's filename, ornullfor 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:DownloadServiceGets 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:
getDownloadUrlin 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:DownloadServiceFinds 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:
resolveBlobFromDownloadUrlin interfaceDownloadService- Parameters:
downloadURL- the URL to use to download the blob- Returns:
- the blob, or
nullif 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 IOExceptionDescription copied from interface:DownloadServiceHandles the download of a document.- Specified by:
handleDownloadin 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 IOExceptionDescription copied from interface:DownloadServiceTriggers aAsyncBlobdownload which gives information about an asynchronous blob.- Specified by:
downloadBlobStatusin interfaceDownloadServicekey- 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 IOExceptionDescription copied from interface:DownloadServiceTriggers 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:
downloadBlobin interfaceDownloadServicekey- 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:DownloadServiceTriggers a blob download.- Specified by:
downloadBlobin interfaceDownloadServicedoc- 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:DownloadServiceTriggers a blob download.- Specified by:
downloadBlobin interfaceDownloadServicedoc- 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:DownloadServiceTriggers a blob download.- Specified by:
downloadBlobin interfaceDownloadServicedoc- 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:DownloadServiceTriggers a blob download.- Specified by:
downloadBlobin interfaceDownloadServicedoc- 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:DownloadServiceTriggers a blob download.- Specified by:
downloadBlobin 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:DownloadServiceCopies the blob stream at the given byte range into the suppliedOutputStream.- Specified by:
transferBlobWithByteRangein interfaceDownloadService- Parameters:
blob- the blobbyteRange- the byte rangeoutputStreamSupplier- theOutputStreamsupplier
-
resolveBlob
public Blob resolveBlob(DocumentModel doc)
Description copied from interface:DownloadServiceFinds a document's blob.- Specified by:
resolveBlobin interfaceDownloadService- Parameters:
doc- the document- Returns:
- the blob, or
nullif not available
-
resolveBlob
public Blob resolveBlob(DocumentModel doc, String xpath)
Description copied from interface:DownloadServiceFinds a document's blob given an xpath or blobholder index- Specified by:
resolveBlobin interfaceDownloadService- Parameters:
doc- the documentxpath- the xpath or blobholder index- Returns:
- the blob, or
nullif not found
-
checkPermission
public boolean checkPermission(DocumentModel doc, String xpath, Blob blob, String reason, Map<String,Serializable> extendedInfos)
Description copied from interface:DownloadServiceChecks whether the download of the blob is allowed.- Specified by:
checkPermissionin 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:
trueif 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:DownloadServiceLogs a download.- Specified by:
logDownloadin 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()
-
-