001    // $HeadURL:
002    // /cvsroot/deegree/src/org/deegree/ogcwebservices/OGCRequestFactory.java,v 1.12
003    // 2004/08/10 17:17:02 tf Exp $
004    /*----------------------------------------------------------------------------
005     This file is part of deegree, http://deegree.org/
006     Copyright (C) 2001-2009 by:
007     Department of Geography, University of Bonn
008     and
009     lat/lon GmbH
010    
011     This library is free software; you can redistribute it and/or modify it under
012     the terms of the GNU Lesser General Public License as published by the Free
013     Software Foundation; either version 2.1 of the License, or (at your option)
014     any later version.
015     This library is distributed in the hope that it will be useful, but WITHOUT
016     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
017     FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
018     details.
019     You should have received a copy of the GNU Lesser General Public License
020     along with this library; if not, write to the Free Software Foundation, Inc.,
021     59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022    
023     Contact information:
024    
025     lat/lon GmbH
026     Aennchenstr. 19, 53177 Bonn
027     Germany
028     http://lat-lon.de/
029    
030     Department of Geography, University of Bonn
031     Prof. Dr. Klaus Greve
032     Postfach 1147, 53001 Bonn
033     Germany
034     http://www.geographie.uni-bonn.de/deegree/
035    
036     e-mail: info@deegree.org
037     ----------------------------------------------------------------------------*/
038    package org.deegree.ogcwebservices;
039    
040    import static org.deegree.framework.util.CharsetUtils.getSystemCharset;
041    import static org.deegree.i18n.Messages.get;
042    import static org.deegree.ogcbase.ExceptionCode.INVALIDPARAMETERVALUE;
043    import static org.deegree.ogcbase.ExceptionCode.MISSINGPARAMETERVALUE;
044    import static org.deegree.ogcbase.ExceptionCode.OPERATIONNOTSUPPORTED;
045    
046    import java.io.BufferedReader;
047    import java.io.IOException;
048    import java.io.InputStreamReader;
049    import java.io.Reader;
050    import java.io.StringReader;
051    import java.io.UnsupportedEncodingException;
052    import java.net.MalformedURLException;
053    import java.net.URLDecoder;
054    import java.util.Map;
055    
056    import javax.servlet.ServletRequest;
057    import javax.servlet.http.HttpServletRequest;
058    
059    import org.deegree.framework.log.ILogger;
060    import org.deegree.framework.log.LoggerFactory;
061    import org.deegree.framework.util.CharsetUtils;
062    import org.deegree.framework.util.IDGenerator;
063    import org.deegree.framework.util.KVP2Map;
064    import org.deegree.framework.util.StringTools;
065    import org.deegree.framework.xml.XMLFragment;
066    import org.deegree.framework.xml.XMLParsingException;
067    import org.deegree.framework.xml.XMLTools;
068    import org.deegree.ogcbase.CommonNamespaces;
069    import org.deegree.ogcbase.ExceptionCode;
070    import org.deegree.ogcwebservices.csw.capabilities.CatalogueGetCapabilities;
071    import org.deegree.ogcwebservices.csw.capabilities.CatalogueOperationsMetadata;
072    import org.deegree.ogcwebservices.csw.discovery.DescribeRecord;
073    import org.deegree.ogcwebservices.csw.discovery.GetRecordById;
074    import org.deegree.ogcwebservices.csw.discovery.GetRecords;
075    import org.deegree.ogcwebservices.csw.discovery.GetRepositoryItem;
076    import org.deegree.ogcwebservices.csw.manager.Harvest;
077    import org.deegree.ogcwebservices.getcapabilities.OperationsMetadata;
078    import org.deegree.ogcwebservices.sos.capabilities.SOSGetCapabilities;
079    import org.deegree.ogcwebservices.sos.capabilities.SOSOperationsMetadata;
080    import org.deegree.ogcwebservices.sos.describeplatform.DescribePlatformRequest;
081    import org.deegree.ogcwebservices.sos.describesensor.DescribeSensorRequest;
082    import org.deegree.ogcwebservices.sos.getobservation.GetObservationRequest;
083    import org.deegree.ogcwebservices.wass.common.CloseSession;
084    import org.deegree.ogcwebservices.wass.common.GetSession;
085    import org.deegree.ogcwebservices.wass.was.operation.DescribeUser;
086    import org.deegree.ogcwebservices.wass.was.operation.WASGetCapabilities;
087    import org.deegree.ogcwebservices.wass.wss.operation.DoService;
088    import org.deegree.ogcwebservices.wass.wss.operation.WSSGetCapabilities;
089    import org.deegree.ogcwebservices.wcs.describecoverage.DescribeCoverage;
090    import org.deegree.ogcwebservices.wcs.getcapabilities.WCSGetCapabilities;
091    import org.deegree.ogcwebservices.wcs.getcoverage.GetCoverage;
092    import org.deegree.ogcwebservices.wcts.operation.GetResourceByID;
093    import org.deegree.ogcwebservices.wcts.operation.GetResourceByIDDocument;
094    import org.deegree.ogcwebservices.wcts.operation.IsTransformable;
095    import org.deegree.ogcwebservices.wcts.operation.IsTransformableDocument;
096    import org.deegree.ogcwebservices.wcts.operation.Transform;
097    import org.deegree.ogcwebservices.wcts.operation.TransformDocument;
098    import org.deegree.ogcwebservices.wcts.operation.WCTSGetCapabilities;
099    import org.deegree.ogcwebservices.wcts.operation.WCTSGetCapabilitiesDocument;
100    import org.deegree.ogcwebservices.wfs.operation.DescribeFeatureType;
101    import org.deegree.ogcwebservices.wfs.operation.GetFeature;
102    import org.deegree.ogcwebservices.wfs.operation.GetFeatureWithLock;
103    import org.deegree.ogcwebservices.wfs.operation.GetGmlObject;
104    import org.deegree.ogcwebservices.wfs.operation.LockFeature;
105    import org.deegree.ogcwebservices.wfs.operation.WFSGetCapabilities;
106    import org.deegree.ogcwebservices.wfs.operation.transaction.Transaction;
107    import org.deegree.ogcwebservices.wmps.operation.DescribeTemplate;
108    import org.deegree.ogcwebservices.wmps.operation.GetAvailableTemplates;
109    import org.deegree.ogcwebservices.wmps.operation.PrintMap;
110    import org.deegree.ogcwebservices.wmps.operation.WMPSGetCapabilities;
111    import org.deegree.ogcwebservices.wms.operation.DescribeLayer;
112    import org.deegree.ogcwebservices.wms.operation.GetFeatureInfo;
113    import org.deegree.ogcwebservices.wms.operation.GetLegendGraphic;
114    import org.deegree.ogcwebservices.wms.operation.GetMap;
115    import org.deegree.ogcwebservices.wms.operation.WMSGetCapabilities;
116    import org.deegree.ogcwebservices.wps.capabilities.WPSGetCapabilities;
117    import org.deegree.ogcwebservices.wps.describeprocess.DescribeProcessRequest;
118    import org.deegree.ogcwebservices.wps.execute.ExecuteRequest;
119    import org.deegree.ogcwebservices.wpvs.operation.Get3DFeatureInfo;
120    import org.deegree.ogcwebservices.wpvs.operation.GetView;
121    import org.deegree.ogcwebservices.wpvs.operation.WPVSGetCapabilities;
122    import org.w3c.dom.Document;
123    import org.w3c.dom.Element;
124    import org.xml.sax.SAXException;
125    
126    /**
127     * Factory for generating request objects for OGC Web Services.
128     * <p>
129     * Requests may be generated from KVP or DOM representations. Also contains methods that decide whether an incoming
130     * request representation is valid for a certain service.
131     * </p>
132     * Currently supported services are:
133     * <ul>
134     * <li>CSW</li>
135     * <li>WFS</li>
136     * <li>WCS</li>
137     * <li>WMS</li>
138     * <li>WFS-G</li>
139     * <li>SOS</li>
140     * <li>WMPS</li>
141     * <li>WSS</li>
142     * <li>WAS</li>
143     * <li>WPVS</li>
144     * </ul>
145     * 
146     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
147     * @author last edited by: $Author: apoth $
148     * 
149     * @version $Revision: 26210 $, $Date: 2010-08-27 13:55:22 +0200 (Fr, 27 Aug 2010) $
150     */
151    public class OGCRequestFactory {
152    
153        private static final ILogger LOG = LoggerFactory.getLogger( OGCRequestFactory.class );
154    
155        private static final String CSW_SERVICE_NAME = "CSW";
156    
157        /**
158         * The service name of a getRepositoryItem request, only valid for the csw/ebrim. Fixed value:
159         * "urn:x-ogc:specification:cswebrim:Service:OGC-CSW:ebRIM"
160         */
161        public static final String CSW_SERVICE_NAME_EBRIM = "urn:x-ogc:specification:cswebrim:Service:OGC-CSW:ebRIM";
162    
163        private static final String WFS_SERVICE_NAME = "WFS";
164    
165        private static final String WCS_SERVICE_NAME = "WCS";
166    
167        private static final String WMS_SERVICE_NAME = "WMS";
168    
169        private static final String SOS_SERVICE_NAME = "SOS";
170    
171        private static final String WPVS_SERVICE_NAME = "WPVS";
172    
173        private static final String WMPS_SERVICE_NAME = "WMPS";
174    
175        private static final String WPS_SERVICE_NAME = "WPS";
176    
177        private static final String WSS_SERVICE_NAME = "WSS";
178    
179        private static final String WAS_SERVICE_NAME = "WAS";
180    
181        private static final String WCTS_SERVICE_NAME = "WCTS";
182    
183        /**
184         * Creates an <code>OGCWebServiceRequest</code> from the content contained within the passed request.
185         * 
186         * @param request
187         * @return the request object
188         * @throws OGCWebServiceException
189         */
190        public static OGCWebServiceRequest create( ServletRequest request )
191                                throws OGCWebServiceException {
192    
193            Map<String, String> result = KVP2Map.toMap( request );
194    
195            LOG.logDebug( "Request parameters: " + result );
196    
197            if ( result.size() != 0 ) {
198                return createFromKVP( result );
199            }
200            
201            XMLFragment fragment = null;
202            try {
203                Reader xmlReader = null;
204                if ( LOG.isDebug() ) {
205                    LOG.logDebug( "Request's content type is " + request.getContentType() );
206                    LOG.logDebug( "Request's character encoding is " + request.getCharacterEncoding() );
207                }
208    
209                if ( request.getContentType() != null ) {
210                    if ( request.getCharacterEncoding() == null ) {
211                        request.setCharacterEncoding( getSystemCharset() );
212                    }
213                    xmlReader = request.getReader();
214                 } else {
215                    // DO NOT REMOVE THIS !!!!!
216                    // IT IS ABSOLUTELY NECESSARY TO ENSURE CORRECT CHARACTER ENCODING !!!
217                    xmlReader = new StringReader( getRequestContent( (HttpServletRequest) request ) );
218                }
219                if ( LOG.getLevel() == ILogger.LOG_DEBUG ) {
220                    StringBuffer sb = new StringBuffer();
221                    BufferedReader br = new BufferedReader( xmlReader );
222                    String line = null;
223                    while ( ( line = br.readLine() ) != null ) {
224                        sb.append( line );
225                    }
226                    String content = sb.toString();
227                    LOG.logDebugFile( "OGCRequestFactory_incoming", ".xml", content );
228                    xmlReader = new StringReader( content );
229                }
230                fragment = new XMLFragment( xmlReader, XMLFragment.DEFAULT_URL );
231            } catch ( SAXException se ) {
232                se.printStackTrace();
233                String message = se.getMessage();
234                if ( message != null ) {
235                    if ( message.contains( "not allowed in prolog" ) ) {
236                        throw new OGCWebServiceException( "OGCRequestFactory",
237                                                          "No key-value pairs were given and the request"
238                                                                                  + " does not contain parsable xml",
239                                                          ExceptionCode.NOAPPLICABLECODE );
240                    }
241                    throw new OGCWebServiceException( "OGCRequestFactory", "Error parsing XML request: " + message,
242                                                      ExceptionCode.NOAPPLICABLECODE );
243                }
244                throw new OGCWebServiceException( "OGCRequestFactory", "Error parsing XML request",
245                                                  ExceptionCode.NOAPPLICABLECODE );
246            } catch ( Exception e ) {
247                LOG.logError( "Error parsing XML request: " + e.getMessage(), e );
248                throw new OGCWebServiceException( "OGCRequestFactory", "Error parsing XML request: " + e.getMessage() );
249            }
250    
251            return createFromXML( fragment.getRootElement().getOwnerDocument() );
252        }
253    
254        /**
255         * DO NOT REMOVE THIS !!!!! IT IS ABSOLUTLY NECESSARY TO ENSURE CORRECT CHARACTER ENCODING !!!
256         * 
257         * @param request
258         * @throws IOException
259         */
260        private static String getRequestContent( HttpServletRequest request )
261                                throws IOException {
262            String method = request.getMethod();
263    
264            if ( method.equalsIgnoreCase( "POST" ) ) {
265                String charset = request.getCharacterEncoding();
266                LOG.logDebug( "posted character encoding: ", charset );
267                if ( charset == null ) {
268                    charset = "UTF-8";
269                }
270                StringBuffer req = readPost( request, charset );
271                if ( charset.equalsIgnoreCase( CharsetUtils.getSystemCharset() ) ) {
272                    return req.toString();
273                }
274                if ( charset.equalsIgnoreCase( "UTF-8" ) && !charset.equalsIgnoreCase( CharsetUtils.getSystemCharset() ) ) {
275                    String s = new String( req.toString().getBytes(), CharsetUtils.getSystemCharset() );
276                    return s;
277                }
278                if ( !charset.equalsIgnoreCase( "UTF-8" ) && !charset.equalsIgnoreCase( CharsetUtils.getSystemCharset() ) ) {
279                    String s = new String( req.toString().getBytes(), "UTF-8" );
280                    return s;
281                }
282                return req.toString();
283            }
284    
285            String req = request.getQueryString();
286            if ( req == null ) {
287                req = readPost( request, CharsetUtils.getSystemCharset() ).toString();
288            }
289            LOG.logDebug( "request string: ", req );
290    
291            return URLDecoder.decode( req, CharsetUtils.getSystemCharset() );
292    
293        }
294    
295        /**
296         * DO NOT REMOVE THIS !!!!! IT IS ABSOLUTLY NECESSARY TO ENSURE CORRECT CHARACTER ENCODING !!!
297         * 
298         * @param request
299         * @param charset
300         * @throws UnsupportedEncodingException
301         * @throws IOException
302         */
303        private static StringBuffer readPost( HttpServletRequest request, String charset )
304                                throws UnsupportedEncodingException, IOException {
305            java.io.Reader reader = new InputStreamReader( request.getInputStream(), charset );
306            BufferedReader br = new BufferedReader( reader );
307            StringBuffer req = new StringBuffer( 10000 );
308            for ( String line = null; ( line = br.readLine() ) != null; ) {
309                req.append( ( new StringBuilder( String.valueOf( line ) ) ).append( "\n" ).toString() );
310            }
311    
312            br.close();
313            return req;
314        }
315    
316        /**
317         * Creates an instance of an <code>AbstractOGCWebServiceRequest</code> from the passed DOM object. Supported OWS are
318         * 'WMS', 'WFS', 'WCS' and 'CSW'. If a request for another service is passed or a request that isn't supported by
319         * one of the listed services an exception will be thrown. <BR>
320         * Notice that not all listed services will support request processing by reading the request to be performed from a
321         * DOM object. In this case also an exception will be thrown even if the same request may can be performed if KVP is
322         * used.
323         * 
324         * @param doc
325         * @return the request object
326         * @throws OGCWebServiceException
327         */
328        public static OGCWebServiceRequest createFromXML( Document doc )
329                                throws OGCWebServiceException {
330    
331            if ( LOG.getLevel() == ILogger.LOG_DEBUG ) {
332                XMLFragment xml = new XMLFragment();
333                xml.setRootElement( doc.getDocumentElement() );
334                LOG.logDebug( "XML request (pretty printed): ", xml.getAsPrettyString() );
335            }
336    
337            String service = XMLTools.getAttrValue( doc.getDocumentElement(), null, "service", null );
338            String request = doc.getDocumentElement().getLocalName();
339            service = getTargetService( service, request, doc );
340            if ( "unknown".equals( service ) ) {
341                throw new OGCWebServiceException( "OGCRequestFactory", "Specified service '" + service
342                                                                       + "' is not a known OGC service type." );
343            }
344            OGCWebServiceRequest ogcRequest = null;
345            if ( request == null ) {
346                throw new OGCWebServiceException( "request", "Request parameter must be set!", MISSINGPARAMETERVALUE );
347            } else if ( WMS_SERVICE_NAME.equals( service ) ) {
348                ogcRequest = getWMSRequest( request, doc );
349            } else if ( WFS_SERVICE_NAME.equals( service ) ) {
350                ogcRequest = getWFSRequest( request, doc );
351            } else if ( WCS_SERVICE_NAME.equals( service ) ) {
352                ogcRequest = getWCSRequest( request, doc );
353            } else if ( CSW_SERVICE_NAME.equals( service ) ) {
354                ogcRequest = getCSWRequest( request, doc );
355            } else if ( SOS_SERVICE_NAME.equals( service ) ) {
356                ogcRequest = getSOSRequest( request, doc );
357            } else if ( WPVS_SERVICE_NAME.equals( service ) ) {
358                ogcRequest = getSOSRequest( request, doc );
359            } else if ( WMPS_SERVICE_NAME.equals( service ) ) {
360                ogcRequest = getWMPSRequest( request, doc );
361            } else if ( WPS_SERVICE_NAME.equals( service ) ) {
362                ogcRequest = getWPSRequest( request, doc );
363            } else if ( WSS_SERVICE_NAME.equals( service ) ) {
364                ogcRequest = getWSSRequest( request, doc );
365            } else if ( WAS_SERVICE_NAME.equals( service ) ) {
366                ogcRequest = getWASRequest( request, doc );
367            } else if ( WCTS_SERVICE_NAME.equals( service ) ) {
368                ogcRequest = getWCTSRequest( request, doc );
369            } else {
370                throw new OGCWebServiceException( "OGCRequestFactory", "No handler for service " + service
371                                                                       + " in OGCRequestFactory." );
372            }
373            return ogcRequest;
374        }
375    
376        /**
377         * Creates an instance of an <code>AbstractOGCWebServiceRequest</code> from the passed KVP encoded request.
378         * Supported OWS are 'WMS', 'WFS', 'WCS' and 'CSW'. If a request for another service is passed or a request that
379         * isn't supported by one of the listed services an exception will be thrown. <BR>
380         * Notice that not all listed services will support request processing by reading the request to be performed from
381         * KVPs. In this case also an exception will be thrown even if the same request may be performed if a DOM object is
382         * used.
383         * 
384         * @param map
385         * @return the request object
386         * @throws OGCWebServiceException
387         */
388        public static OGCWebServiceRequest createFromKVP( Map<String, String> map )
389                                throws OGCWebServiceException {
390    
391            LOG.logDebug( "KVP request: ", map );
392            // request parameter given?
393            String request = map.get( "REQUEST" );
394            if ( request == null ) {
395                LOG.logInfo( "parameter: ", map );
396                throw new OGCWebServiceException( "request", get( "NO_REQUEST_PARAMETER" ), MISSINGPARAMETERVALUE );
397            }
398            // service parameter given?
399            String service = map.get( "SERVICE" );
400            if ( service == null ) {
401                // a profile of a service will be treated as a service
402                service = map.get( "PROFILE" );
403                if ( service == null ) {
404                    service = getTargetService( service, request, null );
405                }
406            }
407    
408            OGCWebServiceRequest ogcRequest = null;
409            if ( !WFS_SERVICE_NAME.equals( service ) ) {
410                map.put( "SERVICE", service );
411            }
412            if ( WMS_SERVICE_NAME.equals( service ) ) {
413                ogcRequest = getWMSRequest( request, map );
414            } else if ( WFS_SERVICE_NAME.equals( service ) ) {
415                ogcRequest = getWFSRequest( request, map );
416            } else if ( WCS_SERVICE_NAME.equals( service ) ) {
417                ogcRequest = getWCSRequest( request, map );
418            } else if ( CSW_SERVICE_NAME_EBRIM.equals( service ) || CSW_SERVICE_NAME.equals( service ) ) {
419                ogcRequest = getCSWRequest( request, map );
420            } else if ( SOS_SERVICE_NAME.equals( service ) ) {
421                ogcRequest = getSOSRequest( request, map );
422            } else if ( WPVS_SERVICE_NAME.equals( service ) ) {
423                ogcRequest = getWPVSRequest( request, map );
424            } else if ( WMPS_SERVICE_NAME.equals( service ) ) {
425                ogcRequest = getWMPSRequest( request, map );
426            } else if ( WPS_SERVICE_NAME.equals( service ) ) {
427                ogcRequest = getWPSRequest( request, map );
428            } else if ( WSS_SERVICE_NAME.equals( service ) ) {
429                ogcRequest = getWSSRequest( request, map );
430            } else if ( WAS_SERVICE_NAME.equals( service ) ) {
431                ogcRequest = getWASRequest( request, map );
432            } else if ( WCTS_SERVICE_NAME.equals( service ) ) {
433                ogcRequest = getWCTSRequest( request, map );
434            } else {
435                if ( map.get( "SERVICE" ) == null || map.get( "SERVICE" ).equals( "unknown" ) ) {
436                    throw new OGCWebServiceException( "service", get( "NO_SERVICE_SPECIFIED" ), MISSINGPARAMETERVALUE );
437                }
438    
439                throw new OGCWebServiceException( "service", get( "UNKNOWN_SERVICE_SPECIFIED", map.get( "SERVICE" ) ),
440                                                  INVALIDPARAMETERVALUE );
441            }
442            return ogcRequest;
443        }
444    
445        /**
446         * Creates the corresponding WFS request object from the given parameters.
447         * 
448         * @param request
449         * @param map
450         * @return the corresponding WFS request object
451         * @throws OGCWebServiceException
452         */
453        private static OGCWebServiceRequest getWFSRequest( String request, Map<String, String> map )
454                                throws OGCWebServiceException {
455            OGCWebServiceRequest ogcRequest = null;
456            map.put( "ID", "" + IDGenerator.getInstance().generateUniqueID() );
457            if ( request.equals( "GetCapabilities" ) ) {
458                ogcRequest = WFSGetCapabilities.create( map );
459            } else if ( request.equals( "GetFeature" ) ) {
460                ogcRequest = GetFeature.create( map );
461            } else if ( request.equals( "GetFeatureWithLock" ) ) {
462                ogcRequest = GetFeatureWithLock.create( map );
463            } else if ( request.equals( "GetGmlObject" ) ) {
464                ogcRequest = GetGmlObject.create( map );
465            } else if ( request.equals( "LockFeature" ) ) {
466                ogcRequest = LockFeature.create( map );
467            } else if ( request.equals( "DescribeFeatureType" ) ) {
468                ogcRequest = DescribeFeatureType.create( map );
469            } else if ( request.equals( "Transaction" ) ) {
470                ogcRequest = Transaction.create( map );
471            } else {
472                throw new InvalidParameterValueException( "Unknown WFS request type: '" + request + "'." );
473            }
474            return ogcRequest;
475        }
476    
477        /**
478         * Creates an <code>OGCWebServiceRequest</code> from the passed <code>Document</code>. The returned request will be
479         * a WFS request. The type of request is determined by also submitted request name. Known requests are:
480         * <ul>
481         * <li>GetCapabilities</li>
482         * <li>GetFeature</li>
483         * <li>GetFeatureWithLock</li>
484         * <li>DescribeFeatureType</li>
485         * <li>Transaction</li>
486         * <li>LockFeature</li>
487         * </ul>
488         * <p>
489         * Any other request passed to the method causes an <code>OGCWebServiceException</code> to be thrown.
490         * </p>
491         * 
492         * @param request
493         * @param doc
494         * @return created <code>OGCWebServiceRequest</code>
495         * @throws OGCWebServiceException
496         */
497        private static OGCWebServiceRequest getWFSRequest( String request, Document doc )
498                                throws OGCWebServiceException {
499            OGCWebServiceRequest ogcRequest = null;
500            String id = "" + IDGenerator.getInstance().generateUniqueID();
501            if ( request.equals( "GetCapabilities" ) ) {
502                ogcRequest = WFSGetCapabilities.create( id, doc.getDocumentElement() );
503            } else if ( request.equals( "GetFeature" ) ) {
504                ogcRequest = GetFeature.create( id, doc.getDocumentElement() );
505            } else if ( request.equals( "GetFeatureWithLock" ) ) {
506                ogcRequest = GetFeatureWithLock.create( id, doc.getDocumentElement() );
507            } else if ( request.equals( "DescribeFeatureType" ) ) {
508                ogcRequest = DescribeFeatureType.create( id, doc.getDocumentElement() );
509            } else if ( request.equals( "Transaction" ) ) {
510                ogcRequest = Transaction.create( id, doc.getDocumentElement() );
511            } else if ( request.equals( "LockFeature" ) ) {
512                ogcRequest = LockFeature.create( id, doc.getDocumentElement() );
513            } else if ( request.equals( "GetGmlObject" ) ) {
514                ogcRequest = GetGmlObject.create( id, doc.getDocumentElement() );
515            } else {
516                throw new OGCWebServiceException( "Unknown / unimplemented WFS request type: '" + request + "'.",
517                                                  OPERATIONNOTSUPPORTED );
518            }
519            return ogcRequest;
520        }
521    
522        /**
523         * Creates an <code>OGCWebServiceRequest</code> from the passed <code>Document</code>. The returned request will be
524         * a WSS request. The type of request is determined by also submitted request name. Known requests are:
525         * <ul>
526         * <li>GetCapabilities</li>
527         * <li>GetSession</li>
528         * <li>CloseSession</li>
529         * <li>DoService</li>
530         * </ul>
531         * <p>
532         * Any other request passed to the method causes an <code>OGCWebServiceException</code> to be thrown.
533         * </p>
534         * 
535         * @param request
536         * @param doc
537         * @return created <code>OGCWebServiceRequest</code>
538         * @throws OGCWebServiceException
539         */
540        private static OGCWebServiceRequest getWSSRequest( String request, Document doc )
541                                throws OGCWebServiceException {
542            OGCWebServiceRequest ogcRequest = null;
543            String id = "" + IDGenerator.getInstance().generateUniqueID();
544            if ( ( "GetCapabilities" ).equals( request ) ) {
545                ogcRequest = WSSGetCapabilities.create( id, doc.getDocumentElement() );
546            } else if ( ( "GetSession" ).equals( request ) ) {
547                ogcRequest = GetSession.create( id, doc.getDocumentElement() );
548            } else if ( ( "CloseSession" ).equals( request ) ) {
549                ogcRequest = CloseSession.create( id, doc.getDocumentElement() );
550            } else if ( ( "DoService" ).equals( request ) ) {
551                ogcRequest = DoService.create( id, doc.getDocumentElement() );
552            } else {
553                throw new OGCWebServiceException( "Unknown / unimplemented WSS request type: '" + request + "'." );
554            }
555            return ogcRequest;
556        }
557    
558        /**
559         * Creates an <code>OGCWebServiceRequest</code> from the passed <code>key value pair</code>. The returned request
560         * will be a WSS request. The type of request is determined by also submitted request name. Known requests are:
561         * <ul>
562         * <li>GetCapabilities</li>
563         * <li>GetSession</li>
564         * <li>CloseSession</li>
565         * <li>DoService</li>
566         * </ul>
567         * <p>
568         * Any other request passed to the method causes an <code>OGCWebServiceException</code> to be thrown.
569         * </p>
570         * 
571         * @param request
572         * @param kvp
573         * @return created <code>OGCWebServiceRequest</code>
574         * @throws OGCWebServiceException
575         */
576        private static OGCWebServiceRequest getWSSRequest( String request, Map<String, String> kvp )
577                                throws OGCWebServiceException {
578            OGCWebServiceRequest ogcRequest = null;
579            String id = "" + IDGenerator.getInstance().generateUniqueID();
580            if ( ( "GetCapabilities" ).equals( request ) ) {
581                ogcRequest = WSSGetCapabilities.create( id, kvp );
582            } else if ( ( "GetSession" ).equals( request ) ) {
583                ogcRequest = GetSession.create( id, kvp );
584            } else if ( ( "CloseSession" ).equals( request ) ) {
585                ogcRequest = CloseSession.create( id, kvp );
586            } else if ( ( "DoService" ).equals( request ) ) {
587                ogcRequest = DoService.create( id, kvp );
588            } else {
589                throw new OGCWebServiceException( "Unknown / unimplemented WSS request type: '" + request + "'." );
590            }
591            return ogcRequest;
592        }
593    
594        /**
595         * Creates an <code>OGCWebServiceRequest</code> from the passed <code>Document</code>. The returned request will be
596         * a WAS request. The type of request is determined by also submitted request name. Known requests are:
597         * <ul>
598         * <li>GetCapabilities</li>
599         * <li>GetSession</li>
600         * <li>CloseSession</li>
601         * </ul>
602         * <p>
603         * Any other request passed to the method causes an <code>OGCWebServiceException</code> to be thrown.
604         * </p>
605         * 
606         * @param request
607         * @param doc
608         * @return created <code>OGCWebServiceRequest</code>
609         * @throws OGCWebServiceException
610         */
611        private static OGCWebServiceRequest getWASRequest( String request, Document doc )
612                                throws OGCWebServiceException {
613            OGCWebServiceRequest ogcRequest = null;
614            String id = "" + IDGenerator.getInstance().generateUniqueID();
615            // note: DescribeUser is only supported through KVP
616            if ( ( "GetCapabilities" ).equals( request ) ) {
617                ogcRequest = WASGetCapabilities.create( id, doc.getDocumentElement() );
618            } else if ( ( "GetSession" ).equals( request ) ) {
619                ogcRequest = GetSession.create( id, doc.getDocumentElement() );
620            } else if ( ( "CloseSession" ).equals( request ) ) {
621                ogcRequest = CloseSession.create( id, doc.getDocumentElement() );
622            } else {
623                throw new OGCWebServiceException( "Unknown / unimplemented WAS request type: '" + request + "'." );
624            }
625            return ogcRequest;
626        }
627    
628        /**
629         * Creates an <code>OGCWebServiceRequest</code> from the passed <code>key value pair</code>. The returned request
630         * will be a WAS request. The type of request is determined by also submitted request name. Known requests are:
631         * <ul>
632         * <li>GetCapabilities</li>
633         * <li>GetSession</li>
634         * <li>CloseSession</li>
635         * <li>DescribeUser</li>
636         * </ul>
637         * <p>
638         * Any other request passed to the method causes an <code>OGCWebServiceException</code> to be thrown.
639         * </p>
640         * 
641         * @param request
642         * @param kvp
643         * @return created <code>OGCWebServiceRequest</code>
644         * @throws OGCWebServiceException
645         */
646        private static OGCWebServiceRequest getWASRequest( String request, Map<String, String> kvp )
647                                throws OGCWebServiceException {
648            OGCWebServiceRequest ogcRequest = null;
649            kvp.put( "SERVICE", WAS_SERVICE_NAME );
650            String id = "" + IDGenerator.getInstance().generateUniqueID();
651            if ( ( "GetCapabilities" ).equals( request ) ) {
652                ogcRequest = WASGetCapabilities.create( id, kvp );
653            } else if ( ( "GetSession" ).equals( request ) ) {
654                ogcRequest = GetSession.create( id, kvp );
655            } else if ( ( "CloseSession" ).equals( request ) ) {
656                ogcRequest = CloseSession.create( id, kvp );
657            } else if ( ( "DescribeUser" ).equals( request ) ) {
658                ogcRequest = new DescribeUser( id, kvp );
659            } else {
660                throw new OGCWebServiceException( "Unknown / unimplemented WAS request type: '" + request + "'." );
661            }
662            return ogcRequest;
663        }
664    
665        /**
666         * return the type of service the passed request targets
667         * 
668         * @param service
669         * @param request
670         * @param doc
671         * @return the type of service the passed request targets
672         */
673        public static String getTargetService( String service, String request, Document doc ) {
674    
675            if ( WMS_SERVICE_NAME.equals( service ) || isWMSRequest( request ) ) {
676                return WMS_SERVICE_NAME;
677            } else if ( WFS_SERVICE_NAME.equals( service ) || isWFSRequest( request, doc ) ) {
678                return WFS_SERVICE_NAME;
679            } else if ( WCS_SERVICE_NAME.equals( service ) || isWCSRequest( request ) ) {
680                return WCS_SERVICE_NAME;
681            } else if ( CSW_SERVICE_NAME_EBRIM.equals( service ) || CSW_SERVICE_NAME.equals( service )
682                        || isCSWRequest( request, doc ) ) {
683                return CSW_SERVICE_NAME;
684            } else if ( SOS_SERVICE_NAME.equals( service ) || isSOSRequest( request ) ) {
685                return SOS_SERVICE_NAME;
686            } else if ( WPVS_SERVICE_NAME.equals( service ) || isWPVSRequest( request ) ) {
687                return WPVS_SERVICE_NAME;
688            } else if ( WMPS_SERVICE_NAME.equals( service ) || isWMPSRequest( doc, request ) ) {
689                return WMPS_SERVICE_NAME;
690            } else if ( WPS_SERVICE_NAME.equals( service ) || isWPSRequest( request ) ) {
691                return WPS_SERVICE_NAME;
692            } else if ( WAS_SERVICE_NAME.equals( service ) || isWASRequest( request ) ) {
693                return WAS_SERVICE_NAME;
694            } else if ( WSS_SERVICE_NAME.equals( service ) || isWSSRequest( request ) ) {
695                return WSS_SERVICE_NAME;
696            } else if ( WCTS_SERVICE_NAME.equals( service ) || isWCTSRequest( doc ) ) {
697                return WCTS_SERVICE_NAME;
698            } else {
699                return "unknown";
700            }
701    
702        }
703    
704        /**
705         * @param doc
706         *            to check
707         * @return true if the namespace of the given dom-xml document equals {@link CommonNamespaces#WCTSNS}.
708         */
709        private static boolean isWCTSRequest( Document doc ) {
710            if ( doc != null ) {
711                Element root = doc.getDocumentElement();
712                if ( root != null ) {
713                    String ns = root.getNamespaceURI();
714                    return CommonNamespaces.WCTSNS.toASCIIString().equals( ns )
715                           || CommonNamespaces.DEEGREEWCTS.toASCIIString().equals( ns );
716                }
717            }
718            return false;
719        }
720    
721        /**
722         * returns true if the request is a WMPS request
723         * 
724         * @param request
725         *            name, e.g. 'GetCapabilities' name, e.g. 'PrintMap'
726         * @return true if the request is a WMPS request
727         */
728        private static boolean isWMPSRequest( Document doc, String request ) {
729            if ( doc != null ) {
730                Element root = doc.getDocumentElement();
731                if ( root != null ) {
732                    String ns = root.getNamespaceURI();
733                    if ( CommonNamespaces.WMPSNS.toASCIIString().equals( ns ) ) {
734                        return true;
735                    }
736                }
737            }
738            if ( ( "PrintMap".equals( request ) ) ) {
739                return true;
740            } else if ( ( "GetAvailableTemplates".equals( request ) ) ) {
741                return true;
742            } else if ( ( "DescribeTemplate".equals( request ) ) ) {
743                return true;
744            }
745            return false;
746        }
747    
748        /**
749         * returns true if the request is a WMS request
750         * 
751         * @param request
752         * @return true if the request is a WMS request
753         */
754        private static boolean isWMSRequest( String request ) {
755            if ( "GetMap".equals( request ) || "map".equals( request ) || "GetFeatureInfo".equals( request )
756                 || "feature_info".equals( request ) || "GetLegendGraphic".equals( request )
757                 || "GetStyles".equals( request ) || "PutStyles".equals( request ) || "DescribeLayer".equals( request ) ) {
758                return true;
759            }
760            return false;
761        }
762    
763        /**
764         * returns true if the request is a WFS request
765         * 
766         * @param request
767         * @param doc
768         * @return true if the request is a WFS request
769         */
770        private static boolean isWFSRequest( String request, Document doc ) {
771            if ( doc != null ) {
772                String s = doc.getDocumentElement().getNamespaceURI();
773                if ( CommonNamespaces.WFSNS.toString().equals( s ) ) {
774                    return true;
775                }
776            } else {
777                if ( "DescribeFeatureType".equals( request ) || "GetFeature".equals( request )
778                     || "GetFeatureWithLock".equals( request ) || "GetGmlObject".equals( request )
779                     || "Lock".equals( request ) || "Transaction".equals( request ) ) {
780                    return true;
781                }
782            }
783            return false;
784        }
785    
786        /**
787         * returns true if the request is a WCS request
788         * 
789         * @param request
790         * @return true if the request is a WCS request
791         */
792        private static boolean isWCSRequest( String request ) {
793            if ( "GetCoverage".equals( request ) || "DescribeCoverage".equals( request ) ) {
794                return true;
795            }
796            return false;
797        }
798    
799        /**
800         * returns true if the request is a CSW request
801         * 
802         * @param request
803         * @return true if the request is a CSW request
804         */
805        private static boolean isCSWRequest( String request, Document doc ) {
806            if ( doc != null ) {
807                String s = doc.getDocumentElement().getNamespaceURI();
808                if ( CommonNamespaces.CSWNS.toString().equals( s ) || CommonNamespaces.CSW202NS.toString().equals( s ) ) {
809                    return true;
810                }
811            } else {
812                if ( CatalogueOperationsMetadata.GET_RECORDS_NAME.equals( request )
813                     || CatalogueOperationsMetadata.DESCRIBE_RECORD_NAME.equals( request )
814                     || CatalogueOperationsMetadata.GET_RECORD_BY_ID_NAME.equals( request )
815                     || CatalogueOperationsMetadata.GET_DOMAIN_NAME.equals( request )
816                     || CatalogueOperationsMetadata.HARVEST_NAME.equals( request ) ) {
817                    return true;
818                }
819            }
820            return false;
821        }
822    
823        /**
824         * returns true if the request is a SOS request
825         * 
826         * @param request
827         * @return true if the request is a SOS request
828         */
829        private static boolean isSOSRequest( String request ) {
830            if ( "GetObservation".equals( request ) || "DescribeSensor".equals( request )
831                 || "DescribePlatform".equals( request ) ) {
832                return true;
833            }
834            return false;
835        }
836    
837        /**
838         * returns true if the request is a WPVS request
839         * 
840         * @param request
841         *            name, e.g. 'GetView'
842         * @return true if the request is a WPVS request
843         */
844        private static boolean isWPVSRequest( String request ) {
845            if ( "GetView".equals( request ) ) {
846                return true;
847            }
848            return false;
849        }
850    
851        /**
852         * returns true if the request is a WPS request
853         * 
854         * @param request
855         *            name, e.g. 'GetCapabilities' name, e.g. 'DescribeProcess', e.g. 'Exceute'
856         * @return true if the request is a WPS request
857         */
858        private static boolean isWPSRequest( String request ) {
859            if ( "DescribeProcess".equals( request ) || "Execute".equals( request ) ) {
860                return true;
861            }
862            return false;
863        }
864    
865        /**
866         * returns true if the request is a WAS request
867         * 
868         * @param request
869         *            name, e.g. 'GetSession' name, e.g. 'CloseSession', e.g. 'GetSAMLResponse'
870         * @return true if and only if the request contains one of the above Strings
871         */
872        private static boolean isWASRequest( String request ) {
873            if ( "GetSession".equals( request ) || "CloseSession".equals( request ) || "GetSAMLResponse".equals( request )
874                 || "DescribeUser".equals( request ) ) {
875                return true;
876            }
877            return false;
878        }
879    
880        /**
881         * returns true if the request is a WSS request
882         * 
883         * @param request
884         *            name, e.g. 'GetSession' name, e.g. 'CloseSession', e.g. 'GetSAMLResponse'
885         * @return true if and only if the request contains one of the above Strins
886         */
887        private static boolean isWSSRequest( String request ) {
888            if ( "GetSession".equals( request ) || "CloseSession".equals( request ) || "DoService".equals( request ) ) {
889                return true;
890            }
891            return false;
892        }
893    
894        /**
895         * Creates an <code>OGCWebServiceRequest</code> from the passed <code>Object</code>. the returned request will be a
896         * WCS request. The type of request is determind by the the also passed 'request' parameter. Possible requests are:
897         * <ul>
898         * <li>GetCapabilities
899         * <li>GetCoverage
900         * <li>DescribeCoverage
901         * </ul>
902         * <p>
903         * Any other request passed to the method causes an exception to be thrown.
904         * </p>
905         * 
906         * @param request
907         * @param req
908         * @return created <code>OGCWebServiceRequest</code>
909         * @throws OGCWebServiceException
910         */
911        @SuppressWarnings("unchecked")
912        private static OGCWebServiceRequest getWMSRequest( String request, Object req )
913                                throws OGCWebServiceException {
914            OGCWebServiceRequest ogcRequest = null;
915            String id = "" + IDGenerator.getInstance().generateUniqueID();
916            try {
917                Map<String, String> map = null;
918                if ( req instanceof Map ) {
919                    map = (Map<String, String>) req;
920                    map.put( "ID", id );
921                }
922                if ( request.equals( "GetCapabilities" ) || "capabilities".equals( request ) ) {
923                    if ( map != null ) {
924                        // defaulting to 1.1.1 is not possible because of spec requirements
925                        // if( ( map.get( "VERSION" ) == null ) && ( map.get( "WMTVER" ) == null ) )
926                        // {
927                        // map.put( "VERSION", "1.3.0" );
928                        // }
929                        ogcRequest = WMSGetCapabilities.create( map );
930                    }
931                } else if ( request.equals( "GetMap" ) || request.equals( "map" ) ) {
932                    if ( map != null ) {
933                        ogcRequest = GetMap.create( map );
934                    } else {
935                        ogcRequest = GetMap.create( id, (Document) req );
936                    }
937                } else if ( request.equals( "GetFeatureInfo" ) || request.equals( "feature_info" ) ) {
938                    if ( map != null ) {
939                        ogcRequest = GetFeatureInfo.create( map );
940                    }
941                } else if ( request.equals( "GetLegendGraphic" ) ) {
942                    if ( map != null ) {
943                        ogcRequest = GetLegendGraphic.create( map );
944                    }
945                } else if ( request.equals( "DescribeLayer" ) ) {
946                    if ( map != null ) {
947                        ogcRequest = DescribeLayer.create( map );
948                    }
949                } else {
950                    throw new OGCWebServiceException( "Unknown WMS request type: '" + request + "'." );
951                }
952            } catch ( MalformedURLException e ) {
953                LOG.logError( e.getLocalizedMessage(), e );
954                throw new OGCWebServiceException( e.getMessage() );
955            } catch ( XMLParsingException e ) {
956                LOG.logError( e.getLocalizedMessage(), e );
957                throw new OGCWebServiceException( e.getMessage() );
958            }
959            return ogcRequest;
960        }
961    
962        /**
963         * Creates an <code>AbstractOGCWebServiceRequest</code> from the passed <code>Object</code>. the returned request
964         * will be a WCS request. The type of request is determind by the the also passed 'request' parameter. Possible
965         * requests are:
966         * <ul>
967         * <li>GetCapabilities
968         * <li>GetCoverage
969         * <li>DescribeCoverage
970         * </ul>
971         * Any other request passed to the method causes an exception to be thrown.
972         * 
973         * @param request
974         *            a string describing the request type.
975         * @param req
976         *            the kvp-encoded request
977         * @return one of the above mentioned Requests.
978         * @throws OGCWebServiceException
979         *             if the requested operation is not one of the above mentioned, or something went wrong while creating
980         *             the request.
981         */
982        private static AbstractOGCWebServiceRequest getWCSRequest( String request, Map<String, String> req )
983                                throws OGCWebServiceException {
984            AbstractOGCWebServiceRequest ogcRequest = null;
985            String id = Long.toString( IDGenerator.getInstance().generateUniqueID() );
986            req.put( "ID", id );
987            if ( request.equals( "GetCapabilities" ) ) {
988                ogcRequest = WCSGetCapabilities.create( req );
989            } else if ( request.equals( "GetCoverage" ) ) {
990                ogcRequest = GetCoverage.create( req );
991            } else if ( request.equals( "DescribeCoverage" ) ) {
992                ogcRequest = DescribeCoverage.create( req );
993            } else {
994                throw new OGCWebServiceException( "Unknown WCS request type: '" + request + "'." );
995            }
996            return ogcRequest;
997        }
998    
999        /**
1000         * Creates an <code>AbstractOGCWebServiceRequest</code> from the passed <code>Docuement</code>. the returned request
1001         * will be a WCS request. The type of request is determind by the the also passed 'request' parameter. Possible
1002         * requests are:
1003         * <ul>
1004         * <li>GetCapabilities
1005         * <li>GetCoverage
1006         * <li>DescribeCoverage
1007         * </ul>
1008         * Any other request passed to the method causes an exception to be thrown.
1009         * 
1010         * @param request
1011         *            a string describing the request type.
1012         * @param req
1013         *            the XML-encoded request
1014         * @return one of the above mentioned Requests.
1015         * @throws OGCWebServiceException
1016         *             if the requested operation is not one of the above mentioned, or something went wrong while creating
1017         *             the request.
1018         */
1019        private static AbstractOGCWebServiceRequest getWCSRequest( String request, Document req )
1020                                throws OGCWebServiceException {
1021            AbstractOGCWebServiceRequest ogcRequest = null;
1022            String id = Long.toString( IDGenerator.getInstance().generateUniqueID() );
1023            if ( request.equals( "GetCapabilities" ) ) {
1024                ogcRequest = WCSGetCapabilities.create( id, req );
1025            } else if ( request.equals( "GetCoverage" ) ) {
1026                ogcRequest = GetCoverage.create( id, req );
1027            } else if ( request.equals( "DescribeCoverage" ) ) {
1028                ogcRequest = DescribeCoverage.create( id, req );
1029            } else {
1030                throw new OGCWebServiceException( "Unknown WCS request type: '" + request + "'." );
1031            }
1032            return ogcRequest;
1033        }
1034    
1035        /**
1036         * Creates an <code>AbstractOGCWebServiceRequest</code> from the passed <code>Object</code>. The returned request
1037         * will be a <code>CSW</code> request. The type of request is determined by the the also passed 'request' parameter.
1038         * Allowed values for the request parameter are:
1039         * <ul>
1040         * <li>GetCapabilities</li>
1041         * <li>GetRecords</li>
1042         * <li>GetRecordsByID</li>
1043         * <li>DescribeRecord</li>
1044         * <li>GetDomain, will cause an exception to be thrown</li>
1045         * <li>Transaction, will cause an exception to be thrown</li>
1046         * <li>Harvest</li>
1047         * </ul>
1048         * 
1049         * Any other request passed to the method causes an exception to be thrown.
1050         * 
1051         * @param request
1052         *            a string describing the request type.
1053         * @param req
1054         *            the KVP-encoded request
1055         * @return one of the above mentioned Requests.
1056         * @throws OGCWebServiceException
1057         *             if the requested operation is not one of the above mentioned, not supported or something went wrong
1058         *             while creating the request.
1059         */
1060        private static AbstractOGCWebServiceRequest getCSWRequest( String request, Map<String, String> req )
1061                                throws OGCWebServiceException {
1062            AbstractOGCWebServiceRequest ogcRequest = null;
1063            String id = Long.toString( IDGenerator.getInstance().generateUniqueID() );
1064            LOG.logDebug( StringTools.concat( 200, "Creating CSW request '", request, "' with ID=", id, "/type:",
1065                                              req.getClass().getName() ) );
1066    
1067            if ( OperationsMetadata.GET_CAPABILITIES_NAME.equals( request ) ) {
1068                req.put( "ID", id );
1069                ogcRequest = CatalogueGetCapabilities.create( req );
1070            } else if ( CatalogueOperationsMetadata.GET_RECORDS_NAME.equals( request ) ) {
1071                req.put( "ID", id );
1072                ogcRequest = GetRecords.create( req );
1073            } else if ( CatalogueOperationsMetadata.GET_RECORD_BY_ID_NAME.equals( request ) ) {
1074                // req.put( "ID", id );
1075                ogcRequest = GetRecordById.create( id, req );
1076            } else if ( CatalogueOperationsMetadata.GET_REPOSITORY_ITEM.equals( request ) ) {
1077                req.put( "REQUESTID", id );
1078                ogcRequest = GetRepositoryItem.create( req );
1079            } else if ( CatalogueOperationsMetadata.DESCRIBE_RECORD_NAME.equals( request ) ) {
1080                req.put( "ID", id );
1081                ogcRequest = DescribeRecord.create( req );
1082            } else if ( CatalogueOperationsMetadata.GET_DOMAIN_NAME.equals( request ) ) {
1083                // TODO
1084                throw new OGCWebServiceException( CatalogueOperationsMetadata.TRANSACTION_NAME + " is not supported." );
1085            } else if ( CatalogueOperationsMetadata.TRANSACTION_NAME.equals( request ) ) {
1086                throw new OGCWebServiceException( CatalogueOperationsMetadata.TRANSACTION_NAME
1087                                                  + " through HTTP Get is not supported." );
1088            } else if ( CatalogueOperationsMetadata.HARVEST_NAME.equals( request ) ) {
1089                req.put( "ID", id );
1090                ogcRequest = Harvest.create( req );
1091            } else {
1092                throw new OGCWebServiceException( "Unknown CSW request type: '" + request + "'." );
1093            }
1094            LOG.logDebug( "CSW request created: " + ogcRequest );
1095            return ogcRequest;
1096        }
1097    
1098        /**
1099         * Creates an <code>AbstractOGCWebServiceRequest</code> from the passed <code>Object</code>. The returned request
1100         * will be a <code>CSW</code> request. The type of request is determined by the the also passed 'request' parameter.
1101         * Allowed values for the request parameter are:
1102         * <ul>
1103         * <li>GetCapabilities</li>
1104         * <li>GetRecords</li>
1105         * <li>GetRecordsByID</li>
1106         * <li>DescribeRecord</li>
1107         * <li>GetDomain, will cause an exception to be thrown</li>
1108         * <li>Transaction</li>
1109         * <li>Harvest, will cause an exception to be thrown</li>
1110         * </ul>
1111         * 
1112         * Any other request passed to the method causes an exception to be thrown.
1113         * 
1114         * @param request
1115         *            a string describing the request type.
1116         * @param req
1117         *            the XML-encoded request
1118         * @return one of the above mentioned Requests.
1119         * @throws OGCWebServiceException
1120         *             if the requested operation is not one of the above mentioned, or something went wrong while creating
1121         *             the request.
1122         */
1123        private static AbstractOGCWebServiceRequest getCSWRequest( String request, Document req )
1124                                throws OGCWebServiceException {
1125            AbstractOGCWebServiceRequest ogcRequest = null;
1126            String id = Long.toString( IDGenerator.getInstance().generateUniqueID() );
1127            LOG.logDebug( StringTools.concat( 200, "Creating CSW request '", request, "' with ID=", id, "/type:",
1128                                              req.getClass().getName() ) );
1129            Element docElem = req.getDocumentElement();
1130            if ( OperationsMetadata.GET_CAPABILITIES_NAME.equals( request ) ) {
1131                ogcRequest = CatalogueGetCapabilities.create( id, docElem );
1132            } else if ( CatalogueOperationsMetadata.GET_RECORDS_NAME.equals( request ) ) {
1133                ogcRequest = GetRecords.create( id, docElem );
1134            } else if ( CatalogueOperationsMetadata.GET_RECORD_BY_ID_NAME.equals( request ) ) {
1135                ogcRequest = GetRecordById.create( id, docElem );
1136            } else if ( CatalogueOperationsMetadata.GET_REPOSITORY_ITEM.equals( request ) ) {
1137                throw new OGCWebServiceException( CatalogueOperationsMetadata.GET_REPOSITORY_ITEM + " is not supported." );
1138            } else if ( CatalogueOperationsMetadata.DESCRIBE_RECORD_NAME.equals( request ) ) {
1139                ogcRequest = DescribeRecord.create( id, docElem );
1140            } else if ( CatalogueOperationsMetadata.GET_DOMAIN_NAME.equals( request ) ) {
1141                // TODO
1142                throw new OGCWebServiceException( CatalogueOperationsMetadata.TRANSACTION_NAME + " is not supported." );
1143            } else if ( CatalogueOperationsMetadata.TRANSACTION_NAME.equals( request ) ) {
1144                ogcRequest = org.deegree.ogcwebservices.csw.manager.Transaction.create( id, docElem );
1145            } else if ( CatalogueOperationsMetadata.HARVEST_NAME.equals( request ) ) {
1146                throw new OGCWebServiceException( CatalogueOperationsMetadata.HARVEST_NAME
1147                                                  + " through HTTP post is not supported." );
1148            } else {
1149                throw new OGCWebServiceException( "Unknown CSW request type: '" + request + "'." );
1150            }
1151            LOG.logDebug( "CSW request created: " + ogcRequest );
1152            return ogcRequest;
1153        }
1154    
1155        /**
1156         * 
1157         * @param request
1158         * @param req
1159         * @return created <code>OGCWebServiceRequest</code>
1160         * @throws OGCWebServiceException
1161         */
1162        @SuppressWarnings("unchecked")
1163        private static AbstractOGCWebServiceRequest getSOSRequest( String request, Object req )
1164                                throws OGCWebServiceException {
1165    
1166            AbstractOGCWebServiceRequest ogcRequest = null;
1167    
1168            String id = "" + IDGenerator.getInstance().generateUniqueID();
1169    
1170            LOG.logDebug( "Creating SOS request '" + request + "' with ID=" + id + "/type:" + req.getClass().getName() );
1171    
1172            if ( req instanceof Map ) {
1173                ( (Map) req ).put( "ID", id );
1174            }
1175    
1176            if ( OperationsMetadata.GET_CAPABILITIES_NAME.equals( request ) ) {
1177                if ( req instanceof Map ) {
1178                    ogcRequest = SOSGetCapabilities.create( (Map) req );
1179                } else {
1180                    ogcRequest = SOSGetCapabilities.create( id, (Document) req );
1181                }
1182    
1183            } else if ( SOSOperationsMetadata.DESCRIBE_PLATFORM_NAME.equals( request ) ) {
1184                if ( req instanceof Map ) {
1185                    ogcRequest = DescribePlatformRequest.create( (Map) req );
1186                } else {
1187                    ogcRequest = DescribePlatformRequest.create( id, (Document) req );
1188                }
1189    
1190            } else if ( SOSOperationsMetadata.DESCRIBE_SENSOR_NAME.equals( request ) ) {
1191                if ( req instanceof Map ) {
1192                    ogcRequest = DescribeSensorRequest.create( (Map) req );
1193                } else {
1194                    ogcRequest = DescribeSensorRequest.create( id, (Document) req );
1195                }
1196            } else if ( SOSOperationsMetadata.GET_OBSERVATION_NAME.equals( request ) ) {
1197                if ( req instanceof Map ) {
1198                    ogcRequest = GetObservationRequest.create( (Map) req );
1199                } else {
1200                    ogcRequest = GetObservationRequest.create( id, (Document) req );
1201                }
1202            } else {
1203                throw new OGCWebServiceException( "Unknown SCS request type: '" + request + "'." );
1204            }
1205            LOG.logDebug( "SCS request created: " + ogcRequest );
1206            return ogcRequest;
1207        }
1208    
1209        /**
1210         * Creates an <code>OGCWebServiceRequest</code> from the passed <code>XML-Document</code>. the returned request will
1211         * be a WPVS request. The type of request is determind by the the also passed 'request' parameter. Possible requests
1212         * are:
1213         * <ul>
1214         * <li>GetCapabilities
1215         * <li>GetView
1216         * </ul>
1217         * <p>
1218         * Any other request passed to the method causes an exception to be thrown.
1219         * </p>
1220         * 
1221         * @param requestName
1222         *            name of the request, one of GetCapabilities or GetView
1223         * @param request
1224         *            the request as an xml document
1225         * @return created <code>OGCWebServiceRequest</code>
1226         * @throws OGCWebServiceException
1227         */
1228        @SuppressWarnings("unused")
1229        private static OGCWebServiceRequest getWPVSRequest( String requestName, Document request )
1230                                throws OGCWebServiceException {
1231            OGCWebServiceRequest ogcRequest = null;
1232            String id = Long.toString( IDGenerator.getInstance().generateUniqueID() );
1233    
1234            if ( OperationsMetadata.GET_CAPABILITIES_NAME.equals( requestName ) ) {
1235                // ogcRequest = WPVSGetCapabilities.create(id, (Document) req);
1236            } else if ( "GetView".equals( requestName ) ) {
1237                // ogcRequest = GetView.create( req );
1238            } else {
1239                throw new OGCWebServiceException( "Unknown WPVS request type: '" + requestName + "'." );
1240            }
1241            return ogcRequest;
1242        }
1243    
1244        /**
1245         * Creates an <code>OGCWebServiceRequest</code> from the passed <code>KVP-Map</code>. the returned request will be a
1246         * WPVS request. The type of request is determind by the the also passed 'request' parameter. Possible requests are:
1247         * <ul>
1248         * <li>GetCapabilities
1249         * <li>GetView
1250         * </ul>
1251         * <p>
1252         * Any other request passed to the method causes an exception to be thrown.
1253         * </p>
1254         * 
1255         * @param requestName
1256         *            name of the request, one of GetCapabilities or GetView
1257         * @param request
1258         *            the actual parameters of the request
1259         * @return created <code>OGCWebServiceRequest</code>
1260         * @throws OGCWebServiceException
1261         */
1262        private static OGCWebServiceRequest getWPVSRequest( String requestName, Map<String, String> request )
1263                                throws OGCWebServiceException {
1264            OGCWebServiceRequest ogcRequest = null;
1265            String id = Long.toString( IDGenerator.getInstance().generateUniqueID() );
1266    
1267            if ( OperationsMetadata.GET_CAPABILITIES_NAME.equals( requestName ) ) {
1268                request.put( "ID", id );
1269                ogcRequest = WPVSGetCapabilities.create( request );
1270            } else if ( "GetView".equals( requestName ) ) {
1271                ogcRequest = GetView.create( request );
1272            } else if ( "Get3DFeatureInfo".equals( requestName ) ) {
1273                ogcRequest = Get3DFeatureInfo.create( request );
1274            } else {
1275                throw new OGCWebServiceException( "Unknown WPVS request type: '" + requestName + "'." );
1276            }
1277            return ogcRequest;
1278        }
1279    
1280        /**
1281         * Creates an <code>AbstractOGCWebServiceRequest</code> from the passed <code>Object</code>. the returned request
1282         * will be a WMPS request. The type of request is determind by the the also passed 'request' parameter. Possible
1283         * requests are:
1284         * <ul>
1285         * <li>GetCapabilities
1286         * </ul>
1287         * Any other request passed to the method causes an exception to be thrown.
1288         * 
1289         * @param request
1290         * @param doc
1291         * @param req
1292         * @return created <code>OGCWebServiceRequest</code>
1293         * @throws OGCWebServiceException
1294         * @throws OGCWebServiceException
1295         */
1296        private static OGCWebServiceRequest getWMPSRequest( String request, Document doc )
1297                                throws OGCWebServiceException {
1298            OGCWebServiceRequest ogcRequest = null;
1299    
1300            if ( request.equals( "PrintMap" ) ) {
1301                try {
1302                    ogcRequest = PrintMap.create( doc.getDocumentElement() );
1303                } catch ( Exception e ) {
1304                    throw new OGCWebServiceException( "Error creating a Print Map object for the request '" + request
1305                                                      + "'. " + e.getMessage() );
1306                }
1307            } else if ( request.equals( "GetAvailableTemplates" ) ) {
1308                try {
1309                    ogcRequest = GetAvailableTemplates.create( doc.getDocumentElement() );
1310                } catch ( Exception e ) {
1311                    throw new OGCWebServiceException( "Error creating a GetAvailableTemplates object for the request '"
1312                                                      + request + "'. " + e.getMessage() );
1313                }
1314            } else if ( request.equals( "DescribeTemplate" ) ) {
1315                try {
1316                    ogcRequest = DescribeTemplate.create( doc.getDocumentElement() );
1317                } catch ( Exception e ) {
1318                    throw new OGCWebServiceException( "Error creating a DescribeTemplate object for the request '"
1319                                                      + request + "'. " + e.getMessage() );
1320                }
1321            } else {
1322                throw new OGCWebServiceException( "Unknown / unimplemented WMPS request type: '" + request + "'." );
1323            }
1324            return ogcRequest;
1325        }
1326    
1327        /**
1328         * Creates an <code>AbstractOGCWebServiceRequest</code> from the passed <code>Object</code>. the returned request
1329         * will be a WMPS request. The type of request is determind by the the also passed 'request' parameter. Possible
1330         * requests are:
1331         * <ul>
1332         * <li>GetCapabilities
1333         * </ul>
1334         * Any other request passed to the method causes an exception to be thrown.
1335         * 
1336         * @param request
1337         * @param map
1338         * @param req
1339         * @return OGCWebServiceRequest
1340         * @throws InconsistentRequestException
1341         * @throws InvalidParameterValueException
1342         * @throws OGCWebServiceException
1343         */
1344        private static OGCWebServiceRequest getWMPSRequest( String request, Map<String, String> map )
1345                                throws InconsistentRequestException, InvalidParameterValueException {
1346            OGCWebServiceRequest ogcRequest = null;
1347            map.put( "ID", "" + IDGenerator.getInstance().generateUniqueID() );
1348            if ( request.equals( "GetCapabilities" ) ) {
1349                ogcRequest = WMPSGetCapabilities.create( map );
1350            } else if ( request.equals( "PrintMap" ) ) {
1351                ogcRequest = PrintMap.create( map );
1352            } else if ( request.equals( "DescribeTemplate" ) ) {
1353                ogcRequest = DescribeTemplate.create( map );
1354            } else if ( request.equals( "GetAvailableTemplates" ) ) {
1355                ogcRequest = GetAvailableTemplates.create( map );
1356            } else {
1357                throw new InvalidParameterValueException( "Unknown WMPS request type: '" + request + "'." );
1358            }
1359            return ogcRequest;
1360        }
1361    
1362        /**
1363         * Creates an <code>OGCWebServiceRequest</code> from the passed <code>Map</code>. The returned request will be a WPS
1364         * request. The type of request is determined by also submitted request name. Known requests are:
1365         * <ul>
1366         * <li>GetCapabilities</li>
1367         * <li>DescribeProcess</li>
1368         * <li>Execute</li>
1369         * </ul>
1370         * <p>
1371         * Any other request passed to the method causes an <code>OGCWebServiceException</code> to be thrown.
1372         * </p>
1373         * 
1374         * @param request
1375         * @param map
1376         * @return created <code>OGCWebServiceRequest</code>
1377         * @throws OGCWebServiceException
1378         */
1379        private static OGCWebServiceRequest getWPSRequest( String request, Map<String, String> map )
1380                                throws OGCWebServiceException {
1381            OGCWebServiceRequest ogcRequest = null;
1382            map.put( "ID", "" + IDGenerator.getInstance().generateUniqueID() );
1383            if ( "GetCapabilities".equals( request ) ) {
1384                ogcRequest = WPSGetCapabilities.create( map );
1385            } else if ( "DescribeProcess".equals( request ) ) {
1386                ogcRequest = DescribeProcessRequest.create( map );
1387            } else if ( "Execute".equals( request ) ) {
1388                ogcRequest = ExecuteRequest.create( map );
1389            } else {
1390                throw new InvalidParameterValueException( "Unknown WPS request type: '" + request + "'." );
1391            }
1392            return ogcRequest;
1393        }
1394    
1395        /**
1396         * Creates an <code>OGCWebServiceRequest</code> from the passed <code>Document</code>. The returned request will be
1397         * a WPS request. The type of request is determined by also submitted request name. Known requests are:
1398         * <ul>
1399         * <li>GetCapabilities</li>
1400         * <li>DescribeProcess</li>
1401         * <li>Execute</li>
1402         * </ul>
1403         * <p>
1404         * Any other request passed to the method causes an <code>OGCWebServiceException</code> to be thrown.
1405         * </p>
1406         * 
1407         * @param request
1408         * @param doc
1409         * @return created <code>OGCWebServiceRequest</code>
1410         * @throws OGCWebServiceException
1411         */
1412        private static OGCWebServiceRequest getWPSRequest( String request, Document doc )
1413                                throws OGCWebServiceException {
1414            OGCWebServiceRequest ogcRequest = null;
1415            String id = "" + IDGenerator.getInstance().generateUniqueID();
1416            if ( "GetCapabilities".equals( request ) ) {
1417                ogcRequest = WPSGetCapabilities.create( id, doc.getDocumentElement() );
1418            } else if ( "DescribeProcess".equals( request ) ) {
1419                ogcRequest = DescribeProcessRequest.create( id, doc.getDocumentElement() );
1420    
1421            } else if ( "Execute".equals( request ) ) {
1422                ogcRequest = ExecuteRequest.create( id, doc.getDocumentElement() );
1423    
1424            } else {
1425                throw new OGCWebServiceException( "Unknown WPS request type: '" + request + "'." );
1426            }
1427            return ogcRequest;
1428        }
1429    
1430        /**
1431         * @param request
1432         *            containing the local-name of the top root element.
1433         * @param doc
1434         * @return
1435         * @throws IllegalArgumentException
1436         * @throws OGCWebServiceException
1437         */
1438        private static OGCWebServiceRequest getWCTSRequest( String request, Document doc )
1439                                throws OGCWebServiceException, IllegalArgumentException {
1440            OGCWebServiceRequest result = null;
1441            String requestID = Long.toString( IDGenerator.getInstance().generateUniqueID() );
1442            if ( "GetResourceByID".equals( request ) ) {
1443                result = new GetResourceByIDDocument( requestID, doc.getDocumentElement() ).getResourceById();
1444            } else if ( "GetCapabilities".equals( request ) ) {
1445                result = new WCTSGetCapabilitiesDocument( requestID, doc.getDocumentElement() ).getGetCapabilities();
1446            } else if ( "Transform".equals( request ) ) {
1447                result = new TransformDocument( requestID, doc.getDocumentElement() ).getTransformRequest();
1448            } else if ( "IsTransformable".equals( request ) ) {
1449                result = new IsTransformableDocument( requestID, doc.getDocumentElement() ).getIsTransformable();
1450            } else if ( "GetTransformation".equals( request ) ) {
1451                throw new OGCWebServiceException( "GetTransformation requests are currently not supported by the WCTS",
1452                                                  ExceptionCode.OPERATIONNOTSUPPORTED );
1453                // result = new Document(requestID, doc.getDocumentElement() ).getIsTransformable();
1454            } else {
1455                throw new OGCWebServiceException( request + " is not known to the WCTS",
1456                                                  ExceptionCode.OPERATIONNOTSUPPORTED );
1457            }
1458            return result;
1459        }
1460    
1461        /**
1462         * @param request
1463         * @param map
1464         * @return
1465         * @throws OGCWebServiceException
1466         */
1467        private static OGCWebServiceRequest getWCTSRequest( String request, Map<String, String> map )
1468                                throws OGCWebServiceException {
1469            OGCWebServiceRequest result = null;
1470            String requestID = Long.toString( IDGenerator.getInstance().generateUniqueID() );
1471            if ( "GetResourceByID".equals( request ) ) {
1472                result = GetResourceByID.create( requestID, map );
1473            } else if ( "GetCapabilities".equals( request ) ) {
1474                result = WCTSGetCapabilities.create( requestID, map );
1475            } else if ( "Transform".equals( request ) ) {
1476                result = Transform.create( requestID, map );
1477            } else if ( "IsTransformable".equals( request ) ) {
1478                result = IsTransformable.create( requestID, map );
1479            } else if ( "GetTransformation".equals( request ) ) {
1480                throw new OGCWebServiceException( "GetTransformation requests are currently not supported by the WCTS",
1481                                                  ExceptionCode.OPERATIONNOTSUPPORTED );
1482                // result = new Document(requestID, doc.getDocumentElement() ).getIsTransformable();
1483            } else {
1484                throw new OGCWebServiceException( request + " is not known to the WCTS",
1485                                                  ExceptionCode.OPERATIONNOTSUPPORTED );
1486            }
1487            return result;
1488        }
1489    
1490    }