in src/main/java/org/apache/sling/scripting/jsp/jasper/compiler/TagFileProcessor.java [190:287]
public void visit(Node.AttributeDirective n) throws JasperException {
JspUtil.checkAttributes("Attribute directive", n,
attributeDirectiveAttrs, err);
// JSP 2.1 Table JSP.8-3
// handle deferredValue and deferredValueType
boolean deferredValue = false;
boolean deferredValueSpecified = false;
String deferredValueString = n.getAttributeValue("deferredValue");
if (deferredValueString != null) {
deferredValueSpecified = true;
deferredValue = JspUtil.booleanValue(deferredValueString);
}
String deferredValueType = n.getAttributeValue("deferredValueType");
if (deferredValueType != null) {
if (deferredValueSpecified && !deferredValue) {
err.jspError(n, "jsp.error.deferredvaluetypewithoutdeferredvalue");
} else {
deferredValue = true;
}
} else if (deferredValue) {
deferredValueType = "java.lang.Object";
} else {
deferredValueType = "java.lang.String";
}
// JSP 2.1 Table JSP.8-3
// handle deferredMethod and deferredMethodSignature
boolean deferredMethod = false;
boolean deferredMethodSpecified = false;
String deferredMethodString = n.getAttributeValue("deferredMethod");
if (deferredMethodString != null) {
deferredMethodSpecified = true;
deferredMethod = JspUtil.booleanValue(deferredMethodString);
}
String deferredMethodSignature = n
.getAttributeValue("deferredMethodSignature");
if (deferredMethodSignature != null) {
if (deferredMethodSpecified && !deferredMethod) {
err.jspError(n, "jsp.error.deferredmethodsignaturewithoutdeferredmethod");
} else {
deferredMethod = true;
}
} else if (deferredMethod) {
deferredMethodSignature = "void methodname()";
}
if (deferredMethod && deferredValue) {
err.jspError(n, "jsp.error.deferredmethodandvalue");
}
String attrName = n.getAttributeValue("name");
boolean required = JspUtil.booleanValue(n
.getAttributeValue("required"));
boolean rtexprvalue = true;
String rtexprvalueString = n.getAttributeValue("rtexprvalue");
if (rtexprvalueString != null) {
rtexprvalue = JspUtil.booleanValue(rtexprvalueString);
}
boolean fragment = JspUtil.booleanValue(n
.getAttributeValue("fragment"));
String type = n.getAttributeValue("type");
if (fragment) {
// type is fixed to "JspFragment" and a translation error
// must occur if specified.
if (type != null) {
err.jspError(n, "jsp.error.fragmentwithtype");
}
// rtexprvalue is fixed to "true" and a translation error
// must occur if specified.
rtexprvalue = true;
if (rtexprvalueString != null) {
err.jspError(n, "jsp.error.frgmentwithrtexprvalue");
}
} else {
if (type == null)
type = "java.lang.String";
if (deferredValue) {
type = ValueExpression.class.getName();
} else if (deferredMethod) {
type = MethodExpression.class.getName();
}
}
if (("2.0".equals(tagLibInfo.getRequiredVersion()) || ("1.2".equals(tagLibInfo.getRequiredVersion())))
&& (deferredMethodSpecified || deferredMethod
|| deferredValueSpecified || deferredValue)) {
err.jspError("jsp.error.invalid.version", path);
}
TagAttributeInfo tagAttributeInfo = new TagAttributeInfo(attrName,
required, type, rtexprvalue, fragment, null, deferredValue,
deferredMethod, deferredValueType, deferredMethodSignature);
attributeVector.addElement(tagAttributeInfo);
checkUniqueName(attrName, ATTR_NAME, n, tagAttributeInfo);
}