001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/ogcwebservices/sos/describeplatform/PlatformDescriptionDocument.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 Aennchenstraße 19
030 53177 Bonn
031 Germany
032 E-Mail: poth@lat-lon.de
033
034 Prof. Dr. Klaus Greve
035 lat/lon GmbH
036 Aennchenstraße 19
037 53177 Bonn
038 Germany
039 E-Mail: greve@giub.uni-bonn.de
040
041 ---------------------------------------------------------------------------*/
042 package org.deegree.ogcwebservices.sos.describeplatform;
043
044 import java.io.IOException;
045 import java.net.URL;
046 import java.util.ArrayList;
047 import java.util.Hashtable;
048 import java.util.List;
049
050 import javax.xml.parsers.ParserConfigurationException;
051 import javax.xml.transform.TransformerException;
052
053 import org.deegree.datatypes.QualifiedName;
054 import org.deegree.framework.util.StringTools;
055 import org.deegree.framework.xml.XMLFragment;
056 import org.deegree.framework.xml.XMLParsingException;
057 import org.deegree.framework.xml.XMLTools;
058 import org.deegree.framework.xml.XSLTDocument;
059 import org.deegree.ogcwebservices.InvalidParameterValueException;
060 import org.deegree.ogcwebservices.OGCWebServiceException;
061 import org.deegree.ogcwebservices.sos.ComponentDescriptionDocument;
062 import org.deegree.ogcwebservices.sos.WFSRequestGenerator;
063 import org.deegree.ogcwebservices.sos.WFSRequester;
064 import org.deegree.ogcwebservices.sos.configuration.SOSDeegreeParams;
065 import org.deegree.ogcwebservices.sos.configuration.SourceServerConfiguration;
066 import org.deegree.ogcwebservices.sos.sensorml.Classifier;
067 import org.deegree.ogcwebservices.sos.sensorml.ComponentDescription;
068 import org.deegree.ogcwebservices.sos.sensorml.EngineeringCRS;
069 import org.deegree.ogcwebservices.sos.sensorml.Identifier;
070 import org.deegree.ogcwebservices.sos.sensorml.LocationModel;
071 import org.w3c.dom.Document;
072 import org.w3c.dom.Node;
073 import org.xml.sax.SAXException;
074
075 /**
076 * gets the platform metadata from a xsl transformed wfs result
077 *
078 * @author <a href="mailto:mkulbe@lat-lon.de">Matthias Kulbe </a>
079 *
080 */
081
082 public class PlatformDescriptionDocument extends ComponentDescriptionDocument {
083
084 private static final String XML_TEMPLATE = "DescribePlatformTemplate.xml";
085
086 /**
087 * creates an document from a template file
088 */
089 public void createEmptyDocument()
090 throws IOException, SAXException {
091 URL url = PlatformDescriptionDocument.class.getResource( XML_TEMPLATE );
092 if ( url == null ) {
093 throw new IOException( "The resource '" + XML_TEMPLATE + " could not be found." );
094 }
095 load( url );
096 }
097
098 /**
099 * gets the platform descriptions from a wfs and transform it with a xslt script
100 *
101 * @param sensors
102 * @return
103 * @throws InvalidParameterValueException
104 * @throws OGCWebServiceException
105 * @throws SAXException
106 * @throws TransformerException
107 */
108 public PlatformMetadata[] getPlatform( SOSDeegreeParams deegreeParams, String[] typNames )
109 throws OGCWebServiceException {
110
111 try {
112
113 // gets the documents from wfs server
114 Document[] docs = getPlatformDescriptionDocuments( deegreeParams, typNames );
115
116 ArrayList<PlatformMetadata> platformMetadata = new ArrayList<PlatformMetadata>( 1000 );
117
118 for ( int d = 0; d < docs.length; d++ ) {
119
120 if ( docs[d] != null ) {
121
122 List nl = XMLTools.getNodes( docs[d], "sml:Platforms/sml:Platform", nsContext );
123
124 // process all platforms in document
125 for ( int y = 0; y < nl.size(); y++ ) {
126
127 Node platformNode = (Node) nl.get( y );
128
129 // get identifiedAs
130 List identifierList = XMLTools.getNodes( platformNode, "sml:identifiedAs", nsContext );
131 if ( ( identifierList == null ) || ( identifierList.size() <= 0 ) ) {
132 throw new XMLParsingException( "at least one identifiedAs required" );
133
134 }
135 ArrayList<Identifier> identifiers = new ArrayList<Identifier>( identifierList.size() );
136 for ( int i = 0; i < identifierList.size(); i++ ) {
137 identifiers.add( getIdentifiedAs( (Node) identifierList.get( i ) ) );
138 }
139
140 // get ClassifiedAs
141 List classifierList = XMLTools.getNodes( platformNode, "sml:classifiedAs", nsContext );
142 ArrayList<Classifier> classifiers = new ArrayList<Classifier>( classifierList.size() );
143 for ( int i = 0; i < classifierList.size(); i++ ) {
144 classifiers.add( getClassifiedAs( (Node) classifierList.get( i ) ) );
145 }
146
147 // get attachedTo
148 String attachedTo = getAttachedTo( XMLTools.getNode( platformNode, "sml:attachedTo", nsContext ) );
149
150 // get hasCRS
151 EngineeringCRS hasCRS = getHasCRS( XMLTools.getNode( platformNode, "sml:hasCRS", nsContext ) );
152
153 // get locatedUsing
154 List locationModelList = XMLTools.getNodes( platformNode, "sml:locatedUsing", nsContext );
155 ArrayList<LocationModel> locationModels = new ArrayList<LocationModel>(
156 locationModelList.size() );
157 for ( int i = 0; i < locationModelList.size(); i++ ) {
158 locationModels.add( getLocatedUsing( (Node) locationModelList.get( i ) ) );
159 }
160
161 // get describedBy
162 ComponentDescription describedBy = getDescribedBy( XMLTools.getNode( platformNode,
163 "sml:describedBy",
164 nsContext ) );
165
166 // get carries
167 List carriesList = XMLTools.getNodes( platformNode, "sml:carries", nsContext );
168 ArrayList<String> carries = new ArrayList<String>( carriesList.size() );
169 for ( int i = 0; i < carriesList.size(); i++ ) {
170 String s = XMLTools.getRequiredNodeAsString( (Node) carriesList.get( i ),
171 "sml:Asset/text()", nsContext );
172 carries.add( s );
173 }
174
175 Identifier[] ids = identifiers.toArray( new Identifier[identifiers.size()] );
176 Classifier[] cls = classifiers.toArray( new Classifier[classifiers.size()] );
177 LocationModel[] lm = locationModels.toArray( new LocationModel[locationModels.size()] );
178 String[] crrs = carries.toArray( new String[carries.size()] );
179 PlatformMetadata pmd = new PlatformMetadata( ids, cls, hasCRS, lm, describedBy, attachedTo,
180 crrs );
181 // add act Metadata to ArrayList
182 platformMetadata.add( pmd );
183 }
184
185 }
186 }
187
188 // return the Array with Sensormetadata
189 PlatformMetadata[] pfmd = new PlatformMetadata[platformMetadata.size()];
190 return platformMetadata.toArray( pfmd );
191
192 } catch ( Exception e ) {
193 e.printStackTrace();
194 throw new OGCWebServiceException( "sos webservice failure" );
195 }
196 }
197
198 /**
199 * requests all servers which serves one of the requested platforms and returns the transformed
200 * result docs
201 *
202 * @param deegreeParams
203 * @param typNames
204 * @return
205 * @throws IOException
206 * @throws IOException
207 * @throws SAXException
208 * @throws ParserConfigurationException
209 * @throws XMLParsingException
210 * @throws TransformerException
211 */
212 private Document[] getPlatformDescriptionDocuments( SOSDeegreeParams dp, String[] typNames )
213 throws IOException, SAXException, XMLParsingException, TransformerException,
214 OGCWebServiceException {
215
216 ArrayList<Document> resultDocuments = new ArrayList<Document>();
217
218 Hashtable<String, ArrayList<String>> servers = new Hashtable<String, ArrayList<String>>();
219
220 for ( int t = 0; t < typNames.length; t++ ) {
221 String sourceServerId = dp.getPlatformConfiguration( typNames[t] ).getSourceServerId();
222
223 if ( servers.containsKey( sourceServerId ) ) {
224 servers.get( sourceServerId ).add( typNames[t] );
225 } else {
226 ArrayList<String> temp = new ArrayList<String>();
227 temp.add( typNames[t] );
228 servers.put( sourceServerId, temp );
229 }
230
231 }
232
233 String[] keySet = servers.keySet().toArray( new String[servers.keySet().size()] );
234
235 // request all servers from servers hashtable
236 for ( int i = 0; i < keySet.length; i++ ) {
237
238 List<String> ids = servers.get( keySet[i] );
239
240 String[] idProps = new String[ids.size()];
241 for ( int a = 0; a < ids.size(); a++ ) {
242 idProps[a] = dp.getPlatformConfiguration( ids.get( a ) ).getIdPropertyValue();
243 }
244
245 QualifiedName pdft = dp.getSourceServerConfiguration( keySet[i] ).getPlatformDescriptionFeatureType();
246 QualifiedName pdid = dp.getSourceServerConfiguration( keySet[i] ).getPlatformDescriptionIdPropertyName();
247 Document request = WFSRequestGenerator.createIsLikeOperationWFSRequest( idProps, pdft, pdid );
248
249 SourceServerConfiguration ssc = dp.getSourceServerConfiguration( keySet[i] );
250
251 Document resultDoc = null;
252 try {
253 resultDoc = WFSRequester.sendWFSrequest( request, ssc.getDataService() );
254 } catch ( Exception e ) {
255 throw new OGCWebServiceException( this.getClass().getName(), "could not get platform data from WFS "
256 + StringTools.stackTraceToString( e ) );
257 }
258 if ( resultDoc != null ) {
259 URL pdxs = dp.getSourceServerConfiguration( keySet[i] ).getPlatformDescriptionXSLTScriptSource();
260 XSLTDocument sheet = new XSLTDocument();
261 sheet.load( pdxs );
262 XMLFragment input = new XMLFragment();
263 input.setRootElement( resultDoc.getDocumentElement() );
264 XMLFragment result = sheet.transform( input );
265 resultDocuments.add( result.getRootElement().getOwnerDocument() );
266 }
267
268 }
269
270 return resultDocuments.toArray( new Document[resultDocuments.size()] );
271 }
272
273 }