/** * Copyright (C) Zhang,Yuexiang (xfeep) * */ package nginx.clojure; import java.util.HashMap; import java.util.Map; public abstract class NginxHandlerFactory { public static final String NGINX_CLOJURE_HANDLER_FACTORY_SYSTEM_PROPERTY_PREFIX = "nginx.clojure.handler.factory."; private static Map<String, NginxHandlerFactory> handlerFactoryMap = new HashMap<String, NginxHandlerFactory>(); public abstract NginxHandler newInstance(int phase, String name, String code); public static synchronized void register(String type, NginxHandlerFactory factory) { handlerFactoryMap.put(type, factory); } public static synchronized NginxHandlerFactory fetchFactory(String type) { NginxHandlerFactory factory = handlerFactoryMap.get(type); if (factory == null) { String factoryName = System.getProperty(NGINX_CLOJURE_HANDLER_FACTORY_SYSTEM_PROPERTY_PREFIX + type); if (factoryName == null) { return null; } try { Class clz = Thread.currentThread().getContextClassLoader().loadClass(factoryName); factory = (NginxHandlerFactory) clz.newInstance(); handlerFactoryMap.put(type, factory); } catch (Throwable e) { throw new RuntimeException("can not load factory:" + factoryName, e); } } return factory; } public static NginxHandler fetchHandler(int phase, String type, String name, String code) { NginxHandlerFactory factory = fetchFactory(type); if (factory == null) { throw new RuntimeException("can not find subclass of NginxHandlerFactory for type : " + type); } return factory.newInstance(phase, name, code); } }