001    //$Header: /deegreerepository/deegree/src/org/deegree/ogcwebservices/wfs/WFService.java,v 1.46 2007/03/14 14:43:44 mschneider Exp $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2001-2008 by:
006     EXSE, Department of Geography, University of Bonn
007     http://www.giub.uni-bonn.de/deegree/
008     lat/lon GmbH
009     http://www.lat-lon.de
010    
011     This library is free software; you can redistribute it and/or
012     modify it under the terms of the GNU Lesser General Public
013     License as published by the Free Software Foundation; either
014     version 2.1 of the License, or (at your option) any later version.
015    
016     This library is distributed in the hope that it will be useful,
017     but WITHOUT ANY WARRANTY; without even the implied warranty of
018     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
019     Lesser General Public License for more details.
020    
021     You should have received a copy of the GNU Lesser General Public
022     License along with this library; if not, write to the Free Software
023     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
024    
025     Contact:
026    
027     Andreas Poth
028     lat/lon GmbH
029     Aennchenstr. 19
030     53115 Bonn
031     Germany
032     E-Mail: poth@lat-lon.de
033    
034     Prof. Dr. Klaus Greve
035     Department of Geography
036     University of Bonn
037     Meckenheimer Allee 166
038     53115 Bonn
039     Germany
040     E-Mail: greve@giub.uni-bonn.de
041    
042     ---------------------------------------------------------------------------*/
043    package org.deegree.ogcwebservices.wfs;
044    
045    import java.util.Map;
046    
047    import org.deegree.datatypes.QualifiedName;
048    import org.deegree.framework.log.ILogger;
049    import org.deegree.framework.log.LoggerFactory;
050    import org.deegree.framework.trigger.TriggerProvider;
051    import org.deegree.io.datastore.LockManager;
052    import org.deegree.io.datastore.schema.MappedFeatureType;
053    import org.deegree.ogcwebservices.OGCWebService;
054    import org.deegree.ogcwebservices.OGCWebServiceException;
055    import org.deegree.ogcwebservices.OGCWebServiceRequest;
056    import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilities;
057    import org.deegree.ogcwebservices.wfs.configuration.WFSConfiguration;
058    import org.deegree.ogcwebservices.wfs.operation.DescribeFeatureType;
059    import org.deegree.ogcwebservices.wfs.operation.GetFeature;
060    import org.deegree.ogcwebservices.wfs.operation.GetFeatureWithLock;
061    import org.deegree.ogcwebservices.wfs.operation.LockFeature;
062    import org.deegree.ogcwebservices.wfs.operation.WFSGetCapabilities;
063    import org.deegree.ogcwebservices.wfs.operation.transaction.Transaction;
064    
065    /**
066     * This class implements access to the methods defined in the OGC WFS 1.1.0 specification.
067     * 
068     * @author <a href="mailto:schneider@lat-lon.de">Markus Schneider</a>
069     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
070     * 
071     * @author last edited by: $Author: apoth $
072     * 
073     * @version $Revision: 9345 $, $Date: 2007-12-27 17:22:25 +0100 (Do, 27 Dez 2007) $
074     * 
075     * @see OGCWebService
076     */
077    public class WFService implements OGCWebService {
078    
079        private static final ILogger LOG = LoggerFactory.getLogger( WFService.class );
080    
081        /** Only OGC standard version currently implemented by this service. */
082        public static final String VERSION = "1.1.0";
083    
084        private static final TriggerProvider TP = TriggerProvider.create( WFService.class );
085    
086        private WFSConfiguration configuration;
087    
088        // shared instance that handles all GetFeature requests to this service
089        private GetFeatureHandler getFeatureHandler;
090    
091        // shared instance that handles all DescribeFeatureType requests to this service
092        private DescribeFeatureTypeHandler describeFTHandler;
093    
094        // shared instance that handles all LockFeature requests to this service
095        private LockFeatureHandler lockFeatureHandler;
096    
097        /**
098         * Creates a new instance of <code>WFService</code> with the given configuration.
099         * 
100         * @param configuration
101         * @throws OGCWebServiceException
102         */
103        WFService( WFSConfiguration configuration ) throws OGCWebServiceException {
104            this.configuration = configuration;
105            this.getFeatureHandler = new GetFeatureHandler( this );
106            this.describeFTHandler = new DescribeFeatureTypeHandler( this );
107            this.lockFeatureHandler = new LockFeatureHandler( this );
108        }
109    
110        /**
111         * Returns the capabilities of the <code>WFService</code>.
112         * 
113         * @return the capabilities, this is actually a <code>WFSConfiguration</code> instance
114         */
115        public WFSCapabilities getCapabilities() {
116            return this.configuration;
117        }
118    
119        /**
120         * Performs the handling of the passed OGCWebServiceEvent directly and returns the result to the
121         * calling class/ method.
122         * 
123         * @param request
124         *            WFS request to perform
125         * 
126         * @throws OGCWebServiceException
127         */
128        public Object doService( OGCWebServiceRequest request )
129                                throws OGCWebServiceException {
130    
131            long ts = System.currentTimeMillis();
132            request = (OGCWebServiceRequest) TP.doPreTrigger( this, request )[0];
133    
134            Object response = null;
135            char rtype = 'C';
136            if ( request instanceof WFSGetCapabilities ) {
137                // TODO implement partial responses (if only some sections are requested)
138                response = this.configuration;
139                rtype = 'C';
140            } else if ( request instanceof GetFeatureWithLock ) {
141                response = this.lockFeatureHandler.handleRequest( (GetFeatureWithLock) request );
142                rtype = 'W';
143            } else if ( request instanceof GetFeature ) {
144                response = this.getFeatureHandler.handleRequest( (GetFeature) request );
145                rtype = 'F';
146            } else if ( request instanceof DescribeFeatureType ) {
147                response = this.describeFTHandler.handleRequest( (DescribeFeatureType) request );
148                rtype = 'D';
149            } else if ( request instanceof Transaction ) {
150                TransactionHandler handler = new TransactionHandler( this, (Transaction) request );
151                response = handler.handleRequest();
152                rtype = 'T';
153            } else if ( request instanceof LockFeature ) {
154                response = this.lockFeatureHandler.handleRequest( (LockFeature) request );
155                rtype = 'L';
156            } else {
157                String msg = "Unknown request type: " + request.getClass().getName();
158                throw new OGCWebServiceException( getClass().getName(), msg );
159            }
160            if ( LOG.getLevel() == ILogger.LOG_DEBUG ) {
161                LOG.logDebug( "" + LockManager.getInstance() );
162            }
163    
164            Object o = TP.doPostTrigger( this, response )[0];
165            LOG.logDebug( "WFS processing time for request type " + rtype + ": ",
166                          Long.toString( ( System.currentTimeMillis() - ts ) ) );
167            return o;
168        }
169    
170        /**
171         * Returns a clone of the <code>WFService</code> instance.
172         * <p>
173         * Note that the configuration of the new service will refer to the same instance.
174         */
175        @Override
176        public Object clone() {
177    
178            WFService clone = null;
179            try {
180                clone = new WFService( configuration );
181            } catch ( OGCWebServiceException e ) {
182                // can never happen
183            }
184            return clone;
185        }
186    
187        /**
188         * Returns the <code>MappedFeatureType</code> with the given name.
189         * 
190         * @param name
191         *            name of the feature type
192         * @return the mapped feature type with the given name, or null if it is not known to this
193         *         WFService instance
194         */
195        public MappedFeatureType getMappedFeatureType( QualifiedName name ) {
196            return this.configuration.getMappedFeatureTypes().get( name );
197        }
198    
199        /**
200         * Returns a <code>Map</code> of the feature types that this WFS serves.
201         * 
202         * @return keys: feature type names, values: mapped feature types
203         */
204        public Map<QualifiedName, MappedFeatureType> getMappedFeatureTypes() {
205            return this.configuration.getMappedFeatureTypes();
206        }
207    }