001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/ogcwebservices/wass/wss/configuration/WSSConfigurationDocument.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2001-2006 by:
006     EXSE, Department of Geography, University of Bonn
007     http://www.giub.uni-bonn.de/exse/
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     Jens Fitzke
035     Department of Geography
036     University of Bonn
037     Meckenheimer Allee 166
038     53115 Bonn
039     Germany
040     E-Mail: jens.fitzke@uni-bonn.de
041    
042     ---------------------------------------------------------------------------*/
043    
044    package org.deegree.ogcwebservices.wass.wss.configuration;
045    
046    import java.io.IOException;
047    import java.net.URL;
048    
049    import org.deegree.framework.log.ILogger;
050    import org.deegree.framework.log.LoggerFactory;
051    import org.deegree.framework.xml.InvalidConfigurationException;
052    import org.deegree.framework.xml.XMLParsingException;
053    import org.deegree.framework.xml.XMLTools;
054    import org.deegree.i18n.Messages;
055    import org.deegree.io.IODocument;
056    import org.deegree.io.JDBCConnection;
057    import org.deegree.model.metadata.iso19115.OnlineResource;
058    import org.deegree.ogcbase.CommonNamespaces;
059    import org.deegree.ogcwebservices.getcapabilities.InvalidCapabilitiesException;
060    import org.deegree.ogcwebservices.wass.common.Operation_1_0;
061    import org.deegree.ogcwebservices.wass.wss.capabilities.WSSCapabilities;
062    import org.deegree.ogcwebservices.wass.wss.capabilities.WSSCapabilitiesDocument;
063    import org.w3c.dom.Element;
064    import org.w3c.dom.Node;
065    import org.xml.sax.SAXException;
066    
067    /**
068     * This class is called from the WSServiceFactory to read a configuration xml file. This file
069     * consains all the capabilities this Web Security Service is able to. The standard calling
070     * procedure is new WSSConfigurationDocument().getConfiguration( url_to_file ). This method returns
071     * the "bean" in form of a WSSConfiguration class, which can be queried for it's values.
072     * 
073     * @see WSSConfiguration
074     * 
075     * @author <a href="mailto:bezema@lat-lon.de">Rutger Bezema</a>
076     * @author last edited by: $Author: aschmitz $
077     * 
078     * @version 2.0, $Revision: 7341 $, $Date: 2007-05-29 14:03:14 +0200 (Di, 29 Mai 2007) $
079     * 
080     * @since 2.0
081     */
082    
083    public class WSSConfigurationDocument extends WSSCapabilitiesDocument {
084        /**
085         * 
086         */
087        private static final long serialVersionUID = 4612405238432274887L;
088    
089        /**
090         * The logger enhances the quality and simplicity of Debugging within the deegree2 framework
091         */
092        private static final ILogger LOG = LoggerFactory.getLogger( WSSConfigurationDocument.class );
093    
094        private static final String DBPRE = CommonNamespaces.DGJDBC_PREFIX + ":";
095    
096        /**
097         * Loads the configuration file located at the given urls location.
098         * 
099         * @param serviceConfigurationUrl
100         *            the url to the configuration file
101         * @return a WSSConfiguration which is a "bean" representation of the configuration xml document
102         * @throws InvalidConfigurationException
103         *             if an error occrur either with opening or parsing the xml configuration file.
104         * @throws InvalidCapabilitiesException 
105         */
106        public WSSConfiguration parseConfiguration( URL serviceConfigurationUrl )
107                                throws InvalidConfigurationException, InvalidCapabilitiesException {
108            
109    
110            WSSConfiguration result = null;
111            try {
112                load( serviceConfigurationUrl );
113                WSSCapabilities capabilities = (WSSCapabilities) parseCapabilities();
114                boolean doService = false;
115                for( Operation_1_0 operation : capabilities.getOperationsMetadata().getAllOperations() ){
116                    if( "DoService".equals(operation.getName()) ){
117                        doService = true;
118                        break;
119                    }
120                }
121                
122                if( !doService ) 
123                    throw new InvalidCapabilitiesException(
124                                                           Messages.getMessage(
125                                                                           "WASS_ERROR_CAPABILITIES_MISSING_REQUIRED_OPERATION",
126                                                           "DoService" ) );
127                
128                WSSDeegreeParams deegreeParams = parseDeegreeParams( );
129                result = new WSSConfiguration( capabilities, deegreeParams );
130            } catch ( IOException e ) {
131                LOG.logError( e.getLocalizedMessage(), e );
132                throw new InvalidConfigurationException(
133                                                         Messages.getMessage(
134                                                                          "WASS_ERROR_CONFIGURATION_NOT_READ",
135                                                                          "WSS" ), e );
136            } catch ( SAXException e ) {
137                LOG.logError( e.getLocalizedMessage(), e );
138                throw new InvalidConfigurationException(
139                                                         Messages.getMessage(
140                                                                          "WASS_ERROR_CONFIGURATION_NOT_PARSED",
141                                                                          "WSS" ), e );
142            } catch ( XMLParsingException e ) {
143                LOG.logError( e.getLocalizedMessage(), e );
144                throw new InvalidConfigurationException(
145                                                         Messages.getMessage(
146                                                                          "WASS_ERROR_CONFIGURATION_NOT_PARSED",
147                                                                          "WSS" ), e );
148            }
149    
150            
151            return result;
152        }
153    
154        /**
155         * Creates a class representation of the <code>deegreeParams</code>- section which are wss
156         * specific.
157         * 
158         * @return the deegree parameter data
159         * @throws XMLParsingException 
160         */
161        private WSSDeegreeParams parseDeegreeParams()
162                                throws XMLParsingException {
163            
164            WSSDeegreeParams deegreeParams = null;
165    
166            final String preWSS = CommonNamespaces.DEEGREEWSS_PREFIX + ":";
167            Node root = this.getRootElement();
168    
169            Element element = (Element) XMLTools.getRequiredNode( root, preWSS + "deegreeParam",
170                                                                  nsContext );
171    
172            OnlineResource defaultOnlineResource = null;
173            defaultOnlineResource = parseOnLineResource( (Element) XMLTools.getRequiredNode(
174                                                                                             element,
175                                                                                             preWSS
176                                                                                                                     + "DefaultOnlineResource",
177                                                                                             nsContext ) );
178    
179            // 'deegreecsw:CacheSize'-element (optional, default: 100)
180            int cacheSize = 0;
181            cacheSize = XMLTools.getNodeAsInt( element, preWSS + "CacheSize", nsContext, 100 );
182    
183            // 'deegreecsw:RequestTimeLimit'-element (optional, default: 15)
184            int requestTimeLimit = XMLTools.getNodeAsInt( element, preWSS + "RequestTimeLimit",
185                                                              nsContext, 15 );
186            requestTimeLimit *= 1000;
187            
188    
189            // 'deegreecsw:Encoding'-element (optional, default: UTF-8)
190            String characterSet = null;
191            characterSet = XMLTools.getNodeAsString( element, preWSS + "Encoding", nsContext, "UTF-8" );
192    
193            StringBuffer sb = new StringBuffer().append( "/" ).append( preWSS );
194            sb.append( "OnlineResource" );
195            StringBuffer sor = new StringBuffer( preWSS ).append( "SecuredServiceAddress" ).append( sb );
196            OnlineResource securedOnlineResource = null;
197            securedOnlineResource = parseOnLineResource( (Element) XMLTools.getRequiredNode(
198                                                                                             element,
199                                                                                             sor.toString(),
200                                                                                             nsContext ) );
201    
202            StringBuffer aor = new StringBuffer( preWSS );
203            aor.append( "AuthenticationServiceAddress" ).append( sb );
204            OnlineResource authOnlineResource = null;
205            authOnlineResource = parseOnLineResource( (Element) XMLTools.getRequiredNode(
206                                                                                          element,
207                                                                                          aor.toString(),
208                                                                                          nsContext ) );
209            
210            int sessionLifetime = XMLTools.getNodeAsInt( element, preWSS + "SessionLifetime",
211                                                          nsContext, 1200 );
212            sessionLifetime *= 1000;
213            
214            // parse database connection
215            Element database = (Element)XMLTools.getNode( element, DBPRE + "JDBCConnection", nsContext );
216            JDBCConnection dbConnection = null;
217            if( database != null ) {
218                IODocument io = new IODocument( database );
219                dbConnection = io.parseJDBCConnection();
220            }
221           
222            deegreeParams = new WSSDeegreeParams( defaultOnlineResource, cacheSize, requestTimeLimit,
223                                                  characterSet, securedOnlineResource,
224                                                  authOnlineResource, sessionLifetime, dbConnection );
225    
226            
227            return deegreeParams;
228        }
229    }