You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Jens Zastrow <ma...@jens-zastrow.de> on 2009/05/27 13:22:04 UTC

Problem passing anonym-classes-models to pages

Hi,

I use a lot of "anonym-classes-models" which a want to pass to Page 
instances (no need for be bookmarkable)

class HomePage() {
// some Models here
IModel<Entity> model = new LoadableDetachableModel();

//.... some Buttons-eventhandler
public onClick() {
      IModel<String> m = new AbstractReadOnlyModel<String>() {
             public String getObject() {
                   return "hello page".
             }
      }

      setResponsePage( new HelloPage(m) );
}

//....
public void detach() {
     model.detach();
}

As i discovered now, this seems not to fit conceptually.

1. using anonym model-classes <m> javac always generates a reference to 
to enclosing class-instance, here <HomePage>
2. during detachment of page <HelloPage> the model <m> will ne detached 
correctly (clearing transient all objects)
3. after detachment the page <HelloPage> is going to be serialized, 
which the effect that the reference to the page <HomePage>
    is serialized as well, without detaching thier models.

Are there any "best-practices" related to this issue?
Maybe pushing the <HomePage> on the "page-map-stack" forking 
<setResponsePage>?

Thanks
Jens Zastrow

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Problem passing anonym-classes-models to pages

Posted by Jens Zastrow <ma...@jens-zastrow.de>.
Hi Martijn,
Think of the following use-case.

There is reusable PersonSelectionPage which should select one person 
from a list.
These page should be usable from some other pages which have entities 
which can be assigned a person to.
A IModel<Person> will be passed to the PersonSelectionPage,
which invokes later model.setObject(Person) after successfull selection.
The specialized "assignment" code now is contained in the 
setObject(Person) method.

IModel<Person> pm = new IModel<Person>() {
  public void setObject() {
       // do something clever here
  }
}
setResponsePage( new PersonSelectionPage(pm, getPage()) );

The PersonSelectionPage also gets the "return-to-page" as parameter, to 
be able to go-back
(never got this working with 
redirectToInterceptPage+continueToOriginalDestination)

Is such a usage out of the best-practices/idea of wicket?

Jens

Martijn Dashorst schrieb:
> Don't pass IModels around, use the model values they represent. Unless
> of course, you know what you are doing. For example, if you share a
> Model between two pages, it actually becomes two different instances
> after being passed on: one in the first page PageA (serialized with
> PageA), and one in the response page PageB (serialized with PageB).
> When you try to check whether PageA.getModel() == PageB.getModel()
> then you'll discover that they are not the same (might be equal, but
> not the same instance).
>
> Anonymous IModels should never be passed around.
>
> In our apps we always let each page wrap the domain classes in their
> own IModel copy (for example an HibernateModel).
>
> Martijn
>
> On Wed, May 27, 2009 at 1:22 PM, Jens Zastrow <ma...@jens-zastrow.de> wrote:
>   
>> Hi,
>>
>> I use a lot of "anonym-classes-models" which a want to pass to Page
>> instances (no need for be bookmarkable)
>>
>> class HomePage() {
>> // some Models here
>> IModel<Entity> model = new LoadableDetachableModel();
>>
>> //.... some Buttons-eventhandler
>> public onClick() {
>>     IModel<String> m = new AbstractReadOnlyModel<String>() {
>>            public String getObject() {
>>                  return "hello page".
>>            }
>>     }
>>
>>     setResponsePage( new HelloPage(m) );
>> }
>>
>> //....
>> public void detach() {
>>    model.detach();
>> }
>>
>> As i discovered now, this seems not to fit conceptually.
>>
>> 1. using anonym model-classes <m> javac always generates a reference to to
>> enclosing class-instance, here <HomePage>
>> 2. during detachment of page <HelloPage> the model <m> will ne detached
>> correctly (clearing transient all objects)
>> 3. after detachment the page <HelloPage> is going to be serialized, which
>> the effect that the reference to the page <HomePage>
>>   is serialized as well, without detaching thier models.
>>
>> Are there any "best-practices" related to this issue?
>> Maybe pushing the <HomePage> on the "page-map-stack" forking
>> <setResponsePage>?
>>
>> Thanks
>> Jens Zastrow
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>> For additional commands, e-mail: users-help@wicket.apache.org
>>
>>
>>     
>
>
>
>   

-- 
dipl. inform jens zastrow

phone | +49.152.04840108
mail  | mail@jens-zastrow.de
web   | http://jens-zastrow.de
xing  | http://www.xing.com/profile/Jens_Zastrow


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Problem passing anonym-classes-models to pages

Posted by Martijn Dashorst <ma...@gmail.com>.
Don't pass IModels around, use the model values they represent. Unless
of course, you know what you are doing. For example, if you share a
Model between two pages, it actually becomes two different instances
after being passed on: one in the first page PageA (serialized with
PageA), and one in the response page PageB (serialized with PageB).
When you try to check whether PageA.getModel() == PageB.getModel()
then you'll discover that they are not the same (might be equal, but
not the same instance).

Anonymous IModels should never be passed around.

In our apps we always let each page wrap the domain classes in their
own IModel copy (for example an HibernateModel).

Martijn

On Wed, May 27, 2009 at 1:22 PM, Jens Zastrow <ma...@jens-zastrow.de> wrote:
> Hi,
>
> I use a lot of "anonym-classes-models" which a want to pass to Page
> instances (no need for be bookmarkable)
>
> class HomePage() {
> // some Models here
> IModel<Entity> model = new LoadableDetachableModel();
>
> //.... some Buttons-eventhandler
> public onClick() {
>     IModel<String> m = new AbstractReadOnlyModel<String>() {
>            public String getObject() {
>                  return "hello page".
>            }
>     }
>
>     setResponsePage( new HelloPage(m) );
> }
>
> //....
> public void detach() {
>    model.detach();
> }
>
> As i discovered now, this seems not to fit conceptually.
>
> 1. using anonym model-classes <m> javac always generates a reference to to
> enclosing class-instance, here <HomePage>
> 2. during detachment of page <HelloPage> the model <m> will ne detached
> correctly (clearing transient all objects)
> 3. after detachment the page <HelloPage> is going to be serialized, which
> the effect that the reference to the page <HomePage>
>   is serialized as well, without detaching thier models.
>
> Are there any "best-practices" related to this issue?
> Maybe pushing the <HomePage> on the "page-map-stack" forking
> <setResponsePage>?
>
> Thanks
> Jens Zastrow
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>



-- 
Become a Wicket expert, learn from the best: http://wicketinaction.com
Apache Wicket 1.3.5 is released
Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.3.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org