package nginx.clojure.bridge; import java.io.IOException; import java.util.HashMap; import java.util.Map; import nginx.clojure.Configurable; import nginx.clojure.java.NginxJavaRequest; import nginx.clojure.java.NginxJavaRingHandler; public class NginxBridgeHandler implements NginxJavaRingHandler, Configurable { protected NginxBridge bridge; protected String alias; protected static Map<String, NginxBridge> aliases = new HashMap<String, NginxBridge>(); public void setBridge(NginxBridge bridge) { this.bridge = bridge; } public NginxBridge getBridge() { return bridge; } public NginxBridgeHandler() { } @Override public Object[] invoke(Map<String, Object> req) throws IOException { if (bridge == null) { bridge = aliases.get(alias); } if (bridge == null) { return new Object[]{404, null, null}; } NginxJavaRequest r = (NginxJavaRequest)req; ClassLoader oldLoader = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(bridge.getClassLoader()); return bridge.handle(r); }finally { Thread.currentThread().setContextClassLoader(oldLoader); } } @Override public void config(Map<String, String> properties) { if (bridge == null) { String alias = properties.get(NginxBridgeStarter.BRIDGE_ALIAS); String impl = properties.get(NginxBridgeStarter.BRIDGE_IMP); if (alias != null) { if (impl == null) { return; } } NginxBridgeStarter starter = new NginxBridgeStarter(); bridge = starter.start(properties); if (alias != null) { aliases.put(alias, bridge); } } } }