diff options
author | Dimitar Misev <dimitar@debian.(none)> | 2011-02-05 22:44:35 +0100 |
---|---|---|
committer | www-data <www-data@ubuntu.localdomain> | 2011-02-16 10:01:49 +0100 |
commit | 3d356cc9ef7b1055242256c00a2e6b93b5462880 (patch) | |
tree | 977d6292418f8bce19632e10e13ac39da617c226 /petascope/src/petascope/wcps/server/servlet/WCPSServlet.java | |
parent | 054f18a0e07c429609aae393f6bde67f21f9b82c (diff) | |
download | rasdaman-upstream-master.tar.gz rasdaman-upstream-master.tar.xz rasdaman-upstream-master.zip |
Diffstat (limited to 'petascope/src/petascope/wcps/server/servlet/WCPSServlet.java')
-rw-r--r-- | petascope/src/petascope/wcps/server/servlet/WCPSServlet.java | 468 |
1 files changed, 230 insertions, 238 deletions
diff --git a/petascope/src/petascope/wcps/server/servlet/WCPSServlet.java b/petascope/src/petascope/wcps/server/servlet/WCPSServlet.java index 74f8d1b..708d028 100644 --- a/petascope/src/petascope/wcps/server/servlet/WCPSServlet.java +++ b/petascope/src/petascope/wcps/server/servlet/WCPSServlet.java @@ -14,245 +14,237 @@ * You should have received a copy of the GNU General Public License * along with rasdaman community. If not, see <http://www.gnu.org/licenses/>. * - * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / - rasdaman GmbH. + * Copyright 2003 - 2010 Peter Baumann / rasdaman GmbH. * * For more information please see <http://www.rasdaman.org> * or contact Peter Baumann via <baumann@rasdaman.com>. */ -package petascope.wcps.server.servlet;
-
-import org.apache.commons.fileupload.FileItem;
-import org.apache.commons.fileupload.disk.DiskFileItemFactory;
-import org.apache.commons.fileupload.servlet.ServletFileUpload;
-
-
-//This is the servlet interface of WCPS. It mostly consists of sanity checks and initialization,
-//the meat is onyl a few lines. The WCPS class does the actual work.
-
-import petascope.wcps.server.core.DbMetadataSource;
-import petascope.wcps.server.core.ProcessCoveragesRequest;
-import petascope.wcps.server.core.WCPS;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-
-//Note an important limitation: this will only return the first result if several are available.
-//The reason is that WCPS currently has no standardized way to return multiple byte streams to
-//the user.
-public class WCPSServlet extends HttpServlet {
-
- private Properties dbParams;
- private DbMetadataSource metadataSource;
- private String rasdamanDatabase;
- private String rasdamanUrl;
- private WCPS wcps;
- // path to the default HTML response of the servlet
- private String servletHtmlPath = "/templates/wcps-servlet.html";
- // String containing the HTML code for the default response
- private String defaultHtmlResponse;
-
- public void init() throws ServletException {
- try {
- dbParams = new Properties();
- System.out.println("WCPS: loading database properties");
- dbParams.load(
- new FileInputStream(
- getServletContext().getRealPath("/settings.properties")));
- rasdamanUrl = dbParams.getProperty("rasdaman_url");
- rasdamanDatabase = dbParams.getProperty("rasdaman_database");
-
- System.out.println("WCPS: initializing metadata database");
- metadataSource =
- new DbMetadataSource(dbParams.getProperty("metadata_driver"),
- dbParams.getProperty("metadata_url"),
- dbParams.getProperty("metadata_user"),
- dbParams.getProperty("metadata_pass"), false);
-
- System.out.println("WCPS: initializing WCPS core");
- wcps = new WCPS(
- new File(getServletContext().getRealPath("/xml/ogc/wcps/1.0.0/wcpsProcessCoverages.xsd")),
- // new CachedMetadataSource(metadataSource)); // removed metadata caching (andrei)
- metadataSource);
-
- servletHtmlPath = getServletContext().getRealPath(servletHtmlPath);
- defaultHtmlResponse = FileUtils.readFileToString(new File(servletHtmlPath));
-
- System.out.println("WCPS: initialization complete");
- } catch (Exception e) {
- System.out.println("WCPS: initialization error");
- System.out.println("WCPS: closing metadata database");
-
- if (metadataSource != null) {
- metadataSource.close();
- }
-
- System.out.println("WCPS: done with init error");
- throw new ServletException("WCPS initialization error", e);
- }
-
- }
-
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- System.out.println("WCPS: invoked with GET");
- printUsage(response);
- }
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- System.out.println("WCPS: invoked with POST");
- OutputStream webOut = null;
-
- try {
- String xmlRequest = null;
-
- if (ServletFileUpload.isMultipartContent(request)) {
- @SuppressWarnings("unchecked")
- Iterator<FileItem> fileItems =
- (Iterator<FileItem>) (new ServletFileUpload(
- new DiskFileItemFactory())).parseRequest(
- request).iterator();
-
- if (!fileItems.hasNext()) {
- throw new IOException(
- "Multipart POST request contains no parts");
- }
-
- FileItem fileItem = fileItems.next();
-
- if (fileItems.hasNext()) {
- throw new IOException(
- "Multipart POST request contains too many parts");
- }
-
- if (!fileItem.isFormField()
- && fileItem.getContentType().equals("text/xml")) {
- xmlRequest = fileItem.getString();
- }
-
- if (xmlRequest == null) {
- System.out.println(
- "WCPS: no XML file was uploaded within multipart POST request");
- printUsage(response);
- return;
- }
-
- System.out.println(
- "WCPS: received XML via a multipart POST request");
- } else {
- String xml = request.getParameter("xml");
- String query = request.getParameter("query");
-
- if (xml != null) {
- System.out.println("WCPS: received XML via a 'xml' parameter in a POST request");
- xmlRequest = xml;
- } else if (query != null) {
- System.out.println("WCPS: received the following query via a 'query' "
- + "parameter in a POST request:");
- System.out.println(query);
-
- xmlRequest = ProcessCoveragesRequest.abstractQueryToXmlQuery(query);
- System.out.println("WCPS: transformed the abstract syntax query into an XML query!");
- } else {
- System.out.println("WCPS: no request was received");
- printUsage(response);
- return;
- }
- }
-
- System.out.println("WCPS: received the following request:");
- System.out.println(xmlRequest);
-
- System.out.println("WCPS: preparing request");
- ProcessCoveragesRequest processCoverageRequest =
- wcps.pcPrepare(rasdamanUrl, rasdamanDatabase, IOUtils.toInputStream(xmlRequest));
-
- String query = processCoverageRequest.getRasqlQuery();
- String mime = processCoverageRequest.getMime();
-
- System.out.println("[" + mime + "] " + query);
-
- System.out.println("Resulting RasQL query: " + query);
-
- System.out.println("WCPS: executing request");
-
- List<byte[]> results = processCoverageRequest.execute();
-
- System.out.println("WCPS: setting response mimetype to " + mime);
- response.setContentType(mime);
- System.out.println("WCPS: returning response");
- webOut = response.getOutputStream();
- webOut.write(results.get(0));
- System.out.println("WCPS: done");
- } catch (Exception e) {
- printError(response, "Error: " + e.getMessage(), e);
- } finally {
- if (webOut != null) {
- try {
- webOut.close();
- } catch (IOException e) {
- }
- }
- }
- }
-
- public void destroy() {
- super.destroy();
-
- }
-
- public String getServletInfo() {
- return "Web Coverage Processing Service (Project PetaScope)";
-
- }
-
- private void printError(HttpServletResponse response, String message, Exception e)
- throws IOException {
- System.out.println("WCPS: error");
- System.out.println("WCPS: setting response mimetype to text/html; charset=utf-8");
- response.setContentType("text/html; charset=utf-8");
- System.out.println("WCPS: returning the following error message");
- e.printStackTrace(System.out);
- System.out.println("WCPS: end of error message");
- PrintWriter out = new PrintWriter(response.getOutputStream());
-
- out.println(
- "<html><head><title>Web Coverage Processing Service</title></head><body>");
- out.println("<h1>An error has occured</h1>");
- out.println("<p>" + message + "</p>");
- out.println("<p>Stack trace:<br/><small>");
- e.printStackTrace(out);
- out.println("</small></p></body></html>");
- out.close();
- System.out.println("WCPS: done with error");
- }
-
- private void printUsage(HttpServletResponse response) throws IOException {
- System.out.println("WCPS: setting response mimetype to text/html; charset=utf-8");
- System.out.println("WCPS: returning usage message");
- response.setContentType("text/html; charset=utf-8");
- PrintWriter out = new PrintWriter(response.getOutputStream());
-
- out.println(defaultHtmlResponse);
-
- out.close();
- System.out.println("WCPS: done nothing");
-
- }
-}
+package petascope.wcps.server.servlet; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import petascope.core.DbMetadataSource; +import petascope.wcps.server.core.ProcessCoveragesRequest; +import petascope.wcps.server.core.WCPS; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; + +//important limitation: this will only return the first result if several are available. +//The reason is that WCPS currently has no standardized way to return multiple byte streams to +//the user. +//This is the servlet interface of WCPS. It mostly consists of sanity checks and initialization, +//the meat is onyl a few lines. The WCPS class does the actual work. +public class WCPSServlet extends HttpServlet { + + private Properties dbParams; + private DbMetadataSource metadataSource; + private String rasdamanDatabase; + private String rasdamanUrl; + private WCPS wcps; + // path to the default HTML response of the servlet + private String servletHtmlPath = "/templates/wcps-servlet.html"; + // String containing the HTML code for the default response + private String defaultHtmlResponse; + + public void init() throws ServletException { + try { + dbParams = new Properties(); + System.out.println("WCPS: loading database properties"); + dbParams.load( + new FileInputStream( + getServletContext().getRealPath("/settings.properties"))); + rasdamanUrl = dbParams.getProperty("rasdaman_url"); + rasdamanDatabase = dbParams.getProperty("rasdaman_database"); + + System.out.println("WCPS: initializing metadata database"); + metadataSource = + new DbMetadataSource(dbParams.getProperty("metadata_driver"), + dbParams.getProperty("metadata_url"), + dbParams.getProperty("metadata_user"), + dbParams.getProperty("metadata_pass"), false); + + System.out.println("WCPS: initializing WCPS core"); + wcps = new WCPS( + new File(getServletContext().getRealPath("/xml/ogc/wcps/1.0.0/wcpsProcessCoverages.xsd")), + // new CachedMetadataSource(metadataSource)); // removed metadata caching (andrei) + metadataSource); + + servletHtmlPath = getServletContext().getRealPath(servletHtmlPath); + defaultHtmlResponse = FileUtils.readFileToString(new File(servletHtmlPath)); + + System.out.println("WCPS: initialization complete"); + } catch (Exception e) { + System.out.println("WCPS: initialization error"); + System.out.println("WCPS: closing metadata database"); + + if (metadataSource != null) { + metadataSource.close(); + } + + System.out.println("WCPS: done with init error"); + throw new ServletException("WCPS initialization error", e); + } + + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + System.out.println("WCPS: invoked with GET"); + printUsage(response); + } + + public void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + System.out.println("WCPS: invoked with POST"); + OutputStream webOut = null; + + try { + String xmlRequest = null; + + if (ServletFileUpload.isMultipartContent(request)) { + @SuppressWarnings("unchecked") + Iterator<FileItem> fileItems = + (Iterator<FileItem>) (new ServletFileUpload( + new DiskFileItemFactory())).parseRequest( + request).iterator(); + + if (!fileItems.hasNext()) { + throw new IOException( + "Multipart POST request contains no parts"); + } + + FileItem fileItem = fileItems.next(); + + if (fileItems.hasNext()) { + throw new IOException( + "Multipart POST request contains too many parts"); + } + + if (!fileItem.isFormField() + && fileItem.getContentType().equals("text/xml")) { + xmlRequest = fileItem.getString(); + } + + if (xmlRequest == null) { + System.out.println( + "WCPS: no XML file was uploaded within multipart POST request"); + printUsage(response); + return; + } + + System.out.println( + "WCPS: received XML via a multipart POST request"); + } else { + String xml = request.getParameter("xml"); + String query = request.getParameter("query"); + + if (xml != null) { + System.out.println("WCPS: received XML via a 'xml' parameter in a POST request"); + xmlRequest = xml; + } else if (query != null) { + System.out.println("WCPS: received the following query via a 'query' " + + "parameter in a POST request:"); + System.out.println(query); + + xmlRequest = ProcessCoveragesRequest.abstractQueryToXmlQuery(query); + System.out.println("WCPS: transformed the abstract syntax query into an XML query!"); + } else { + System.out.println("WCPS: no request was received"); + printUsage(response); + return; + } + } + + System.out.println("WCPS: received the following request:"); + System.out.println(xmlRequest); + + System.out.println("WCPS: preparing request"); + ProcessCoveragesRequest processCoverageRequest = + wcps.pcPrepare(rasdamanUrl, rasdamanDatabase, IOUtils.toInputStream(xmlRequest)); + + String query = processCoverageRequest.getRasqlQuery(); + String mime = processCoverageRequest.getMime(); + + System.out.println("[" + mime + "] " + query); + + System.out.println("Resulting RasQL query: " + query); + + System.out.println("WCPS: executing request"); + + List<byte[]> results = processCoverageRequest.execute(); + + System.out.println("WCPS: setting response mimetype to " + mime); + response.setContentType(mime); + System.out.println("WCPS: returning response"); + webOut = response.getOutputStream(); + webOut.write(results.get(0)); + System.out.println("WCPS: done"); + } catch (Exception e) { + printError(response, "Error: " + e.getMessage(), e); + } finally { + if (webOut != null) { + try { + webOut.close(); + } catch (IOException e) { + } + } + } + } + + public void destroy() { + super.destroy(); + + } + + public String getServletInfo() { + return "Web Coverage Processing Service (Project PetaScope)"; + + } + + private void printError(HttpServletResponse response, String message, Exception e) + throws IOException { + System.out.println("WCPS: error"); + System.out.println("WCPS: setting response mimetype to text/html; charset=utf-8"); + response.setContentType("text/html; charset=utf-8"); + System.out.println("WCPS: returning the following error message"); + e.printStackTrace(System.out); + System.out.println("WCPS: end of error message"); + PrintWriter out = new PrintWriter(response.getOutputStream()); + + out.println( + "<html><head><title>Web Coverage Processing Service</title></head><body>"); + out.println("<h1>An error has occured</h1>"); + out.println("<p>" + message + "</p>"); + out.println("<p>Stack trace:<br/><small>"); + e.printStackTrace(out); + out.println("</small></p></body></html>"); + out.close(); + System.out.println("WCPS: done with error"); + } + + private void printUsage(HttpServletResponse response) throws IOException { + System.out.println("WCPS: setting response mimetype to text/html; charset=utf-8"); + System.out.println("WCPS: returning usage message"); + response.setContentType("text/html; charset=utf-8"); + PrintWriter out = new PrintWriter(response.getOutputStream()); + + out.println(defaultHtmlResponse); + + out.close(); + System.out.println("WCPS: done nothing"); + + } +} |