Wildcard configuration doesn't work with cascaded attributes
------------------------------------------------------------
Key: TILES-482
URL: https://issues.apache.org/struts/browse/TILES-482
Project: Tiles
Issue Type: Bug
Components: tiles-core
Affects Versions: 2.1.4, 2.1.3
Environment: Windows, WAS 6.1, Struts 2
Reporter: Aris Tzoumas
Priority: Critical
I found out that when creating a wildcard configuration with a cascade="true"
attribute inside, this attribute doesn't actualy apply to the actual resulting
cached configuration.
Sample configuration xml:
<definition name="abstract.one" template="/WEB-INF/jsp/one.jsp">
</definition>
<definition name="abstract.two" template="/WEB-INF/jsp/two.jsp">
</definition>
<definition name="*.*.*" extends="abstract.one">
<put-attribute name="abstract.one-param1" value="/WEB-INF/jsp/param1.jsp" />
<put-attribute name="abstract.one-param2" value="abstract.two" />
<put-attribute name="abstract.two-param1"
value="/WEB-INF/jsp/{1}/{2}/{3}.jsp" cascade="true"/>
</definition>
Looking at the source code, the problem seems to be in method replaceDefinition
of class CachingLocaleUrlDefinitionDAO.java
If I replace the method to the following, everything is ok:
protected Definition replaceDefinition(Definition d, String name,
Map<Integer, String> vars) {
Definition nudef = new Definition();
nudef.setExtends(replace(d.getExtends(), vars));
nudef.setName(name);
nudef.setPreparer(replace(d.getPreparer(), vars));
nudef.setTemplateAttribute(replaceVarsInAttribute(d
.getTemplateAttribute(), vars));
Set<String> localAttributeNames = d.getLocalAttributeNames();
if (localAttributeNames != null && !localAttributeNames.isEmpty()) {
for (String attributeName : localAttributeNames) {
Attribute attr = d.getLocalAttribute(attributeName);
Attribute nuattr = replaceVarsInAttribute(attr, vars);
nudef.putAttribute(replace(attributeName, vars), nuattr);
}
}
/** this is my hack! **/
Set<String> cascadedAttributeNames = d.getCascadedAttributeNames();
if (cascadedAttributeNames != null &&
!cascadedAttributeNames.isEmpty()) {
for (String attributeName : cascadedAttributeNames) {
Attribute attr = d.getCascadedAttribute(attributeName);
Attribute nuattr = replaceVarsInAttribute(attr, vars);
nudef.putAttribute(replace(attributeName, vars), nuattr, true);
}
}
return nudef;
}
Please fix it in next version of Tiles 2.1.x. I don't know if this is working
in Tiles 2.2.x, since there is no Struts plugin for Tiles 2.2.x yet.... (who
should I blame?)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.