/*
* @(#)DownloadRequest.java 1.7 05/11/17
*
* 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 java.io.File;
import java.util.ArrayList;
import javax.servlet.*;
import javax.servlet.http.*;
/**
* The DownloadRequest incapsulates all the data in a request
* SQE: We need to address query string
*/
public class DownloadRequest {
// Arguments
private static final String ARG_ARCH = "arch";
private static final String ARG_OS = "os";
private static final String ARG_LOCALE = "locale";
private static final String ARG_VERSION_ID = "version-id";
private static final String ARG_CURRENT_VERSION_ID = "current-version-id";
private static final String ARG_PLATFORM_VERSION_ID = "platform-version-id";
private static final String ARG_KNOWN_PLATFORMS = "known-platforms";
private static final String TEST_JRE = "TestJRE";
private String _path = null;
private String _version = null;
private String _currentVersionId = null;
private String[] _os = null;
private String[] _arch = null;
private String[] _locale = null;
private String[] _knownPlatforms = null;
private String _query = null;
private String _testJRE = null;
private boolean _isPlatformRequest = false;
private ServletContext _context = null;
private String _encoding = null;
private HttpServletRequest _httpRequest = null;
// HTTP Compression RFC 2616 : Standard headers
public static final String ACCEPT_ENCODING = "accept-encoding";
// Contruct Request object based on HTTP request
public DownloadRequest(HttpServletRequest request) {
this((ServletContext)null, request);
}
public DownloadRequest(ServletContext context, HttpServletRequest request) {
_context = context;
_httpRequest = request;
_path = request.getRequestURI();
_encoding = request.getHeader(ACCEPT_ENCODING);
String context_path = request.getContextPath();
if (context_path != null) _path = _path.substring(context_path.length());
if (_path == null) _path = request.getServletPath(); // This works for *.<ext> invocations
if (_path == null) _path = "/"; // No path given
_path = _path.trim();
if (_context != null && !_path.endsWith("/")) {
String realPath = _context.getRealPath(_path);
// fix for 4474021 - getRealPath might returns NULL
if (realPath != null) {
File f = new File(realPath);
if (f != null && f.exists() && f.isDirectory()) {
_path += "/";
}
}
}
// Append default file for a directory
if (_path.endsWith("/")) _path += "launch.jnlp";
_version = getParameter(request, ARG_VERSION_ID);
_currentVersionId = getParameter(request, ARG_CURRENT_VERSION_ID);
_os = getParameterList(request, ARG_OS);
_arch = getParameterList(request, ARG_ARCH);
_locale = getParameterList(request, ARG_LOCALE);
_knownPlatforms = getParameterList(request, ARG_KNOWN_PLATFORMS);
String platformVersion = getParameter(request, ARG_PLATFORM_VERSION_ID);
_isPlatformRequest = (platformVersion != null);
if (_isPlatformRequest) _version = platformVersion;
_query = request.getQueryString();
_testJRE = getParameter(request, TEST_JRE);
}
/** Returns a DownloadRequest for the currentVersionId, that can be used
* to lookup the existing cached version
*/
private DownloadRequest(DownloadRequest dreq) {
_encoding = dreq._encoding;
_context = dreq._context;
_httpRequest = dreq._httpRequest;
_path = dreq._path;
_version = dreq._currentVersionId;
_currentVersionId = null;
_os = dreq._os;
_arch = dreq._arch;
_locale = dreq._locale;
_knownPlatforms = dreq._knownPlatforms;
_isPlatformRequest = dreq._isPlatformRequest;
_query = dreq._query;
_testJRE = dreq._testJRE;
}
private String getParameter(HttpServletRequest req, String key) {
String res = req.getParameter(key);
return (res == null) ? null : res.trim();
}
/** Converts a space delimitered string to a list of strings */
static private String[] getStringList(String str) {
if (str == null) return null;
ArrayList list = new ArrayList();
int i = 0;
int length = str.length();
StringBuffer sb = null;
while(i < length) {
char ch = str.charAt(i);
if (ch == ' ') {
// A space was hit. Add string to list
if (sb != null) {
list.add(sb.toString());
sb = null;
}
} else if (ch == '\\') {
// It is a delimiter. Add next character
if (i + 1 < length) {
ch = str.charAt(++i);
if (sb == null) sb = new StringBuffer();
sb.append(ch);
}
} else {
if (sb == null) sb = new StringBuffer();
sb.append(ch);
}
i++; // Next character
}
// Make sure to add the last part to the list too
if (sb != null) {
list.add(sb.toString());
}
if (list.size() == 0) return null;
String[] results = new String[list.size()];
return (String[])list.toArray(results);
}
/* Split parameter at spaces. Convert '\ ' insto a space */
private String[] getParameterList(HttpServletRequest req, String key) {
String res = req.getParameter(key);
return (res == null) ? null : getStringList(res.trim());
}
// Query
public String getPath() { return _path; }
public String getVersion() { return _version; }
public String getCurrentVersionId() { return _currentVersionId; }
public String getQuery() { return _query; }
public String getTestJRE() { return _testJRE; }
public String getEncoding() { return _encoding; }
public String[] getOS() { return _os; }
public String[] getArch() { return _arch; }
public String[] getLocale() { return _locale; }
public String[] getKnownPlatforms() { return _knownPlatforms; }
public boolean isPlatformRequest() { return _isPlatformRequest; }
public HttpServletRequest getHttpRequest() { return _httpRequest; }
/** Returns a DownloadRequest for the currentVersionId, that can be used
* to lookup the existing cached version
*/
DownloadRequest getFromDownloadRequest() {
return new DownloadRequest(this);
}
// Debug
public String toString() {
return "DownloadRequest[path=" + _path +
showEntry(" encoding=", _encoding) +
showEntry(" query=", _query) +
showEntry(" TestJRE=", _testJRE) +
showEntry(" version=", _version) +
showEntry(" currentVersionId=", _currentVersionId) +
showEntry(" os=", _os) +
showEntry(" arch=", _arch) +
showEntry(" locale=", _locale) +
showEntry(" knownPlatforms=", _knownPlatforms)
+ " isPlatformRequest=" + _isPlatformRequest + "]";
}
private String showEntry(String msg, String value) {
if (value == null) return "";
return msg + value;
}
private String showEntry(String msg, String[] value) {
if (value == null) return "";
return msg + java.util.Arrays.asList(value).toString();
}
}