001    /** 
002     * 
003     * Copyright 2004 Protique Ltd
004     * 
005     * Licensed under the Apache License, Version 2.0 (the "License"); 
006     * you may not use this file except in compliance with the License. 
007     * You may obtain a copy of the License at 
008     * 
009     * http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS, 
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
014     * See the License for the specific language governing permissions and 
015     * limitations under the License. 
016     * 
017     **/
018    package org.codehaus.activesoap.handler;
019    
020    import org.codehaus.activesoap.handler.ProcedureNotPresentHandler;
021    import org.codehaus.activesoap.handler.QNameHandler;
022    import org.codehaus.activesoap.HandlerRegistry;
023    import org.codehaus.activesoap.Handler;
024    
025    import javax.xml.namespace.QName;
026    import java.util.HashMap;
027    import java.util.Map;
028    
029    /**
030     * Provides a registry of handlers indexed by specific {@link QName}
031     * instances as well as providing a default handler which is used for processing
032     * SOAP body elements (or REST root elements) if no QName could be matched.
033     *
034     * @version $Revision: 1.1 $
035     */
036    public class DefaultHandlerRegistry implements HandlerRegistry {
037        private Map handlers = new HashMap();
038        private Handler defaultHandler;
039        private Handler bodyHandler;
040    
041        public DefaultHandlerRegistry() {
042            this(ProcedureNotPresentHandler.getInstance());
043        }
044    
045        public DefaultHandlerRegistry(Handler defaultHandler) {
046            this.defaultHandler = defaultHandler;
047            this.bodyHandler = new QNameHandler(this);
048        }
049    
050    
051        public synchronized Handler getHandler(QName name) {
052            Handler answer = (Handler) handlers.get(name);
053            if (answer == null) {
054                answer = (Handler) handlers.get(name.getNamespaceURI());
055            }
056            return answer;
057        }
058    
059        public synchronized void addHandler(String namepaceURI, Handler handler) {
060            handlers.put(namepaceURI, handler);
061        }
062    
063        public void addHandler(String[] namespaceURIs, Handler handler) {
064            for (int i = 0; i < namespaceURIs.length; i++) {
065                String namespaceURI = namespaceURIs[i];
066                addHandler(namespaceURI, handler);
067            }
068        }
069    
070    
071        public void removeHandler(String[] namespaceURIs, Handler handler) {
072            for (int i = 0; i < namespaceURIs.length; i++) {
073                String namespaceURI = namespaceURIs[i];
074                removeHandler(namespaceURI, handler);
075            }
076        }
077    
078        public synchronized void addHandler(QName name, Handler handler) {
079            handlers.put(name, handler);
080        }
081    
082        public synchronized Handler removeHandler(QName name) {
083            return (Handler) handlers.remove(name);
084        }
085    
086        public synchronized Handler removeHandler(String namepaceURI) {
087            return (Handler) handlers.remove(namepaceURI);
088        }
089    
090        public synchronized Handler removeHandler(String namepaceURI, Handler handler) {
091            // TODO we may wish to implement this differently if we handle
092            // many handlers to a single namespace/qname
093            return removeHandler(namepaceURI);
094        }
095    
096        public Handler getBodyHandler() {
097            return bodyHandler;
098        }
099    
100        public void setBodyHandler(Handler bodyHandler) {
101            this.bodyHandler = bodyHandler;
102        }
103    
104        public Handler getDefaultHandler() {
105            return defaultHandler;
106        }
107    
108        public void setDefaultHandler(Handler defaultHandler) {
109            this.defaultHandler = defaultHandler;
110        }
111    
112        /**
113         * Provide implementations with direct access to the handler map
114         */
115        protected Map getHandlers() {
116            return handlers;
117        }
118    
119        /**
120         * Provide implementations with direct access to the handler map
121         */
122        protected void setHandlers(Map handlers) {
123            this.handlers = handlers;
124        }
125    }