package org.nutz.mvc.impl.processor; import java.util.ArrayList; import java.util.List; import org.nutz.mvc.ActionContext; import org.nutz.mvc.ActionFilter; import org.nutz.mvc.ActionInfo; import org.nutz.mvc.NutConfig; import org.nutz.mvc.ObjectInfo; import org.nutz.mvc.Processor; import org.nutz.mvc.View; /** * * @author zozoh(zozohtnt@gmail.com) * @author wendal(wendal1985@gmail.com) * */ public class ActionFiltersProcessor extends AbstractProcessor { protected List<ActionFilter> filters = new ArrayList<ActionFilter>(); protected Processor proxyProcessor; protected Processor lastProcessor; public void init(NutConfig config, ActionInfo ai) throws Throwable { ObjectInfo<? extends ActionFilter>[] filterInfos = ai.getFilterInfos(); if (null != filterInfos) { for (int i = 0; i < filterInfos.length; i++) { ActionFilter filter = evalObj(config, filterInfos[i]); filters.add(filter); if (filter instanceof Processor) { Processor processor = (Processor)filter; if (proxyProcessor == null) { proxyProcessor = processor; lastProcessor = processor; } else { processor.setNext(proxyProcessor); proxyProcessor = processor; } } } } } public void process(ActionContext ac) throws Throwable { for (ActionFilter filter : filters) { View view = filter.match(ac); if (null != view) { ac.setMethodReturn(view); renderView(ac); return; } } if (proxyProcessor == null) { doNext(ac); } else { if (lastProcessor != null) lastProcessor.setNext(next); proxyProcessor.process(ac); } } }