i think a LoadableDetachableModel would be good. it is attached once per request and the data is held for the duration of the request. you can have a sync block inside load() where you would copy the list from your datasource into a local copy.

-Igor


On 3/2/06, Eelco Hillenius <[EMAIL PROTECTED]> wrote:
One way could be to not update the model until you are attaching
again, or - kind of the same principle - update the model from the
buffer on detach. You still need some more synchronization though: the
attach/ detach models need to be synchronized in that case, and you
want to do it it such a way that you don't have a bunch of clients
waiting for it.

Eelco

On 3/2/06, Ramnivas Laddad <[EMAIL PROTECTED]> wrote:
>  Spoke too soon... that doesn't work and I see why. Let me think more to
> come with a solution.
>
>  -Ramnivas
>
>
>  Ramnivas Laddad wrote:
>  Okay... I solved my problem by making the model thread-aware...
>
>  class TestModel implements IModel {
>      private List<String> asyncBuffer = new ArrayList<String>();
>      private List<String> underlying = new ArrayList<String>();
>
>      synchronized public Object getObject(Component component) {
>          underlying.addAll(asyncBuffer);
>          asyncBuffer.clear();
>          return underlying;
>      }
>
>      synchronized public void add(String message) {
>          asyncBuffer.add(message);
>      }
>
>      public IModel getNestedModel() {
>          return null;
>      }
>
>      public void setObject(Component component, Object object) {
>      }
>
>      public void detach() {
>      }
>  }
>
>  Thanks Igor for your help.
>
>  -Ramnivas
>
>  Ramnivas Laddad wrote:
>  So more like the Swing's single thread policy... In that case, how do I
> update model when I receive model data asynchronously? Does Wicket has
> something like EventQueue.invokeLater() or EventQueue.invokeAndWait()?
>
>  -Ramnivas
>
>  Igor Vaynberg wrote:
> doh, i guess i should have looked at the code before jumping to conclusions.
> i assumed you were updating the listview in the callback of the ajax
> behavior. assumption is the mother of ...
>
>  you have a thread that is running unsynchronized! and updating the model of
> the component.
>
>  we synchronize on the session for you so the code inside components you
> write does not have to be threadsafe. your TestModelUpdater breaks that.
>
>  so the listview maybe rendering and looping over its model WHILE your
> thread adds another item to the list! that can cause all sorts of weird
> things.
>
>  long story short, you cannot have a run away thread updating wicket
> components or their models. its not meant for that.
>
>  -Igor
>
>
>
> On 3/2/06, Igor Vaynberg < [EMAIL PROTECTED]> wrote:
> >
> > here is what i am getting after a minute or so
> > interesting
> >
> > -Igor
> >
> > 18:09:06.263 WARN!! Exception for
> /quickstart/app?wicket:interface=:3:wmc:-1:IUnversionedBehaviorListener&wicket:behaviorId=0&random=
> 0.46824654938259036
> >
> > wicket.WicketRuntimeException : Internal Error: Could not render error page
> class wicket.markup.html.pages.InternalErrorPage
> >
> >     at
> wicket.request.compound.DefaultExceptionResponseStrategy.respond
> (DefaultExceptionResponseStrategy.java :106)
> >     at
> wicket.request.compound.AbstractCompoundRequestCycleProcessor.respond(AbstractCompoundRequestCycleProcessor.java:76)
> >     at wicket.RequestCycle.step(RequestCycle.java :971)
> >
> >     at wicket.RequestCycle.steps(RequestCycle.java:1005)
> >     at wicket.RequestCycle.request(RequestCycle.java:451)
> >
> >     at
> wicket.protocol.http.WicketServlet.doGet (WicketServlet.java:209)
> >
> >     at javax.servlet.http.HttpServlet.service
> (HttpServlet.java:740)
> >     at
> javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> >     at
> org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:358)
> >     at
> org.mortbay.jetty.servlet.WebApplicationHandler.dispatch
> (WebApplicationHandler.java:294)
> >     at
> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:567)
> >     at
> org.mortbay.http.HttpContext.handle(HttpContext.java:1807)
> >     at
> org.mortbay.jetty.servlet.WebApplicationContext.handle
> (WebApplicationContext.java:525)
> >     at
> org.mortbay.http.HttpContext.handle(HttpContext.java:1757)
> >     at
> org.mortbay.http.HttpServer.service(HttpServer.java:879)
> >     at
> org.mortbay.http.HttpConnection.service(HttpConnection.java
> :790)
> >     at
> org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:961)
> >     at
> org.mortbay.http.HttpConnection.handle (HttpConnection.java:807)
> >     at
> org.mortbay.http.SocketListener.handleConnection(SocketListener.java
> :218)
> >     at
> org.mortbay.util.ThreadedServer.handle(ThreadedServer.java :300)
> >     at
> org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:511)
> >
> > Caused by: java.lang.ClassCastException:
> wicket.ajax.AjaxRequestTarget$EncodingResponse
> >     at
> wicket.protocol.http.WebRequestCycle.getWebResponse(WebRequestCycle.java:99)
> >     at
> wicket.protocol.http.WebRequestCycle.redirectTo(WebRequestCycle.java:130)
> >     at
> wicket.request.target.component.PageRequestTarget.respond
> (PageRequestTarget.java:60)
> >
> >     at
> wicket.request.compound.DefaultResponseStrategy.respond(DefaultResponseStrategy.java :47)
> >     at
> wicket.request.compound.AbstractCompoundRequestCycleProcessor.respond
> (AbstractCompoundRequestCycleProcessor.java :66)
> >
> >     at wicket.RequestCycle.respond( RequestCycle.java:877)
> >     at wicket.RequestCycle.step(RequestCycle.java:946)
> >     ... 18 more
> >
> >
> >
> >
> >
> > On 3/2/06, Ramnivas Laddad < [EMAIL PROTECTED]> wrote:
> > >
> > > Sending again. Sourceforge is rejecting .zip attachment, so please
> change extension of the attached file to .zip.
> > >
> > > -Ramnivas
> > > ===
> > > Here it is... (removed lib/*.jar to cut down size).
> > >
> > >
> > > -Ramnivas
> > >
> > >
> > > Igor Vaynberg wrote:
> > > any chance you can stick those two files into a quickstart project?
> > >
> > > -Igor
> > >
> > >
> > >
> > > On 3/2/06, Ramnivas Laddad < [EMAIL PROTECTED]> wrote:
> > > > Hi,
> > > >
> > > > I now have an AJAXified listview working. However, occasionally (very
> > > > frequently on a real application and less frequently on a simplified
> > > > application :-() it crashes (program and stack trace at the end of
> this
> > > > email).
> > > >
> > > > I have an updater thread that adds new entries to the model for the
> > > > listview.
> > > >
> > > > A few observations:
> > > > 1. In the onRender() method, size returned by getViewSize() is 1, and
> > > > the index of the item to be rendered is 1. This all seems correct, as
> > > > the updater thread has just added a new item. However, item returned
> by
> > > > (ListItem)get( Integer.toString(index)) is null.
> > > >
> > > > 2. When the crashed view is re-rendered, I do no see the following
> > > > snippet in markup produced:
> > > > <script language="_javascript_"
> > > >             type="text/_javascript_"
> > > >
> > > >
> src="">> > > > </script>
> > > > As a result, no AJAX updates take place.
> > > >
> > > > While it seems to be concurrency-related bug, the model itself as I
> have
> > > > written seems thread-safe.
> > > >
> > > > Thanks.
> > > >
> > > > -Ramnivas
> > > >
> > > > Source code:
> > > > ==========
> > > > public class AJAXListHome extends WebPage {
> > > >     public AJAXListHome() {
> > > >         TestModel model = new TestModel();
> > > >
> > > >         WebMarkupContainer wmc = new WebMarkupContainer("wmc");
> > > >         add(wmc);
> > > >         ListView testListView = new TestListView("dates", model);
> > > >         wmc.add(testListView);
> > > >           wmc.add(new
> AjaxSelfUpdatingTimerBehavior(Duration.seconds(2)));
> > > >
> > > >         new Thread(new TestModelUpdater(model, testListView)).start();
> > > >     }
> > > > }
> > > >
> > > > class TestListView extends ListView {
> > > >     public TestListView(String id, TestModel model) {
> > > >         super(id, model);
> > > >     }
> > > >
> > > >     @Override
> > > >     protected void populateItem(ListItem item) {
> > > >         String date = (String)item.getModelObject();
> > > >         item.add(new Label("date", date));
> > > >     }
> > > > }
> > > >
> > > > class TestModel implements IModel {
> > > >     private List<String> underlying = new ArrayList<String>();
> > > >
> > > >     synchronized public Object getObject(Component component) {
> > > >         return underlying;
> > > >     }
> > > >
> > > >     synchronized public void add(String message) {
> > > >         underlying.add(message);
> > > >     }
> > > >
> > > >     public IModel getNestedModel() {
> > > >         return null;
> > > >     }
> > > >
> > > >     public void setObject(Component component, Object object) {
> > > >     }
> > > >
> > > >     public void detach() {
> > > >     }
> > > > }
> > > >
> > > > class TestModelUpdater implements Runnable {
> > > >     private TestModel model;
> > > >     private Component view;
> > > >
> > > >     static int counter = 0;
> > > >
> > > >     public TestModelUpdater(TestModel model, Component view) {
> > > >         this.model = model;
> > > >         this.view = view;
> > > >     }
> > > >
> > > >     public void run() {
> > > >         while(true) {
> > > >             model.add("string" + counter);
> > > >              // notifying model doesn't seem to be required; should it
> > > > be notified?
> > > > //            view.modelChanged();
> > > >             counter++;
> > > >             try {
> > > >                 TimeUnit.SECONDS.sleep(1);
> > > >             } catch (InterruptedException ignored) {
> > > >             }
> > > >         }
> > > >     }
> > > > }
> > > > ===
> > > > Stack trace:
> > > > Root cause:
> > > >
> > > > java.lang.NullPointerException
> > > > at
> wicket.markup.html.list.ListView.renderItem(ListView.java:606)
> > > > at
> wicket.markup.html.list.ListView.onRender(ListView.java
> :567)
> > > > at wicket.Component.render(Component.java:1516)
> > > > at
> wicket.MarkupContainer.renderNext(MarkupContainer.java :1206)
> > > > at
> wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:875)
> > > > at wicket.MarkupContainer.onComponentTagBody
> (MarkupContainer.java:795)
> > > > at
> wicket.Component.renderComponent(Component.java:1602)
> > > > at wicket.MarkupContainer.onRender(MarkupContainer.java:805)
> > > > at wicket.Component.render(Component.java:1516)
> > > > at wicket.MarkupContainer.renderNext
> (MarkupContainer.java:1206)
> > > > at
> wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:875)
> > > > at
> wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:795)
> > > > at wicket.Component.renderComponent(Component.java
> :1602)
> > > > at wicket.MarkupContainer.onRender (MarkupContainer.java:805)
> > > > at wicket.Component.render(Component.java:1516)
> > > > at
> wicket.MarkupContainer.renderNext(MarkupContainer.java:1206)
> > > > at wicket.MarkupContainer.renderAll
> (MarkupContainer.java:822)
> > > > at wicket.Page.onRender(Page.java:846)
> > > > at wicket.Component.render(Component.java:1516)
> > > > at wicket.Page.doRender(Page.java :390)
> > > > at
> > > >
> wicket.request.target.component.BookmarkablePageRequestTarget.respond
> (BookmarkablePageRequestTarget.java:224)
> > > > at
> > > >
> wicket.request.compound.DefaultResponseStrategy.respond(DefaultResponseStrategy.java:47)
> > > > at
> > > >
> wicket.request.compound.AbstractCompoundRequestCycleProcessor.respond (AbstractCompoundRequestCycleProcessor.java
> :66)
> > > > at
> wicket.RequestCycle.doProcessEventsAndRespond(RequestCycle.java:824)
> > > > at
> wicket.RequestCycle.processEventsAndRespond (RequestCycle.java:851)
> > > > at wicket.RequestCycle.step(RequestCycle.java:931)
> > > > at wicket.RequestCycle.steps (RequestCycle.java:1005)
> > > > at wicket.RequestCycle.request (RequestCycle.java:451)
> > > > at
> wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:208)
> > > > at
> javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
> > > > at
> javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> > > > at
> org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:358)
> > > > at
> > > >
> org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java
> :294)
> > > > at
> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java :567)
> > > > at
> org.mortbay.http.HttpContext.handle(HttpContext.java:1807)
> > > > at
> > > >
> org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationContext.java
> :525)
> > > > at
> org.mortbay.http.HttpContext.handle(HttpContext.java:1757)
> > > > at
> org.mortbay.http.HttpServer.service(HttpServer.java:879)
> > > > at
> org.mortbay.http.HttpConnection.service(HttpConnection.java:790)
> > > > at org.mortbay.http.HttpConnection.handleNext
> (HttpConnection.java:961)
> > > > at
> org.mortbay.http.HttpConnection.handle (HttpConnection.java:807)
> > > > at
> org.mortbay.http.SocketListener.handleConnection(SocketListener.java:218)
> > > > at org.mortbay.util.ThreadedServer.handle(
> ThreadedServer.java :300)
> > > > at
> org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:511)
> > > >
> > > >
> > > >
> > > >
> > > >
> -------------------------------------------------------
> > > > This SF.Net email is sponsored by xPML, a groundbreaking scripting
> language
> > > > that extends applications into web and mobile media. Attend the live
> webcast
> > > > and join the prime developer group breaking into this new coding
> territory!
> > > >
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
> > > > _______________________________________________
> > > > Wicket-user mailing list
> > > > Wicket-user@lists.sourceforge.net
> > > >
> https://lists.sourceforge.net/lists/listinfo/wicket-user
> > > >
> > >
> > >
> > >
> >
> >
>
>  -------------------------------------------------------
> This SF.Net email is sponsored by xPML, a groundbreaking scripting language
> that extends applications into web and mobile media. Attend the live webcast
> and join the prime developer group breaking into this new coding territory!
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
> _______________________________________________ Wicket-user
> mailing list Wicket-user@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wicket-user
> -------------------------------------------------------
> This SF.Net email is sponsored by xPML, a groundbreaking scripting language
> that extends applications into web and mobile media. Attend the live webcast
> and join the prime developer group breaking into this new coding territory!
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
> _______________________________________________ Wicket-user
> mailing list Wicket-user@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wicket-user
>  -------------------------------------------------------
> This SF.Net email is sponsored by xPML, a groundbreaking scripting language
> that extends applications into web and mobile media. Attend the live webcast
> and join the prime developer group breaking into this new coding territory!
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
> _______________________________________________ Wicket-user
> mailing list Wicket-user@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wicket-user


-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmdlnk&kid0944&bid$1720&dat1642
_______________________________________________
Wicket-user mailing list
Wicket-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wicket-user

Reply via email to