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 }