2021SC@SDUSC
**内容非常主观,可能出现错漏,慎重参考
AutoEscBlock.java
package freemarker.core;
import java.io.IOException;
import freemarker.template.TemplateException;
/**
* An #autoEsc element
*/
final class AutoEscBlock extends TemplateElement {
AutoEscBlock(TemplateElements children) {
setChildren(children);
}
@Override
TemplateElement[] accept(Environment env) throws TemplateException, IOException {
return getChildBuffer();
}
@Override
protected String dump(boolean canonical) {
if (canonical) {
return "<" + getNodeTypeSymbol() + "\">" + getChildrenCanonicalForm() + "</" + getNodeTypeSymbol() + ">";
} else {
return getNodeTypeSymbol();
}
}
@Override
String getNodeTypeSymbol() {
return "#autoesc";
}
@Override
int getParameterCount() {
return 0;
}
@Override
Object getParameterValue(int idx) {
throw new IndexOutOfBoundsException();
}
@Override
ParameterRole getParameterRole(int idx) {
throw new IndexOutOfBoundsException();
}
@Override
boolean isIgnorable(boolean stripWhitespace) {
return getChildCount() == 0;
}
@Override
boolean isNestedBlockRepeater() {
return false;
}
}
AttemptBlock.java
package freemarker.core;
import java.io.IOException;
import freemarker.template.TemplateException;
/**
* Holder for the attempted section of the #attempt element and of the nested #recover element ({@link RecoveryBlock}).
*/
final class AttemptBlock extends TemplateElement {
private TemplateElement attemptedSection;
private RecoveryBlock recoverySection;
AttemptBlock(TemplateElements attemptedSectionChildren, RecoveryBlock recoverySection) {
TemplateElement attemptedSection = attemptedSectionChildren.asSingleElement();
this.attemptedSection = attemptedSection;
this.recoverySection = recoverySection;
setChildBufferCapacity(2);
addChild(attemptedSection); // for backward compatibility
addChild(recoverySection);
}
@Override
TemplateElement[] accept(Environment env) throws TemplateException, IOException {
env.visitAttemptRecover(this, attemptedSection, recoverySection);
return null;
}
@Override
protected String dump(boolean canonical) {
if (!canonical) {
return getNodeTypeSymbol();
} else {
StringBuilder buf = new StringBuilder();
buf.append("<").append(getNodeTypeSymbol()).append(">");
buf.append(getChildrenCanonicalForm());
buf.append("</").append(getNodeTypeSymbol()).append(">");
return buf.toString();
}
}
@Override
int getParameterCount() {
return 1;
}
@Override
Object getParameterValue(int idx) {
if (idx != 0) throw new IndexOutOfBoundsException();
return recoverySection;
}
@Override
ParameterRole getParameterRole(int idx) {
if (idx != 0) throw new IndexOutOfBoundsException();
return ParameterRole.ERROR_HANDLER;
}
@Override
String getNodeTypeSymbol() {
return "#attempt";
}
@Override
boolean isNestedBlockRepeater() {
return false;
}
}