001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/ogcwebservices/csw/CatalogueService.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2004 by:
006 EXSE, Department of Geography, University of Bonn
007 http://www.giub.uni-bonn.de/exse/
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 Meckenheimer Allee 176
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
044 package org.deegree.ogcwebservices.csw;
045
046 import java.net.URL;
047 import java.util.HashMap;
048 import java.util.Map;
049
050 import org.deegree.framework.log.ILogger;
051 import org.deegree.framework.log.LoggerFactory;
052 import org.deegree.framework.trigger.TriggerProvider;
053 import org.deegree.ogcwebservices.InvalidParameterValueException;
054 import org.deegree.ogcwebservices.MissingParameterValueException;
055 import org.deegree.ogcwebservices.OGCWebService;
056 import org.deegree.ogcwebservices.OGCWebServiceException;
057 import org.deegree.ogcwebservices.OGCWebServiceRequest;
058 import org.deegree.ogcwebservices.csw.capabilities.CatalogueGetCapabilities;
059 import org.deegree.ogcwebservices.csw.capabilities.CatalogueOperationsMetadata;
060 import org.deegree.ogcwebservices.csw.configuration.CatalogueConfiguration;
061 import org.deegree.ogcwebservices.csw.configuration.CatalogueConfigurationDocument;
062 import org.deegree.ogcwebservices.csw.discovery.DescribeRecord;
063 import org.deegree.ogcwebservices.csw.discovery.Discovery;
064 import org.deegree.ogcwebservices.csw.discovery.GetDomain;
065 import org.deegree.ogcwebservices.csw.discovery.GetRecordById;
066 import org.deegree.ogcwebservices.csw.discovery.GetRecords;
067 import org.deegree.ogcwebservices.csw.manager.Harvest;
068 import org.deegree.ogcwebservices.csw.manager.Manager;
069 import org.deegree.ogcwebservices.csw.manager.Transaction;
070 import org.deegree.ogcwebservices.getcapabilities.OGCCapabilities;
071 import org.deegree.ogcwebservices.wfs.RemoteWFService;
072 import org.deegree.ogcwebservices.wfs.WFService;
073 import org.deegree.ogcwebservices.wfs.WFServiceFactory;
074 import org.deegree.ogcwebservices.wfs.XMLFactory;
075 import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilities;
076 import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilitiesDocument;
077 import org.deegree.ogcwebservices.wfs.configuration.WFSConfiguration;
078 import org.deegree.ogcwebservices.wfs.configuration.WFSConfigurationDocument;
079
080 /**
081 * The Catalogue Service class provides the foundation for an OGC catalogue service. The Catalogue Service class
082 * directly includes only the serviceTypeID attribute. In most cases, this attribute will not be directly visible to
083 * catalogue clients.
084 * <p>
085 * The catalog service is an implementation of the OpenGIS Catalogue Service Specification 2.0.
086 * </p>
087 *
088 * @author <a href="mailto:tfr@users.sourceforge.net">Torsten Friebe </a>
089 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
090 *
091 * @author last edited by: $Author: rbezema $
092 *
093 * @version $Revision: 7253 $, $Date: 2007-05-22 11:35:33 +0200 (Di, 22 Mai 2007) $
094 * @see <a href="http://www.opengis.org/specs/">OGC Specification </a>
095 */
096
097 public class CatalogueService implements OGCWebService {
098
099 private static final ILogger LOG = LoggerFactory.getLogger( CatalogueService.class );
100
101 private static final TriggerProvider TP = TriggerProvider.create( CatalogueService.class );
102
103 private Discovery discovery;
104
105 private Manager manager;
106
107 private CatalogueConfiguration serviceConfiguration;
108
109 static Map<URL, OGCWebService> wfsMap = new HashMap<URL, OGCWebService>();
110
111 /**
112 * Creates a new <code>CatalogService</code> instance.
113 *
114 * @param config
115 *
116 * @return new <code>CatalogService</code> instance.
117 * @throws OGCWebServiceException
118 */
119 public static final CatalogueService create( CatalogueConfiguration config ) throws OGCWebServiceException {
120 // get WFS: local or remote
121 OGCWebService wfsResource = null;
122 try {
123 CatalogueConfigurationDocument document = new CatalogueConfigurationDocument();
124 document.setSystemId( config.getSystemId() );
125
126 URL wfsCapabilitiesFileURL = document.resolve( config.getDeegreeParams()
127 .getWfsResource()
128 .getHref()
129 .toString() );
130 if ( wfsMap.get( wfsCapabilitiesFileURL ) == null ) {
131 if ( wfsCapabilitiesFileURL.getProtocol().equals( "http" ) ) {
132 WFSCapabilitiesDocument capaDoc = new WFSCapabilitiesDocument();
133 capaDoc.load( wfsCapabilitiesFileURL );
134 WFSCapabilities capabilities = (WFSCapabilities) capaDoc.parseCapabilities();
135 LOG.logInfo( "Creating remote WFS with capabilities file " + wfsCapabilitiesFileURL );
136 wfsResource = new RemoteWFService( capabilities );
137 } else {
138 WFSConfigurationDocument capaDoc = new WFSConfigurationDocument();
139 capaDoc.load( wfsCapabilitiesFileURL );
140 WFSConfiguration conf = capaDoc.getConfiguration();
141 LOG.logInfo( "CS-W service: Creating local WFS with capabilities file " + wfsCapabilitiesFileURL );
142 wfsResource = WFServiceFactory.createInstance( conf );
143 LOG.logDebug( "CS-W service: The localwfs was has been successfully created, it's capabilties are: " +
144 XMLFactory.export( (WFSCapabilities)wfsResource.getCapabilities() ).getAsPrettyString());
145 }
146 wfsMap.put( wfsCapabilitiesFileURL, wfsResource );
147 } else {
148 wfsResource = wfsMap.get( wfsCapabilitiesFileURL );
149 }
150 } catch ( Exception e ) {
151 LOG.logError( "Error creating WFS for CSW", e );
152 throw new OGCWebServiceException( CatalogueService.class.getName(),
153 "Error creating WFS for CSW: " + e.getMessage() );
154 }
155
156 // initialize manager and discovery
157 return new CatalogueService( config, (WFService) wfsResource );
158 }
159
160 /**
161 *
162 * @param config
163 * @param wfsService
164 * @throws OGCWebServiceException
165 */
166 private CatalogueService( CatalogueConfiguration config, WFService wfsService ) throws OGCWebServiceException {
167 this.serviceConfiguration = config;
168 this.discovery = new Discovery( wfsService, config );
169 CatalogueOperationsMetadata com = (CatalogueOperationsMetadata) config.getOperationsMetadata();
170 if ( com.getHarvest() != null || com.getTransaction() != null ) {
171 try {
172 this.manager = new Manager( wfsService, config );
173 } catch ( MissingParameterValueException e ) {
174 LOG.logError( e.getMessage(), e );
175 throw new OGCWebServiceException( getClass().getName(), e.getMessage() );
176 }
177 }
178 }
179
180 /**
181 * Returns the OGC-capabilities of the service.
182 *
183 * @return the OGC-capabilities of the service.
184 * @todo analyze incoming request! return only requested sections
185 */
186 public OGCCapabilities getCapabilities() {
187 return this.serviceConfiguration;
188 }
189
190 /**
191 * Returns the service type (CSW).
192 *
193 * @return the service type (CSW).
194 */
195 public String getServiceTypeId() {
196 return this.serviceConfiguration.getServiceIdentification().getServiceType().getCode();
197 }
198
199 /**
200 * @return Version
201 */
202 public String getVersion() {
203 return this.serviceConfiguration.getVersion();
204 }
205
206 /**
207 * Method for event based request processing.
208 *
209 * @param request
210 * request object containing the request
211 * @return an Object which may be one of the following <ul>
212 * <li>DescribeRecordResult</li>
213 * <li>GetRecordResult</li>
214 * <li>GetRecordByIdResult</li>
215 * <li>TransactionResult</li>
216 * <li>EchoRequest</li>
217 * <li>OGCCapabilities</li>
218 * @throws OGCWebServiceException
219 *
220 * @todo validation of requested version against accepted versions
221 * @todo return type
222 */
223 public Object doService( OGCWebServiceRequest request ) throws OGCWebServiceException {
224
225 request = (OGCWebServiceRequest) TP.doPreTrigger( this, request )[0];
226
227 Object response = null;
228
229 if ( request instanceof DescribeRecord ) {
230 response = this.getDiscovery().describeRecordType( (DescribeRecord) request );
231 } else if ( request instanceof GetDomain ) {
232 throw new OGCWebServiceException( getClass().getName(), "Operation GetDomain is not implement yet" );
233 // TODO is not implemented
234 // response = this.getDiscovery().getDomain( (GetDomain) request );
235 } else if ( request instanceof GetRecords ) {
236 response = this.getDiscovery().query( (GetRecords) request );
237 } else if ( request instanceof GetRecordById ) {
238 response = this.getDiscovery().query( (GetRecordById) request );
239 } else if ( request instanceof Transaction ) {
240 response = this.getManager().transaction( (Transaction) request );
241 } else if ( request instanceof Harvest ) {
242 response = this.getManager().harvestRecords( (Harvest) request );
243 } else if ( request instanceof CatalogueGetCapabilities ) {
244 LOG.logDebug( "GetCapabilities for version:" + request.getVersion(), request );
245 String[] acceptVersions = ( (CatalogueGetCapabilities) request ).getAcceptVersions();
246 boolean versionOk = false;
247 if ( acceptVersions == null || acceptVersions.length == 0 ) {
248 versionOk = true;
249 } else {
250 for ( int i = 0; i < acceptVersions.length; i++ ) {
251 if ( acceptVersions[i].equals( "2.0.0" ) ) {
252 versionOk = true;
253 break;
254 }
255 }
256 }
257 if ( versionOk ) {
258 response = this.getCapabilities();
259 } else {
260 throw new InvalidParameterValueException( "Unsupported version requested, only version 2.0.0 is supported." );
261 }
262 } else {
263 throw new OGCWebServiceException( "Invalid request type: '" + request.getClass().getName() + "'." );
264 }
265
266 return TP.doPostTrigger( this, response )[0];
267 }
268
269 /**
270 * @return Returns the discovery.
271 *
272 */
273 public Discovery getDiscovery() {
274 return discovery;
275 }
276
277 /**
278 * @return the manager.
279 * @throws OGCWebServiceException
280 */
281 public Manager getManager() throws OGCWebServiceException {
282 if ( manager == null ) {
283 throw new OGCWebServiceException( getClass().getName(),
284 "CSW Manager class for " + "handling transactional requests is not initialized. Please verfiy, "
285 + "that you have defined Transaction and/or Harvest in the "
286 + "OperationMetadata section of your capabilities/configuration." );
287 }
288 return manager;
289 }
290
291 }