abstractoutboundvariable.java
来自「反向的AJAX。最大的特性是我们成为反向的Ajax。DWR1.x允许你用java」· Java 代码 · 共 351 行
JAVA
351 行
/* * Copyright 2005 Joe Walker * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.directwebremoting.dwrp;import java.util.Collection;import java.util.Iterator;import org.directwebremoting.extend.OutboundContext;import org.directwebremoting.extend.OutboundVariable;/** * A helper class for people that want to implement {@link OutboundVariable}. * @author Joe Walker [joe at getahead dot ltd dot uk] */public abstract class AbstractOutboundVariable implements OutboundVariable{ /** * @param outboundContext the OutboundContext to set */ protected AbstractOutboundVariable(OutboundContext outboundContext) { this.outboundContext = outboundContext; } /** * We might want to force us into predefined mode. * @param inlineStatus The inline status to force */ protected void forceInline(boolean inlineStatus) { setInline(inlineStatus); forcedInlineStatus = true; } /** * @param children the dependent children of this variable */ protected void setChildren(Collection children) { this.children = children; } /* (non-Javadoc) * @see org.directwebremoting.OutboundVariable#getDeclareCode() */ public String getDeclareCode() { if (!calculated) { calculate(); } if (inline) { return getChildDeclareCodes(); } else { return notInlineDefinition.declareCode + getChildDeclareCodes(); } } /* (non-Javadoc) * @see org.directwebremoting.OutboundVariable#getBuildCode() */ public String getBuildCode() { if (!calculated) { calculate(); } if (inline) { return getChildBuildCodes(); } else { return notInlineDefinition.buildCode + getChildBuildCodes(); } } /* (non-Javadoc) * @see org.directwebremoting.OutboundVariable#getAssignCode() */ public String getAssignCode() { if (calculated) { if (inline) { return assignCode; } else { return varName; } } else { // Someone is asking our name before we are calculated? This is // likely to be because we are nested. calling calculate() is not // possible because there might not be the data to make that work // so we name ourselves, and return that. if (forcedInlineStatus) { if (inline) { return getInlineDefinition(); } else { return getVariableName(); } } else { // log.debug("Moving outline. Do we need to? " + this); setInline(false); return getVariableName(); } } } /* (non-Javadoc) * @see org.directwebremoting.OutboundVariable#getReference() */ public OutboundVariable getReferenceVariable() { if (reference == null) { reference = new ReferenceOutboundVariable(getVariableName()); if (forcedInlineStatus && inline) { throw new IllegalStateException("Ignoring request to inline on reference for: " + this); } else { setInline(false); } } return reference; } /** * Called at the last moment as the outputs are being read when we are * sure if we are a reference or not. */ private void calculate() { if (inline) { assignCode = getInlineDefinition(); } else { notInlineDefinition = getNotInlineDefinition(); } calculated = true; } /** * Grab all the build codes together * @return A build string */ private String getChildBuildCodes() { if (children == null) { return ""; } StringBuffer buffer = new StringBuffer(); // Make sure the nested things are declared for (Iterator it = children.iterator(); it.hasNext();) { OutboundVariable nested = (OutboundVariable) it.next(); buffer.append(nested.getBuildCode()); } return buffer.toString(); } /** * Grab all the declare codes together * @return A declare string */ private String getChildDeclareCodes() { if (children == null) { return ""; } StringBuffer buffer = new StringBuffer(); // Make sure the nested things are declared for (Iterator it = children.iterator(); it.hasNext();) { OutboundVariable nested = (OutboundVariable) it.next(); buffer.append(nested.getDeclareCode()); } return buffer.toString(); } /** * @return the varName */ protected String getVariableName() { if (varName == null) { varName = outboundContext.getNextVariableName(); } return varName; } /** * Define the definition we should use if we are being used not inline * @return an out of line definition */ protected abstract NotInlineDefinition getNotInlineDefinition(); /** * Define the definition we should use if we are being used inline * @return an inline definition */ protected abstract String getInlineDefinition(); /** * A helper struct to pass a build code and define code together */ protected class NotInlineDefinition { protected NotInlineDefinition(String declareCode, String buildCode) { this.declareCode = declareCode; this.buildCode = buildCode; } /** * The code to be executed to do basic initialization */ String declareCode; /** * The code to be executed to setup the data structure */ String buildCode; } /** * A helper to children get have definition info in {@link #toString()} * @return For children to use in {@link #toString()} */ protected String toStringDefinitionHint() { if (inline) { return "inline"; } else { if (varName != null) { return varName; } else { return "?"; } } } /** * @param isInline The new inline status */ private void setInline(boolean isInline) { if (calculated) { throw new IllegalStateException("Attempt to change inline status after calculation"); } this.inline = isInline; } /** * Does anything refer to us? */ private OutboundVariable reference; /** * Are we known to be recursive */ private boolean inline = true; /** * Have we forced an inline/outline status? */ private boolean forcedInlineStatus = false; /** * Has calculate been run? */ private boolean calculated = false; /** * The init code for the non-inline case */ private NotInlineDefinition notInlineDefinition; /** * The code to be executed to get the value of the initialized data */ private String assignCode; /** * If we get recursive, this is the variable name we declare */ private String varName; /** * The conversion context */ private OutboundContext outboundContext; /** * The OutboundVariables that we depend on */ private Collection children;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?