001 // $HeadURL: /cvsroot/deegree/src/org/deegree/ogcwebservices/wms/WMService.java,v
002 // 1.3 2004/07/12 06:12:11 ap Exp $
003 /*---------------- FILE HEADER ------------------------------------------
004
005 This file is part of deegree.
006 Copyright (C) 2001-2008 by:
007 EXSE, Department of Geography, University of Bonn
008 http://www.giub.uni-bonn.de/deegree/
009 lat/lon GmbH
010 http://www.lat-lon.de
011
012 This library is free software; you can redistribute it and/or
013 modify it under the terms of the GNU Lesser General Public
014 License as published by the Free Software Foundation; either
015 version 2.1 of the License, or (at your option) any later version.
016
017 This library is distributed in the hope that it will be useful,
018 but WITHOUT ANY WARRANTY; without even the implied warranty of
019 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
020 Lesser General Public License for more details.
021
022 You should have received a copy of the GNU Lesser General Public
023 License along with this library; if not, write to the Free Software
024 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
025
026 Contact:
027
028 Andreas Poth
029 lat/lon GmbH
030 Aennchenstr. 19
031 53115 Bonn
032 Germany
033 E-Mail: poth@lat-lon.de
034
035 Prof. Dr. Klaus Greve
036 Department of Geography
037 University of Bonn
038 Meckenheimer Allee 166
039 53115 Bonn
040 Germany
041 E-Mail: greve@giub.uni-bonn.de
042
043
044 ---------------------------------------------------------------------------*/
045 package org.deegree.ogcwebservices.wms;
046
047 import java.lang.reflect.Constructor;
048 import java.lang.reflect.InvocationTargetException;
049
050 import org.deegree.enterprise.Proxy;
051 import org.deegree.framework.log.ILogger;
052 import org.deegree.framework.log.LoggerFactory;
053 import org.deegree.framework.trigger.TriggerProvider;
054 import org.deegree.ogcwebservices.CurrentUpdateSequenceException;
055 import org.deegree.ogcwebservices.InvalidUpdateSequenceException;
056 import org.deegree.ogcwebservices.OGCWebService;
057 import org.deegree.ogcwebservices.OGCWebServiceException;
058 import org.deegree.ogcwebservices.OGCWebServiceRequest;
059 import org.deegree.ogcwebservices.OGCWebServiceResponse;
060 import org.deegree.ogcwebservices.getcapabilities.OGCCapabilities;
061 import org.deegree.ogcwebservices.wms.configuration.WMSConfigurationType;
062 import org.deegree.ogcwebservices.wms.operation.DescribeLayer;
063 import org.deegree.ogcwebservices.wms.operation.GetFeatureInfo;
064 import org.deegree.ogcwebservices.wms.operation.GetLegendGraphic;
065 import org.deegree.ogcwebservices.wms.operation.GetLegendGraphicResult;
066 import org.deegree.ogcwebservices.wms.operation.GetMap;
067 import org.deegree.ogcwebservices.wms.operation.GetStyles;
068 import org.deegree.ogcwebservices.wms.operation.GetStylesResult;
069 import org.deegree.ogcwebservices.wms.operation.PutStyles;
070 import org.deegree.ogcwebservices.wms.operation.WMSGetCapabilities;
071 import org.deegree.ogcwebservices.wms.operation.WMSGetCapabilitiesResult;
072 import org.deegree.ogcwebservices.wms.operation.WMSProtocolFactory;
073
074 /**
075 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
076 * @author last edited by: $Author: aschmitz $
077 *
078 * @version 1.0. $Revision: 10167 $, $Date: 2008-02-19 16:59:48 +0100 (Di, 19 Feb 2008) $
079 *
080 * @since 1.1
081 *
082 */
083
084 public class WMService implements OGCWebService {
085
086 private static final ILogger LOG = LoggerFactory.getLogger( WMService.class );
087
088 private static final TriggerProvider TP = TriggerProvider.create( WMService.class );
089
090 private WMSConfigurationType configuration = null;
091
092 /**
093 * Creates a new WMService object.
094 *
095 * @param configuration
096 */
097 public WMService( WMSConfigurationType configuration ) {
098 this.configuration = configuration;
099 Proxy proxy = configuration.getDeegreeParams().getProxy();
100 if ( proxy != null ) {
101 proxy.setProxy( true );
102 }
103 }
104
105 /**
106 *
107 */
108 public OGCCapabilities getCapabilities() {
109 // should a class implement the WMSConfigurationType and not be an instance
110 // of OGCCapabilities, here's where it'll fail ;-)
111 return (OGCCapabilities) configuration;
112 }
113
114 /**
115 * the method performs the handling of the passed OGCWebServiceEvent directly and returns the
116 * result to the calling class/method
117 *
118 * @param request
119 * request to perform
120 *
121 * @throws OGCWebServiceException
122 */
123 public Object doService( OGCWebServiceRequest request )
124 throws OGCWebServiceException {
125
126 request = (OGCWebServiceRequest) TP.doPreTrigger( this, request )[0];
127
128 LOG.logDebug( "Handling WMS request with ID ", request.getId() );
129
130 Object result = null;
131 if ( request instanceof GetMap ) {
132 GetMapHandler gmh = (GetMapHandler) createHandler( request, GetMap.class,
133 HandlerMapping.getString( "WMService.GETMAP" ) );
134 result = gmh.performGetMap();
135 } else if ( request instanceof GetFeatureInfo ) {
136 GetFeatureInfoHandler gmh = (GetFeatureInfoHandler) createHandler(
137 request,
138 GetFeatureInfo.class,
139 HandlerMapping.getString( "WMService.GETFEATUREINFO" ) );
140 result = gmh.performGetFeatureInfo();
141 } else if ( request instanceof WMSGetCapabilities ) {
142 result = handleGetCapabilities( (WMSGetCapabilities) request );
143 } else if ( request instanceof GetStyles ) {
144 handleGetStyles( (GetStyles) request );
145 } else if ( request instanceof PutStyles ) {
146 handlePutStyles( (PutStyles) request );
147 } else if ( request instanceof DescribeLayer ) {
148 result = new DescribeLayerHandler().perform( (DescribeLayer) request, configuration );
149 } else if ( request instanceof GetLegendGraphic ) {
150 result = handleGetLegendGraphic( (GetLegendGraphic) request );
151 }
152
153 LOG.logDebug( "Handled WMS request with ID ", request.getId() );
154
155 return TP.doPostTrigger( this, result )[0];
156 }
157
158 /**
159 * creates a handler class for performing the incomming request. The instance that will be
160 * created depends on the responsible class the for the submitted request in the WMS
161 * capabilities/configuration.
162 *
163 * @param request
164 * request to be performed
165 * @param requestClass
166 * of the request (GetStyles, WMSFeatureInfoRequest etc.)
167 * @param operationType
168 * type of the operation to perform by the handler
169 */
170 private Object createHandler( OGCWebServiceRequest request, Class<?> requestClass, String className )
171 throws OGCWebServiceException {
172 // describes the signature of the required constructor
173 Class[] cl = new Class[2];
174 cl[0] = WMSConfigurationType.class;
175 cl[1] = requestClass;
176
177 // set parameter to submitt to the constructor
178 Object[] o = new Object[2];
179 o[0] = configuration;
180 o[1] = request;
181
182 Object handler = null;
183
184 try {
185 // get constructor
186 Class<?> creator = Class.forName( className );
187 Constructor<?> con = creator.getConstructor( cl );
188
189 // call constructor and instantiate a new DataStore
190 handler = con.newInstance( o );
191 } catch ( ClassNotFoundException cce ) {
192 throw new OGCWebServiceException( "Couldn't instantiate " + className + "! \n" + cce.toString() );
193 } catch ( NoSuchMethodException nsme ) {
194 throw new OGCWebServiceException( "Couldn't instantiate " + className + "! \n" + nsme.toString() );
195 } catch ( InstantiationException ie ) {
196 throw new OGCWebServiceException( "Couldn't instantiate " + className + "! \n" + ie.toString() );
197 } catch ( IllegalAccessException iae ) {
198 throw new OGCWebServiceException( "Couldn't instantiate " + className + "! \n" + iae.toString() );
199 } catch ( InvocationTargetException ite ) {
200 // causes need not be OGCWebService exceptions
201 Throwable cause = ite.getCause();
202 if ( cause instanceof OGCWebServiceException ) {
203 throw (OGCWebServiceException) cause;
204 }
205 LOG.logError( "Unknown error", cause );
206 throw new OGCWebServiceException( getClass().getName(), cause.getMessage() );
207 } catch ( Exception e ) {
208 throw new OGCWebServiceException( "Couldn't instantiate " + className + "! \n" + e.toString() );
209 }
210
211 return handler;
212 }
213
214 /**
215 * reads/creates the capabilities of the WMS.
216 *
217 * @param request
218 * capabilities request
219 */
220 private WMSGetCapabilitiesResult handleGetCapabilities( WMSGetCapabilities request )
221 throws OGCWebServiceException {
222
223 String rUp = request.getUpdateSequence();
224 String cUp = configuration.getUpdateSequence();
225
226 if ( ( rUp != null ) && ( cUp != null ) && ( rUp.compareTo( cUp ) == 0 ) ) {
227 throw new CurrentUpdateSequenceException( "request update sequence (" + rUp + ") is equal to capabilities"
228 + " update sequence " + cUp );
229 }
230
231 if ( ( rUp != null ) && ( cUp != null ) && ( rUp.compareTo( cUp ) > 0 ) ) {
232 throw new InvalidUpdateSequenceException( "request update sequence: " + rUp + " is higher than the "
233 + "capabilities update sequence " + cUp );
234 }
235
236 WMSGetCapabilitiesResult res = null;
237 res = WMSProtocolFactory.createGetCapabilitiesResponse( request, null, configuration );
238
239 return res;
240 }
241
242 /**
243 * @param request
244 * get styles request (WMS 1.1.1 - SLD)
245 */
246 private GetStylesResult handleGetStyles( GetStyles request ) {
247 throw new UnsupportedOperationException( "handleGetStyles(" + request.getClass().getSimpleName()
248 + ") not implemented" );
249 }
250
251 /**
252 * @param request
253 * put styles request (WMS 1.1.1 - SLD)
254 */
255 private void handlePutStyles( PutStyles request ) {
256 throw new UnsupportedOperationException( "handlePutStyles(" + request.getClass().getSimpleName()
257 + ") not implemented" );
258 }
259
260 /**
261 * @param request
262 *
263 * @return the response
264 * @throws WebServiceException
265 */
266 private OGCWebServiceResponse handleGetLegendGraphic( GetLegendGraphic request )
267 throws OGCWebServiceException {
268 OGCWebServiceResponse result;
269
270 Object o = createHandler( request, GetLegendGraphic.class,
271 HandlerMapping.getString( "WMService.GETLEGENDGRAPHIC" ) );
272 GetLegendGraphicHandler glgh = (GetLegendGraphicHandler) o;
273 result = glgh.performGetLegendGraphic();
274 if ( ( (GetLegendGraphicResult) result ).getLegendGraphic() != null ) {
275 // cache.push(request, ((GetLegendGraphicResult) result).getLegendGraphic());
276 }
277
278 return result;
279 }
280
281 }