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