Class AbstractDownloadStrategy
- java.lang.Object
-
- com.atlassian.bamboo.plugin.servlet.AbstractDownloadStrategy
-
- All Implemented Interfaces:
com.atlassian.plugin.servlet.DownloadStrategy
- Direct Known Subclasses:
ArtifactDownloadStrategy,BambooSpecsZipDownloadStrategy,DefaultDownloadStrategy,DeploymentDownloadStrategy,GlobalArtifactDownloadStrategy,SpecLogsDownloadStrategy
public abstract class AbstractDownloadStrategy extends Object implements com.atlassian.plugin.servlet.DownloadStrategy
-
-
Field Summary
Fields Modifier and Type Field Description protected BambooAuthenticationContextauthenticationContextprotected BambooContentTypeResolverbambooContentTypeResolverprotected BambooPermissionManagerbambooPermissionManagerprotected static org.apache.logging.log4j.Loggerlog
-
Constructor Summary
Constructors Modifier Constructor Description protectedAbstractDownloadStrategy(AdministrationConfigurationAccessor administrationConfigurationAccessor, BambooContentTypeResolver bambooContentTypeResolver, BambooAuthenticationContext authenticationContext, BambooPermissionManager bambooPermissionManager)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description StringgenerateETag(File file)Generates an ETag for a given file based on its last modified timestamp and lengthprotected abstract @NotNull TitledFilegetFileToServe(RequestPath requestPath, javax.servlet.http.HttpServletRequest request)protected abstract StringgetServletPath()Returns the servlet path handled by this download strategy.static booleanisByteRangeRequest(javax.servlet.http.HttpServletRequest request)Checks if the request contains a valid Byte-Range headerbooleanisCompressionEnabled()booleanmatches(String requestUri)protected RangeHeaderResultprocessRangeHeader(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, long fileLength)Processes the Range and If-Range headers from the HTTP request to determine the byte range to be served This method validates the range, calculates the start and content length, and sets the appropriate response headers If the range is invalid or not satisfiable, it sets the response status to 416 (Range Not Satisfiable) If an If-Range header is present, it checks whether the file has changed since the specified date or ETag If the file has changed, it serves the entire file instead of the rangevoidserveFile(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse)protected voidserveOrdinaryFile(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, TitledFile titledFileToServe)Serves the specified file, handling both full and partial content requestsprotected voidthrowPermissionException(RequestPath requestPath)Throws an exception indicating that the current user does not have permission to access the requested item.
-
-
-
Field Detail
-
log
protected static final org.apache.logging.log4j.Logger log
-
bambooContentTypeResolver
protected final BambooContentTypeResolver bambooContentTypeResolver
-
authenticationContext
protected final BambooAuthenticationContext authenticationContext
-
bambooPermissionManager
protected final BambooPermissionManager bambooPermissionManager
-
-
Constructor Detail
-
AbstractDownloadStrategy
protected AbstractDownloadStrategy(AdministrationConfigurationAccessor administrationConfigurationAccessor, BambooContentTypeResolver bambooContentTypeResolver, BambooAuthenticationContext authenticationContext, BambooPermissionManager bambooPermissionManager)
-
-
Method Detail
-
matches
public boolean matches(String requestUri)
- Specified by:
matchesin interfacecom.atlassian.plugin.servlet.DownloadStrategy
-
getServletPath
protected abstract String getServletPath()
Returns the servlet path handled by this download strategy. Includes the leading "/" but no trailing "/", e.g. "/download" or "/artifact".
-
serveFile
public void serveFile(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws com.atlassian.plugin.servlet.DownloadException- Specified by:
serveFilein interfacecom.atlassian.plugin.servlet.DownloadStrategy- Throws:
com.atlassian.plugin.servlet.DownloadException
-
getFileToServe
@NotNull protected abstract @NotNull TitledFile getFileToServe(RequestPath requestPath, javax.servlet.http.HttpServletRequest request) throws org.acegisecurity.AccessDeniedException, FileNotFoundException, UserNotLoggedInException, WebValidationException
- Returns:
- file to serve, with an optional display name if file is a directory
- Throws:
org.acegisecurity.AccessDeniedExceptionFileNotFoundExceptionUserNotLoggedInExceptionWebValidationException
-
serveOrdinaryFile
protected void serveOrdinaryFile(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, TitledFile titledFileToServe) throws IOExceptionServes the specified file, handling both full and partial content requests- Parameters:
httpServletRequest- The servlet request containing client datahttpServletResponse- The servlet response for sending the file datatitledFileToServe- The file to be served, with metadata- Throws:
IOException- If an error occurs during file access or streaming
-
isByteRangeRequest
public static boolean isByteRangeRequest(javax.servlet.http.HttpServletRequest request)
Checks if the request contains a valid Byte-Range header- Parameters:
request- The HTTP request- Returns:
- boolean True if the request contains a Range header, false otherwise
-
generateETag
public String generateETag(File file)
Generates an ETag for a given file based on its last modified timestamp and length- Parameters:
file- The file for which the ETag is generated- Returns:
- A string representing the ETag
-
processRangeHeader
protected RangeHeaderResult processRangeHeader(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, long fileLength)
Processes the Range and If-Range headers from the HTTP request to determine the byte range to be served This method validates the range, calculates the start and content length, and sets the appropriate response headers If the range is invalid or not satisfiable, it sets the response status to 416 (Range Not Satisfiable) If an If-Range header is present, it checks whether the file has changed since the specified date or ETag If the file has changed, it serves the entire file instead of the range- Parameters:
httpServletRequest- The servlet request containing the Range and If-Range headers (if present)httpServletResponse- The servlet response to set the headers onfileLength- The total length of the file being requested- Returns:
- A
RangeHeaderResultcontaining the start position and content length to be served, or null if the range is invalid
-
throwPermissionException
protected void throwPermissionException(RequestPath requestPath) throws UserNotLoggedInException, org.acegisecurity.AccessDeniedException
Throws an exception indicating that the current user does not have permission to access the requested item. The requestPath parameter may be included in the exception message and/or logs.- Throws:
UserNotLoggedInExceptionorg.acegisecurity.AccessDeniedException
-
isCompressionEnabled
public boolean isCompressionEnabled()
-
-