001 // $HeadURL:
002 // /cvsroot/deegree/src/org/deegree/ogcwebservices/csw/capabilities/CatalogCapabilitiesDocument.java,v
003 // 1.22 2004/08/05 15:40:08 ap Exp $
004 /*---------------- FILE HEADER ------------------------------------------
005
006 This file is part of deegree.
007 Copyright (C) 2001-2006 by:
008 EXSE, Department of Geography, University of Bonn
009 http://www.giub.uni-bonn.de/deegree/
010 lat/lon GmbH
011 http://www.lat-lon.de
012
013 This library is free software; you can redistribute it and/or
014 modify it under the terms of the GNU Lesser General Public
015 License as published by the Free Software Foundation; either
016 version 2.1 of the License, or (at your option) any later version.
017
018 This library is distributed in the hope that it will be useful,
019 but WITHOUT ANY WARRANTY; without even the implied warranty of
020 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
021 Lesser General Public License for more details.
022
023 You should have received a copy of the GNU Lesser General Public
024 License along with this library; if not, write to the Free Software
025 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
026
027 Contact:
028
029 Andreas Poth
030 lat/lon GmbH
031 Aennchenstr. 19
032 53115 Bonn
033 Germany
034 E-Mail: poth@lat-lon.de
035
036 Prof. Dr. Klaus Greve
037 Department of Geography
038 University of Bonn
039 Meckenheimer Allee 166
040 53115 Bonn
041 Germany
042 E-Mail: greve@giub.uni-bonn.de
043
044 ---------------------------------------------------------------------------*/
045 package org.deegree.ogcwebservices.csw.capabilities;
046
047 import java.io.IOException;
048 import java.net.URI;
049 import java.net.URISyntaxException;
050 import java.net.URL;
051 import java.util.Arrays;
052 import java.util.HashMap;
053 import java.util.List;
054 import java.util.Map;
055
056 import org.deegree.datatypes.xlink.SimpleLink;
057 import org.deegree.framework.log.ILogger;
058 import org.deegree.framework.log.LoggerFactory;
059 import org.deegree.framework.xml.ElementList;
060 import org.deegree.framework.xml.InvalidConfigurationException;
061 import org.deegree.framework.xml.XMLParsingException;
062 import org.deegree.framework.xml.XMLTools;
063 import org.deegree.i18n.Messages;
064 import org.deegree.model.filterencoding.capabilities.FilterCapabilities;
065 import org.deegree.model.filterencoding.capabilities.FilterCapabilities100Fragment;
066 import org.deegree.ogcbase.CommonNamespaces;
067 import org.deegree.ogcwebservices.getcapabilities.InvalidCapabilitiesException;
068 import org.deegree.ogcwebservices.getcapabilities.OGCCapabilities;
069 import org.deegree.ogcwebservices.getcapabilities.Operation;
070 import org.deegree.ogcwebservices.getcapabilities.OperationsMetadata;
071 import org.deegree.owscommon.OWSCommonCapabilitiesDocument;
072 import org.deegree.owscommon.OWSDomainType;
073 import org.w3c.dom.Element;
074 import org.w3c.dom.Node;
075 import org.xml.sax.SAXException;
076
077 /**
078 * Represents an XML capabilities document for an OGC CSW 2.0 compliant service.
079 *
080 * @author <a href="mailto:tfr@users.sourceforge.net">Torsten Friebe </a>
081 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
082 *
083 * @author last edited by: $Author: rbezema $
084 *
085 * @version 2.0, $Revision: 7335 $, $Date: 2007-05-29 11:43:53 +0200 (Di, 29 Mai 2007) $
086 *
087 * @since 2.0
088 *
089 */
090 public class CatalogueCapabilitiesDocument extends OWSCommonCapabilitiesDocument {
091
092 private static final ILogger LOG = LoggerFactory.getLogger( CatalogueCapabilitiesDocument.class );
093
094 public final static String FILTER_CAPABILITIES_NAME = "FilterCapabilities";
095
096 public final static String EBRIM_CAPABILITIES_NAME = "EBRIMCapabilities";
097
098 protected static final URI OGCNS = CommonNamespaces.OGCNS;
099
100 private static final String XML_TEMPLATE = "CatalogueCapabilitiesTemplate.xml";
101
102 /**
103 * Creates a skeleton capabilities document that contains the mandatory elements only.
104 *
105 * @throws IOException
106 * @throws SAXException
107 */
108 public void createEmptyDocument() throws IOException,
109 SAXException {
110 URL url = CatalogueCapabilitiesDocument.class.getResource( XML_TEMPLATE );
111 if ( url == null ) {
112 throw new IOException( "The resource '" + XML_TEMPLATE + " could not be found." );
113 }
114 load( url );
115 }
116
117 /**
118 * Creates a class representation of the document.
119 *
120 * @return class representation of the configuration document
121 */
122 public OGCCapabilities parseCapabilities() throws InvalidCapabilitiesException {
123 try {
124 FilterCapabilities filterCapabilities = null;
125 Element filterCapabilitiesElement = (Element) XMLTools.getNode( getRootElement(),
126 "ogc:Filter_Capabilities",
127 nsContext );
128 if ( filterCapabilitiesElement != null ) {
129 filterCapabilities = new FilterCapabilities100Fragment( filterCapabilitiesElement, getSystemId() ).parseFilterCapabilities();
130 }
131 return new CatalogueCapabilities( parseVersion(),
132 parseUpdateSequence(),
133 getServiceIdentification(),
134 getServiceProvider(),
135 getOperationsMetadata(),
136 null,
137 filterCapabilities );
138 } catch ( Exception e ) {
139 LOG.logError( e.getMessage(), e );
140 throw new InvalidCapabilitiesException( e.getMessage() );
141 }
142 }
143
144 /**
145 * Creates a class representation of the <code>OperationsMetadata</code>- section.
146 *
147 * @return
148 * @throws InvalidConfigurationException
149 */
150 public OperationsMetadata getOperationsMetadata() throws XMLParsingException {
151
152 Node root = this.getRootElement();
153
154 Node omNode = XMLTools.getRequiredChildElement( "OperationsMetadata", OWSNS, root );
155 ElementList elementList = XMLTools.getChildElements( "Operation", OWSNS, omNode );
156
157 ElementList parameterElements = XMLTools.getChildElements( "Parameter", OWSNS, omNode );
158 OWSDomainType[] parameters = new OWSDomainType[parameterElements.getLength()];
159
160 for ( int i = 0; i < parameters.length; i++ ) {
161 parameters[i] = getOWSDomainType( null, parameterElements.item( i ) );
162 }
163
164 // build HashMap of 'Operation'-elements for easier access
165 HashMap operations = new HashMap();
166 for ( int i = 0; i < elementList.getLength(); i++ ) {
167 operations.put( XMLTools.getRequiredAttrValue( "name", null, elementList.item( i ) ), elementList.item( i ) );
168 }
169
170 // 'GetCapabilities'-operation
171 Operation getCapabilites = getOperation( OperationsMetadata.GET_CAPABILITIES_NAME, true, operations );
172 // 'DescribeRecord'-operation
173 Operation describeRecord = getOperation( CatalogueOperationsMetadata.DESCRIBE_RECORD_NAME, true, operations );
174 // 'GetDomain'-operation
175 Operation getDomain = getOperation( CatalogueOperationsMetadata.GET_DOMAIN_NAME, false, operations );
176 // 'GetRecords'-operation
177 Operation getRecords = getOperation( CatalogueOperationsMetadata.GET_RECORDS_NAME, true, operations );
178 // 'GetRecordById'-operation
179 Operation getRecordById = getOperation( CatalogueOperationsMetadata.GET_RECORD_BY_ID_NAME, true, operations );
180 // 'Transaction'-operation
181 Operation transaction = getOperation( CatalogueOperationsMetadata.TRANSACTION_NAME, false, operations );
182 // 'Harvest'-operation
183 Operation harvest = getOperation( CatalogueOperationsMetadata.HARVEST_NAME, false, operations );
184
185 return new CatalogueOperationsMetadata( getCapabilites,
186 describeRecord,
187 getDomain,
188 getRecords,
189 getRecordById,
190 transaction,
191 harvest,
192 parameters,
193 null );
194 }
195
196 /**
197 * @return a {@link EBRIMCapabilities} element (specified in the ogc-ebrim extension)
198 * @throws XMLParsingException
199 * if a required node isn't found
200 */
201 protected EBRIMCapabilities parseEBRIMCapabilities() throws XMLParsingException {
202 Element rootElement = getRootElement();
203
204 String prefix = rootElement.getOwnerDocument().lookupPrefix( CommonNamespaces.WRS_EBRIMNS.toString() );
205
206 if ( prefix == null || "".equals( prefix.trim() ) ) {
207 return null;
208 }
209
210 // SeviceFeatures
211 Element serviceFeature = (Element) XMLTools.getRequiredNode( rootElement, "wrs:ServiceFeatures", nsContext );
212 List nl = XMLTools.getNodes( serviceFeature, "wrs:feature", nsContext );
213 Map<URI, CSWFeature> features = new HashMap<URI, CSWFeature>();
214 for ( Object n : nl ) {
215 Node featureElement = (Node) n;
216 URI featureName = XMLTools.getRequiredNodeAsURI( featureElement, "@name", nsContext );
217 LOG.logDebug( "found featurename: " + featureName );
218 if ( features.containsKey( featureName ) ) {
219 throw new XMLParsingException( Messages.getMessage( "WRS_UNAMBIGUOUS_FEAT_PROP", featureName.toString() ) );
220 }
221 CSWFeature feature = new CSWFeature( parsePropties( featureElement ) );
222 features.put( featureName, feature );
223 }
224
225 Element serviceProps = (Element) XMLTools.getRequiredNode( rootElement, "wrs:ServiceProperties", nsContext );
226 Map<URI, List<String>> serviceProperties = parsePropties( serviceProps );
227 SimpleLink wsdl_SimpleLink = parseSimpleLink( (Element) XMLTools.getRequiredNode( rootElement,
228 "wrs:WSDL-services",
229 nsContext ) );
230
231 return new EBRIMCapabilities( features, serviceProperties, wsdl_SimpleLink );
232 }
233
234 private Map<URI, List<String>> parsePropties( Node xmlNode ) throws XMLParsingException {
235 List pnl = XMLTools.getNodes( xmlNode, "wrs:property", nsContext );
236 Map<URI, List<String>> properties = new HashMap<URI, List<String>>();
237
238 for ( Object pn : pnl ) {
239 Node property = (Node) pn;
240 URI propName = XMLTools.getRequiredNodeAsURI( property, "@name", nsContext );
241 List<String> propValues = Arrays.asList( XMLTools.getRequiredNodesAsStrings( property,
242 "wrs:value",
243 nsContext ) );
244 properties.put( propName, propValues );
245 }
246 return properties;
247 }
248 }