001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/ogcwebservices/wass/common/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
037 package org.deegree.ogcwebservices.wass.common;
038
039 import java.io.IOException;
040 import java.net.URI;
041 import java.util.ArrayList;
042
043 import org.deegree.framework.log.ILogger;
044 import org.deegree.framework.log.LoggerFactory;
045 import org.deegree.framework.xml.XMLTools;
046 import org.deegree.i18n.Messages;
047 import org.deegree.ogcbase.CommonNamespaces;
048 import org.deegree.ogcwebservices.getcapabilities.DCPType;
049 import org.deegree.ogcwebservices.getcapabilities.Operation;
050 import org.deegree.ogcwebservices.getcapabilities.ServiceIdentification;
051 import org.deegree.ogcwebservices.getcapabilities.ServiceProvider;
052 import org.deegree.ogcwebservices.wass.was.capabilities.WASCapabilities;
053 import org.deegree.ogcwebservices.wass.was.capabilities.WASCapabilitiesDocument;
054 import org.deegree.ogcwebservices.wass.wss.capabilities.WSSCapabilities;
055 import org.deegree.ogcwebservices.wass.wss.capabilities.WSSCapabilitiesDocument;
056 import org.deegree.owscommon.OWSDomainType;
057 import org.w3c.dom.Element;
058 import org.xml.sax.SAXException;
059
060 /**
061 * This is the XMLFactory for both the WAS and the WSS. Please note that it only works with the 1.0
062 * version of the OWS base classes, mostly recognizable by the appendix _1_0.
063 *
064 * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a>
065 * @author last edited by: $Author: mschneider $
066 *
067 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
068 */
069
070 public class XMLFactory extends org.deegree.owscommon.XMLFactory {
071
072 private static final URI WAS = CommonNamespaces.GDINRW_WAS;
073
074 private static final String PWAS = CommonNamespaces.GDINRWWAS_PREFIX + ":";
075
076 private static final URI WSS = CommonNamespaces.GDINRW_WSS;
077
078 private static final String PWSS = CommonNamespaces.GDINRWWSS_PREFIX + ":";
079
080 private static final URI OWS = CommonNamespaces.OWSNS;
081
082 private static final String POWS = CommonNamespaces.OWS_PREFIX + ":";
083
084 private static final URI AUTHN = CommonNamespaces.GDINRW_AUTH;
085
086 private static final String PAUTHN = CommonNamespaces.GDINRW_AUTH_PREFIX + ":";
087
088 private static final ILogger LOG = LoggerFactory.getLogger( XMLFactory.class );
089
090 /**
091 *
092 * Exports the given WAS capabilities as XML document.
093 *
094 * @param capabilities
095 * the data to export
096 * @return the XMLFragment
097 */
098 public static WASCapabilitiesDocument export( WASCapabilities capabilities ) {
099
100 WASCapabilitiesDocument doc = new WASCapabilitiesDocument();
101
102 try {
103 doc.createEmptyDocument();
104 Element root = doc.getRootElement();
105
106 appendBaseCapabilities( capabilities, root );
107 appendExtendedCapabilities( capabilities, root, WAS, PWAS );
108
109 } catch ( SAXException e ) {
110 LOG.logError( Messages.getMessage( "WASS_ERROR_XML_TEMPLATE_NOT_PARSED",
111 new Object[] { "WAS",
112 WASCapabilitiesDocument.XML_TEMPLATE } ),
113 e );
114 } catch ( IOException e ) {
115 LOG.logError( Messages.getMessage( "WASS_ERROR_XML_TEMPLATE_NOT_READ",
116 new Object[] { "WAS",
117 WASCapabilitiesDocument.XML_TEMPLATE } ),
118 e );
119 }
120
121 return doc;
122 }
123
124 /**
125 *
126 * Exports the given WSS capabilities as XML document. Also appends the WSS specific element
127 * SecuredServiceType.
128 *
129 * @param capabilities
130 * the data to export
131 * @return the XMLFragment
132 */
133 public static WSSCapabilitiesDocument export( WSSCapabilities capabilities ) {
134
135 WSSCapabilitiesDocument doc = new WSSCapabilitiesDocument();
136
137 try {
138 doc.createEmptyDocument();
139 Element root = doc.getRootElement();
140
141 appendBaseCapabilities( capabilities, root );
142 Element cap = appendExtendedCapabilities( capabilities, root, WSS, PWSS );
143
144 XMLTools.appendElement( cap, WSS, PWSS + "SecuredServiceType",
145 capabilities.getSecuredServiceType() );
146 } catch ( SAXException e ) {
147 LOG.logError( Messages.getMessage( "WASS_ERROR_XML_TEMPLATE_NOT_PARSED",
148 new Object[] { "WSS",
149 WSSCapabilitiesDocument.XML_TEMPLATE } ),
150 e );
151 } catch ( IOException e ) {
152 LOG.logError( Messages.getMessage( "WASS_ERROR_XML_TEMPLATE_NOT_READ",
153 new Object[] { "WSS",
154 WSSCapabilitiesDocument.XML_TEMPLATE } ),
155 e );
156 }
157
158 return doc;
159 }
160
161 /**
162 *
163 * Appends the WAS/WSS specific capabilities elements, but only those WAS and WSS have in
164 * common.
165 *
166 * @param capabilities
167 * the data to append
168 * @param root
169 * the WAS/WSS_Capabilities element
170 * @param namespace
171 * the namespace URI, WAS or WSS
172 * @param prefix
173 * @return the appended Capability element
174 */
175 private static Element appendExtendedCapabilities( OWSCapabilitiesBaseType_1_0 capabilities,
176 Element root, URI namespace, String prefix ) {
177
178 Element cap = XMLTools.appendElement( root, namespace, prefix + "Capability" );
179 Element sams = XMLTools.appendElement( cap, namespace,
180 prefix + "SupportedAuthenticationMethodList" );
181
182 ArrayList<SupportedAuthenticationMethod> methods = capabilities.getAuthenticationMethods();
183 for ( SupportedAuthenticationMethod method : methods )
184 appendSupportedAuthenticationMethod( sams, method );
185
186
187 return cap;
188 }
189
190 /**
191 *
192 * Appends a SupportedAuthenticationMethod element to the given element.
193 *
194 * @param sams
195 * the SupportedAuthenticationMethodList element
196 * @param method
197 * the data to append
198 */
199 private static void appendSupportedAuthenticationMethod( Element sams,
200 SupportedAuthenticationMethod method ) {
201
202 Element sam = XMLTools.appendElement( sams, AUTHN, PAUTHN + "SupportedAuthenticationMethod" );
203 Element authMethod = XMLTools.appendElement( sam, AUTHN, PAUTHN + "AuthenticationMethod" );
204 authMethod.setAttribute( "id", method.getMethod().toString() );
205
206 String unknownMD = method.getMetadata();
207 if ( unknownMD != null )
208 XMLTools.appendElement( sam, AUTHN, PAUTHN + "UnknownMethodMetadata", unknownMD );
209
210 WASAuthenticationMethodMD metadata = method.getWasMetadata();
211 if ( metadata != null )
212 appendMetadata( sam, metadata );
213
214 }
215
216 /**
217 *
218 * Appends the OWS base capabilities data to the given element.
219 *
220 * @param capabilities
221 * the data to append
222 * @param root
223 * the element to append to, WAS_- or WSS_Capabilities
224 */
225 private static void appendBaseCapabilities( OWSCapabilitiesBaseType_1_0 capabilities,
226 Element root ) {
227
228 root.setAttribute( "version", capabilities.getVersion() );
229 root.setAttribute( "updateSequence", capabilities.getUpdateSequence() );
230
231 // may have to be changed/overwritten (?)
232 ServiceIdentification serviceIdentification = capabilities.getServiceIdentification();
233 if ( serviceIdentification != null )
234 appendServiceIdentification( root, serviceIdentification );
235
236 ServiceProvider serviceProvider = capabilities.getServiceProvider();
237 if ( serviceProvider != null )
238 appendServiceProvider( root, serviceProvider );
239
240 OperationsMetadata_1_0 metadata = capabilities.getOperationsMetadata();
241 if ( metadata != null )
242 appendOperationsMetadata_1_0( root, metadata );
243
244 }
245
246 /**
247 *
248 * Appends an OperationsMetadata element to the given element.
249 *
250 * @param elem
251 * the element to append to
252 * @param operationsMetadata
253 * the data to append
254 */
255 private static void appendOperationsMetadata_1_0( Element elem,
256 OperationsMetadata_1_0 operationsMetadata ) {
257
258 Element root = XMLTools.appendElement( elem, OWS, POWS + "OperationsMetadata" );
259
260 Operation[] operations = operationsMetadata.getAllOperations();
261 for ( Operation operation : operations )
262 appendOperation_1_0( root, (Operation_1_0) operation );
263
264 OWSDomainType[] parameters = operationsMetadata.getParameter();
265 if ( parameters != null )
266 for ( OWSDomainType parameter : parameters )
267 appendParameter( root, parameter, POWS + "Parameter" );
268
269 OWSDomainType[] constraints = operationsMetadata.getConstraints();
270 if ( constraints != null )
271 for ( OWSDomainType constraint : constraints )
272 appendParameter( root, constraint, POWS + "Constraint" );
273
274 String extCap = operationsMetadata.getExtendedCapabilities();
275 if ( extCap != null )
276 XMLTools.appendElement( root, OWS, POWS + "ExtendedCapabilities", extCap );
277
278 }
279
280 /**
281 *
282 * Appends an Operation element to the argument element.
283 *
284 * @param root
285 * the element to append to
286 * @param operation
287 * the data to append
288 */
289 private static void appendOperation_1_0( Element root, Operation_1_0 operation ) {
290
291 Element op = XMLTools.appendElement( root, OWS, POWS + "Operation" );
292
293 op.setAttribute( "Name", operation.getName() );
294
295 DCPType[] dcps = operation.getDCPs();
296 for ( DCPType dcp : dcps )
297 appendDCP( op, dcp );
298
299 OWSDomainType[] parameters = operation.getParameters();
300 for ( OWSDomainType parameter : parameters )
301 appendParameter( op, parameter, "Parameter" );
302
303 OWSDomainType[] constraints = operation.getConstraints();
304 for ( OWSDomainType constraint : constraints )
305 appendParameter( op, constraint, "Constraint" );
306
307 Object[] metadatas = operation.getMetadata();
308 for ( Object metadata : metadatas )
309 appendMetadata( op, metadata );
310
311 }
312
313 }