001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/ogcwebservices/wfs/configuration/WFSConfigurationDocument.java $
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 Aennchenstraße 19
030 53177 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.configuration;
044
045 import java.io.File;
046 import java.net.URL;
047 import java.util.HashMap;
048 import java.util.List;
049 import java.util.Map;
050
051 import org.deegree.framework.log.ILogger;
052 import org.deegree.framework.log.LoggerFactory;
053 import org.deegree.framework.util.CharsetUtils;
054 import org.deegree.framework.util.StringTools;
055 import org.deegree.framework.xml.InvalidConfigurationException;
056 import org.deegree.framework.xml.XMLParsingException;
057 import org.deegree.framework.xml.XMLTools;
058 import org.deegree.model.metadata.iso19115.OnlineResource;
059 import org.deegree.ogcwebservices.getcapabilities.DCPType;
060 import org.deegree.ogcwebservices.getcapabilities.HTTP;
061 import org.deegree.ogcwebservices.getcapabilities.Operation;
062 import org.deegree.ogcwebservices.getcapabilities.OperationsMetadata;
063 import org.deegree.ogcwebservices.getcapabilities.Protocol;
064 import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilitiesDocument;
065 import org.deegree.ogcwebservices.wfs.capabilities.WFSOperationsMetadata;
066 import org.deegree.owscommon.OWSDomainType;
067 import org.w3c.dom.Element;
068 import org.w3c.dom.Node;
069
070 /**
071 * Represents an XML configuration document for a deegree WFS instance, i.e. it consists of all
072 * sections common to an OGC WFS 1.1 capabilities document plus some deegree specific elements.
073 *
074 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
075 * @author last edited by: $Author: apoth $
076 *
077 * @version $Revision: 9348 $, $Date: 2007-12-27 17:59:14 +0100 (Do, 27 Dez 2007) $
078 */
079 public class WFSConfigurationDocument extends WFSCapabilitiesDocument {
080
081 private static final long serialVersionUID = -6415476866015999971L;
082
083 protected static final ILogger LOG = LoggerFactory.getLogger( WFSConfigurationDocument.class );
084
085 /**
086 * Creates an object representation of the document.
087 *
088 * @return class representation of the configuration document
089 * @throws InvalidConfigurationException
090 */
091 public WFSConfiguration getConfiguration()
092 throws InvalidConfigurationException {
093
094 WFSConfiguration config = null;
095
096 try {
097 WFSDeegreeParams deegreeParams = getDeegreeParams();
098
099 // get default Urls (used when DCP element is ommitted in Operation-elements)
100 OnlineResource defaultOnlineResource = deegreeParams.getDefaultOnlineResource();
101 String defaultUrl = defaultOnlineResource.getLinkage().getHref().toString();
102 if ( defaultUrl.endsWith( "?" ) ) {
103 defaultUrl = defaultUrl.substring( 0, defaultUrl.length() - 1 );
104 }
105 URL defaultUrlGet = new URL( defaultUrl + '?' );
106 URL defaultUrlPost = new URL( defaultUrl );
107
108 OperationsMetadata opMetadata = getOperationsMetadata( defaultUrlGet, defaultUrlPost );
109 config = new WFSConfiguration( parseVersion(), parseUpdateSequence(), getServiceIdentification(),
110 getServiceProvider(), opMetadata, getFeatureTypeList(),
111 getServesGMLObjectTypeList(), getSupportsGMLObjectTypeList(), null,
112 getFilterCapabilities(), deegreeParams );
113 } catch ( Exception e ) {
114 throw new InvalidConfigurationException( e.getMessage() + "\n" + StringTools.stackTraceToString( e ) );
115 }
116 return config;
117 }
118
119 /**
120 * Creates an object representation of the <code>deegreeParams</code>- section.
121 *
122 * @return class representation of the <code>deegreeParams</code>- section
123 * @throws InvalidConfigurationException
124 */
125 public WFSDeegreeParams getDeegreeParams()
126 throws InvalidConfigurationException {
127
128 WFSDeegreeParams deegreeParams = null;
129
130 try {
131 Element element = (Element) XMLTools.getRequiredNode( getRootElement(), "deegreewfs:deegreeParams",
132 nsContext );
133 OnlineResource defaultOnlineResource = parseOnLineResource( (Element) XMLTools.getRequiredNode(
134 element,
135 "deegreewfs:DefaultOnlineResource",
136 nsContext ) );
137 int cacheSize = XMLTools.getNodeAsInt( element, "deegreewfs:CacheSize/text()", nsContext, 100 );
138 int requestTimeLimit = XMLTools.getNodeAsInt( element, "deegreewfs:RequestTimeLimit/text()", nsContext, 10 );
139 String characterSet = XMLTools.getNodeAsString( element, "deegreewfs:Encoding/text()", nsContext,
140 CharsetUtils.getSystemCharset() );
141 String[] dataDirectories = XMLTools.getNodesAsStrings(
142 element,
143 "deegreewfs:DataDirectoryList/deegreewfs:DataDirectory/text()",
144 nsContext );
145 if ( dataDirectories.length == 0 ) {
146 LOG.logInfo( "No data directory specified. Using configuration document directory." );
147 dataDirectories = new String[] { "." };
148 }
149 for ( int i = 0; i < dataDirectories.length; i++ ) {
150 try {
151 dataDirectories[i] = resolve( dataDirectories[i] ).toURI().getPath();
152 } catch ( Exception e ) {
153 String msg = "DataDirectory '" + dataDirectories[i] + "' cannot be resolved as a directory: "
154 + e.getMessage();
155 throw new InvalidConfigurationException( msg );
156 }
157 }
158
159 String lockManagerString = XMLTools.getNodeAsString( element, "deegreewfs:LockManagerDirectory/text()",
160 nsContext, null );
161 File lockManagerDir = null;
162 if ( lockManagerString != null ) {
163 try {
164 lockManagerDir = new File( this.resolve( lockManagerString ).toURI().toURL().getFile() );
165 } catch ( Exception e ) {
166 String msg = "Specified value (" + lockManagerDir
167 + ") for 'deegreewfs:LockManagerDirectory' is invalid.";
168 throw new InvalidConfigurationException( msg, e );
169 }
170 }
171 deegreeParams = new WFSDeegreeParams( defaultOnlineResource, cacheSize, requestTimeLimit, characterSet,
172 dataDirectories, lockManagerDir );
173 } catch ( XMLParsingException e ) {
174 throw new InvalidConfigurationException( "Error parsing the deegreeParams "
175 + "section of the WFS configuration: \n" + e.getMessage()
176 + StringTools.stackTraceToString( e ) );
177 }
178 return deegreeParams;
179 }
180
181 /**
182 * Creates an object representation of the <code>ows:OperationsMetadata</code> section.
183 *
184 * @param defaultUrlGet
185 * @param defaultUrlPost
186 * @return object representation of the <code>ows:OperationsMetadata</code> section
187 * @throws XMLParsingException
188 */
189 public OperationsMetadata getOperationsMetadata( URL defaultUrlGet, URL defaultUrlPost )
190 throws XMLParsingException {
191
192 List operationElementList = XMLTools.getNodes( getRootElement(), "ows:OperationsMetadata/ows:Operation",
193 nsContext );
194
195 // build HashMap of 'ows:Operation'-elements for easier access
196 Map<String, Element> operations = new HashMap<String, Element>();
197 for ( int i = 0; i < operationElementList.size(); i++ ) {
198 operations.put(
199 XMLTools.getRequiredNodeAsString( (Node) operationElementList.get( i ), "@name", nsContext ),
200 (Element) operationElementList.get( i ) );
201 }
202
203 Operation getCapabilities = getOperation( OperationsMetadata.GET_CAPABILITIES_NAME, true, operations,
204 defaultUrlGet, defaultUrlPost );
205 Operation describeFeatureType = getOperation( WFSOperationsMetadata.DESCRIBE_FEATURETYPE_NAME, true,
206 operations, defaultUrlGet, defaultUrlPost );
207 Operation getFeature = getOperation( WFSOperationsMetadata.GET_FEATURE_NAME, false, operations, defaultUrlGet,
208 defaultUrlPost );
209 Operation getFeatureWithLock = getOperation( WFSOperationsMetadata.GET_FEATURE_WITH_LOCK_NAME, false,
210 operations, defaultUrlGet, defaultUrlPost );
211 Operation getGMLObject = getOperation( WFSOperationsMetadata.GET_GML_OBJECT_NAME, false, operations,
212 defaultUrlGet, defaultUrlPost );
213 Operation lockFeature = getOperation( WFSOperationsMetadata.LOCK_FEATURE_NAME, false, operations,
214 defaultUrlGet, defaultUrlPost );
215 Operation transaction = getOperation( WFSOperationsMetadata.TRANSACTION_NAME, false, operations, defaultUrlGet,
216 defaultUrlPost );
217
218 List parameterElementList = XMLTools.getNodes( getRootElement(), "ows:OperationsMetadata/ows:Parameter",
219 nsContext );
220 OWSDomainType[] parameters = new OWSDomainType[parameterElementList.size()];
221 for ( int i = 0; i < parameters.length; i++ ) {
222 parameters[i] = getOWSDomainType( null, (Element) parameterElementList.get( i ) );
223 }
224
225 List constraintElementList = XMLTools.getNodes( getRootElement(), "ows:OperationsMetadata/ows:Constraint",
226 nsContext );
227 OWSDomainType[] constraints = new OWSDomainType[constraintElementList.size()];
228 for ( int i = 0; i < constraints.length; i++ ) {
229 constraints[i] = getOWSDomainType( null, (Element) constraintElementList.get( i ) );
230 }
231 WFSOperationsMetadata metadata = new WFSOperationsMetadata( getCapabilities, describeFeatureType, getFeature,
232 getFeatureWithLock, getGMLObject, lockFeature,
233 transaction, parameters, constraints );
234
235 return metadata;
236 }
237
238 /**
239 * Creates an object representation of an <code>ows:Operation</code>- element.
240 *
241 * @param name
242 * @param isMandatory
243 * @param operations
244 * @param defaultUrlGet
245 * @param defaultUrlPost
246 * @return object representation of <code>ows:Operation</code>- element
247 * @throws XMLParsingException
248 */
249 protected Operation getOperation( String name, boolean isMandatory, Map<String, Element> operations,
250 URL defaultUrlGet, URL defaultUrlPost )
251 throws XMLParsingException {
252
253 Operation operation = null;
254 Element operationElement = operations.get( name );
255 if ( operationElement == null ) {
256 if ( isMandatory ) {
257 throw new XMLParsingException( "Mandatory operation '" + name + "' not defined in "
258 + "'OperationsMetadata'-section." );
259 }
260 } else {
261 // "ows:Parameter"-elements
262 List parameterElements = XMLTools.getNodes( operationElement, "ows:Parameter", nsContext );
263 OWSDomainType[] parameters = new OWSDomainType[parameterElements.size()];
264 for ( int i = 0; i < parameters.length; i++ ) {
265 parameters[i] = getOWSDomainType( name, (Element) parameterElements.get( i ) );
266 }
267
268 DCPType[] dcps = null;
269 List nl = XMLTools.getNodes( operationElement, "ows:DCP", nsContext );
270 if ( nl.size() > 0 ) {
271 dcps = getDCPs( nl );
272 } else {
273 // add default URLs
274 dcps = new DCPType[1];
275 Protocol protocol = new HTTP( new URL[] { defaultUrlGet }, new URL[] { defaultUrlPost } );
276 dcps[0] = new DCPType( protocol );
277 }
278 operation = new Operation( name, dcps, parameters );
279 }
280 return operation;
281 }
282 }