001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/owscommon_new/OWSCommonCapabilitiesDocument.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003     This file is part of deegree.
004     Copyright (C) 2001-2006 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.net.URISyntaxException;
038    import java.util.ArrayList;
039    import java.util.Arrays;
040    import java.util.Date;
041    import java.util.List;
042    import java.util.Map;
043    
044    import org.deegree.datatypes.Code;
045    import org.deegree.datatypes.QualifiedName;
046    import org.deegree.datatypes.values.TypedLiteral;
047    import org.deegree.datatypes.xlink.SimpleLink;
048    import org.deegree.framework.xml.XMLFragment;
049    import org.deegree.framework.xml.XMLParsingException;
050    import org.deegree.framework.xml.XMLTools;
051    import org.deegree.model.metadata.iso19115.CitedResponsibleParty;
052    import org.deegree.model.metadata.iso19115.Constraints;
053    import org.deegree.model.metadata.iso19115.ISO19115Document;
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>OWSCommonCapabilitiesDocument</code> is the parser class for the
061     * <code>OWSCommonCapabilities</code> data class.
062     * 
063     * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a>
064     * @author last edited by: $Author: aschmitz $
065     * 
066     * @version 2.0, $Revision: 6888 $, $Date: 2007-05-08 13:32:27 +0200 (Di, 08 Mai 2007) $
067     * 
068     * @since 2.0
069     */
070    
071    public class OWSCommonCapabilitiesDocument extends XMLFragment {
072    
073        private static final long serialVersionUID = 5069379023892304513L;
074    
075        private static final String POWS = CommonNamespaces.OWS_PREFIX + ":";
076    
077        private ISO19115Document iso = new ISO19115Document();
078    
079        /**
080         * @param contents the service specific contents
081         * @return the data object containing all parsed information.
082         * @throws XMLParsingException 
083         */
084        public OWSCommonCapabilities parseCapabilities( Map<String, Content> contents )
085                                throws XMLParsingException {
086            Element root = getRootElement();
087    
088            String version = XMLTools.getRequiredNodeAsString( root, "@version", nsContext );
089            String updateSequence = XMLTools.getNodeAsString( root, "@updateSequence", nsContext, null );
090    
091            Element elem = (Element) XMLTools.getNode( root, POWS + "ServiceIdentification", nsContext );
092            ServiceIdentification serviceIdentification = null;
093            if ( elem != null )
094                serviceIdentification = parseServiceIdentification( elem );
095    
096            elem = (Element) XMLTools.getNode( root, POWS + "ServiceProvider", nsContext );
097            ServiceProvider serviceProvider = null;
098            if ( elem != null )
099                serviceProvider = parseServiceProvider( elem );
100    
101            OperationsMetadata operationsMetadata = null;
102            elem = (Element) XMLTools.getNode( root, POWS + "OperationsMetadata", nsContext );
103            if ( elem != null )
104                operationsMetadata = parseOperationsMetadata( elem );
105    
106            OWSCommonCapabilities capabilities = new OWSCommonCapabilities( version, updateSequence,
107                                                                            serviceIdentification,
108                                                                            serviceProvider,
109                                                                            operationsMetadata,
110                                                                            contents );
111            return capabilities;
112        }
113    
114        private OperationsMetadata parseOperationsMetadata( Element root )
115                                throws XMLParsingException {
116            List<Element> operationElements = XMLTools.getRequiredElements( root, POWS + "Operation",
117                                                                         nsContext );
118            if ( operationElements.size() < 2 ) {
119                throw new XMLParsingException( "Too few operations defined in the Operations"
120                                               + "Metadata element." );
121            }
122            
123            List<Operation> operations = new ArrayList<Operation>();
124            for ( Element element : operationElements ) {
125                operations.add( parseOperation( element ) );
126            }
127    
128            List<Element> parameterElements = XMLTools.getElements( root, POWS + "Parameter", nsContext );
129            List<Parameter> parameters = new ArrayList<Parameter>();
130    
131            for ( Element parameter : parameterElements ) {
132                parameters.add( parseDomainType( parameter, true, true, false, false ) );
133            }
134    
135            List<Element> constraintElements = XMLTools.getElements( root, POWS + "Constraint", nsContext );
136            List<DomainType> constraints = new ArrayList<DomainType>();
137    
138            for ( Element constraint : constraintElements ) {
139                constraints.add( parseDomainType( constraint, true, true, false, false ) );
140            }
141    
142            // extended capabilities are ignored for now
143    
144            OperationsMetadata result = new OperationsMetadata( parameters, constraints, operations,
145                                                                null );
146            return result;
147        }
148    
149        private Operation parseOperation( Element root )
150                                throws XMLParsingException {
151            QualifiedName name = XMLTools.getRequiredNodeAsQualifiedName( root, "@name", nsContext );
152    
153            List<DCP> dcps = parseDCPs( root );
154    
155            List<Element> parameterElements = XMLTools.getElements( root, POWS + "Parameter", nsContext );
156            List<Parameter> parameters = new ArrayList<Parameter>();
157    
158            for ( Element parameter : parameterElements )
159                parameters.add( parseDomainType( parameter, true, true, false, false ) );
160    
161            List<Element> constraintElements = XMLTools.getElements( root, POWS + "Constraint", nsContext );
162            List<DomainType> constraints = new ArrayList<DomainType>();
163    
164            for ( Element constraint : constraintElements )
165                constraints.add( parseDomainType( constraint, true, true, false, false ) );
166    
167            List<Element> metadataElements = XMLTools.getElements( root, POWS + "Metadata", nsContext );
168            List<Metadata> metadatas = new ArrayList<Metadata>();
169    
170            for ( Element metadata : metadataElements )
171                metadatas.add( parseMetadata( metadata ) );
172    
173            Operation result = new Operation( name, dcps, parameters, constraints, metadatas, "n/a" );
174            return result;
175        }
176    
177        // parameter should be the element containing the DCP element
178        private List<DCP> parseDCPs( Element root )
179                                throws XMLParsingException {
180            List<DCP> result = new ArrayList<DCP>();
181            List<Element> dcps = XMLTools.getElements( root, POWS + "DCP", nsContext );
182    
183            for ( Element dcp : dcps )
184                result.add( parseHTTP( dcp ) );
185    
186            return result;
187        }
188    
189        private HTTP parseHTTP( Element root )
190                                throws XMLParsingException {
191    
192            List<Element> get = XMLTools.getElements( root, POWS + "HTTP/" + POWS + "Get", nsContext );
193            List<Element> post = XMLTools.getElements( root, POWS + "HTTP/" + POWS + "Post", nsContext );
194    
195            if ( ( get.size() + post.size() ) == 0 )
196                throw new XMLParsingException( "At least one of Get or Post "
197                                               + "must be specified under DCP/HTTP." );
198    
199            List<HTTP.Type> types = new ArrayList<HTTP.Type>();
200            List<OnlineResource> links = new ArrayList<OnlineResource>();
201            List<List<DomainType>> constraints = new ArrayList<List<DomainType>>();
202    
203            for ( Element elem : get ) {
204                OnlineResource link = iso.parseOnlineResource( elem );
205                List<Element> constraintElements = XMLTools.getElements( elem, POWS + "Constraint",
206                                                                      nsContext );
207                List<DomainType> myConstr = new ArrayList<DomainType>();
208                for ( Element constraint : constraintElements )
209                    myConstr.add( parseDomainType( constraint, true, true, false, false ) );
210    
211                types.add( HTTP.Type.Get );
212                constraints.add( myConstr );
213                links.add( link );
214            }
215    
216            for ( Element elem : post ) {
217                OnlineResource link = iso.parseOnlineResource( elem );
218                List<Element> constraintElements = XMLTools.getElements( elem, POWS + "Constraint",
219                                                                      nsContext );
220                List<DomainType> myConstr = new ArrayList<DomainType>();
221                for ( Element constraint : constraintElements )
222                    myConstr.add( parseDomainType( constraint, true, true, false, false ) );
223    
224                types.add( HTTP.Type.Post );
225                constraints.add( myConstr );
226                links.add( link );
227            }
228    
229            return new HTTP( links, constraints, types );
230        }
231    
232        private Metadata parseMetadata( Element root )
233                                throws XMLParsingException {
234            SimpleLink link = parseSimpleLink( root );
235            URI about = XMLTools.getNodeAsURI( root, "@about", nsContext, null );
236            return new Metadata( link, about, null );
237        }
238    
239        private DomainType parseDomainType( Element root, boolean optional, boolean repeatable,
240                                           boolean noValuesAllowed, boolean anyValueAllowed )
241                                throws XMLParsingException {
242            String[] valueArray = XMLTools.getRequiredNodesAsStrings( root, POWS + "Value", nsContext );
243            List<TypedLiteral> values = new ArrayList<TypedLiteral>();
244            URI stringURI = null;
245            try {
246                stringURI = new URI( null, "String", null );
247            } catch ( URISyntaxException e ) {
248                // cannot happen, why do I have to catch this?
249            }
250            for ( String value : valueArray )
251                values.add( new TypedLiteral( value, stringURI ) );
252    
253            List<Element> metadataElements = XMLTools.getElements( root, POWS + "Metadata", nsContext );
254            List<Metadata> metadata = new ArrayList<Metadata>();
255    
256            for ( Element element : metadataElements )
257                metadata.add( parseMetadata( element ) );
258    
259            QualifiedName name = XMLTools.getRequiredNodeAsQualifiedName( root, "@name", nsContext );
260    
261            DomainType result = new DomainType( optional, repeatable, "n/a", 0, name, values, null,
262                                                null, anyValueAllowed, null, noValuesAllowed, null,
263                                                null, null, metadata );
264            return result;
265        }
266    
267        private ServiceProvider parseServiceProvider( Element root )
268                                throws XMLParsingException {
269            String providerName = XMLTools.getRequiredNodeAsString( root, POWS + "ProviderName",
270                                                                    nsContext );
271    
272            OnlineResource providerSite = null;
273            Element siteElement = (Element) XMLTools.getNode( root, POWS + "ProviderSite", nsContext );
274            if ( siteElement != null )
275                providerSite = iso.parseOnlineResource( siteElement );
276    
277            Element partyElement = (Element) XMLTools.getRequiredNode( root, POWS + "ServiceContact",
278                                                                       nsContext );
279            CitedResponsibleParty party = iso.parseCitedResponsibleParty( partyElement );
280    
281            ServiceProvider result = new ServiceProvider( providerName, providerSite, party );
282            return result;
283        }
284    
285        private ServiceIdentification parseServiceIdentification( Element root )
286                                throws XMLParsingException {
287            Element elem = (Element) XMLTools.getRequiredNode( root, POWS + "ServiceType", nsContext );
288            Code serviceType = iso.parseCode( elem );
289    
290            List<String> versions = Arrays.asList( XMLTools.getRequiredNodesAsStrings(
291                                                                                       root,
292                                                                                       POWS
293                                                                                                               + "ServiceTypeVersion",
294                                                                                       nsContext ) );
295    
296            String fee = XMLTools.getNodeAsString( root, POWS + "Fees", nsContext, null );
297    
298            List<Element> constraintElements = XMLTools.getElements( root, POWS + "AccessConstraints",
299                                                                  nsContext );
300            List<Constraints> constraints = new ArrayList<Constraints>();
301    
302            for ( Element constraint : constraintElements )
303                constraints.add( iso.parseConstraint( constraint, fee ) );
304    
305            String title = XMLTools.getNodeAsString( root, POWS + "Title", nsContext, null );
306            String abstractString = XMLTools.getNodeAsString( root, POWS + "Abstract", nsContext, null );
307    
308            List<Element> keywordsElements = XMLTools.getElements( root, POWS + "Keywords", nsContext );
309            List<Keywords> keywords = new ArrayList<Keywords>();
310            for ( Element keyword : keywordsElements )
311                keywords.add( iso.parseKeywords( keyword ) );
312    
313            // the next one is an extension
314            List<String> alternativeTitles = Arrays.asList( XMLTools.getNodesAsStrings(
315                                                                                        root,
316                                                                                        POWS
317                                                                                                                + "AlternateTitle",
318                                                                                        nsContext ) );
319    
320            Date date = new Date( System.currentTimeMillis() );
321    
322            String identification = title;
323    
324            ServiceIdentification result = new ServiceIdentification( serviceType, versions, title,
325                                                                      alternativeTitles, date,
326                                                                      identification, abstractString,
327                                                                      keywords, constraints );
328            return result;
329        }
330    
331    }