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