Nope.
Not a bug.
Just a result of the way that class loaders, class comparison, etc.
work in java, and a side-effect of T5's class reloading.
Classes in the .components, .mixins, and .pages are in a separate
class-loader from everything else. Class1==Class1 from different
classloaders is false. What's more, A.class.equals(A.class) if the
two "A's" are in different class loaders is also false.
In general, only store page classes .pages, component classes
in .components, and mixin classes in .mixins. Any other class
(including ASO's, environmentals, services, interfaces, etc.) should
be located elsewhere.
Robert
On May 16, 2008, at 5/162:13 PM , Toby Hobson wrote:
Fixed it! this looks like a bug in T5 to me ...
I was trying to pass a "PageResponse" object from the enclosing
"Pager" component to the nested "Next" component. All three of these
classes were in my web.components package. When I moved PageResponse
to another package (in this case my *.model package) it worked as
expected. To double check I moved it back and got the old and
unhelpful error.
Should I raise a JIRA for this?
Thanks
Toby
----- Original Message ----
From: Toby Hobson <[EMAIL PROTECTED]>
To: Tapestry users <users@tapestry.apache.org>
Sent: Friday, 16 May, 2008 7:30:51 PM
Subject: Re: Making a property available to nested components
I've noticed something ... If I try to pass a string to the nested
component it works as expected, it seems there is something about
the PageResponse class that it doesn't like. But this is just a
normal javabean :
public class PageResponse implements Serializable {
public static final long serialVersionUID = 1L;
private int startIndex;
private int endIndex;
... getters/setters
}
Toby
----- Original Message ----
From: Toby Hobson <[EMAIL PROTECTED]>
To: Tapestry users <users@tapestry.apache.org>
Sent: Friday, 16 May, 2008 6:09:19 PM
Subject: Re: Making a property available to nested components
Thanks Robert I've had a look at that and managed to replace a page
property with a value supplied by a component at runtime. One
problem I've hit though is when I want to make a property available
to a nested component. Probably best explained with the code!
Basically i'm trying to write a simple pager which will provide
previous and next buttons: I have a Pager component which should
make a "PageResponse" object available to nested components
(previous and next).
Pager.java
private PageResponse response; // This is basically the list of
results from the datasource with startIndex, endIndex, totalRecords
etc.
@Inject
private Environment environment;
@SetupRender
void setupRender() {
response = ds.action(request);
}
@BeginRender
void beginRender() {
environment.push(PageResponse.class, response);
}
@AfterRender
void afterRender() {
environment.pop(PageResponse.class);
}
I also have a "Previous" component which basically decides if it
should render a "previous" actionLink on the page:
Previous.java
@Environmental
@Property
private PageResponse response;
public boolean render() {
return response.getPageNumber() > 1;
}
Previous.tml
<t:if test="render()">
<t:actionLink t:context="response.pageNumber"
t:id="previoust">previous</t:actionLink>
</t:if>
I also have a "next" component which is basically the same as above
Then on my admin page I have
<t:pager t:id="pager">
<t:previous id="previous" /> <t:next id="next" />
</t:pager>
I was hoping that the "previous" component would be able to see the
pageResponse object which is provided by the containing pager
component. But I get a very strange and unhelpful error:
Render queue error in BeginRender[Admin:previous.if]: Failure
readingparameter 'test' of component Admin:previous.if: No object of
typecom.thc.web.components.PageResponse is available from the
Environment.Available types are
com
.thc
.web
.components
.PageResponse
,org
.apache
.tapestry
.PageRenderSupport
,org
.apache
.tapestry
.ValidationDecorator
,org
.apache
.tapestry
.internal
.services
.ClientBehaviorSupport,org.apache.tapestry.services.Heartbeat.
So it's not available, but it is!!
Can anyone see any glaring errors with this?
Thanks
Toby
----- Original Message ----
From: Robert Zeigler <[EMAIL PROTECTED]>
To: Tapestry users <users@tapestry.apache.org>
Sent: Friday, 16 May, 2008 3:32:00 PM
Subject: Re: Making a property available to nested components
Check out the environment service.
Robert
On May 16, 2008, at 5/169:23 AM , Toby Hobson wrote:
I've managed to achieve something by making the "container" a
component AND a property on my test page:
@Property
@Component(id="container")
private Container container;
but this seems like a bit of a hack, there must be a neater way of
doing this!
Toby
----- Original Message ----
From: Toby Hobson <[EMAIL PROTECTED]>
To: tapestry <users@tapestry.apache.org>
Sent: Friday, 16 May, 2008 3:15:57 PM
Subject: Making a property available to nested components
Hi
I am looking to achieve something similar to the way in which JSP
custom tags work - I would like to make a property of a component
available to nested components/markup e.g.
TestPage.tml:
<t:container value="container">
hello ${container.user.name}
</t:container>
Container {
@Property
User user;
@PageAttached()
void attach() {
... load and process "user"
}
}
But i can't find a way to do this. I know it can be done because the
loop component works like this.
Does anyone have any ideas?
Thanks
Toby
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]