Author: apetrelli
Date: Mon Oct 2 04:38:09 2006
New Revision: 451985
URL: http://svn.apache.org/viewvc?view=rev&rev=451985
Log:
SB-48
Fixed by adding the "preprocessAttribute" method that fixes attributes before
they are actually processed (i.e. displayed).
Modified:
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/InsertTag.java
Modified:
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/InsertTag.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/InsertTag.java?view=diff&rev=451985&r1=451984&r2=451985
==============================================================================
---
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/InsertTag.java
(original)
+++
struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/InsertTag.java
Mon Oct 2 04:38:09 2006
@@ -598,20 +598,11 @@
return null;
}
+ // FIXME Currently this call executes with every attribute, even
+ // those that do not need to be preprocessed, like attributes from
+ // Tiles definitions files. Fix it to improve performances.
+ preprocessAttribute(value);
String type = value.getType();
- if (type == null) {
- Object valueContent = value.getValue();
- if (valueContent instanceof String) {
- String valueString = (String) valueContent;
- if (valueString.startsWith("/")) {
- type = "template";
- } else {
- type = "string";
- }
- } else if (valueContent instanceof ComponentDefinition) {
- type = "definition";
- }
- }
if (type == null) {
throw new JspException("Unrecognized type for attribute value "
@@ -641,6 +632,57 @@
throws Exception, IOException {
TilesUtil.doInclude(page, pageContext, flush);
}
+
+ /**
+ * Preprocess an attribute before using it. It guesses the type of the
+ * attribute if it is missing, and gets the right definition if a
definition
+ * name has been specified.
+ * @param value The attribute to preprocess.
+ * @throws JspException If something goes wrong during definition
+ * resolution.
+ */
+ protected void preprocessAttribute(ComponentAttribute value)
+ throws JspException {
+ String type = value.getType();
+ if (type == null) {
+ Object valueContent = value.getValue();
+ if (valueContent instanceof String) {
+ String valueString = (String) valueContent;
+ if (valueString.startsWith("/")) {
+ type = "template";
+ } else {
+ ComponentDefinition definition = TagUtils
+ .getComponentDefinition(valueString,
+ pageContext);
+ if (definition != null) {
+ type = "definition";
+ value.setValue(definition);
+ } else {
+ type = "string";
+ }
+ }
+ } else if (valueContent instanceof ComponentDefinition) {
+ type = "definition";
+ }
+ if (type == null) {
+ throw new JspException("Unrecognized type for attribute value "
+ + value.getValue());
+ }
+ value.setType(type);
+ } else if (type.equalsIgnoreCase("definition")) {
+ Object valueContent = value.getValue();
+ if (valueContent instanceof String) {
+ ComponentDefinition definition = TagUtils
+ .getComponentDefinition((String) valueContent,
+ pageContext);
+ if (definition == null) {
+ throw new JspException("Cannot find any definition named '"
+ + valueContent + "'");
+ }
+ value.setValue(definition);
+ }
+ }
+ }
/////////////////////////////////////////////////////////////////////////////