001    package org.shiftone.jrat.core.config;
002    
003    import org.shiftone.jrat.core.MethodKey;
004    import org.shiftone.jrat.core.spi.MethodHandler;
005    import org.shiftone.jrat.core.spi.MethodHandlerFactory;
006    import org.shiftone.jrat.core.spi.RuntimeContext;
007    import org.shiftone.jrat.util.log.Logger;
008    
009    import java.util.HashMap;
010    import java.util.Map;
011    
012    /**
013     * @author jeff@shiftone.org (Jeff Drost)
014     */
015    public class CacheMethodHandlerFactory implements MethodHandlerFactory {
016    
017        private static final Logger LOG = Logger.getLogger(CacheMethodHandlerFactory.class);
018        private final MethodHandlerFactory methodHandlerFactory;
019        private Map cache = new HashMap();
020    
021        public CacheMethodHandlerFactory(MethodHandlerFactory methodHandlerFactory) {
022            this.methodHandlerFactory = methodHandlerFactory;
023        }
024    
025        public synchronized MethodHandler createMethodHandler(MethodKey methodKey) throws Exception {
026    
027            MethodHandler methodHandler = (MethodHandler) cache.get(methodKey);
028    
029            if (methodHandler == null) {
030    
031                methodHandler = methodHandlerFactory.createMethodHandler(methodKey);
032    
033            }
034    
035            return methodHandler;
036        }
037    
038        public void startup(RuntimeContext context) throws Exception {
039            LOG.info("startup");
040            methodHandlerFactory.startup(context);
041        }
042    }