001 //$HeadURL: svn+ssh://developername@svn.wald.intevation.org/deegree/base/trunk/src/org/deegree/ogcwebservices/csw/XMLFactory.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 package org.deegree.ogcwebservices.csw;
044
045 import java.io.IOException;
046 import java.util.HashSet;
047 import java.util.Set;
048
049 import org.deegree.framework.xml.XMLParsingException;
050 import org.deegree.framework.xml.XMLTools;
051 import org.deegree.model.filterencoding.capabilities.FilterCapabilities;
052 import org.deegree.ogcwebservices.csw.capabilities.CatalogueCapabilities;
053 import org.deegree.ogcwebservices.csw.capabilities.CatalogueCapabilitiesDocument;
054 import org.deegree.ogcwebservices.csw.capabilities.CatalogueCapabilitiesDocument_2_0_2;
055 import org.deegree.ogcwebservices.csw.configuration.CatalogueOutputSchemaParameter;
056 import org.deegree.ogcwebservices.csw.configuration.CatalogueOutputSchemaValue;
057 import org.deegree.ogcwebservices.csw.configuration.CatalogueTypeNameSchemaParameter;
058 import org.deegree.ogcwebservices.csw.configuration.CatalogueTypeNameSchemaValue;
059 import org.deegree.ogcwebservices.getcapabilities.Contents;
060 import org.deegree.ogcwebservices.getcapabilities.DCPType;
061 import org.deegree.ogcwebservices.getcapabilities.Operation;
062 import org.deegree.ogcwebservices.getcapabilities.OperationsMetadata;
063 import org.deegree.ogcwebservices.getcapabilities.ServiceIdentification;
064 import org.deegree.ogcwebservices.getcapabilities.ServiceProvider;
065 import org.deegree.owscommon.OWSCommonCapabilitiesDocument;
066 import org.deegree.owscommon.OWSDomainType;
067 import org.w3c.dom.Element;
068 import org.xml.sax.SAXException;
069
070 /**
071 * factory class for creating OGC CSW 2.0.2 compliant XML representation of a
072 * CatalogueCapabilities instance
073 *
074 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
075 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
076 * @author last edited by: $Author: apoth $
077 *
078 * @version $Revision: 9345 $, $Date: 2007-12-27 17:22:25 +0100 (Do, 27 Dez 2007) $
079 *
080 */
081 public class XMLFactory_2_0_2 extends XMLFactory_2_0_0 {
082
083 /**
084 * Exports a <code>CatalogCapabilities</code> instance as an <code>XmlDocument</code>.
085 *
086 * @param capabilities
087 * @param sections
088 * names of sections to be exported, may contain 'All'
089 * @return DOM representation of the <code>CatalogCapabilities</code>
090 * @throws IOException
091 * if XML template could not be loaded
092 */
093 public static CatalogueCapabilitiesDocument export( CatalogueCapabilities capabilities, String[] sections )
094 throws IOException {
095
096 // no sections specified? => return all sections
097 if ( sections == null || sections.length == 0 ) {
098 sections = new String[] { OWSCommonCapabilitiesDocument.ALL_NAME };
099 }
100
101 // build HashSet with the names of the sections to be exported
102 Set<String> sectionSet = new HashSet<String>();
103 for ( int i = 0; i < sections.length; i++ ) {
104 sectionSet.add( sections[i] );
105 }
106
107 CatalogueCapabilitiesDocument_2_0_2 doc = new CatalogueCapabilitiesDocument_2_0_2();
108 try {
109 doc.createEmptyDocument();
110 Element root = doc.getRootElement();
111
112 // 'ServiceIdentification'-section
113 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME )
114 || sectionSet.contains( OWSCommonCapabilitiesDocument.SERVICE_IDENTIFICATION_NAME ) ) {
115 ServiceIdentification serviceIdentification = capabilities.getServiceIdentification();
116 if ( serviceIdentification != null ) {
117 appendServiceIdentification( root, serviceIdentification );
118 }
119 }
120
121 // 'ServiceProvider'-section
122 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME )
123 || sectionSet.contains( OWSCommonCapabilitiesDocument.SERVICE_PROVIDER_NAME ) ) {
124 ServiceProvider serviceProvider = capabilities.getServiceProvider();
125 if ( serviceProvider != null ) {
126 appendServiceProvider( root, capabilities.getServiceProvider() );
127 }
128 }
129
130 // 'OperationsMetadata'-section
131 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME )
132 || sectionSet.contains( OWSCommonCapabilitiesDocument.OPERATIONS_METADATA_NAME ) ) {
133 OperationsMetadata operationsMetadata = capabilities.getOperationsMetadata();
134 if ( operationsMetadata != null ) {
135 appendOperationsMetadata( root, operationsMetadata, true );
136 }
137 }
138
139 // 'Contents'-section
140 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME )
141 || sectionSet.contains( OWSCommonCapabilitiesDocument.CONTENTS_NAME ) ) {
142 Contents contents = capabilities.getContents();
143 if ( contents != null ) {
144 // appendContents(root, contents);
145 }
146 }
147
148 // 'Filter_Capabilities'-section
149 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME )
150 || sectionSet.contains( CatalogueCapabilitiesDocument.FILTER_CAPABILITIES_NAME ) ) {
151 FilterCapabilities filterCapabilities = capabilities.getFilterCapabilities();
152 if ( filterCapabilities != null ) {
153 org.deegree.model.filterencoding.XMLFactory.appendFilterCapabilities110( root, filterCapabilities );
154 }
155 }
156
157 } catch ( Exception e ) {
158 e.printStackTrace();
159 LOG.logError( e.getMessage(), e );
160 }
161 return doc;
162 }
163
164
165
166 /**
167 * Appends the DOM representation of the <code>OperationsMetadata</code>- section to the
168 * passed <code>Element</code>.
169 *
170 * @param root
171 */
172 protected static void appendOperationsMetadata( Element root, OperationsMetadata operationsMetadata,
173 boolean capabilities ) {
174
175 // 'ows:OperationsMetadata'-element
176 Element operationsMetadataNode = XMLTools.appendElement( root, OWSNS, "ows:OperationsMetadata" );
177
178 // append all Operations
179 Operation[] operations = operationsMetadata.getOperations();
180 for ( int i = 0; i < operations.length; i++ ) {
181 Operation operation = operations[i];
182
183 // 'ows:Operation'-element
184 Element operationElement = XMLTools.appendElement( operationsMetadataNode, OWSNS, "ows:Operation" );
185
186 operationElement.setAttribute( "name", operation.getName() );
187
188 // 'ows:DCP'-elements
189 DCPType[] dcps = operation.getDCPs();
190 for ( int j = 0; j < dcps.length; j++ ) {
191 appendDCP( operationElement, dcps[j] );
192 }
193
194 // 'ows:Parameter'-elements
195 OWSDomainType[] parameters = operation.getParameters();
196 for ( int j = 0; j < parameters.length; j++ ) {
197 if ( parameters[j] instanceof CatalogueOutputSchemaParameter ) {
198 appendParameter( operationElement, (CatalogueOutputSchemaParameter) parameters[j], "ows:Parameter",
199 capabilities );
200 } else if ( parameters[j] instanceof CatalogueTypeNameSchemaParameter ) {
201 appendParameter( operationElement, (CatalogueTypeNameSchemaParameter) parameters[j],
202 "ows:Parameter", capabilities );
203 } else {
204 appendParameter( operationElement, parameters[j], "ows:Parameter" );
205 }
206 }
207
208 // 'ows:Metadata'-elements
209 Object[] metadata = operation.getMetadata();
210 if ( metadata != null ) {
211 for ( int j = 0; j < metadata.length; j++ ) {
212 appendMetadata( operationElement, metadata[j] );
213 }
214 }
215 }
216
217 // append general parameters
218 OWSDomainType[] parameters = operationsMetadata.getParameter();
219 for ( int i = 0; i < parameters.length; i++ ) {
220 appendParameter( operationsMetadataNode, parameters[i], "ows:Parameter" );
221 }
222
223 // append constraints
224 OWSDomainType[] constraints = operationsMetadata.getConstraints();
225 for ( int i = 0; i < constraints.length; i++ ) {
226 appendParameter( operationsMetadataNode, constraints[i], "ows:Constraint" );
227 }
228 }
229
230 /**
231 * Appends the DOM representation of a <code>OWSDomainType</code> instance to the passed
232 * <code>Element</code>.
233 *
234 * @param root
235 * @param parameter
236 */
237 protected static void appendParameter( Element root, CatalogueOutputSchemaParameter parameter, String elementName,
238 boolean capabilities ) {
239
240 // 'ows:Parameter'-element
241 Element parameterNode = XMLTools.appendElement( root, OWSNS, elementName );
242 parameterNode.setAttribute( "name", parameter.getName() );
243
244 // 'ows:Value'-elements
245 CatalogueOutputSchemaValue[] values = parameter.getSpecializedValues();
246 for ( int i = 0; i < values.length; i++ ) {
247 Element elem = XMLTools.appendElement( parameterNode, OWSNS, "ows:Value", values[i].getValue() );
248 if ( !capabilities ) {
249 elem.setAttribute( "deegree:input", values[i].getInXsl() );
250 elem.setAttribute( "deegree:ouput", values[i].getOutXsl() );
251 }
252 }
253 }
254
255 /**
256 * Appends the DOM representation of a <code>OWSDomainType</code> instance to the passed
257 * <code>Element</code>.
258 *
259 * @param root
260 * @param parameter
261 */
262 protected static void appendParameter( Element root, CatalogueTypeNameSchemaParameter parameter,
263 String elementName, boolean capabilities ) {
264
265 // 'ows:Parameter'-element
266 Element parameterNode = XMLTools.appendElement( root, OWSNS, elementName );
267 parameterNode.setAttribute( "name", parameter.getName() );
268
269 // 'ows:Value'-elements
270 CatalogueTypeNameSchemaValue[] values = parameter.getSpecializedValues();
271 for ( int i = 0; i < values.length; i++ ) {
272 Element elem = XMLTools.appendElement( parameterNode, OWSNS, "ows:Value", values[i].getValue() );
273 if ( !capabilities ) {
274 elem.setAttribute( "deegree:schema", values[i].getSchema() );
275 }
276 }
277 }
278
279
280 /**
281 * Appends the DOM representation of the <code>ServiceIdentification</code>- section to the
282 * passed <code>Element</code>.
283 *
284 * @param root
285 * @param serviceIdentification
286 * @throws XMLParsingException
287 */
288 protected static void appendServiceIdentification( Element root,
289 ServiceIdentification serviceIdentification ) {
290
291 // 'ServiceIdentification'-element
292 Element serviceIdentificationNode = XMLTools.appendElement( root, OWSNS,
293 "ows:ServiceIdentification" );
294
295 //'Title'-element
296 XMLTools.appendElement( serviceIdentificationNode, OWSNS, "ows:Title",
297 serviceIdentification.getTitle() );
298
299 // 'Abstract'-element
300 if ( serviceIdentification.getAbstract() != null ) {
301 XMLTools.appendElement( serviceIdentificationNode, OWSNS, "ows:Abstract",
302 serviceIdentification.getAbstract() );
303 }
304
305 // 'Keywords'-element
306 appendOWSKeywords( serviceIdentificationNode, serviceIdentification.getKeywords() );
307
308 // 'ServiceType'-element
309 XMLTools.appendElement( serviceIdentificationNode, OWSNS, "ows:ServiceType",
310 serviceIdentification.getServiceType().getCode() );
311
312 // 'ServiceTypeVersion'-elements
313 String[] versions = serviceIdentification.getServiceTypeVersions();
314 for ( int i = 0; i < versions.length; i++ ) {
315 XMLTools.appendElement( serviceIdentificationNode, OWSNS, "ows:ServiceTypeVersion",
316 versions[i] );
317 }
318
319 // 'Fees'-element
320 XMLTools.appendElement( serviceIdentificationNode, OWSNS, "ows:Fees",
321 serviceIdentification.getFees() );
322
323 // 'AccessConstraints'-element
324 String[] constraints = serviceIdentification.getAccessConstraints();
325 if ( constraints != null ) {
326 for ( int i = 0; i < constraints.length; i++ ) {
327 XMLTools.appendElement( serviceIdentificationNode, OWSNS, "ows:AccessConstraints",
328 constraints[i] );
329 }
330 }
331 }
332
333
334 }