001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/owscommon_new/XMLFactory.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 This file is part of deegree. 004 Copyright (C) 2001-2007 by: 005 Department of Geography, University of Bonn 006 http://www.giub.uni-bonn.de/deegree/ 007 lat/lon GmbH 008 http://www.lat-lon.de 009 This library is free software; you can redistribute it and/or 010 modify it under the terms of the GNU Lesser General Public 011 License as published by the Free Software Foundation; either 012 version 2.1 of the License, or (at your option) any later version. 013 This library is distributed in the hope that it will be useful, 014 but WITHOUT ANY WARRANTY; without even the implied warranty of 015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 016 Lesser General Public License for more details. 017 You should have received a copy of the GNU Lesser General Public 018 License along with this library; if not, write to the Free Software 019 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 Contact: 021 Andreas Poth 022 lat/lon GmbH 023 Aennchenstraße 19 024 53177 Bonn 025 Germany 026 E-Mail: poth@lat-lon.de 027 Jens Fitzke 028 lat/lon GmbH 029 Aennchenstraße 19 030 53177 Bonn 031 Germany 032 E-Mail: jens.fitzke@uni-bonn.de 033 ---------------------------------------------------------------------------*/ 034 package org.deegree.owscommon_new; 035 036 import java.net.URI; 037 import java.util.List; 038 039 import org.deegree.datatypes.Code; 040 import org.deegree.datatypes.values.TypedLiteral; 041 import org.deegree.framework.xml.XMLTools; 042 import org.deegree.model.metadata.iso19115.CitedResponsibleParty; 043 import org.deegree.model.metadata.iso19115.Constraints; 044 import org.deegree.model.metadata.iso19115.Keywords; 045 import org.deegree.model.metadata.iso19115.OnlineResource; 046 import org.deegree.ogcbase.CommonNamespaces; 047 import org.w3c.dom.Element; 048 049 /** 050 * <code>XMLFactory</code> for generation of Capabilities XML documents according to the OWS 051 * common specification 1.0.0. 052 * 053 * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a> 054 * @author last edited by: $Author: aschmitz $ 055 * 056 * @version 2.0, $Revision: 6888 $, $Date: 2007-05-08 13:32:27 +0200 (Di, 08 Mai 2007) $ 057 * 058 * @since 2.0 059 */ 060 061 public class XMLFactory extends org.deegree.ogcbase.XMLFactory { 062 063 private static URI OWS = CommonNamespaces.OWSNS; 064 065 private static String POWS = CommonNamespaces.OWS_PREFIX + ":"; 066 067 /** 068 * Exports the given capabilities as XML. 069 * 070 * @param root 071 * the root capabilities element according to the specification of the service 072 * @param caps 073 */ 074 public static void appendBaseCapabilities( Element root, OWSCommonCapabilities caps ) { 075 ServiceIdentification identification = caps.getServiceIdentification(); 076 if ( identification != null ) 077 appendServiceIdentification( root, identification ); 078 079 ServiceProvider provider = caps.getServiceProvider(); 080 if ( provider != null ) 081 appendServiceProvider( root, provider ); 082 083 OperationsMetadata metadata = caps.getOperationsMetadata(); 084 if ( metadata != null ) 085 appendOperationsMetadata( root, metadata ); 086 087 root.setAttribute( "version", caps.getVersion() ); 088 089 String updateSequence = caps.getUpdateSequence(); 090 if ( updateSequence != null ) 091 root.setAttribute( "updateSequence", updateSequence ); 092 } 093 094 /** 095 * Appends a <code>ServiceIdentification</code> object as XML. 096 * 097 * @param root 098 * @param identification 099 */ 100 public static void appendServiceIdentification( Element root, ServiceIdentification identification ) { 101 Element elem = XMLTools.appendElement( root, OWS, POWS + "ServiceIdentification" ); 102 103 String title = identification.getTitle(); 104 if ( title != null ) 105 XMLTools.appendElement( elem, OWS, POWS + "Title", title ); 106 107 String abstractString = identification.getAbstractString(); 108 if ( abstractString != null ) 109 XMLTools.appendElement( elem, OWS, POWS + "Abstract", abstractString ); 110 111 List<Keywords> keywords = identification.getKeywords(); 112 for ( Keywords keys : keywords ) 113 org.deegree.model.metadata.iso19115.XMLFactory.appendKeywords( elem, keys ); 114 115 Code serviceType = identification.getServiceType(); 116 if ( serviceType != null ) 117 org.deegree.model.metadata.iso19115.XMLFactory.appendCode( elem, "Code", serviceType ); 118 119 List<String> versions = identification.getServiceTypeVersions(); 120 for ( String version : versions ) 121 XMLTools.appendElement( elem, OWS, POWS + "ServiceTypeVersion", version ); 122 123 List<Constraints> accessConstraints = identification.getAccessConstraints(); 124 if ( accessConstraints.size() > 0 ) { 125 // append the first fee data from the constraints, ignore the rest 126 String fees = accessConstraints.get( 0 ).getFees(); 127 XMLTools.appendElement( elem, OWS, POWS + "Fees", fees ); 128 129 for ( Constraints constraints : accessConstraints ) 130 org.deegree.model.metadata.iso19115.XMLFactory.appendAccessConstraint( elem, constraints ); 131 } 132 } 133 134 /** 135 * Appends a <code>ServiceProvider</code> object as XML. 136 * 137 * @param root 138 * where to append 139 * @param provider 140 * the object to append 141 */ 142 public static void appendServiceProvider( Element root, ServiceProvider provider ) { 143 Element elem = XMLTools.appendElement( root, OWS, POWS + "ServiceProvider" ); 144 145 String name = provider.getProviderName(); 146 if ( name != null ) 147 XMLTools.appendElement( elem, OWS, POWS + "ProviderName", name ); 148 149 OnlineResource resource = provider.getProviderSite(); 150 if ( resource != null ) { 151 Element resElement = XMLTools.appendElement( elem, OWS, POWS + "ProviderSite" ); 152 org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( resElement, resource ); 153 } 154 155 CitedResponsibleParty party = provider.getServiceContact(); 156 org.deegree.model.metadata.iso19115.XMLFactory.appendCitedResponsibleParty( elem, party ); 157 } 158 159 /** 160 * Appends an <code>OperationsMetadata</code> object as XML. 161 * 162 * @param root 163 * where to append 164 * @param data 165 * what to append 166 */ 167 public static void appendOperationsMetadata( Element root, OperationsMetadata data ) { 168 Element elem = XMLTools.appendElement( root, OWS, POWS + "OperationsMetadata" ); 169 170 List<Operation> operations = data.getOperations(); 171 for ( Operation operation : operations ) 172 appendOperation( elem, operation ); 173 174 List<Parameter> parameters = data.getParameters(); 175 for ( Parameter parameter : parameters ) { 176 if ( parameter instanceof DomainType ) 177 appendDomainType( elem, "Parameter", (DomainType) parameter ); 178 } 179 180 List<DomainType> constraints = data.getConstraints(); 181 for ( DomainType constraint : constraints ) 182 appendDomainType( elem, "Constraint", constraint ); 183 184 // extended capabilities are ignored 185 } 186 187 /** 188 * Appends an <code>Operation</code> object as XML. 189 * 190 * @param root 191 * where to append 192 * @param operation 193 * what to append 194 */ 195 public static void appendOperation( Element root, Operation operation ) { 196 Element elem = XMLTools.appendElement( root, OWS, POWS + "Operation" ); 197 198 List<DCP> dcps = operation.getDCP(); 199 for ( DCP dcp : dcps ) 200 appendDCP( elem, dcp ); 201 202 List<Parameter> parameters = operation.getParameters(); 203 for ( Parameter parameter : parameters ) { 204 if ( parameter instanceof DomainType ) 205 appendDomainType( elem, "Parameter", (DomainType) parameter ); 206 } 207 208 List<DomainType> constraints = operation.getConstraints(); 209 for ( DomainType constraint : constraints ) 210 appendDomainType( elem, "Constraint", constraint ); 211 212 Object md = operation.getMetadata(); 213 if ( md instanceof List ) { 214 List<?> metadata = (List)md; 215 for ( Object obj : metadata ) { 216 if ( obj instanceof Metadata ) 217 appendMetadata( elem, (Metadata) obj ); 218 } 219 } 220 221 elem.setAttribute( "name", operation.getName().getPrefixedName() ); 222 } 223 224 /** 225 * Appends a <code>DCP</code> object as XML. 226 * 227 * @param root 228 * where to append 229 * @param dcp 230 * what to append 231 */ 232 public static void appendDCP( Element root, DCP dcp ) { 233 Element dcpElem = XMLTools.appendElement( root, OWS, POWS + "DCP" ); 234 235 if ( dcp instanceof HTTP ) 236 appendHTTP( dcpElem, (HTTP) dcp ); 237 } 238 239 /** 240 * Appends a <code>HTTP</code> object as XML. 241 * 242 * @param root 243 * where to append 244 * @param http 245 * what to append 246 */ 247 public static void appendHTTP( Element root, HTTP http ) { 248 Element elem = XMLTools.appendElement( root, OWS, POWS + "HTTP" ); 249 250 List<HTTP.Type> types = http.getTypes(); 251 List<List<DomainType>> constraints = http.getConstraints(); 252 List<OnlineResource> links = http.getLinks(); 253 254 for ( int i = 0; i < types.size(); ++i ) { 255 String type = ( types.get( i ) == HTTP.Type.Get ) ? "Get" : "Post"; 256 Element getpost = XMLTools.appendElement( elem, OWS, POWS + type ); 257 org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( getpost, links.get( i ) ); 258 List<DomainType> constraintList = constraints.get( i ); 259 for ( DomainType constraint : constraintList ) 260 appendDomainType( getpost, "Constraint", constraint ); 261 } 262 } 263 264 /** 265 * Appends a <code>DomainType</code> object as XML. 266 * 267 * @param root 268 * where to append 269 * @param tagName 270 * under which name to append 271 * @param data 272 * what to append 273 */ 274 public static void appendDomainType( Element root, String tagName, DomainType data ) { 275 Element elem = XMLTools.appendElement( root, OWS, POWS + tagName ); 276 277 List<TypedLiteral> values = data.getValues(); 278 for ( TypedLiteral value : values ) 279 XMLTools.appendElement( elem, OWS, POWS + "Value", value.getValue() ); 280 281 Object md = data.getMetadata(); 282 if ( md instanceof List ) { 283 List<?> metadata = (List) md; 284 for ( Object obj : metadata ) { 285 if ( obj instanceof Metadata ) 286 appendMetadata( elem, (Metadata) obj ); 287 } 288 } 289 290 elem.setAttribute( "name", data.getName().getPrefixedName() ); 291 } 292 293 /** 294 * Appends a <code>Metadata</code> object as XML. 295 * 296 * @param root 297 * where to append 298 * @param data 299 * what to append 300 */ 301 public static void appendMetadata( Element root, Metadata data ) { 302 Element elem = XMLTools.appendElement( root, OWS, POWS + "Metadata" ); 303 elem.setAttribute( "about", data.getAbout().toASCIIString() ); 304 appendSimpleLinkAttributes( elem, data.getLink() ); 305 } 306 307 }