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