package org.nutz.mvc.impl; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import org.nutz.lang.Lang; import org.nutz.lang.Mirror; import org.nutz.log.Log; import org.nutz.log.Logs; import org.nutz.mvc.ActionChain; import org.nutz.mvc.ActionChainMaker; import org.nutz.mvc.ActionInfo; import org.nutz.mvc.NutConfig; import org.nutz.mvc.Processor; import org.nutz.mvc.impl.chainconfig.ActionChainMakerConfiguration; import org.nutz.mvc.impl.chainconfig.JsonActionChainMakerConfiguretion; public class NutActionChainMaker implements ActionChainMaker { private static final Log log = Logs.get(); ActionChainMakerConfiguration co; protected ConcurrentHashMap<String, String> disabledProcessor = new ConcurrentHashMap<String, String>(); public NutActionChainMaker(String...args) { co = new JsonActionChainMakerConfiguretion(args); } public ActionChain eval(NutConfig config, ActionInfo ai) { try { List<Processor> list = new ArrayList<Processor>(); for (String name : co.getProcessors(ai.getChainName())) { Processor processor = getProcessorByName(config, name); if (processor != null) { processor.init(config, ai); list.add(processor); } } Processor errorProcessor = getProcessorByName(config, co.getErrorProcessor(ai.getChainName())); errorProcessor.init(config, ai); /* * 返回动作链实例 */ return new NutActionChain(list, errorProcessor, ai); } catch (Throwable e) { if (log.isDebugEnabled()) log.debugf("Eval FAIL!! : %s",ai.getMethod(), e); throw Lang.wrapThrow(e); } } protected Processor getProcessorByName(NutConfig config,String name) throws Exception { if (name.startsWith("ioc:") && name.length() > 4) { if (config.getIoc() == null) throw new IllegalArgumentException("getProcessorByName " + name + " but no ioc !"); return config.getIoc().get(Processor.class, name.substring(4).trim()); } else { Class<?> klass = null; if (name.startsWith("!")) { name = name.substring(1); if (disabledProcessor.contains(name)) return null; try { klass = Lang.loadClass(name); } catch (Throwable e) { log.info("Optional processor class not found, disabled : " + name); disabledProcessor.put(name, name); return null; } return (Processor) Mirror.me(klass).born(); } return (Processor) Mirror.me(Lang.loadClass(name)).born(); } } }