001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/ogcwebservices/csw/configuration/CatalogueConfigurationDocument.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 Aennchenstr. 19 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 045 package org.deegree.ogcwebservices.csw.configuration; 046 047 import java.io.IOException; 048 import java.net.URI; 049 import java.net.URL; 050 051 import org.deegree.datatypes.xlink.SimpleLink; 052 import org.deegree.framework.log.ILogger; 053 import org.deegree.framework.log.LoggerFactory; 054 import org.deegree.framework.util.StringTools; 055 import org.deegree.framework.xml.ElementList; 056 import org.deegree.framework.xml.InvalidConfigurationException; 057 import org.deegree.framework.xml.NamespaceContext; 058 import org.deegree.framework.xml.XMLParsingException; 059 import org.deegree.framework.xml.XMLTools; 060 import org.deegree.io.JDBCConnection; 061 import org.deegree.model.filterencoding.capabilities.FilterCapabilities; 062 import org.deegree.model.filterencoding.capabilities.FilterCapabilities100Fragment; 063 import org.deegree.model.metadata.iso19115.OnlineResource; 064 import org.deegree.ogcbase.CommonNamespaces; 065 import org.deegree.ogcwebservices.csw.capabilities.CatalogueCapabilitiesDocument; 066 import org.deegree.owscommon.OWSDomainType; 067 import org.w3c.dom.Element; 068 import org.w3c.dom.Node; 069 import org.w3c.dom.NodeList; 070 import org.xml.sax.SAXException; 071 072 /** 073 * Represents an XML configuration document for a deegree CSW 2.0 instance, i.e. it consists of all 074 * sections common to an OGC CSW 2.0 capabilities document plus a deegree specific section named 075 * <code>deegreeParams</code>. 076 * 077 * @author <a href="mailto:tfr@users.sourceforge.net">Torsten Friebe </a> 078 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a> 079 * @author last edited by: $Author: apoth $ 080 * 081 * @version $Revision: 9345 $, $Date: 2007-12-27 17:22:25 +0100 (Do, 27 Dez 2007) $ 082 */ 083 public class CatalogueConfigurationDocument extends CatalogueCapabilitiesDocument { 084 085 private static ILogger LOG = LoggerFactory.getLogger( CatalogueConfigurationDocument.class ); 086 087 private static final long serialVersionUID = -2923926335089417513L; 088 089 private static final NamespaceContext nsc = CommonNamespaces.getNamespaceContext(); 090 091 protected static final URI DEEGREECSW = CommonNamespaces.DEEGREECSW; 092 093 private static final String XML_TEMPLATE = "CatalogueConfigurationTemplate.xml"; 094 095 /** 096 * Creates a skeleton configuration document that contains the mandatory elements only. 097 * 098 * @throws IOException 099 * @throws SAXException 100 */ 101 @Override 102 public void createEmptyDocument() 103 throws IOException, SAXException { 104 URL url = CatalogueConfigurationDocument.class.getResource( XML_TEMPLATE ); 105 if ( url == null ) { 106 throw new IOException( "The resource '" + XML_TEMPLATE + " could not be found." ); 107 } 108 load( url ); 109 } 110 111 /** 112 * Creates a class representation of the whole document. 113 * 114 * @return class representation of the configuration document 115 * @throws InvalidConfigurationException 116 */ 117 public CatalogueConfiguration getConfiguration() 118 throws InvalidConfigurationException { 119 CatalogueConfiguration configuration = null; 120 try { 121 FilterCapabilities filterCapabilities = null; 122 Element filterCapabilitiesElement = (Element) XMLTools.getNode( getRootElement(), 123 "ogc:Filter_Capabilities", nsContext ); 124 if ( filterCapabilitiesElement != null ) { 125 filterCapabilities = new FilterCapabilities100Fragment( filterCapabilitiesElement, getSystemId() ).parseFilterCapabilities(); 126 } 127 configuration = new CatalogueConfiguration( parseVersion(), parseUpdateSequence(), 128 getServiceIdentification(), getServiceProvider(), 129 getOperationsMetadata(), null, filterCapabilities, 130 getDeegreeParams(), getSystemId(), parseEBRIMCapabilities() ); 131 } catch ( XMLParsingException e ) { 132 LOG.logError( e.getMessage(), e ); 133 throw new InvalidConfigurationException( "Class representation of the catalog configuration " 134 + "document could not be generated: " + e.getMessage(), e ); 135 } 136 return configuration; 137 } 138 139 /** 140 * Creates a class representation of the <code>deegreeParams</code>- section. 141 * 142 * @return the DeegreeParams of the catalogue 143 * @throws InvalidConfigurationException 144 */ 145 public CatalogueDeegreeParams getDeegreeParams() 146 throws InvalidConfigurationException { 147 148 CatalogueDeegreeParams deegreeParams = null; 149 150 try { 151 Node root = this.getRootElement(); 152 Element element = XMLTools.getRequiredChildElement( "deegreeParams", DEEGREECSW, root ); 153 154 // 'deegreecsw:DefaultOnlineResource'-element (mandatory) 155 OnlineResource defaultOnlineResource = parseOnLineResource( XMLTools.getRequiredChildElement( 156 "DefaultOnlineResource", 157 DEEGREECSW, 158 element ) ); 159 160 // 'deegreecsw:CacheSize'-element (optional, default: 100) 161 int cacheSize = XMLTools.getNodeAsInt( element, "./deegreecsw:CacheSize", nsContext, 100 ); 162 163 // 'deegreecsw:RequestTimeLimit'-element (optional, default: 2) 164 int requestTimeLimit = XMLTools.getNodeAsInt( element, "./deegreecsw:RequestTimeLimit", nsContext, 2 ); 165 166 // 'deegreecsw:Encoding'-element (optional, default: UTF-8) 167 String characterSet = XMLTools.getStringValue( "Encoding", DEEGREECSW, element, "UTF-8" ); 168 169 // default output schema used by a catalogue 170 String defaultOutputSchema = XMLTools.getStringValue( "DefaultOutputSchema", DEEGREECSW, element, "OGCCORE" ); 171 172 // 'deegreecsw:WFSResource'-element (mandatory) 173 SimpleLink wfsResource = parseSimpleLink( XMLTools.getRequiredChildElement( "WFSResource", DEEGREECSW, 174 element ) ); 175 176 // 'deegreecsw:CatalogAddresses'-element (optional) 177 Element catalogAddressesElement = XMLTools.getChildElement( "CatalogAddresses", DEEGREECSW, element ); 178 OnlineResource[] catalogAddresses = new OnlineResource[0]; 179 if ( catalogAddressesElement != null ) { 180 // 'deegreecsw:CatalogAddresses'-element (optional) 181 ElementList el = XMLTools.getChildElements( "CatalogAddress", DEEGREECSW, catalogAddressesElement ); 182 catalogAddresses = new OnlineResource[el.getLength()]; 183 for ( int i = 0; i < catalogAddresses.length; i++ ) { 184 catalogAddresses[i] = parseOnLineResource( el.item( i ) ); 185 } 186 } 187 188 OnlineResource transInXslt = null; 189 Element elem = (Element) XMLTools.getNode( element, "deegreecsw:TransactionInputXSLT", nsc ); 190 if ( elem != null ) { 191 transInXslt = parseOnLineResource( elem ); 192 } 193 OnlineResource transOutXslt = null; 194 elem = (Element) XMLTools.getNode( element, "deegreecsw:TransactionOutputXSLT", nsc ); 195 if ( elem != null ) { 196 transOutXslt = parseOnLineResource( elem ); 197 } 198 if ( ( transInXslt != null && transOutXslt == null ) || ( transInXslt == null && transOutXslt != null ) ) { 199 throw new InvalidConfigurationException( 200 "if CSW-deegreeParam " 201 + "'TransactionInputXSLT' is defined 'TransactionOutputXSLT' must " 202 + "be defined too and vice versa!" ); 203 } 204 205 // 'deegreecsw:HarvestRepository'-element (optional) 206 Element harvestRepositoryElement = XMLTools.getChildElement( "HarvestRepository", DEEGREECSW, element ); 207 JDBCConnection harvestRepository = null; 208 if ( harvestRepositoryElement != null ) { 209 // 'deegreecsw:Connection'-element (optional) 210 Element connectionElement = XMLTools.getChildElement( "Connection", DEEGREECSW, 211 harvestRepositoryElement ); 212 if ( connectionElement != null ) { 213 harvestRepository = new JDBCConnection( XMLTools.getRequiredStringValue( "Driver", DEEGREECSW, 214 connectionElement ), 215 XMLTools.getRequiredStringValue( "Logon", DEEGREECSW, 216 connectionElement ), 217 XMLTools.getRequiredStringValue( "User", DEEGREECSW, 218 connectionElement ), 219 XMLTools.getRequiredStringValue( "Password", DEEGREECSW, 220 connectionElement ), null, 221 null, null ); 222 } 223 } 224 deegreeParams = new CatalogueDeegreeParams( defaultOnlineResource, cacheSize, requestTimeLimit, 225 characterSet, wfsResource, catalogAddresses, harvestRepository, 226 defaultOutputSchema, transInXslt, transOutXslt ); 227 } catch ( XMLParsingException e ) { 228 LOG.logError( e.getMessage(), e ); 229 throw new InvalidConfigurationException( "Error parsing the deegreeParams " 230 + "section of the CSW configuration: \n" + e.getMessage() 231 + StringTools.stackTraceToString( e ) ); 232 } 233 return deegreeParams; 234 } 235 236 /** 237 * Overwritten to cope with additional deegree CSW specific attributes (used in the 238 * "outputSchema" parameter element). 239 * 240 * @param operation 241 * @param parameterElement 242 * @return OWSDomainType 243 * @throws XMLParsingException 244 * 245 * @see "org.deegree.owscommon.OWSCommonCapabilitiesDocument#getParameter(org.w3c.dom.Element)" 246 */ 247 @Override 248 protected OWSDomainType getOWSDomainType( String operation, Element parameterElement ) 249 throws XMLParsingException { 250 // "name"-attribute 251 String parameterName = XMLTools.getRequiredAttrValue( "name", null, parameterElement ); 252 253 if ( "GetRecords".equals( operation ) && "outputSchema".equals( parameterName ) ) { 254 // "ows:Value"-elements 255 NodeList valueNodes = parameterElement.getElementsByTagNameNS( OWSNS.toString(), "Value" ); 256 CatalogueOutputSchemaValue[] values = new CatalogueOutputSchemaValue[valueNodes.getLength()]; 257 for ( int i = 0; i < valueNodes.getLength(); i++ ) { 258 String value = XMLTools.getStringValue( valueNodes.item( i ) ); 259 String input = XMLTools.getRequiredAttrValue( "input", DEEGREECSW, valueNodes.item( i ) ); 260 String output = XMLTools.getRequiredAttrValue( "output", DEEGREECSW, valueNodes.item( i ) ); 261 if ( value == null || value.equals( "" ) ) { 262 throw new XMLParsingException( "Missing or empty node '" + value + "'." ); 263 } 264 values[i] = new CatalogueOutputSchemaValue( value, input, output ); 265 } 266 return new CatalogueOutputSchemaParameter( parameterName, values, null ); 267 } else if ( "GetRecords".equals( operation ) && "typeName".equals( parameterName ) ) { 268 NodeList valueNodes = parameterElement.getElementsByTagNameNS( OWSNS.toString(), "Value" ); 269 CatalogueTypeNameSchemaValue[] values = new CatalogueTypeNameSchemaValue[valueNodes.getLength()]; 270 for ( int i = 0; i < valueNodes.getLength(); i++ ) { 271 String value = XMLTools.getStringValue( valueNodes.item( i ) ); 272 String schema = XMLTools.getRequiredAttrValue( "schema", DEEGREECSW, valueNodes.item( i ) ); 273 values[i] = new CatalogueTypeNameSchemaValue( value, schema ); 274 } 275 return new CatalogueTypeNameSchemaParameter( parameterName, values, null ); 276 } else { 277 return super.getOWSDomainType( operation, parameterElement ); 278 } 279 } 280 }