Re: How to detect model leakage into session
One 'hack' of a way to check whether you have stuff in your session that shouldn't be, is to make sure that the objects you don't want sticking around are not serializable, and you'll see stacktraces soon enough. If that's an options, it's a useful hack... Eelco On Wed, Aug 26, 2009 at 12:29 PM, Bas Goorenb...@iswd.nl wrote: Hi all, My problem is as follows: I use LoadableDetachableModels throughout my application, and have made sure I never use a model without it being attached to a component to prevent models which never get their detach() method called. Nonetheless, after hitting two fairly simple pages which list some database data in my application, I get a 100kb session which is filled with literal strings from model objects. I've fired up my (Eclipse) debugger and have stepped through all models on one of the pages after setting a breakpoint on the pages onDetach() method. I see all LoadableDetachableModels are detached, so I have no idea what's causing this. What would be a good strategy for finding the source of this problem? Bas - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: How to detect model leakage into session
Eelco, Thanks for your tip. Bas - Original Message - From: Eelco Hillenius eelco.hillen...@gmail.com To: users@wicket.apache.org Sent: Thursday, August 27, 2009 10:09 AM Subject: Re: How to detect model leakage into session One 'hack' of a way to check whether you have stuff in your session that shouldn't be, is to make sure that the objects you don't want sticking around are not serializable, and you'll see stacktraces soon enough. If that's an options, it's a useful hack... Eelco On Wed, Aug 26, 2009 at 12:29 PM, Bas Goorenb...@iswd.nl wrote: Hi all, My problem is as follows: I use LoadableDetachableModels throughout my application, and have made sure I never use a model without it being attached to a component to prevent models which never get their detach() method called. Nonetheless, after hitting two fairly simple pages which list some database data in my application, I get a 100kb session which is filled with literal strings from model objects. I've fired up my (Eclipse) debugger and have stepped through all models on one of the pages after setting a breakpoint on the pages onDetach() method. I see all LoadableDetachableModels are detached, so I have no idea what's causing this. What would be a good strategy for finding the source of this problem? Bas - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: How to detect model leakage into session
Or check your pages for references to your entities at the end of the request: private void testDetachedObjects(final Page page) { Page responsePage = getResponsePage(); if (page == null || page.isErrorPage() || (responsePage != null responsePage.isErrorPage())) { return; } try { NotSerializableException exception = new NotSerializableException(); EntityAndSerializableChecker checker = new EntityAndSerializableChecker(exception); checker.writeObject(page); } catch (Exception ex) { log.error(Couldn't test/serialize the Page: + page + , error: + ex); } } Copy the SerializableChecker code (included in Wicket) and modify it to discover your entities. Here's a patch (against 1.4) that our app uses to perform the check: @@ -330,21 +410,40 @@ writeObjectMethodCache.clear(); } + @SuppressWarnings(all) private void check(Object obj) { - if (obj == null) + if (obj == null || obj.getClass().isAnnotationPresent(Deprecated.class) + || obj.getClass().isAnnotationPresent(SkipClass.class)) { return; } - Class? cls = obj.getClass(); + Class cls = obj.getClass(); nameStack.add(simpleName); traceStack.add(new TraceSlot(obj, fieldDescription)); if (!(obj instanceof Serializable) (!Proxy.isProxyClass(cls))) { - throw new WicketNotSerializableException( - toPrettyPrintedStack(obj.getClass().getName()), exception); + throw new WicketNotSerializableException(toPrettyPrintedStack(obj.getClass().getName()) + .toString(), exception); + } + if (obj instanceof IdObject) + { + Serializable id = ((IdObject) obj).getIdAsSerializable(); + if (id != null !(id instanceof Long ((Long) id) = 0)) + { + throw new WicketContainsEntityException(toPrettyPrintedStack( + obj.getClass().getName()).toString(), exception); + } + // Deze uitgezet aangezien objecten die nieuw zijn *wel* gewoon in de sessie + // mogen komen. + // else + // { + // log.info(New Id Object ( + // + obj.getClass().getSimpleName() + ) Found ' + obj + // + ' found: + stack); + // } } ObjectStreamClass desc; On Thu, Aug 27, 2009 at 10:09 AM, Eelco Hilleniuseelco.hillen...@gmail.com wrote: One 'hack' of a way to check whether you have stuff in your session that shouldn't be, is to make sure that the objects you don't want sticking around are not serializable, and you'll see stacktraces soon enough. If that's an options, it's a useful hack... Eelco On Wed, Aug 26, 2009 at 12:29 PM, Bas Goorenb...@iswd.nl wrote: Hi all, My problem is as follows: I use LoadableDetachableModels throughout my application, and have made sure I never use a model without it being attached to a component to prevent models which never get their detach() method called. Nonetheless, after hitting two fairly simple pages which list some database data in my application, I get a 100kb session which is filled with literal strings from model objects. I've fired up my (Eclipse) debugger and have stepped through all models on one of the pages after setting a breakpoint on the pages onDetach() method. I see all LoadableDetachableModels are detached, so I have no idea what's causing this. What would be a good strategy for finding the source of this problem? Bas - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org -- Become a Wicket expert, learn from the best: http://wicketinaction.com Apache Wicket 1.4 increases type safety for web applications Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.4.0 - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: How to detect model leakage into session
Hi, you're probably doing something like the following: add(new Label(foo, ldm.getObject().getFoo())); Never do that, instead use: add(new Label(foo, new PropertyModel(ldm, foo))); ... or ... add(new Label(foo, new AbstractReadonlyModel() { public Object getObject() { return ldm.getObject().getFoo()); } })); ... or even better ... setModel(new CompoundPropertyModel(ldm)); add(new Label(foo)); // - getFoo() add(new Label(bar)); // - getBar() add(new Label(baz)); // - getBaz() HTH Sven On Mi, 2009-08-26 at 21:29 +0200, Bas Gooren wrote: Hi all, My problem is as follows: I use LoadableDetachableModels throughout my application, and have made sure I never use a model without it being attached to a component to prevent models which never get their detach() method called. Nonetheless, after hitting two fairly simple pages which list some database data in my application, I get a 100kb session which is filled with literal strings from model objects. I've fired up my (Eclipse) debugger and have stepped through all models on one of the pages after setting a breakpoint on the pages onDetach() method. I see all LoadableDetachableModels are detached, so I have no idea what's causing this. What would be a good strategy for finding the source of this problem? Bas - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: How to detect model leakage into session
Sven, I've been using wicket for over a year, so I'm quite familiar with Model usage. So thanks for the explanation, but I'm already using CompoundPropertyModels and PropertyModels everywhere. Because of this it's all the more frustrating to see model contents in my session. Bas - Original Message - From: Sven Meier s...@meiers.net To: users@wicket.apache.org Sent: Wednesday, August 26, 2009 9:48 PM Subject: Re: How to detect model leakage into session Hi, you're probably doing something like the following: add(new Label(foo, ldm.getObject().getFoo())); Never do that, instead use: add(new Label(foo, new PropertyModel(ldm, foo))); ... or ... add(new Label(foo, new AbstractReadonlyModel() { public Object getObject() { return ldm.getObject().getFoo()); } })); ... or even better ... setModel(new CompoundPropertyModel(ldm)); add(new Label(foo)); // - getFoo() add(new Label(bar)); // - getBar() add(new Label(baz)); // - getBaz() HTH Sven On Mi, 2009-08-26 at 21:29 +0200, Bas Gooren wrote: Hi all, My problem is as follows: I use LoadableDetachableModels throughout my application, and have made sure I never use a model without it being attached to a component to prevent models which never get their detach() method called. Nonetheless, after hitting two fairly simple pages which list some database data in my application, I get a 100kb session which is filled with literal strings from model objects. I've fired up my (Eclipse) debugger and have stepped through all models on one of the pages after setting a breakpoint on the pages onDetach() method. I see all LoadableDetachableModels are detached, so I have no idea what's causing this. What would be a good strategy for finding the source of this problem? Bas - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: How to detect model leakage into session
If you are certain that detach is always called then you must have references to the underlying model objects. I would look through every call to IModel#getObject(). One thought is that if you create a final variable and refer to that variable in an anonymous inner class then you have bound the object to the component. E.g. final Foo foo = fooModel.getObject(); add(new Label(id, whatever){public isVisible(){return foo.isPurple();}}); // now foo is bound to the label, and will end up in the session Scott On Wed, Aug 26, 2009 at 12:51 PM, Bas Goorenb...@iswd.nl wrote: Sven, I've been using wicket for over a year, so I'm quite familiar with Model usage. So thanks for the explanation, but I'm already using CompoundPropertyModels and PropertyModels everywhere. Because of this it's all the more frustrating to see model contents in my session. Bas - Original Message - From: Sven Meier s...@meiers.net To: users@wicket.apache.org Sent: Wednesday, August 26, 2009 9:48 PM Subject: Re: How to detect model leakage into session Hi, you're probably doing something like the following: add(new Label(foo, ldm.getObject().getFoo())); Never do that, instead use: add(new Label(foo, new PropertyModel(ldm, foo))); ... or ... add(new Label(foo, new AbstractReadonlyModel() { public Object getObject() { return ldm.getObject().getFoo()); } })); ... or even better ... setModel(new CompoundPropertyModel(ldm)); add(new Label(foo)); // - getFoo() add(new Label(bar)); // - getBar() add(new Label(baz)); // - getBaz() HTH Sven On Mi, 2009-08-26 at 21:29 +0200, Bas Gooren wrote: Hi all, My problem is as follows: I use LoadableDetachableModels throughout my application, and have made sure I never use a model without it being attached to a component to prevent models which never get their detach() method called. Nonetheless, after hitting two fairly simple pages which list some database data in my application, I get a 100kb session which is filled with literal strings from model objects. I've fired up my (Eclipse) debugger and have stepped through all models on one of the pages after setting a breakpoint on the pages onDetach() method. I see all LoadableDetachableModels are detached, so I have no idea what's causing this. What would be a good strategy for finding the source of this problem? Bas - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: How to detect model leakage into session
Am Mittwoch, den 26.08.2009, 21:29 +0200 schrieb Bas Gooren: Hi all, My problem is as follows: I use LoadableDetachableModels throughout my application, and have made sure I never use a model without it being attached to a component to prevent models which never get their detach() method called. Nonetheless, after hitting two fairly simple pages which list some database data in my application, I get a 100kb session which is filled with literal strings from model objects. I've fired up my (Eclipse) debugger and have stepped through all models on one of the pages after setting a breakpoint on the pages onDetach() method. I see all LoadableDetachableModels are detached, so I have no idea what's causing this. What would be a good strategy for finding the source of this problem? IMHO this could be a solution to your problem: http://www.wicket-praxis.de/blog/2009/01/03/modell-referenzen/ CascadingLoadableDetachableModel will detach it's child so that for any used model detach will be called. mm:) - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: How to detect model leakage into session
Scott, Well, sometimes the model object is needed to make a rendering decision, so I say: final Foo foo = getModelObject(); if( foo.getX() ) add( new Label(x, new PropertyModel( getModel(), x ) ); else add( new Label(x, new PropertyModel( getModel(), y ) ); But in this case the final variable foo is garbage collected when it goes out of scope, right? The only object-references in my application are Guice-injected (and thus session-safe proxied) daos and services. I have taken particular care to never reference model object directly. But thanks anyway, I'll put it on my list of things to check. The example you provide is one of the first things I read on the wicket wiki when I just started using it: prevent direct access to (large) model objects and never share non-static inner model classes between pages. Bas - Original Message - From: Scott Swank scott.sw...@gmail.com To: users@wicket.apache.org Sent: Wednesday, August 26, 2009 10:11 PM Subject: Re: How to detect model leakage into session If you are certain that detach is always called then you must have references to the underlying model objects. I would look through every call to IModel#getObject(). One thought is that if you create a final variable and refer to that variable in an anonymous inner class then you have bound the object to the component. E.g. final Foo foo = fooModel.getObject(); add(new Label(id, whatever){public isVisible(){return foo.isPurple();}}); // now foo is bound to the label, and will end up in the session Scott On Wed, Aug 26, 2009 at 12:51 PM, Bas Goorenb...@iswd.nl wrote: Sven, I've been using wicket for over a year, so I'm quite familiar with Model usage. So thanks for the explanation, but I'm already using CompoundPropertyModels and PropertyModels everywhere. Because of this it's all the more frustrating to see model contents in my session. Bas - Original Message - From: Sven Meier s...@meiers.net To: users@wicket.apache.org Sent: Wednesday, August 26, 2009 9:48 PM Subject: Re: How to detect model leakage into session Hi, you're probably doing something like the following: add(new Label(foo, ldm.getObject().getFoo())); Never do that, instead use: add(new Label(foo, new PropertyModel(ldm, foo))); ... or ... add(new Label(foo, new AbstractReadonlyModel() { public Object getObject() { return ldm.getObject().getFoo()); } })); ... or even better ... setModel(new CompoundPropertyModel(ldm)); add(new Label(foo)); // - getFoo() add(new Label(bar)); // - getBar() add(new Label(baz)); // - getBaz() HTH Sven On Mi, 2009-08-26 at 21:29 +0200, Bas Gooren wrote: Hi all, My problem is as follows: I use LoadableDetachableModels throughout my application, and have made sure I never use a model without it being attached to a component to prevent models which never get their detach() method called. Nonetheless, after hitting two fairly simple pages which list some database data in my application, I get a 100kb session which is filled with literal strings from model objects. I've fired up my (Eclipse) debugger and have stepped through all models on one of the pages after setting a breakpoint on the pages onDetach() method. I see all LoadableDetachableModels are detached, so I have no idea what's causing this. What would be a good strategy for finding the source of this problem? Bas - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: How to detect model leakage into session
Michael, This is something which is helpful in case you have models which are not owned by a component. This is not the case in my application. Also, the strategy they explain in the blog is something which is quite common with wicket, at least for me: a model referencing another model, and calling it's detach() method when its own onDetach() is called. Thanks anyway! Bas - Original Message - From: Michael Mosmann mich...@mosmann.de To: users@wicket.apache.org Sent: Wednesday, August 26, 2009 10:13 PM Subject: Re: How to detect model leakage into session Am Mittwoch, den 26.08.2009, 21:29 +0200 schrieb Bas Gooren: Hi all, My problem is as follows: I use LoadableDetachableModels throughout my application, and have made sure I never use a model without it being attached to a component to prevent models which never get their detach() method called. Nonetheless, after hitting two fairly simple pages which list some database data in my application, I get a 100kb session which is filled with literal strings from model objects. I've fired up my (Eclipse) debugger and have stepped through all models on one of the pages after setting a breakpoint on the pages onDetach() method. I see all LoadableDetachableModels are detached, so I have no idea what's causing this. What would be a good strategy for finding the source of this problem? IMHO this could be a solution to your problem: http://www.wicket-praxis.de/blog/2009/01/03/modell-referenzen/ CascadingLoadableDetachableModel will detach it's child so that for any used model detach will be called. mm:) - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: How to detect model leakage into session
Ok, I found the source of the problem ;-) I must've hit enter a little too quick on a content-complete in Eclipse. Inside one of the repeaters on the page I had new PropertyModel( item.getModelObject(), x ) instead of new PropertyModel( item.getModel(), x ) Obviously that's going to increase session size as it's a direct reference to an object. Thanks for giving me some pointers! Bas - Original Message - From: Bas Gooren b...@iswd.nl To: users@wicket.apache.org Sent: Wednesday, August 26, 2009 10:27 PM Subject: Re: How to detect model leakage into session Michael, This is something which is helpful in case you have models which are not owned by a component. This is not the case in my application. Also, the strategy they explain in the blog is something which is quite common with wicket, at least for me: a model referencing another model, and calling it's detach() method when its own onDetach() is called. Thanks anyway! Bas - Original Message - From: Michael Mosmann mich...@mosmann.de To: users@wicket.apache.org Sent: Wednesday, August 26, 2009 10:13 PM Subject: Re: How to detect model leakage into session Am Mittwoch, den 26.08.2009, 21:29 +0200 schrieb Bas Gooren: Hi all, My problem is as follows: I use LoadableDetachableModels throughout my application, and have made sure I never use a model without it being attached to a component to prevent models which never get their detach() method called. Nonetheless, after hitting two fairly simple pages which list some database data in my application, I get a 100kb session which is filled with literal strings from model objects. I've fired up my (Eclipse) debugger and have stepped through all models on one of the pages after setting a breakpoint on the pages onDetach() method. I see all LoadableDetachableModels are detached, so I have no idea what's causing this. What would be a good strategy for finding the source of this problem? IMHO this could be a solution to your problem: http://www.wicket-praxis.de/blog/2009/01/03/modell-referenzen/ CascadingLoadableDetachableModel will detach it's child so that for any used model detach will be called. mm:) - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: How to detect model leakage into session
Scott, That's what I thought. Bas - Original Message - From: Scott Swank scott.sw...@gmail.com To: users@wicket.apache.org Sent: Wednesday, August 26, 2009 10:53 PM Subject: Re: How to detect model leakage into session Bas, The code you showed is fine, foo will be garbage collected. You only have to worry about situations where you reference a final object inside an anonymous inner class. E.g. The below WebMarkupContainer can has to keep a reference to foo, and so foo cannot be garbage collected. final Foo foo = getModelObject(); WebMarkupContainer bigBox = new WebMarkupContainer(me){ if( foo.getX() ) add( new Label(x, new PropertyModel( getModel(), x ) ); else add( new Label(x, new PropertyModel( getModel(), y ) ); }; add(bigBox); Scott Any time you make an object final it is potentially bound into the context of On Wed, Aug 26, 2009 at 1:27 PM, Bas Goorenb...@iswd.nl wrote: Michael, This is something which is helpful in case you have models which are not owned by a component. This is not the case in my application. Also, the strategy they explain in the blog is something which is quite common with wicket, at least for me: a model referencing another model, and calling it's detach() method when its own onDetach() is called. Thanks anyway! Bas - Original Message - From: Michael Mosmann mich...@mosmann.de To: users@wicket.apache.org Sent: Wednesday, August 26, 2009 10:13 PM Subject: Re: How to detect model leakage into session Am Mittwoch, den 26.08.2009, 21:29 +0200 schrieb Bas Gooren: Hi all, My problem is as follows: I use LoadableDetachableModels throughout my application, and have made sure I never use a model without it being attached to a component to prevent models which never get their detach() method called. Nonetheless, after hitting two fairly simple pages which list some database data in my application, I get a 100kb session which is filled with literal strings from model objects. I've fired up my (Eclipse) debugger and have stepped through all models on one of the pages after setting a breakpoint on the pages onDetach() method. I see all LoadableDetachableModels are detached, so I have no idea what's causing this. What would be a good strategy for finding the source of this problem? IMHO this could be a solution to your problem: http://www.wicket-praxis.de/blog/2009/01/03/modell-referenzen/ CascadingLoadableDetachableModel will detach it's child so that for any used model detach will be called. mm:) - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org