001 // $HeadURL: /cvsroot/deegree/src/org/deegree/ogcwebservices/wms/WMPService.java,v
002 // 1.3 2004/07/12 06:12:11 ap Exp $
003 /*----------------------------------------------------------------------------
004 This file is part of deegree, http://deegree.org/
005 Copyright (C) 2001-2009 by:
006 Department of Geography, University of Bonn
007 and
008 lat/lon GmbH
009
010 This library is free software; you can redistribute it and/or modify it under
011 the terms of the GNU Lesser General Public License as published by the Free
012 Software Foundation; either version 2.1 of the License, or (at your option)
013 any later version.
014 This library is distributed in the hope that it will be useful, but WITHOUT
015 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
016 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
017 details.
018 You should have received a copy of the GNU Lesser General Public License
019 along with this library; if not, write to the Free Software Foundation, Inc.,
020 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
021
022 Contact information:
023
024 lat/lon GmbH
025 Aennchenstr. 19, 53177 Bonn
026 Germany
027 http://lat-lon.de/
028
029 Department of Geography, University of Bonn
030 Prof. Dr. Klaus Greve
031 Postfach 1147, 53001 Bonn
032 Germany
033 http://www.geographie.uni-bonn.de/deegree/
034
035 e-mail: info@deegree.org
036 ----------------------------------------------------------------------------*/
037 package org.deegree.ogcwebservices.wmps;
038
039 import java.lang.reflect.Constructor;
040
041 import org.deegree.enterprise.Proxy;
042 import org.deegree.framework.log.ILogger;
043 import org.deegree.framework.log.LoggerFactory;
044 import org.deegree.framework.trigger.TriggerProvider;
045 import org.deegree.i18n.Messages;
046 import org.deegree.ogcwebservices.CurrentUpdateSequenceException;
047 import org.deegree.ogcwebservices.InvalidUpdateSequenceException;
048 import org.deegree.ogcwebservices.OGCWebService;
049 import org.deegree.ogcwebservices.OGCWebServiceException;
050 import org.deegree.ogcwebservices.OGCWebServiceRequest;
051 import org.deegree.ogcwebservices.getcapabilities.OGCCapabilities;
052 import org.deegree.ogcwebservices.wmps.configuration.WMPSConfiguration;
053 import org.deegree.ogcwebservices.wmps.configuration.WMPSDeegreeParams;
054 import org.deegree.ogcwebservices.wmps.operation.PrintMap;
055 import org.deegree.ogcwebservices.wmps.operation.WMPSGetCapabilities;
056 import org.deegree.ogcwebservices.wmps.operation.WMPSGetCapabilitiesResult;
057 import org.deegree.ogcwebservices.wmps.operation.WMPSProtocolFactory;
058
059 /**
060 * Handles saving the PrintMap request to the databank and generating the initial response to be
061 * sent to the user.
062 *
063 * @author <a href="mailto:deshmukh@lat-lon.de">Anup Deshmukh</a>
064 * @version 2.0
065 */
066 public class WMPService implements OGCWebService {
067
068 private static final ILogger LOG = LoggerFactory.getLogger( WMPService.class );
069
070 private static final TriggerProvider TP = TriggerProvider.create( WMPService.class );
071
072 private PrintMapHandler printMapHandler;
073
074 private WMPSConfiguration configuration;
075
076 /**
077 * Creates a new WMPService object.
078 *
079 * @param configuration
080 */
081 public WMPService( WMPSConfiguration configuration ) {
082 this.configuration = configuration;
083 this.printMapHandler = new PrintMapHandler( configuration );
084 Proxy proxy = this.configuration.getDeegreeParams().getProxy();
085 if ( proxy != null ) {
086 proxy.setProxy( true );
087 }
088 }
089
090 /**
091 * Return the OGCCapabilities.
092 *
093 * @return OGCCapabilities
094 */
095 public OGCCapabilities getCapabilities() {
096 return this.configuration;
097 }
098
099 /**
100 * the method performs the handling of the passed OGCWebServiceEvent directly and returns the
101 * result to the calling class/method
102 *
103 * @param request
104 * request to perform
105 * @return Object
106 * @throws OGCWebServiceException
107 */
108 public Object doService( OGCWebServiceRequest request )
109 throws OGCWebServiceException {
110
111 request = (OGCWebServiceRequest) TP.doPreTrigger( this, request )[0];
112
113 Object result = null;
114 if ( request instanceof PrintMap ) {
115
116 String template = ( (PrintMap) request ).getTemplate();
117 WMPSDeegreeParams params = this.configuration.getDeegreeParams();
118 boolean isSynchronous = params.getSynchronousTemplates().contains( template );
119
120 String handler = HandlerMapping.getString( "WMPService.PRINTMAP" );
121 RequestManager rqManager = (RequestManager) createHandler( request, PrintMap.class, handler );
122
123 try {
124 rqManager.saveRequestToDB();
125
126 result = rqManager.createInitialResponse( Messages.getMessage( "WMPS_INIT_RESPONSE" ) );
127 } catch ( OGCWebServiceException e ) {
128
129 throw new OGCWebServiceException( "Error saving the PrintMap request " + "to the DB. " + e.getMessage() );
130 }
131
132 try {
133 if ( isSynchronous ) {
134 result = this.printMapHandler.runSynchronous( (PrintMap) request );
135 } else {
136 Thread printMap = new Thread( this.printMapHandler );
137 printMap.start();
138 }
139 } catch ( Exception e ) {
140 LOG.logError( e.getMessage(), e );
141 throw new OGCWebServiceException( "Error performing the PrintMap request. " + e.getMessage() );
142 }
143 } else if ( request instanceof WMPSGetCapabilities ) {
144 result = handleGetCapabilities( (WMPSGetCapabilities) request );
145 }
146
147 return TP.doPostTrigger( this, result )[0];
148 }
149
150 /**
151 * creates a handler class for performing the incomming request. The instance that will be
152 * created depends on the responsible class the for the submitted request in the WMPS
153 * capabilities/configuration.
154 *
155 * @param request
156 * request to be performed
157 * @param requestClass
158 * of the request (GetStyles, WMSFeatureInfoRequest etc.)
159 * @param className
160 * type of the operation to perform by the handler
161 * @return Object
162 * @throws OGCWebServiceException
163 */
164 private Object createHandler( OGCWebServiceRequest request, Class<?> requestClass, String className )
165 throws OGCWebServiceException {
166
167 // describes the signature of the required constructor
168 Class<?>[] cl = new Class[2];
169 cl[0] = WMPSConfiguration.class;
170 cl[1] = requestClass;
171
172 // set parameter to submitt to the constructor
173 Object[] o = new Object[2];
174 o[0] = this.configuration;
175 o[1] = request;
176
177 Object handler = null;
178
179 try {
180 // get constructor
181 Class<?> creator = Class.forName( className );
182 Constructor<?> con = creator.getConstructor( cl );
183 // call constructor and instantiate a new DataStore
184 handler = con.newInstance( o );
185 } catch ( Exception e ) {
186 LOG.logError( e.getMessage(), e );
187 throw new OGCWebServiceException( "Couldn't instantiate " + className + '!' );
188 }
189
190 return handler;
191 }
192
193 /**
194 * reads/creates the capabilities of the WMPS.
195 *
196 * @param request
197 * capabilities request
198 * @return WMPSGetCapabilitiesResult
199 * @throws CurrentUpdateSequenceException
200 * @throws InvalidUpdateSequenceException
201 */
202 private WMPSGetCapabilitiesResult handleGetCapabilities( WMPSGetCapabilities request )
203 throws CurrentUpdateSequenceException, InvalidUpdateSequenceException {
204
205 String rUp = request.getUpdateSequence();
206 String cUp = this.configuration.getUpdateSequence();
207
208 if ( ( rUp != null ) && ( cUp != null ) && ( rUp.compareTo( cUp ) == 0 ) ) {
209 throw new CurrentUpdateSequenceException( "request update sequence: " + rUp + "is equal to capabilities"
210 + " update sequence " + cUp );
211 }
212
213 if ( ( rUp != null ) && ( cUp != null ) && ( rUp.compareTo( cUp ) > 0 ) ) {
214 throw new InvalidUpdateSequenceException( "request update sequence: " + rUp + " is higher then the "
215 + "capabilities update sequence " + cUp );
216 }
217 return WMPSProtocolFactory.createGetCapabilitiesResult( request, null, this.configuration );
218 }
219
220 }