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    }