001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/owscommon_new/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 ---------------------------------------------------------------------------*/ 044 package org.deegree.owscommon_new; 045 046 import java.net.URI; 047 import java.util.List; 048 049 import org.deegree.datatypes.Code; 050 import org.deegree.datatypes.values.TypedLiteral; 051 import org.deegree.framework.xml.XMLTools; 052 import org.deegree.model.metadata.iso19115.CitedResponsibleParty; 053 import org.deegree.model.metadata.iso19115.Constraints; 054 import org.deegree.model.metadata.iso19115.Keywords; 055 import org.deegree.model.metadata.iso19115.OnlineResource; 056 import org.deegree.ogcbase.CommonNamespaces; 057 import org.w3c.dom.Element; 058 059 /** 060 * <code>XMLFactory</code> for generation of Capabilities XML documents according to the OWS 061 * common specification 1.0.0. 062 * 063 * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a> 064 * @author last edited by: $Author: apoth $ 065 * 066 * @version 2.0, $Revision: 9346 $, $Date: 2007-12-27 17:39:07 +0100 (Do, 27 Dez 2007) $ 067 * 068 * @since 2.0 069 */ 070 071 public class XMLFactory extends org.deegree.ogcbase.XMLFactory { 072 073 private static URI OWS = CommonNamespaces.OWSNS; 074 075 private static String POWS = CommonNamespaces.OWS_PREFIX + ":"; 076 077 /** 078 * Exports the given capabilities as XML. 079 * 080 * @param root 081 * the root capabilities element according to the specification of the service 082 * @param caps 083 */ 084 public static void appendBaseCapabilities( Element root, OWSCommonCapabilities caps ) { 085 ServiceIdentification identification = caps.getServiceIdentification(); 086 if ( identification != null ) 087 appendServiceIdentification( root, identification ); 088 089 ServiceProvider provider = caps.getServiceProvider(); 090 if ( provider != null ) 091 appendServiceProvider( root, provider ); 092 093 OperationsMetadata metadata = caps.getOperationsMetadata(); 094 if ( metadata != null ) 095 appendOperationsMetadata( root, metadata ); 096 097 root.setAttribute( "version", caps.getVersion() ); 098 099 String updateSequence = caps.getUpdateSequence(); 100 if ( updateSequence != null ) 101 root.setAttribute( "updateSequence", updateSequence ); 102 } 103 104 /** 105 * Appends a <code>ServiceIdentification</code> object as XML. 106 * 107 * @param root 108 * @param identification 109 */ 110 public static void appendServiceIdentification( Element root, ServiceIdentification identification ) { 111 Element elem = XMLTools.appendElement( root, OWS, POWS + "ServiceIdentification" ); 112 113 String title = identification.getTitle(); 114 if ( title != null ) 115 XMLTools.appendElement( elem, OWS, POWS + "Title", title ); 116 117 String abstractString = identification.getAbstractString(); 118 if ( abstractString != null ) 119 XMLTools.appendElement( elem, OWS, POWS + "Abstract", abstractString ); 120 121 List<Keywords> keywords = identification.getKeywords(); 122 for ( Keywords keys : keywords ) 123 org.deegree.model.metadata.iso19115.XMLFactory.appendKeywords( elem, keys ); 124 125 Code serviceType = identification.getServiceType(); 126 if ( serviceType != null ) 127 org.deegree.model.metadata.iso19115.XMLFactory.appendCode( elem, "Code", serviceType ); 128 129 List<String> versions = identification.getServiceTypeVersions(); 130 for ( String version : versions ) 131 XMLTools.appendElement( elem, OWS, POWS + "ServiceTypeVersion", version ); 132 133 List<Constraints> accessConstraints = identification.getAccessConstraints(); 134 if ( accessConstraints.size() > 0 ) { 135 // append the first fee data from the constraints, ignore the rest 136 String fees = accessConstraints.get( 0 ).getFees(); 137 XMLTools.appendElement( elem, OWS, POWS + "Fees", fees ); 138 139 for ( Constraints constraints : accessConstraints ) 140 org.deegree.model.metadata.iso19115.XMLFactory.appendAccessConstraint( elem, constraints ); 141 } 142 } 143 144 /** 145 * Appends a <code>ServiceProvider</code> object as XML. 146 * 147 * @param root 148 * where to append 149 * @param provider 150 * the object to append 151 */ 152 public static void appendServiceProvider( Element root, ServiceProvider provider ) { 153 Element elem = XMLTools.appendElement( root, OWS, POWS + "ServiceProvider" ); 154 155 String name = provider.getProviderName(); 156 if ( name != null ) 157 XMLTools.appendElement( elem, OWS, POWS + "ProviderName", name ); 158 159 OnlineResource resource = provider.getProviderSite(); 160 if ( resource != null ) { 161 Element resElement = XMLTools.appendElement( elem, OWS, POWS + "ProviderSite" ); 162 org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( resElement, resource ); 163 } 164 165 CitedResponsibleParty party = provider.getServiceContact(); 166 org.deegree.model.metadata.iso19115.XMLFactory.appendCitedResponsibleParty( elem, party ); 167 } 168 169 /** 170 * Appends an <code>OperationsMetadata</code> object as XML. 171 * 172 * @param root 173 * where to append 174 * @param data 175 * what to append 176 */ 177 public static void appendOperationsMetadata( Element root, OperationsMetadata data ) { 178 Element elem = XMLTools.appendElement( root, OWS, POWS + "OperationsMetadata" ); 179 180 List<Operation> operations = data.getOperations(); 181 for ( Operation operation : operations ) 182 appendOperation( elem, operation ); 183 184 List<Parameter> parameters = data.getParameters(); 185 for ( Parameter parameter : parameters ) { 186 if ( parameter instanceof DomainType ) 187 appendDomainType( elem, "Parameter", (DomainType) parameter ); 188 } 189 190 List<DomainType> constraints = data.getConstraints(); 191 for ( DomainType constraint : constraints ) 192 appendDomainType( elem, "Constraint", constraint ); 193 194 // extended capabilities are ignored 195 } 196 197 /** 198 * Appends an <code>Operation</code> object as XML. 199 * 200 * @param root 201 * where to append 202 * @param operation 203 * what to append 204 */ 205 public static void appendOperation( Element root, Operation operation ) { 206 Element elem = XMLTools.appendElement( root, OWS, POWS + "Operation" ); 207 208 List<DCP> dcps = operation.getDCP(); 209 for ( DCP dcp : dcps ) 210 appendDCP( elem, dcp ); 211 212 List<Parameter> parameters = operation.getParameters(); 213 for ( Parameter parameter : parameters ) { 214 if ( parameter instanceof DomainType ) 215 appendDomainType( elem, "Parameter", (DomainType) parameter ); 216 } 217 218 List<DomainType> constraints = operation.getConstraints(); 219 for ( DomainType constraint : constraints ) 220 appendDomainType( elem, "Constraint", constraint ); 221 222 Object md = operation.getMetadata(); 223 if ( md instanceof List ) { 224 List<?> metadata = (List)md; 225 for ( Object obj : metadata ) { 226 if ( obj instanceof Metadata ) 227 appendMetadata( elem, (Metadata) obj ); 228 } 229 } 230 231 elem.setAttribute( "name", operation.getName().getPrefixedName() ); 232 } 233 234 /** 235 * Appends a <code>DCP</code> object as XML. 236 * 237 * @param root 238 * where to append 239 * @param dcp 240 * what to append 241 */ 242 public static void appendDCP( Element root, DCP dcp ) { 243 Element dcpElem = XMLTools.appendElement( root, OWS, POWS + "DCP" ); 244 245 if ( dcp instanceof HTTP ) 246 appendHTTP( dcpElem, (HTTP) dcp ); 247 } 248 249 /** 250 * Appends a <code>HTTP</code> object as XML. 251 * 252 * @param root 253 * where to append 254 * @param http 255 * what to append 256 */ 257 public static void appendHTTP( Element root, HTTP http ) { 258 Element elem = XMLTools.appendElement( root, OWS, POWS + "HTTP" ); 259 260 List<HTTP.Type> types = http.getTypes(); 261 List<List<DomainType>> constraints = http.getConstraints(); 262 List<OnlineResource> links = http.getLinks(); 263 264 for ( int i = 0; i < types.size(); ++i ) { 265 String type = ( types.get( i ) == HTTP.Type.Get ) ? "Get" : "Post"; 266 Element getpost = XMLTools.appendElement( elem, OWS, POWS + type ); 267 org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( getpost, links.get( i ) ); 268 List<DomainType> constraintList = constraints.get( i ); 269 for ( DomainType constraint : constraintList ) 270 appendDomainType( getpost, "Constraint", constraint ); 271 } 272 } 273 274 /** 275 * Appends a <code>DomainType</code> object as XML. 276 * 277 * @param root 278 * where to append 279 * @param tagName 280 * under which name to append 281 * @param data 282 * what to append 283 */ 284 public static void appendDomainType( Element root, String tagName, DomainType data ) { 285 Element elem = XMLTools.appendElement( root, OWS, POWS + tagName ); 286 287 List<TypedLiteral> values = data.getValues(); 288 for ( TypedLiteral value : values ) 289 XMLTools.appendElement( elem, OWS, POWS + "Value", value.getValue() ); 290 291 Object md = data.getMetadata(); 292 if ( md instanceof List ) { 293 List<?> metadata = (List) md; 294 for ( Object obj : metadata ) { 295 if ( obj instanceof Metadata ) 296 appendMetadata( elem, (Metadata) obj ); 297 } 298 } 299 300 elem.setAttribute( "name", data.getName().getPrefixedName() ); 301 } 302 303 /** 304 * Appends a <code>Metadata</code> object as XML. 305 * 306 * @param root 307 * where to append 308 * @param data 309 * what to append 310 */ 311 public static void appendMetadata( Element root, Metadata data ) { 312 Element elem = XMLTools.appendElement( root, OWS, POWS + "Metadata" ); 313 elem.setAttribute( "about", data.getAbout().toASCIIString() ); 314 appendSimpleLinkAttributes( elem, data.getLink() ); 315 } 316 317 }