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-2008 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.URL;
050 import java.util.Arrays;
051 import java.util.HashMap;
052 import java.util.List;
053 import java.util.Map;
054
055 import org.deegree.datatypes.xlink.SimpleLink;
056 import org.deegree.framework.log.ILogger;
057 import org.deegree.framework.log.LoggerFactory;
058 import org.deegree.framework.xml.ElementList;
059 import org.deegree.framework.xml.InvalidConfigurationException;
060 import org.deegree.framework.xml.XMLParsingException;
061 import org.deegree.framework.xml.XMLTools;
062 import org.deegree.i18n.Messages;
063 import org.deegree.model.filterencoding.capabilities.FilterCapabilities;
064 import org.deegree.model.filterencoding.capabilities.FilterCapabilities100Fragment;
065 import org.deegree.ogcbase.CommonNamespaces;
066 import org.deegree.ogcwebservices.getcapabilities.InvalidCapabilitiesException;
067 import org.deegree.ogcwebservices.getcapabilities.OGCCapabilities;
068 import org.deegree.ogcwebservices.getcapabilities.Operation;
069 import org.deegree.ogcwebservices.getcapabilities.OperationsMetadata;
070 import org.deegree.owscommon.OWSCommonCapabilitiesDocument;
071 import org.deegree.owscommon.OWSDomainType;
072 import org.w3c.dom.Element;
073 import org.w3c.dom.Node;
074 import org.xml.sax.SAXException;
075
076 /**
077 * Represents an XML capabilities document for an OGC CSW 2.0 compliant service.
078 *
079 * @author <a href="mailto:tfr@users.sourceforge.net">Torsten Friebe </a>
080 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
081 *
082 * @author last edited by: $Author: apoth $
083 *
084 * @version 2.0, $Revision: 9501 $, $Date: 2008-01-10 10:41:39 +0100 (Do, 10 Jan 2008) $
085 *
086 * @since 2.0
087 *
088 */
089 public class CatalogueCapabilitiesDocument extends OWSCommonCapabilitiesDocument {
090
091 private static final ILogger LOG = LoggerFactory.getLogger( CatalogueCapabilitiesDocument.class );
092
093 public final static String FILTER_CAPABILITIES_NAME = "FilterCapabilities";
094
095 public final static String EBRIM_CAPABILITIES_NAME = "EBRIMCapabilities";
096
097 protected static final URI OGCNS = CommonNamespaces.OGCNS;
098
099 private static final String XML_TEMPLATE = "CatalogueCapabilitiesTemplate.xml";
100
101 /**
102 * Creates a skeleton capabilities document that contains the mandatory elements only.
103 *
104 * @throws IOException
105 * @throws SAXException
106 */
107 public void createEmptyDocument()
108 throws IOException, SAXException {
109 URL url = CatalogueCapabilitiesDocument.class.getResource( XML_TEMPLATE );
110 if ( url == null ) {
111 throw new IOException( "The resource '" + XML_TEMPLATE + " could not be found." );
112 }
113 load( url );
114 }
115
116 /**
117 * Creates a class representation of the document.
118 *
119 * @return class representation of the configuration document
120 */
121 public OGCCapabilities parseCapabilities()
122 throws InvalidCapabilitiesException {
123 try {
124 FilterCapabilities filterCapabilities = null;
125 Element filterCapabilitiesElement = (Element) XMLTools.getNode( getRootElement(),
126 "ogc:Filter_Capabilities", nsContext );
127 if ( filterCapabilitiesElement != null ) {
128 filterCapabilities = new FilterCapabilities100Fragment( filterCapabilitiesElement, getSystemId() ).parseFilterCapabilities();
129 }
130 return new CatalogueCapabilities( parseVersion(), parseUpdateSequence(), getServiceIdentification(),
131 getServiceProvider(), getOperationsMetadata(), null, filterCapabilities );
132 } catch ( Exception e ) {
133 LOG.logError( e.getMessage(), e );
134 throw new InvalidCapabilitiesException( e.getMessage() );
135 }
136 }
137
138 /**
139 * Creates a class representation of the <code>OperationsMetadata</code>- section.
140 *
141 * @return
142 * @throws InvalidConfigurationException
143 */
144 public OperationsMetadata getOperationsMetadata()
145 throws XMLParsingException {
146
147 Node root = this.getRootElement();
148
149 Node omNode = XMLTools.getRequiredChildElement( "OperationsMetadata", OWSNS, root );
150 ElementList elementList = XMLTools.getChildElements( "Operation", OWSNS, omNode );
151
152 ElementList parameterElements = XMLTools.getChildElements( "Parameter", OWSNS, omNode );
153 OWSDomainType[] parameters = new OWSDomainType[parameterElements.getLength()];
154
155 for ( int i = 0; i < parameters.length; i++ ) {
156 parameters[i] = getOWSDomainType( null, parameterElements.item( i ) );
157 }
158
159 OWSDomainType[] constraints = getContraints( (Element)omNode );
160
161 // build HashMap of 'Operation'-elements for easier access
162 HashMap<String,Node> operations = new HashMap<String,Node>();
163 for ( int i = 0; i < elementList.getLength(); i++ ) {
164 operations.put( XMLTools.getRequiredAttrValue( "name", null, elementList.item( i ) ), elementList.item( i ) );
165 }
166
167 // 'GetCapabilities'-operation
168 Operation getCapabilites = getOperation( OperationsMetadata.GET_CAPABILITIES_NAME, true, operations );
169 // 'DescribeRecord'-operation
170 Operation describeRecord = getOperation( CatalogueOperationsMetadata.DESCRIBE_RECORD_NAME, true, operations );
171 // 'GetDomain'-operation
172 Operation getDomain = getOperation( CatalogueOperationsMetadata.GET_DOMAIN_NAME, false, operations );
173 // 'GetRecords'-operation
174 Operation getRecords = getOperation( CatalogueOperationsMetadata.GET_RECORDS_NAME, true, operations );
175 // 'GetRecordById'-operation
176 Operation getRecordById = getOperation( CatalogueOperationsMetadata.GET_RECORD_BY_ID_NAME, true, operations );
177 // 'Transaction'-operation
178 Operation transaction = getOperation( CatalogueOperationsMetadata.TRANSACTION_NAME, false, operations );
179 // 'Harvest'-operation
180 Operation harvest = getOperation( CatalogueOperationsMetadata.HARVEST_NAME, false, operations );
181
182
183 return new CatalogueOperationsMetadata( getCapabilites, describeRecord, getDomain, getRecords, getRecordById,
184 transaction, harvest, parameters, constraints );
185 }
186
187 /**
188 * @return a {@link EBRIMCapabilities} element (specified in the ogc-ebrim extension)
189 * @throws XMLParsingException
190 * if a required node isn't found
191 */
192 protected EBRIMCapabilities parseEBRIMCapabilities()
193 throws XMLParsingException {
194 Element rootElement = getRootElement();
195
196 String prefix = rootElement.getOwnerDocument().lookupPrefix( CommonNamespaces.WRS_EBRIMNS.toString() );
197
198 if ( prefix == null || "".equals( prefix.trim() ) ) {
199 return null;
200 }
201
202 // SeviceFeatures
203 Element serviceFeature = (Element) XMLTools.getRequiredNode( rootElement, "wrs:ServiceFeatures", nsContext );
204 List nl = XMLTools.getNodes( serviceFeature, "wrs:feature", nsContext );
205 Map<URI, CSWFeature> features = new HashMap<URI, CSWFeature>();
206 for ( Object n : nl ) {
207 Node featureElement = (Node) n;
208 URI featureName = XMLTools.getRequiredNodeAsURI( featureElement, "@name", nsContext );
209 LOG.logDebug( "found featurename: " + featureName );
210 if ( features.containsKey( featureName ) ) {
211 throw new XMLParsingException(
212 Messages.getMessage( "WRS_UNAMBIGUOUS_FEAT_PROP", featureName.toString() ) );
213 }
214 CSWFeature feature = new CSWFeature( parsePropties( featureElement ) );
215 features.put( featureName, feature );
216 }
217
218 Element serviceProps = (Element) XMLTools.getRequiredNode( rootElement, "wrs:ServiceProperties", nsContext );
219 Map<URI, List<String>> serviceProperties = parsePropties( serviceProps );
220 SimpleLink wsdl_SimpleLink = parseSimpleLink( (Element) XMLTools.getRequiredNode( rootElement,
221 "wrs:WSDL-services",
222 nsContext ) );
223
224 return new EBRIMCapabilities( features, serviceProperties, wsdl_SimpleLink );
225 }
226
227 private Map<URI, List<String>> parsePropties( Node xmlNode )
228 throws XMLParsingException {
229 List pnl = XMLTools.getNodes( xmlNode, "wrs:property", nsContext );
230 Map<URI, List<String>> properties = new HashMap<URI, List<String>>();
231
232 for ( Object pn : pnl ) {
233 Node property = (Node) pn;
234 URI propName = XMLTools.getRequiredNodeAsURI( property, "@name", nsContext );
235 List<String> propValues = Arrays.asList( XMLTools.getRequiredNodesAsStrings( property, "wrs:value",
236 nsContext ) );
237 properties.put( propName, propValues );
238 }
239 return properties;
240 }
241 }