> First of all, version of Tiles? I'm working with trunk (2.2.2-SNAPSHOT), via Spring-web (3.0.1-SNAPSHOT), made possible with the patch included in http://jira.springframework.org/browse/SPR-6097
Thanks for a quick response. > > <definition name="vertical.motor" template="/WEB-INF/blank.jsp"> > > <put-attribute name="description" > > value="/WEB-INF/tiles/vertical/motor/description.jsp" cascade="true"/> > > </definition> > >... > > The description attribute is available from "vertical.motor" > definition to all *included* definitions, not definitions that include > it. I'm starting to see that. Was hoping that insertDefinition, or importAttribute (given that the attribute is a definition), would make it possible to access the internal attributes from a different definition. > I suppose that to accomplish what you want to do is using a preparer. That doesn't quite fit the big picture for me :-( What i'm after is delegation, or injection, of definitions in addition to the supported extension. To explain, i got is a number of "global" wildcarded definitions like this: <!-- sub-vertical definition --> <definition name="WILDCARD:*.*.*" extends="{1}.{2}" template="/WEB-INF/tiles/templates/[{3}|{2}|{1}]_template.jsp"> <put-attribute name="body" value="/WEB-INF/tiles/vertical/[{3}|{2}|{1}]/content_new.jsp" cascade="true"/> ... <!-- definition injection --> <put-list-attribute name="definition-injection" inherit="true"> <add-attribute value="subvertical.{3}" type="string"/> </put-list-attribute> </definition> <!-- vertical definition --> <definition name="WILDCARD:*.*" extends="{1}" template="/WEB-INF/tiles/templates/[{2}|{1}]_template.jsp"> <put-attribute name="body" value="/WEB-INF/tiles/vertical/[{2}|{1}]/content_new.jsp" cascade="true"/> ... <!-- Dynamic definition injection --> <put-list-attribute name="definition-injection"> <add-attribute value="vertical.{2}" type="string"/> </put-list-attribute> </definition> Then in additional tiles-*.xml (that individual developer teams are free to edit) definitions like: <!-- motor definition that is injected into the real definition --> <definition name="vertical.motor"> <put-attribute name="motor.description" value="/WEB-INF/tiles/vertical/motor/description.jsp"/> <put-attribute name="motor.equipment" value="/WEB-INF/tiles/vertical/motor/equipment.jsp"/> </definition> <!-- car definition that is injected into the real definition --> <definition name="subvertical.car"> <put-attribute name="car.something" value="/WEB-INF/tiles/vertical/car/something.jsp"/> </definition> By overriding the DefinitionsFactory like: private static final String DEF_INJECTION = "definition-injection"; @Override public Definition getDefinition(String name, TilesRequestContext tilesContext) { Definition def = super.getDefinition(name, tilesContext); if(null != def){ def = new Definition(super.getDefinition(name, tilesContext)); Attribute defList = def.getLocalAttribute(DEF_INJECTION); if(null != defList){ if(defList instanceof ListAttribute){ List<Attribute> list = (List<Attribute>) defList.getValue(); for(Attribute inject : list){ injectDefinition((String) inject.getValue(), def, tilesContext); } } } } return def; } private void injectDefinition(String fromName, Definition to, TilesRequestContext cxt){ Definition from = super.getDefinition(fromName, cxt); for(String attrName : from.getLocalAttributeNames()){ to.putAttribute(attrName, from.getLocalAttribute(attrName), true); } } these "definition-injection" definitions are injected at run-time. For example the spring controller returns a View("advert.motor.car"). This matches the definition with hierarchy: "WILDCARD:*.*.*" --> "WILDCARD:*.*" --> "WILDCARD:*" but each definition has in addition "a sideways delegation" so-to-speak, like: "WILDCARD:*.*.*" --> "subvertical.{3}" | v "WILDCARD:*.*" --> "vertical.{2}" | v "WILDCARD:*" I've got this working as explained, but was hoping there was an existing and easier way to achieve it all. Is there? ~mck ps the "[{3}|{2}|{1}]" syntax is provided by a custom TemplateAttributeRenderer, it returns the found template looking first for {3}, then for {2}, and finally for {1}. -- "People only get lost in thought because it is unfamiliar territory." Paul Fix | semb.wever.org | sesat.no | finn.no |
signature.asc
Description: This is a digitally signed message part