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 }