001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/enterprise/servlet/ServiceLookup.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     Aennchenstr. 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    package org.deegree.enterprise.servlet;
044    
045    import java.util.HashMap;
046    import java.util.Iterator;
047    import java.util.Map;
048    
049    import org.deegree.enterprise.ServiceException;
050    import org.deegree.framework.log.ILogger;
051    import org.deegree.framework.log.LoggerFactory;
052    
053    /**
054     * look up class for deegree service handler. The class is 
055     * implemented as singleton to ensure that only one instance and
056     * so just ine mapping is valid with a service instance
057     * 
058     * @version $Revision: 9338 $
059     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
060     * @author last edited by: $Author: apoth $
061     *
062     * @version 1.0. $Revision: 9338 $, $Date: 2007-12-27 13:31:31 +0100 (Do, 27 Dez 2007) $
063     *
064     * @since 2.0
065     */
066    public class ServiceLookup {
067        
068        private static final ILogger LOG = LoggerFactory.getLogger(  ServiceLookup.class );
069        
070        private static ServiceLookup lookup = null;
071        
072        private static Map<String, Class> services;
073        
074        /**
075         * @return static wrapper for a private constructor
076         */
077        public static ServiceLookup getInstance() {
078            if ( lookup == null ) {
079                lookup = new ServiceLookup();
080            }
081            return lookup;
082        }
083        
084        private ServiceLookup() {
085            services = new HashMap<String, Class>();
086        }
087        
088        /**
089         * Maps a web service to the given class
090         * @param key
091         * @param clss
092         */
093        public void addService(String key, Class clss) {
094            services.put( key, clss );
095        }
096        
097        /**
098         * @param key to be removed
099         * @return the handler class to which the key is mapped
100         */
101        public Class removeService(String key) {
102            return services.remove( key );
103        }
104        
105        /**
106         * @param key the webservice of interest
107         * @return its handler class
108         */
109        public Class getService(String key) {
110            return services.get( key );
111        }
112        
113        /**
114         * @return an iterator over all the webservices names.
115         */
116        public Iterator getIterator() {
117            return services.keySet().iterator();
118        }
119        
120        /**
121         * @param serviceName 
122         * @return the Handler of the webservice
123         * @throws ServiceException
124         */
125        public ServiceDispatcher getHandler(String serviceName) throws ServiceException {
126            Class handlerClass = services.get( serviceName );
127    
128            if ( handlerClass == null ) {
129                throw new ServiceException( "Unknown service handler for " + "requested service:" //$NON-NLS-1$ //$NON-NLS-2$
130                                            + serviceName );
131            }
132            ServiceDispatcher handler = null;
133            try {
134                handler = (ServiceDispatcher) handlerClass.newInstance();
135                LOG.logDebug( "Dispatching request to handler '" + handlerClass.getName() + "'." ); //$NON-NLS-1$ //$NON-NLS-2$
136            } catch ( Exception e ) {
137                LOG.logError( "Can't initialize OGC service:" + serviceName, e ); //$NON-NLS-1$
138                throw new ServiceException( "Can't initialize OGC service:" + serviceName ); //$NON-NLS-1$
139            }
140            return handler;
141        }
142        
143        /**
144         * Clear the map
145         */
146        public void clear() {
147            services.clear();
148        }
149    
150    }