001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/enterprise/servlet/WPSHandler.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2008 by:
006 EXSE, Department of Geography, University of Bonn
007 http://www.giub.uni-bonn.de/deegree/
008 lat/lon GmbH
009 http://www.lat-lon.de
010
011 This library is free software; you can redistribute it and/or
012 modify it under the terms of the GNU Lesser General Public
013 License as published by the Free Software Foundation; either
014 version 2.1 of the License, or (at your option) any later version.
015
016 This library is distributed in the hope that it will be useful,
017 but WITHOUT ANY WARRANTY; without even the implied warranty of
018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019 Lesser General Public License for more details.
020
021 You should have received a copy of the GNU Lesser General Public
022 License along with this library; if not, write to the Free Software
023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024
025 Contact:
026
027 Andreas Poth
028 lat/lon GmbH
029 Aennchenstr. 19
030 53115 Bonn
031 Germany
032 E-Mail: poth@lat-lon.de
033
034 Prof. Dr. Klaus Greve
035 Department of Geography
036 University of Bonn
037 Meckenheimer Allee 166
038 53115 Bonn
039 Germany
040 E-Mail: greve@giub.uni-bonn.de
041
042
043 ---------------------------------------------------------------------------*/
044 package org.deegree.enterprise.servlet;
045
046 import java.io.IOException;
047
048 import javax.servlet.http.HttpServletResponse;
049
050 import org.deegree.enterprise.ServiceException;
051 import org.deegree.framework.log.ILogger;
052 import org.deegree.framework.log.LoggerFactory;
053 import org.deegree.framework.util.CharsetUtils;
054 import org.deegree.model.feature.FeatureCollection;
055 import org.deegree.model.feature.GMLFeatureAdapter;
056 import org.deegree.ogcbase.ExceptionCode;
057 import org.deegree.ogcwebservices.OGCWebServiceException;
058 import org.deegree.ogcwebservices.OGCWebServiceRequest;
059 import org.deegree.ogcwebservices.wps.WPService;
060 import org.deegree.ogcwebservices.wps.WPServiceFactory;
061 import org.deegree.ogcwebservices.wps.XMLFactory;
062 import org.deegree.ogcwebservices.wps.capabilities.WPSCapabilities;
063 import org.deegree.ogcwebservices.wps.capabilities.WPSCapabilitiesDocument;
064 import org.deegree.ogcwebservices.wps.configuration.WPSConfiguration;
065 import org.deegree.ogcwebservices.wps.describeprocess.ProcessDescriptions;
066 import org.deegree.ogcwebservices.wps.describeprocess.ProcessDescriptionsDocument;
067 import org.deegree.ogcwebservices.wps.execute.ComplexValue;
068 import org.deegree.ogcwebservices.wps.execute.ExecuteResponse;
069 import org.deegree.ogcwebservices.wps.execute.ExecuteResponseDocument;
070
071 /**
072 * WPSHandler.java
073 *
074 * Created on 08.03.2006. 17:01:31h
075 *
076 * @author <a href="mailto:kiehle@giub.uni-bonn.de">Christian Kiehle</a>
077 * @author <a href="mailto:che@wupperverband.de">Christian Heier</a>
078 *
079 * @version 1.0.
080 *
081 * @since 2.0
082 */
083 public class WPSHandler extends AbstractOWServiceHandler implements ServiceDispatcher {
084
085 private static final ILogger LOG = LoggerFactory.getLogger( WPSHandler.class );
086
087 /**
088 *
089 */
090 public void perform( OGCWebServiceRequest request, HttpServletResponse httpServletResponse )
091 throws ServiceException, OGCWebServiceException {
092
093 WPService service = WPServiceFactory.getInstance();
094 @SuppressWarnings ( "unused")
095 WPSConfiguration config = ( WPSConfiguration ) service.getCapabilities();
096 Object response = service.doService( request );
097 if ( response instanceof WPSCapabilities ) {
098 sendGetCapabilitiesResponse( httpServletResponse, ( WPSCapabilities ) response );
099 } else if ( response instanceof ProcessDescriptions ) {
100 sendDescribeProcessResponse( httpServletResponse, ( ProcessDescriptions ) response );
101 } else if ( response instanceof ExecuteResponse ) {
102 sendExecuteResponse( httpServletResponse, ( ExecuteResponse ) response );
103 }
104
105 }
106
107 /**
108 * Sends the response to a GetCapabilities request to the client.
109 *
110 * @param httpResponse
111 * @param capabilities
112 * @throws OGCWebServiceException
113 * if an exception occurs which can be propagated to the client
114 */
115 private void sendGetCapabilitiesResponse( HttpServletResponse httpResponse,
116 WPSCapabilities capabilities ) {
117 try {
118 httpResponse.setContentType( "text/xml; charset=" + CharsetUtils.getSystemCharset() );
119 WPSCapabilitiesDocument document = XMLFactory.export( capabilities );
120 document.write( httpResponse.getOutputStream() );
121 } catch ( IOException e ) {
122 LOG.logError( "Error sending GetCapabilities response.", e );
123 }
124 }
125
126 /**
127 * Sends the response to a DescribeProcess request to the client.
128 *
129 * @param httpResponse
130 * @param capabilities
131 * @throws OGCWebServiceException
132 * if an exception occurs which can be propagated to the client
133 */
134 private void sendDescribeProcessResponse( HttpServletResponse httpResponse,
135 ProcessDescriptions processDescriptions ) {
136 try {
137 httpResponse.setContentType( "text/xml; charset=" + CharsetUtils.getSystemCharset() );
138 ProcessDescriptionsDocument document = XMLFactory.export( processDescriptions );
139 document.write( httpResponse.getOutputStream() );
140 } catch ( IOException e ) {
141 LOG.logError( "Error sending DescribeProcess response.", e );
142 }
143 }
144
145 /**
146 * Sends the response to an Execute request to the client.
147 *
148 * @param httpServletResponse
149 * @param request
150 * @throws OGCWebServiceException
151 * if an exception occurs which can be propagated to the client
152 */
153 private void sendExecuteResponse( HttpServletResponse httpResponse,
154 ExecuteResponse executeResponse ) throws OGCWebServiceException {
155
156 /*
157 * @see OGC 05-007r4 Subclauses 10.3.1 and 10.3.2
158 * @see OGC 05-007r4 Tables 43, 44
159 * @see OGC 05-007r4 Table 27: If the �store� parameter is �false�,
160 * process execution was successful, there is only one output, and
161 * that output has a ComplexValue, then this ComplexValue shall be
162 * returned to the client outside of any ExecuteResponse document.
163 */
164 String processSucceeded = executeResponse.getStatus().getProcessSucceeded();
165
166 if ( null != processSucceeded && executeResponse.isDirectResponse() ) {
167
168 ComplexValue complexValue = executeResponse.getProcessOutputs().getOutputs().get( 0 )
169 .getComplexValue();
170
171 if ( null != complexValue ) {
172 sendDirectResponse( httpResponse, complexValue );
173 }
174
175 } else {
176 try {
177 httpResponse.setContentType( "text/xml; charset=" + CharsetUtils.getSystemCharset() );
178 ExecuteResponseDocument document = XMLFactory.export( executeResponse );
179 document.write( httpResponse.getOutputStream() );
180 } catch ( IOException e ) {
181 LOG.logError( "error sending execute response.", e );
182 }
183 }
184 }
185
186 /**
187 * Writes the passed <code>ComplexValue</code> to the
188 * <code>HTTPServletResponse</code>
189 *
190 * @param httpResponse
191 * @param complexValue
192 */
193 private static void sendDirectResponse( HttpServletResponse httpResponse,
194 ComplexValue complexValue ) throws OGCWebServiceException {
195
196 Object content = complexValue.getContent();
197
198 if ( content instanceof FeatureCollection ) {
199
200 LOG.logInfo( "content is instance of featurecollection" );
201
202 FeatureCollection fc = ( FeatureCollection ) content;
203
204 GMLFeatureAdapter gmlFeatureAdapter = new GMLFeatureAdapter();
205
206 try {
207 gmlFeatureAdapter.export( fc, httpResponse.getOutputStream() );
208 } catch ( Exception e ) {
209 String msg = "Error sending direct execute response.";
210 LOG.logError( msg, e );
211 throw new OGCWebServiceException( "", msg, ExceptionCode.NOAPPLICABLECODE );
212 }
213 } else {
214 // TODO implement direct output methods for complexvalue types other
215 // than
216 // featurecollection
217 }
218 }
219 }