On Mon, Oct 12, 2009 at 12:38 PM, excurser <[email protected]> wrote: > On Mon, Oct 12, 2009 at 10:42 AM, Antonio Petrelli > <[email protected]> wrote: >> >> 2009/10/12 Johannes Kuhs <[email protected]> >> >> > I was wondering if there is a way to inherit the value of an attribute and >> > to extend it with new content. Basically, I’m looking for something like >> > inherit=”true” for list-attributes but for normal attributes. >> > >> > Following is a quick example of what I would like to do: >> > >> > Initialization in /WEB-INF/tiles-defs.xml: >> > >> > <definition name=" test.definition" template="/layouts/classic.jsp"> >> > <put-attribute name="title" value="Initial title value" /> >> > </definition> >> > >> > Inherit and extend in /test.jsp, note inherit=”true” in the <putAttribute> >> > tag (which does not work but I think it shows what I want to achieve): >> > >> > <tiles:insertDefinition name="test.definition"> >> > <tiles:putAttribute name="title" inherit=”true”> >> > --This text gets appended to the initial value of the title attribute >> > </tiles:putAttribute> >> > </tiles:insertDefinition> >> > >> > Now, when inserting the attribute with the following code: >> > >> > <tiles:insertAttribute name="title"/> >> > >> > The following title should be displayed: >> > Initial title value--This text gets appended to the initial value of the >> > title attribute >> > >> >> >> You can do it with a preparer. For example, add an "auxiliar" attribute in >> which you put the text to add, something like: >> >> <tiles:insertDefinition name="test.definition" >> preparer="my.package.MyPreparer"> >> <tiles:putAttribute name="title-aux"> >> --This text gets appended to the initial value of the title attribute >> </tiles:putAttribute> >> </tiles:insertDefinition> >> >> And in your preparer: >> >> public void execute(TilesRequestContext tilesContext, >> AttributeContext attributeContext) { >> String auxValue = >> attributeContext.getAttribute("title-aux").getValue().toString(); >> String originalTitle = >> attributeContext.getAttribute("title").getValue().toString(); >> attributeContext.putAttribute("title", new Attribute(originalTitle + >> auxValue, null); >> } >> >> HTH >> Antonio > > Thanks for your reply, Antonio! I guess the preparer solution would > work but I would have to create a new preparer for every attribute > that I want to inherit/extend. Is there a way to have a general > preparer that I pass the attribute in question and the value to append > to? > > Thanks, > John >
Following up on this. I wrote a preparer class that I can reuse for various attributes. However, so far I can only extend attributes that have a string value associated with them. If an attribute links to a file (e.g. /header.jsp) the the preparer adds the aux value to the file name instead of the actual content in the file resulting in something like: /header.jsp--appended text here This of course results in an error because there is not file called "/header.jsp--appended text here". I guess the header attribute content needs to be evaluated before adding the aux value. Is this possible within the preparer class? Thanks!
