KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > celtix > handlers > HandlerChainBuilder


1 package org.objectweb.celtix.handlers;
2
3 import java.lang.reflect.InvocationTargetException JavaDoc;
4 import java.lang.reflect.Method JavaDoc;
5 import java.util.ArrayList JavaDoc;
6 import java.util.HashMap JavaDoc;
7 import java.util.List JavaDoc;
8 import java.util.Map JavaDoc;
9 import java.util.logging.Level JavaDoc;
10 import java.util.logging.Logger JavaDoc;
11
12 import javax.xml.ws.WebServiceException;
13 import javax.xml.ws.handler.Handler;
14 import javax.xml.ws.handler.LogicalHandler;
15
16 import org.objectweb.celtix.bus.jaxws.configuration.types.HandlerChainType;
17 import org.objectweb.celtix.bus.jaxws.configuration.types.HandlerInitParamType;
18 import org.objectweb.celtix.bus.jaxws.configuration.types.HandlerType;
19 import org.objectweb.celtix.common.i18n.Message;
20 import org.objectweb.celtix.common.logging.LogUtils;
21
22 public class HandlerChainBuilder {
23     static final Logger JavaDoc LOG = LogUtils.getL7dLogger(HandlerChainBuilder.class);
24
25     public List JavaDoc<Handler> buildHandlerChainFromConfiguration(HandlerChainType hc) {
26         if (null == hc) {
27             return null;
28         }
29         return sortHandlers(buildHandlerChain(hc));
30     }
31
32     /**
33      * sorts the handlers into correct order. All of the logical handlers first
34      * followed by the protocol handlers
35      *
36      * @param handlers
37      * @return sorted list of handlers
38      */

39     public List JavaDoc<Handler> sortHandlers(List JavaDoc<Handler> handlers) {
40
41         List JavaDoc<LogicalHandler> logicalHandlers = new ArrayList JavaDoc<LogicalHandler>();
42         List JavaDoc<Handler> protocolHandlers = new ArrayList JavaDoc<Handler>();
43
44         for (Handler handler : handlers) {
45             if (handler instanceof LogicalHandler) {
46                 logicalHandlers.add((LogicalHandler)handler);
47             } else {
48                 protocolHandlers.add(handler);
49             }
50         }
51
52         List JavaDoc<Handler> sortedHandlers = new ArrayList JavaDoc<Handler>();
53         sortedHandlers.addAll(logicalHandlers);
54         sortedHandlers.addAll(protocolHandlers);
55         return sortedHandlers;
56     }
57
58     private ClassLoader JavaDoc getHandlerClassLoader() {
59         return getClass().getClassLoader();
60     }
61
62     protected List JavaDoc<Handler> buildHandlerChain(HandlerChainType hc) {
63         List JavaDoc<Handler> handlerChain = new ArrayList JavaDoc<Handler>();
64         for (HandlerType h : hc.getHandler()) {
65             try {
66                 LOG.log(Level.FINE, "loading handler", h.getHandlerName());
67
68                 Class JavaDoc<? extends Handler> handlerClass = Class.forName(h.getHandlerClass(), true,
69                                                                       getHandlerClassLoader())
70                     .asSubclass(Handler.class);
71
72                 Handler handler = handlerClass.newInstance();
73                 LOG.fine("adding handler to chain: " + handler);
74                 configureHandler(handler, h);
75                 handlerChain.add(handler);
76             } catch (ClassNotFoundException JavaDoc e) {
77                 throw new WebServiceException(new Message("HANDLER_INSTANTIATION_EXC", LOG).toString(), e);
78             } catch (InstantiationException JavaDoc e) {
79                 throw new WebServiceException(new Message("HANDLER_INSTANTIATION_EXC", LOG).toString(), e);
80             } catch (IllegalAccessException JavaDoc e) {
81                 throw new WebServiceException(new Message("HANDLER_INSTANTIATION_EXC", LOG).toString(), e);
82             }
83         }
84         return handlerChain;
85     }
86
87     private void configureHandler(Handler handler, HandlerType h) {
88
89         Map JavaDoc<String JavaDoc, String JavaDoc> params = new HashMap JavaDoc<String JavaDoc, String JavaDoc>();
90
91         for (HandlerInitParamType param : h.getInitParam()) {
92             params.put(param.getParamName(), param.getParamValue());
93         }
94
95         if (params.size() > 0) {
96             try {
97                 Method JavaDoc init = handler.getClass().getMethod("init", Map JavaDoc.class);
98                 init.invoke(handler, params);
99             } catch (InvocationTargetException JavaDoc ex) {
100                 Throwable JavaDoc t = ex.getCause() != null ? ex.getCause() : ex;
101                 LogUtils.log(LOG, Level.WARNING, "INIT_METHOD_THREW_EXCEPTION", t, handler.getClass());
102             } catch (NoSuchMethodException JavaDoc ex) {
103                 LOG.log(Level.SEVERE, "NO_INIT_METHOD_ON_HANDLER", handler.getClass());
104             } catch (IllegalAccessException JavaDoc ex) {
105                 LOG.log(Level.SEVERE, "CANNOT_ACCESS_INIT", handler.getClass());
106             }
107         }
108     }
109 }
110
Popular Tags