Methods Summary |
---|
public boolean | canLoadAsArrayOffsetLength()Check whether this Text node can be stored in a char[] in the translet.
Calling this is precondition to calling loadAsArrayOffsetLength.
// Magic number! 21845*3 == 65535. BCEL uses a DataOutputStream to
// serialize class files. The Java run-time places a limit on the size
// of String data written using a DataOutputStream - it cannot require
// more than 64KB when represented as UTF-8. The number of bytes
// required to represent a Java string as UTF-8 cannot be greater
// than three times the number of char's in the string, hence the
// check for 21845.
return (_text.length() <= 21845);
|
protected boolean | contextDependent()
return false;
|
public void | display(int indent)
indent(indent);
Util.println("Text");
indent(indent + IndentIncrement);
Util.println(_text);
|
protected java.lang.String | getText()Returns the text wrapped inside this node
return _text;
|
public void | ignore()
_ignore = true;
|
public boolean | isIgnore()
return _ignore;
|
public boolean | isTextElement()
return _textElement;
|
private static boolean | isWhitespace(char c)
return (c == 0x20 || c == 0x09 || c == 0x0A || c == 0x0D);
|
public void | loadAsArrayOffsetLength(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)Generates code that loads the array that will contain the character
data represented by this Text node, followed by the offset of the
data from the start of the array, and then the length of the data.
The pre-condition to calling this method is that
canLoadAsArrayOffsetLength() returns true.
final ConstantPoolGen cpg = classGen.getConstantPool();
final InstructionList il = methodGen.getInstructionList();
final XSLTC xsltc = classGen.getParser().getXSLTC();
// The XSLTC object keeps track of character data
// that is to be stored in char arrays.
final int offset = xsltc.addCharacterData(_text);
final int length = _text.length();
String charDataFieldName =
STATIC_CHAR_DATA_FIELD + (xsltc.getCharacterDataCount()-1);
il.append(new GETSTATIC(cpg.addFieldref(xsltc.getClassName(),
charDataFieldName,
STATIC_CHAR_DATA_FIELD_SIG)));
il.append(new PUSH(cpg, offset));
il.append(new PUSH(cpg, _text.length()));
|
public void | parseContents(com.sun.org.apache.xalan.internal.xsltc.compiler.Parser parser)
final String str = getAttribute("disable-output-escaping");
if ((str != null) && (str.equals("yes"))) _escaping = false;
parseChildren(parser);
if (_text == null) {
if (_textElement) {
_text = EMPTYSTRING;
}
else {
_ignore = true;
}
}
else if (_textElement) {
if (_text.length() == 0) _ignore = true;
}
else if (getParent() instanceof LiteralElement) {
LiteralElement element = (LiteralElement)getParent();
String space = element.getAttribute("xml:space");
if ((space == null) || (!space.equals("preserve")))
{
int i;
final int textLength = _text.length();
for (i = 0; i < textLength; i++) {
char c = _text.charAt(i);
if (!isWhitespace(c))
break;
}
if (i == textLength)
_ignore = true;
}
}
else {
int i;
final int textLength = _text.length();
for (i = 0; i < textLength; i++)
{
char c = _text.charAt(i);
if (!isWhitespace(c))
break;
}
if (i == textLength)
_ignore = true;
}
|
protected void | setText(java.lang.String text)Set the text for this node. Appends the given text to any already
existing text (using string concatenation, so use only when needed).
if (_text == null)
_text = text;
else
_text = _text + text;
|
public void | translate(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
final ConstantPoolGen cpg = classGen.getConstantPool();
final InstructionList il = methodGen.getInstructionList();
if (!_ignore) {
// Turn off character escaping if so is wanted.
final int esc = cpg.addInterfaceMethodref(OUTPUT_HANDLER,
"setEscaping", "(Z)Z");
if (!_escaping) {
il.append(methodGen.loadHandler());
il.append(new PUSH(cpg, false));
il.append(new INVOKEINTERFACE(esc, 2));
}
il.append(methodGen.loadHandler());
// Call characters(String) or characters(char[],int,int), as
// appropriate.
if (!canLoadAsArrayOffsetLength()) {
final int characters = cpg.addInterfaceMethodref(OUTPUT_HANDLER,
"characters",
"("+STRING_SIG+")V");
il.append(new PUSH(cpg, _text));
il.append(new INVOKEINTERFACE(characters, 2));
} else {
final int characters = cpg.addInterfaceMethodref(OUTPUT_HANDLER,
"characters",
"([CII)V");
loadAsArrayOffsetLength(classGen, methodGen);
il.append(new INVOKEINTERFACE(characters, 4));
}
// Restore character escaping setting to whatever it was.
// Note: setEscaping(bool) returns the original (old) value
if (!_escaping) {
il.append(methodGen.loadHandler());
il.append(SWAP);
il.append(new INVOKEINTERFACE(esc, 2));
il.append(POP);
}
}
translateContents(classGen, methodGen);
|