001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/ogcwebservices/wps/configuration/WPSConfigurationDocument.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    package org.deegree.ogcwebservices.wps.configuration;
037    
038    import org.deegree.framework.log.ILogger;
039    import org.deegree.framework.log.LoggerFactory;
040    import org.deegree.framework.util.StringTools;
041    import org.deegree.framework.xml.InvalidConfigurationException;
042    import org.deegree.framework.xml.XMLParsingException;
043    import org.deegree.framework.xml.XMLTools;
044    import org.deegree.model.metadata.iso19115.OnlineResource;
045    import org.deegree.ogcwebservices.wps.capabilities.WPSCapabilitiesDocument;
046    import org.deegree.ogcwebservices.wps.execute.RequestQueueManager;
047    import org.w3c.dom.Element;
048    
049    /**
050     * WPSConfigurationDocument.java
051     *
052     * @author <a href="mailto:christian@kiehle.org">Christian Kiehle</a>
053     * @author <a href="mailto:christian.heier@gmx.de">Christian Heier</a>
054     * @author last edited by: $Author: mschneider $
055     *
056     * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
057     */
058    public class WPSConfigurationDocument extends WPSCapabilitiesDocument {
059    
060        protected static final ILogger LOG = LoggerFactory.getLogger( WPSConfigurationDocument.class );
061    
062        /**
063         * Creates a class representation of the document.
064         *
065         * @return class representation of the configuration document
066         */
067        public WPSConfiguration getConfiguration()
068                                throws InvalidConfigurationException {
069            WPSConfiguration WPSConfiguration = null;
070    
071            try {
072                // last Parameter <code>ProcessOfferings</code> set to null, because
073                // <code>WPSConfiguration</code>
074                // constructor is responsible for instantiating ProcessOfferings
075                WPSConfiguration = new WPSConfiguration( parseVersion(), parseUpdateSequence(), getServiceIdentification(),
076                                                         getServiceProvider(), getOperationsMetadata(), null,
077                                                         getDeegreeParams() );
078            } catch ( XMLParsingException e ) {
079                LOG.logError( e.getMessage() );
080                throw new InvalidConfigurationException( e.getMessage() + "\n" + StringTools.stackTraceToString( e ) );
081            }
082            return WPSConfiguration;
083        }
084    
085        /**
086         * Creates the java representation of the <code>deegreeParams</code>- section.
087         *
088         * @return java representation of <code>deegreeParams</code> section
089         * @throws InvalidConfigurationException
090         */
091        public WPSDeegreeParams getDeegreeParams()
092                                throws InvalidConfigurationException {
093            LOG.logInfo( nsContext.toString() );
094            WPSDeegreeParams deegreeParams = null;
095    
096            try {
097                Element element = (Element) XMLTools.getRequiredNode( getRootElement(), "./deegreewps:deegreeParams",
098                                                                      nsContext );
099                OnlineResource defaultOnlineResource = parseOnLineResource( (Element) XMLTools.getRequiredNode(
100                                                                                                                element,
101                                                                                                                "./deegreewps:DefaultOnlineResource",
102                                                                                                                nsContext ) );
103                int cacheSize = XMLTools.getNodeAsInt( element, "./deegreewps:CacheSize/text()", nsContext, 100 );
104                int requestTimeLimit = XMLTools.getNodeAsInt( element, "./deegreewps:RequestTimeLimit/text()", nsContext, 2 );
105    
106                String[] processDirectories = XMLTools.getNodesAsStrings(
107                                                                          element,
108                                                                          "./deegreewps:ProcessDirectoryList/deegreewps:ProcessDirectory/text()",
109                                                                          nsContext );
110                int lengthOfProcessDirectoryList = processDirectories.length;
111                if ( 0 == lengthOfProcessDirectoryList ) {
112                    LOG.logInfo( "No process directory specified. Using configuration document directory." );
113                    processDirectories = new String[] { "." };
114                }
115    
116                for ( int i = 0; i < lengthOfProcessDirectoryList; i++ ) {
117                    try {
118                        processDirectories[i] = resolve( processDirectories[i] ).toURI().getPath();
119                    } catch ( Exception e ) {
120                        LOG.logError( "Process directory '" + processDirectories[i]
121                                      + "' cannot be resolved as a directory: " + e.getMessage(), e );
122                        throw new InvalidConfigurationException(
123                                                                 "Process directory '"
124                                                                                         + processDirectories[i]
125                                                                                         + "' cannot be resolved as a directory: "
126                                                                                         + e.getMessage(), e );
127    
128                    }
129                }
130                RequestQueueManager requestQueueManagerClass = getRequestQueueManagerClass( element );
131    
132                deegreeParams = new WPSDeegreeParams( defaultOnlineResource, cacheSize, requestTimeLimit,
133                                                      processDirectories, requestQueueManagerClass );
134    
135            } catch ( XMLParsingException e ) {
136                LOG.logError( e.getMessage() );
137                throw new InvalidConfigurationException( "Error parsing the deegreeParams "
138                                                         + "section of the WPS configuration: \n" + e.getMessage()
139                                                         + StringTools.stackTraceToString( e ) );
140            }
141            return deegreeParams;
142        }
143    
144        private RequestQueueManager getRequestQueueManagerClass( Element deegreeParamsNode )
145                                throws XMLParsingException {
146    
147            // Get resonsible class for requestqueuemanager from deegreeParams
148            // section
149            RequestQueueManager requestQueueManager = null;
150    
151            String requestQueueManagerClass = XMLTools.getRequiredNodeAsString(
152                                                                                deegreeParamsNode,
153                                                                                "./deegreewps:RequestQueueManager/deegreewps:ResponsibleClass/text()",
154                                                                                nsContext );
155    
156            Object tmp = null;
157            try {
158                tmp = Class.forName( requestQueueManagerClass ).newInstance();
159            } catch ( ClassNotFoundException clnfe ) {
160    
161                String msg = "Responsible class for queue management: '" + requestQueueManagerClass + "' not found.";
162                LOG.logError( msg, clnfe );
163                throw new XMLParsingException( msg, clnfe );
164            } catch ( InstantiationException ia ) {
165    
166                String msg = "Responsible class for queue management: '" + requestQueueManagerClass
167                             + "' can not be instantiated.";
168                LOG.logError( msg, ia );
169                throw new XMLParsingException( msg, ia );
170            } catch ( IllegalAccessException iae ) {
171    
172                String msg = "Responsible class for queue management: '" + requestQueueManagerClass
173                             + "' can not be accessed.";
174    
175                LOG.logError( msg, iae );
176                throw new XMLParsingException( msg, iae );
177            }
178    
179            if ( tmp instanceof RequestQueueManager ) {
180                requestQueueManager = (RequestQueueManager) tmp;
181            } else {
182                String msg = "Responsible class for queue management: '"
183                             + requestQueueManagerClass
184                             + "' does not implement required Interface 'org.deegree.ogcwebservices.wps.execute.RequestQueueManager'.";
185                ;
186                LOG.logError( msg );
187                throw new XMLParsingException( msg );
188            }
189            LOG.logInfo( "requestQueueManager: " + requestQueueManagerClass );
190            return requestQueueManager;
191        }
192    
193    }