001 package org.shiftone.jrat.core;
002
003
004 import org.shiftone.jrat.core.config.CacheMethodHandlerFactory;
005 import org.shiftone.jrat.core.config.ConfigMethodHandlerFactory;
006 import org.shiftone.jrat.core.spi.MethodHandler;
007 import org.shiftone.jrat.core.spi.MethodHandlerFactory;
008 import org.shiftone.jrat.provider.silent.SilentMethodHandler;
009 import org.shiftone.jrat.util.log.Logger;
010
011
012 public class HandlerFactory {
013
014 private static final Logger LOG = Logger.getLogger(HandlerFactory.class);
015
016 /**
017 * Force initialization. This should really only be called from test cases to
018 * initialize a particular configuration.
019 */
020 public static void initialize() {
021 Singleton.initialize();
022 }
023
024
025 private static class Singleton {
026
027 private static MethodHandlerFactory rootHandlerFactory;
028
029 static {
030
031 // Mode.set(Mode.RUNTIME);
032
033 try {
034
035 rootHandlerFactory = new CacheMethodHandlerFactory(
036 new ConfigMethodHandlerFactory(
037 Environment.getConfiguration()
038 )
039 );
040
041 rootHandlerFactory.startup(new RuntimeContextImpl());
042
043 } catch (Exception e) {
044
045 rootHandlerFactory = SilentMethodHandler.HANDLER_FACTORY;
046
047 LOG.error("There was an error starting up a handler factory", e);
048 LOG.info("JRat will ignore all configuration and use the slient handler");
049 }
050 }
051
052 public static void initialize() {
053 }
054
055 public static synchronized MethodHandler getMethodHandler(MethodKey methodKey) {
056 try {
057 return rootHandlerFactory.createMethodHandler(methodKey);
058 } catch (Exception e) {
059 LOG.error("failed to column MethodHandler for : " + methodKey, e);
060 return SilentMethodHandler.METHOD_HANDLER;
061 }
062 }
063 }
064
065 public static synchronized MethodHandler getMethodHandler(MethodKey methodKey) {
066 return Singleton.getMethodHandler(methodKey);
067 }
068
069 public static synchronized MethodHandler getMethodHandler(String className, String methodName, String signature) {
070 return Singleton.getMethodHandler(MethodKey.getInstance(className, methodName, signature));
071 }
072
073 public static synchronized MethodHandler getMethodHandler(Class klass, String methodName, String signature) {
074 return Singleton.getMethodHandler(MethodKey.getInstance(klass.getName(), methodName, signature));
075 }
076 }