1 package org.objectweb.celtix.handlers; 2 3 import java.lang.reflect.InvocationTargetException ; 4 import java.lang.reflect.Method ; 5 import java.util.ArrayList ; 6 import java.util.HashMap ; 7 import java.util.List ; 8 import java.util.Map ; 9 import java.util.logging.Level ; 10 import java.util.logging.Logger ; 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 LOG = LogUtils.getL7dLogger(HandlerChainBuilder.class); 24 25 public List <Handler> buildHandlerChainFromConfiguration(HandlerChainType hc) { 26 if (null == hc) { 27 return null; 28 } 29 return sortHandlers(buildHandlerChain(hc)); 30 } 31 32 39 public List <Handler> sortHandlers(List <Handler> handlers) { 40 41 List <LogicalHandler> logicalHandlers = new ArrayList <LogicalHandler>(); 42 List <Handler> protocolHandlers = new ArrayList <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 <Handler> sortedHandlers = new ArrayList <Handler>(); 53 sortedHandlers.addAll(logicalHandlers); 54 sortedHandlers.addAll(protocolHandlers); 55 return sortedHandlers; 56 } 57 58 private ClassLoader getHandlerClassLoader() { 59 return getClass().getClassLoader(); 60 } 61 62 protected List <Handler> buildHandlerChain(HandlerChainType hc) { 63 List <Handler> handlerChain = new ArrayList <Handler>(); 64 for (HandlerType h : hc.getHandler()) { 65 try { 66 LOG.log(Level.FINE, "loading handler", h.getHandlerName()); 67 68 Class <? 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 e) { 77 throw new WebServiceException(new Message("HANDLER_INSTANTIATION_EXC", LOG).toString(), e); 78 } catch (InstantiationException e) { 79 throw new WebServiceException(new Message("HANDLER_INSTANTIATION_EXC", LOG).toString(), e); 80 } catch (IllegalAccessException 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 <String , String > params = new HashMap <String , String >(); 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 init = handler.getClass().getMethod("init", Map .class); 98 init.invoke(handler, params); 99 } catch (InvocationTargetException ex) { 100 Throwable t = ex.getCause() != null ? ex.getCause() : ex; 101 LogUtils.log(LOG, Level.WARNING, "INIT_METHOD_THREW_EXCEPTION", t, handler.getClass()); 102 } catch (NoSuchMethodException ex) { 103 LOG.log(Level.SEVERE, "NO_INIT_METHOD_ON_HANDLER", handler.getClass()); 104 } catch (IllegalAccessException ex) { 105 LOG.log(Level.SEVERE, "CANNOT_ACCESS_INIT", handler.getClass()); 106 } 107 } 108 } 109 } 110 | Popular Tags |