package com.hundsun.jresplus.web.contain.pipeline; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.PriorityQueue; import java.util.Queue; import java.util.Set; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.apache.velocity.context.InternalContextAdapter; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.runtime.Renderable; /** * Bigpipe渲染任务,一个bp输出会使用一个PipelineTask封装放置到队列中等待PipelineExport的触发 * @author XIE (xjj@hundsun.com) * */ public class PipelineTask implements Renderable { public static final String ATTR_KEY = "asyncContainContext"; public static final int DEFAULT_QUEUE_SIZE = 8; public static final Comparator<PipelineTask> COMPARATOR = new PipelineTaskComparator(); private int order = Integer.MAX_VALUE; private String view; private String id; private Map<String, Object> parameters = new HashMap<String, Object>(); private Set<String> js; private StringBuilder jsCode = new StringBuilder(); private Set<String> css; private boolean hasCss = false; private Queue<PipelineTask> subTask = new PriorityQueue<PipelineTask>( DEFAULT_QUEUE_SIZE, COMPARATOR); private PipelineTask parentTask; public boolean render(InternalContextAdapter context, Writer writer) throws IOException, MethodInvocationException, ParseErrorException, ResourceNotFoundException { writer.write("<div id=\"" + id + "\"></div>"); return true; } public void addJsCode(String jsCode) throws IOException { if (StringUtils.isBlank(jsCode)) { return; } StringWriter sw = new StringWriter(); StringEscapeUtils.escapeJavaScript(sw, jsCode); this.jsCode.append(sw); } public void setParentTask(PipelineTask task) { this.parentTask = task; } public void addSubTask(PipelineTask task) { if (task != null) { task.setParentTask(this); subTask.add(task); } } public boolean isParentView(String view) { if (parentTask != null) { String parentView = parentTask.getView(); if (parentView.indexOf("?") > 0) { parentView = parentView.substring(0, parentView.indexOf("?")); } String currentView = view; if (view.indexOf("?") > 0) { currentView = view.substring(0, view.indexOf("?")); } if (parentView.equals(currentView)) { return true; } return parentTask.isParentView(currentView); } return false; } public boolean isHasSubTask() { return subTask.size() > 0; } public Queue<PipelineTask> getSubTask() { return this.subTask; } public void addJs(String js) { if (StringUtils.isBlank(js)) { return; } if (this.js == null) { this.js = new HashSet<String>(); } this.js.add(js); } public void addCss(String css) { if (StringUtils.isBlank(css)) { return; } if (this.css == null) { this.css = new HashSet<String>(); } this.css.add(css); this.hasCss = true; } public boolean isHasCss() { return hasCss; } public Set<String> getJs() { return js; } public StringBuilder getJsCode() { return jsCode; } public Set<String> getCss() { return css; } public PipelineTask(String view, int order) { this.view = view; this.order = order; } public PipelineTask put(String key, Object value) { parameters.put(key, value); return this; } public PipelineTask setParameter(String key, Object value) { return this.put(key, value); } public Map<String, Object> getParameters() { return parameters; } public PipelineTask(String view, String id) { this.view = view; this.id = id; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } public String getView() { return view; } public void setView(String view) { this.view = view; } public String getId() { return id; } public void setId(String id) { this.id = id; } }