jnlp.sample.servlet.DownloadResponse Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of webstart-jnlp-servlet Show documentation
Show all versions of webstart-jnlp-servlet Show documentation
JNLP Sample servlet that supports pack200 protocol. Taken from Sun's JDK sample/jnlp directory thanks to
its permissive license.
The newest version!
/*
* @(#)DownloadResponse.java 1.8 07/03/15
*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/
package jnlp.sample.servlet;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.util.Date;
import java.util.MissingResourceException;
/**
* A class used to encapsulate a file response, and
* factory methods to create some common types.
*/
abstract public class DownloadResponse
{
private static final String HEADER_LASTMOD = "Last-Modified";
private static final String HEADER_JNLP_VERSION = "x-java-jnlp-version-id";
private static final String JNLP_ERROR_MIMETYPE = "application/x-java-jnlp-error";
public static final int STS_00_OK = 0;
public static final int ERR_10_NO_RESOURCE = 10;
public static final int ERR_11_NO_VERSION = 11;
public static final int ERR_20_UNSUP_OS = 20;
public static final int ERR_21_UNSUP_ARCH = 21;
public static final int ERR_22_UNSUP_LOCALE = 22;
public static final int ERR_23_UNSUP_JRE = 23;
public static final int ERR_99_UNKNOWN = 99;
// HTTP Compression RFC 2616 : Standard headers
public static final String CONTENT_ENCODING = "content-encoding";
// HTTP Compression RFC 2616 : Standard header for HTTP/Pack200 Compression
public static final String GZIP_ENCODING = "gzip";
public static final String PACK200_GZIP_ENCODING = "pack200-gzip";
public DownloadResponse()
{ /* do nothing */ }
public String toString()
{
return getClass().getName();
}
/**
* Post information to an HttpResponse
*/
abstract void sendRespond( HttpServletResponse response )
throws IOException;
/**
* Factory methods for error responses
*/
static DownloadResponse getNotFoundResponse()
{
return new NotFoundResponse();
}
static DownloadResponse getNoContentResponse()
{
return new NotFoundResponse();
}
static DownloadResponse getJnlpErrorResponse( int jnlpErrorCode )
{
return new JnlpErrorResponse( jnlpErrorCode );
}
/**
* Factory method for file download responses
*/
static DownloadResponse getNotModifiedResponse()
{
return new NotModifiedResponse();
}
static DownloadResponse getHeadRequestResponse( String mimeType, String versionId, long lastModified,
int contentLength )
{
return new HeadRequestResponse( mimeType, versionId, lastModified, contentLength );
}
static DownloadResponse getFileDownloadResponse( byte[] content, String mimeType, long timestamp, String versionId )
{
return new ByteArrayFileDownloadResponse( content, mimeType, versionId, timestamp );
}
static DownloadResponse getFileDownloadResponse( URL resource, String mimeType, long timestamp, String versionId )
{
return new ResourceFileDownloadResponse( resource, mimeType, versionId, timestamp );
}
static DownloadResponse getFileDownloadResponse( File file, String mimeType, long timestamp, String versionId )
{
return new DiskFileDownloadResponse( file, mimeType, versionId, timestamp );
}
//
// Private classes implementing the various types
//
static private class NotModifiedResponse
extends DownloadResponse
{
public void sendRespond( HttpServletResponse response )
throws IOException
{
response.sendError( HttpServletResponse.SC_NOT_MODIFIED );
}
}
static private class NotFoundResponse
extends DownloadResponse
{
public void sendRespond( HttpServletResponse response )
throws IOException
{
response.sendError( HttpServletResponse.SC_NOT_FOUND );
}
}
static private class NoContentResponse
extends DownloadResponse
{
public void sendRespond( HttpServletResponse response )
throws IOException
{
response.sendError( HttpServletResponse.SC_NO_CONTENT );
}
}
static private class HeadRequestResponse
extends DownloadResponse
{
private String _mimeType;
private String _versionId;
private long _lastModified;
private int _contentLength;
HeadRequestResponse( String mimeType, String versionId, long lastModified, int contentLength )
{
_mimeType = mimeType;
_versionId = versionId;
_lastModified = lastModified;
_contentLength = contentLength;
}
/**
* Post information to an HttpResponse
*/
public void sendRespond( HttpServletResponse response )
throws IOException
{
// Set header information
response.setContentType( _mimeType );
response.setContentLength( _contentLength );
if ( _versionId != null )
{
response.setHeader( HEADER_JNLP_VERSION, _versionId );
}
if ( _lastModified != 0 )
{
response.setDateHeader( HEADER_LASTMOD, _lastModified );
}
response.sendError( HttpServletResponse.SC_OK );
}
}
static public class JnlpErrorResponse
extends DownloadResponse
{
private String _message;
public JnlpErrorResponse( int jnlpErrorCode )
{
String msg = Integer.toString( jnlpErrorCode );
String dsc = "No description";
try
{
dsc = JnlpDownloadServlet.getResourceBundle().getString( "servlet.jnlp.err." + msg );
}
catch ( MissingResourceException mre )
{ /* ignore */}
_message = msg + " " + dsc;
}
public void sendRespond( HttpServletResponse response )
throws IOException
{
response.setContentType( JNLP_ERROR_MIMETYPE );
PrintWriter pw = response.getWriter();
pw.println( _message );
}
;
public String toString()
{
return super.toString() + "[" + _message + "]";
}
}
static private abstract class FileDownloadResponse
extends DownloadResponse
{
private String _mimeType;
private String _versionId;
private long _lastModified;
private String _fileName;
FileDownloadResponse( String mimeType, String versionId, long lastModified )
{
_mimeType = mimeType;
_versionId = versionId;
_lastModified = lastModified;
_fileName = null;
}
FileDownloadResponse( String mimeType, String versionId, long lastModified, String fileName )
{
_mimeType = mimeType;
_versionId = versionId;
_lastModified = lastModified;
_fileName = fileName;
}
/**
* Information about response
*/
String getMimeType()
{
return _mimeType;
}
String getVersionId()
{
return _versionId;
}
long getLastModified()
{
return _lastModified;
}
abstract int getContentLength()
throws IOException;
abstract InputStream getContent()
throws IOException;
/**
* Post information to an HttpResponse
*/
public void sendRespond( HttpServletResponse response )
throws IOException
{
// Set header information
response.setContentType( getMimeType() );
response.setContentLength( getContentLength() );
if ( getVersionId() != null )
{
response.setHeader( HEADER_JNLP_VERSION, getVersionId() );
}
if ( getLastModified() != 0 )
{
response.setDateHeader( HEADER_LASTMOD, getLastModified() );
}
if ( _fileName != null )
{
if ( _fileName.endsWith( ".pack.gz" ) )
{
response.setHeader( CONTENT_ENCODING, PACK200_GZIP_ENCODING );
}
else if ( _fileName.endsWith( ".gz" ) )
{
response.setHeader( CONTENT_ENCODING, GZIP_ENCODING );
}
else
{
response.setHeader( CONTENT_ENCODING, null );
}
}
// Send contents
InputStream in = getContent();
OutputStream out = response.getOutputStream();
try
{
byte[] bytes = new byte[32 * 1024];
int read;
while ( ( read = in.read( bytes ) ) != -1 )
{
out.write( bytes, 0, read );
}
}
finally
{
if ( in != null )
{
in.close();
}
}
}
protected String getArgString()
{
long length = 0;
try
{
length = getContentLength();
}
catch ( IOException ioe )
{ /* ignore */ }
return "Mimetype=" + getMimeType() + " VersionId=" + getVersionId() + " Timestamp=" +
new Date( getLastModified() ) + " Length=" + length;
}
}
static private class ByteArrayFileDownloadResponse
extends FileDownloadResponse
{
private byte[] _content;
ByteArrayFileDownloadResponse( byte[] content, String mimeType, String versionId, long lastModified )
{
super( mimeType, versionId, lastModified );
_content = content;
}
int getContentLength()
{
return _content.length;
}
InputStream getContent()
{
return new ByteArrayInputStream( _content );
}
public String toString()
{
return super.toString() + "[ " + getArgString() + "]";
}
}
static private class ResourceFileDownloadResponse
extends FileDownloadResponse
{
URL _url;
ResourceFileDownloadResponse( URL url, String mimeType, String versionId, long lastModified )
{
super( mimeType, versionId, lastModified, url.toString() );
_url = url;
}
int getContentLength()
throws IOException
{
return _url.openConnection().getContentLength();
}
InputStream getContent()
throws IOException
{
return _url.openConnection().getInputStream();
}
public String toString()
{
return super.toString() + "[ " + getArgString() + "]";
}
}
static private class DiskFileDownloadResponse
extends FileDownloadResponse
{
private File _file;
DiskFileDownloadResponse( File file, String mimeType, String versionId, long lastModified )
{
super( mimeType, versionId, lastModified, file.getName() );
_file = file;
}
int getContentLength()
throws IOException
{
return (int) _file.length();
}
InputStream getContent()
throws IOException
{
return new BufferedInputStream( new FileInputStream( _file ) );
}
public String toString()
{
return super.toString() + "[ " + getArgString() + "]";
}
}
}