001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/ogcwebservices/wps/configuration/WPSConfiguration.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2007 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 Prof. Dr. Klaus Greve
035 Department of Geography
036 University of Bonn
037 Meckenheimer Allee 166
038 53115 Bonn
039 Germany
040 E-Mail: greve@giub.uni-bonn.de
041
042 ---------------------------------------------------------------------------*/
043 /**
044 * asdfasd
045 */
046 package org.deegree.ogcwebservices.wps.configuration;
047
048 import java.io.File;
049 import java.io.IOException;
050 import java.lang.reflect.Constructor;
051 import java.lang.reflect.InvocationTargetException;
052 import java.net.URL;
053 import java.util.ArrayList;
054 import java.util.HashMap;
055 import java.util.Iterator;
056 import java.util.List;
057 import java.util.Map;
058
059 import org.deegree.framework.log.ILogger;
060 import org.deegree.framework.log.LoggerFactory;
061 import org.deegree.framework.util.ConvenienceFileFilter;
062 import org.deegree.framework.xml.InvalidConfigurationException;
063 import org.deegree.framework.xml.XMLParsingException;
064 import org.deegree.ogcwebservices.getcapabilities.Contents;
065 import org.deegree.ogcwebservices.getcapabilities.InvalidCapabilitiesException;
066 import org.deegree.ogcwebservices.getcapabilities.OperationsMetadata;
067 import org.deegree.ogcwebservices.getcapabilities.ServiceIdentification;
068 import org.deegree.ogcwebservices.getcapabilities.ServiceProvider;
069 import org.deegree.ogcwebservices.wps.ProcessBrief;
070 import org.deegree.ogcwebservices.wps.capabilities.ProcessOfferings;
071 import org.deegree.ogcwebservices.wps.capabilities.WPSCapabilities;
072 import org.deegree.ogcwebservices.wps.describeprocess.ProcessDescription;
073 import org.deegree.ogcwebservices.wps.describeprocess.ProcessDescriptionDocument;
074 import org.deegree.ogcwebservices.wps.execute.Process;
075 import org.xml.sax.SAXException;
076
077 /**
078 * WPSConfiguration.java
079 *
080 * Created on 08.03.2006. 17:58:55h
081 *
082 * @author <a href="mailto:christian@kiehle.org">Christian Kiehle</a>
083 * @author <a href="mailto:christian.heier@gmx.de">Christian Heier</a>
084 * @version 1.0.
085 * @since 2.0
086 */
087 public class WPSConfiguration extends WPSCapabilities {
088
089 private static final ILogger LOG = LoggerFactory.getLogger( WPSConfiguration.class );
090
091 private WPSDeegreeParams deegreeParams = null;
092
093 private Map<String, Process> registeredProcesses;
094
095 private static final String SPEC_PROC_DIR = "Specified process directory '";
096
097 /**
098 * Constructor initializes WPSConfiguration from passed parameters
099 *
100 * @param version
101 * @param updateSequence
102 * @param serviceIdentification
103 * @param serviceProvider
104 * @param operationsMetadata
105 * @param contents
106 * @throws InvalidConfigurationException
107 */
108 protected WPSConfiguration( String version, String updateSequence, ServiceIdentification serviceIdentification,
109 ServiceProvider serviceProvider, OperationsMetadata operationsMetadata,
110 Contents contents, WPSDeegreeParams wpsDeegreeParams )
111 throws InvalidConfigurationException {
112 super( version, updateSequence, serviceIdentification, serviceProvider, operationsMetadata, contents );
113 this.deegreeParams = wpsDeegreeParams;
114 try {
115 loadProcessConfigs();
116 setConfiguredProcessOfferings();
117 } catch ( InvalidConfigurationException e ) {
118 LOG.logError( e.getMessage(), e );
119 throw e;
120 }
121 }
122
123 private void setConfiguredProcessOfferings() {
124
125 List<ProcessBrief> processBriefList = new ArrayList<ProcessBrief>();
126
127 Iterator<Process> registeredProcessesValuesIterator = registeredProcesses.values().iterator();
128
129 while ( registeredProcessesValuesIterator.hasNext() ) {
130 Process process = registeredProcessesValuesIterator.next();
131
132 ProcessDescription processDescription = process.getProcessDescription();
133
134 processBriefList.add( new ProcessBrief( processDescription.getIdentifier(), processDescription.getTitle(),
135 processDescription.getAbstract(),
136 processDescription.getProcessVersion(),
137 processDescription.getMetadata() ) );
138 }
139
140 ProcessOfferings processOfferings = new ProcessOfferings( processBriefList );
141
142 super.setProcessOfferings( processOfferings );
143 }
144
145 /**
146 * @return Returns the registeredProcesses.
147 */
148 public Map<String, Process> getRegisteredProcesses() {
149 return registeredProcesses;
150 }
151
152 /**
153 * loads and initializes processes configured in the process directory.
154 *
155 * @throws InvalidConfigurationException
156 */
157 private void loadProcessConfigs()
158 throws InvalidConfigurationException {
159 this.registeredProcesses = scanForRegisteredProcesses();
160
161 }
162
163 /**
164 * Scans for process configuration documents located in process directory of current WPS
165 * configuration.
166 *
167 * @return Map<String, Process>
168 * @throws InvalidConfigurationException
169 */
170 private Map<String, Process> scanForRegisteredProcesses()
171 throws InvalidConfigurationException {
172 List<String> fileNameList = new ArrayList<String>();
173 String[] processDirectories = getDeegreeParams().getProcessDirectories();
174
175 for ( int i = 0; i < processDirectories.length; i++ ) {
176 File file = new File( processDirectories[i] );
177 LOG.logInfo( "Directory '" + file.getAbsolutePath() + "' will be scanned for process configuration files." );
178 String[] list = file.list( new ConvenienceFileFilter( false, "XML" ) );
179 if ( list != null ) {
180 if ( list.length == 0 ) {
181 String msg = SPEC_PROC_DIR + processDirectories[i] + "' does not contain any '.xml' files.";
182 LOG.logError( msg );
183 throw new InvalidConfigurationException( msg );
184 }
185 for ( int j = 0; j < list.length; j++ ) {
186 fileNameList.add( processDirectories[i] + '/' + list[j] );
187 }
188 } else {
189 String msg = SPEC_PROC_DIR + processDirectories[i] + "' does not denote a directory.";
190 LOG.logError( msg );
191 throw new InvalidConfigurationException( msg );
192 }
193 }
194 String[] fileNames = fileNameList.toArray( new String[fileNameList.size()] );
195 return extractProcessDescriptions( fileNames );
196 }
197
198 /**
199 * Extracts a <code>ProcessDescription</code> for each provided files in <code>String[]</code>
200 * fileNames.
201 *
202 * @param fileNames
203 * @return
204 * @throws InvalidConfigurationException
205 */
206 private Map<String, Process> extractProcessDescriptions( String[] fileNames )
207 throws InvalidConfigurationException {
208 int size = fileNames.length;
209 Map<String, Process> processMap = new HashMap<String, Process>( size );
210 for ( int i = 0; i < size; i++ ) {
211 LOG.logInfo( "Parsing process configuration file: '" + fileNames[i] + "'." );
212 Process process = null;
213 try {
214 URL fileURL = new File( fileNames[i] ).toURL();
215 ProcessDescriptionDocument processDescriptionDocument = new ProcessDescriptionDocument();
216 processDescriptionDocument.load( fileURL );
217 ProcessDescription processDescription = processDescriptionDocument.parseProcessDescription();
218
219 String className = processDescription.getResponsibleClass();
220 try {
221 Class processClass = Class.forName( className );
222 Constructor con = processClass.getConstructor( ProcessDescription.class );
223 process = (Process) con.newInstance( processDescription );
224 } catch ( ClassNotFoundException cnfEx ) {
225 String msg = "Responsible class for process execution: '" + className + "' not found.";
226 LOG.logError( msg, cnfEx );
227 throw new XMLParsingException( msg, cnfEx );
228 } catch ( NoSuchMethodException nsmEx ) {
229 String msg = "Responsible class for process execution: '" + className
230 + "' can not be instantiated.";
231 LOG.logError( msg, nsmEx );
232 throw new XMLParsingException( msg, nsmEx );
233 } catch ( InstantiationException iEx ) {
234 String msg = "Responsible class for process execution: '" + className
235 + "' can not be instantiated.";
236 LOG.logError( msg, iEx );
237 throw new XMLParsingException( msg, iEx );
238 } catch ( InvocationTargetException itEx ) {
239 String msg = "Responsible class for process execution: '" + className
240 + "' can not be instantiated.";
241 LOG.logError( msg, itEx );
242 throw new XMLParsingException( msg, itEx );
243 } catch ( IllegalAccessException iaEx ) {
244 String msg = "Responsible class for process execution: '" + className
245 + "' can not be instantiated.";
246 LOG.logError( msg, iaEx );
247 throw new XMLParsingException( msg, iaEx );
248 }
249
250 String processKey = processDescription.getIdentifier().getCode().toUpperCase();
251 if ( !processMap.containsKey( processKey ) ) {
252 processMap.put( processKey, process );
253 LOG.logDebug( "Process '" + processKey + "' registered to server." );
254 } else {
255 String msg = "Multiple definition of process '" + processKey + "' not allowed! Process '"
256 + processKey + "' is already defined.";
257 LOG.logError( msg );
258 throw new InvalidConfigurationException( msg );
259 }
260
261 } catch ( IOException ioe ) {
262 String msg = "Error loading '" + fileNames[i] + "': " + ioe.getMessage();
263 LOG.logError( msg );
264 throw new InvalidConfigurationException( msg, ioe );
265 } catch ( Exception e ) {
266 String msg = "Error parsing '" + fileNames[i] + "': " + e.getMessage();
267 LOG.logError( msg );
268 throw new InvalidConfigurationException( msg, e );
269 }
270 }
271
272 return processMap;
273 }
274
275 /**
276 * @return Returns the deegreeParams.
277 */
278 public WPSDeegreeParams getDeegreeParams() {
279 return deegreeParams;
280 }
281
282 /**
283 * @param deegreeParams
284 * The deegreeParams to set.
285 */
286 public void setDeegreeParams( WPSDeegreeParams deegreeParams ) {
287 this.deegreeParams = deegreeParams;
288 }
289
290 /**
291 *
292 * @param url
293 * @return
294 * @throws IOException
295 * @throws SAXException
296 * @throws InvalidCapabilitiesException
297 * @throws InvalidConfigurationException
298 */
299 public static WPSConfiguration createConfiguration( URL url )
300 throws IOException, SAXException, InvalidConfigurationException {
301 WPSConfigurationDocument confDoc = new WPSConfigurationDocument();
302 confDoc.load( url );
303 WPSConfiguration configuration = confDoc.getConfiguration();
304
305 return configuration;
306 }
307
308 }