summaryrefslogtreecommitdiffstats
path: root/src/wcs/server/servlet/newWcsServlet.java
diff options
context:
space:
mode:
authorConstantin Jucovschi <cj@ubuntu.localdomain>2009-03-31 06:18:54 -0400
committerConstantin Jucovschi <cj@ubuntu.localdomain>2009-03-31 06:18:54 -0400
commit0f1055b8d7f97d86c66fa602c17666bc2ff9c437 (patch)
tree9c68fa99a97063bbe4a4231e04fc09329541ac71 /src/wcs/server/servlet/newWcsServlet.java
Initial commit
Diffstat (limited to 'src/wcs/server/servlet/newWcsServlet.java')
-rw-r--r--src/wcs/server/servlet/newWcsServlet.java244
1 files changed, 244 insertions, 0 deletions
diff --git a/src/wcs/server/servlet/newWcsServlet.java b/src/wcs/server/servlet/newWcsServlet.java
new file mode 100644
index 0000000..64288d6
--- /dev/null
+++ b/src/wcs/server/servlet/newWcsServlet.java
@@ -0,0 +1,244 @@
+package wcs.server.servlet;
+
+import java.io.File;
+import java.io.FileInputStream;
+import org.apache.commons.io.FileUtils;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringBufferInputStream;
+import java.io.StringReader;
+import java.util.List;
+import java.util.Properties;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.opengis.ows.v_1_0_0.ExceptionReport;
+import org.xml.sax.InputSource;
+import wcps.server.core.ProcessCoverageRequest;
+import wcps.server.core.CachedMetadataSource;
+import wcps.server.core.DbMetadataSource;
+import wcps.server.core.WCPS;
+
+/**
+ *
+ * @author Andrei Aiordachioaie
+ */
+public class newWcsServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 84786549L;
+
+ private Properties dbParams;
+ private DbMetadataSource metadataSource;
+ private String rasdamanUrl;
+ private String rasdamanDatabase;
+ private String servletHtmlPath; // path to the default HTML response of the servlet
+ private String defaultHtmlResponse; // String containing the HTML code for the default response
+ private WCPS wcps;
+ private String metaDbPath;
+
+ @Override
+ public void init() throws ServletException {
+
+ try {
+ metaDbPath = getServletContext().getRealPath("/dbparams.properties");
+
+ dbParams = new Properties();
+ System.out.println ("WCPS: loading database properties");
+ dbParams.load( new FileInputStream( metaDbPath ) );
+ rasdamanUrl = dbParams.getProperty( "rasdaman_url" );
+ rasdamanDatabase = dbParams.getProperty( "rasdaman_database" );
+
+ servletHtmlPath = getServletContext().getRealPath("/misc/wcs-servlet-default.html");
+ this.defaultHtmlResponse = FileUtils.readFileToString(new File(servletHtmlPath));
+
+ 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.1/wcpsProcessCoverage.xsd" ) ), new CachedMetadataSource( metadataSource ) );
+
+ 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 );
+ }
+
+ }
+
+
+ /**
+ * Handles the HTTP <code>GET</code> method.
+ * @param request servlet request
+ * @param response servlet response
+ * @throws ServletException if a servlet-specific error occurs
+ * @throws IOException if an I/O error occurs
+ */
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException
+ {
+ System.out.println( "WCS: invoked with GET" );
+ printUsage( response );
+ }
+
+ /**
+ * Handles the HTTP <code>POST</code> method.
+ * @param request servlet request
+ * @param response servlet response
+ * @throws ServletException if a servlet-specific error occurs
+ * @throws IOException if an I/O error occurs
+ */
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException
+ {
+ // Select the operation
+ int op = -1;
+ if (request.getParameter("GetCapabilitiesXML") != null)
+ op = 3;
+ if (request.getParameter("DescribeCoverageXML") != null)
+ op = 2;
+ if (request.getParameter("GetCoverageXML") != null)
+ op = 1;
+
+ // Convert the WCS request into a WCPS request
+ WCS wcs = new WCS(metaDbPath);
+ try
+ {
+ // initialize WebService operation arguments here
+ String inputXML, wcpsXml;
+ PrintWriter out;
+ switch (op)
+ {
+ case 1:
+ inputXML = request.getParameter("GetCoverageXML");
+ wcpsXml = wcs.GetCoverage(inputXML);
+ // Check if this result is an ExceptionReport
+ // Try reading the exception report
+ ExceptionReport report = new ExceptionReport();
+ boolean gotWcsException = false;
+ try
+ {
+ javax.xml.bind.JAXBContext jaxbCtx = javax.xml.bind.JAXBContext.newInstance(ExceptionReport.class.getPackage().getName());
+ javax.xml.bind.Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+ report = (ExceptionReport) unmarshaller.unmarshal(new StringReader(wcpsXml));
+ gotWcsException = true;
+ } catch (Exception e)
+ {
+ gotWcsException = false;
+ }
+
+ // If output is ProcessCOverage, send the WCPS xml to the WCPS servlet
+ if (gotWcsException == false)
+ response = processWcpsRequest(wcpsXml, response);
+ else
+ {
+ out = new PrintWriter(response.getOutputStream());
+ out.write(wcpsXml);
+ out.flush();
+ }
+ break;
+ case 2:
+ inputXML = request.getParameter("DescribeCoverageXML");
+ wcpsXml = wcs.DescribeCoverage(inputXML);
+ out = new PrintWriter(response.getOutputStream());
+ out.write(wcpsXml);
+ out.flush();
+ break;
+ case 3:
+ inputXML = request.getParameter("GetCapabilitiesXML");
+ wcpsXml = wcs.GetCapabilities(inputXML);
+ out = new PrintWriter(response.getOutputStream());
+ out.write(wcpsXml);
+ out.flush();
+ break;
+ default:
+ throw new Exception("No valid operation specified !");
+ }
+
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ throw new ServletException("WCS servlet error !");
+ }
+ }
+
+ /**
+ * Returns a short description of the servlet.
+ * @return a String containing servlet description
+ */
+ @Override
+ public String getServletInfo() {
+ return "Web Coverage Service @ Jacobs University";
+ }
+
+
+ private void printUsage( HttpServletResponse response ) throws IOException
+ {
+
+ System.out.println( "WCS: setting response mimetype to text/html; charset=utf-8" );
+ System.out.println( "WPS: returning usage message" );
+ response.setContentType( "text/html; charset=utf-8" );
+ PrintWriter out = new PrintWriter( response.getOutputStream() );
+
+ System.err.println(this.defaultHtmlResponse);
+ out.println(defaultHtmlResponse);
+
+ out.close();
+ System.out.println( "WCPS: done nothing" );
+
+ }
+
+ /***
+ * Sends a request to the WCPS service.
+ * The source code is copied from the WCPS servlet, WCPService.java.
+ * Make sure to update it if the WCPS code changes.
+ */
+ private HttpServletResponse processWcpsRequest(String xmlRequest, HttpServletResponse response) throws IOException, Exception
+ {
+ try
+ {
+ System.out.println( "WCPS: received the following request:" );
+ System.out.println( xmlRequest );
+
+ System.out.println( "WCPS: preparing request" );
+ ProcessCoverageRequest processCoverageRequest = wcps.pcPrepare(this.rasdamanUrl, this.rasdamanDatabase, new InputSource(new StringBufferInputStream(xmlRequest)));
+ System.out.println( "[" + processCoverageRequest.getMime() + "] " + processCoverageRequest.getQuery());
+
+ String query = processCoverageRequest.getQuery();
+ String mimetype = processCoverageRequest.getMime();
+ System.out.println( "WCPS: executing request" );
+
+ List<byte[]> results = processCoverageRequest.execute();
+
+ System.out.println( "WCPS: setting response mimetype to " + mimetype );
+ response.setContentType( mimetype );
+ System.out.println( "WCPS: returning response" );
+ ServletOutputStream webOut = response.getOutputStream();
+ webOut.write( results.get( 0 ) );
+ System.out.println( "WCPS: done" );
+ }
+ catch (Exception e)
+ {
+ System.out.println("WCPS Error !");
+ PrintWriter webOut = new PrintWriter(response.getOutputStream());
+ webOut.write("WCPS Processing error !\n");
+ webOut.write("xmlRequest is:\n");
+ webOut.write(xmlRequest);
+ webOut.write("\n\n\n");
+ e.printStackTrace(webOut);
+ webOut.flush();
+ }
+ return response;
+ }
+
+}