Hi,

I've created a "domain search" panel for Wicket. It consists of a ListView that lists all the TLD's, and a checkbox so you can order if the domain is available. To make it a bit fancy, I iterate over the list after construction, and set a "TldChecker" to work on each tld. Basically, it performs a whois search, and sets some boolean values on the tld after it's finished.

Then I have a AbstractAjaxTimerBehavior running every 500 milliseconds that adds any tld that has finished the whois-search to the AjaxRequestTarget. This works most of the times, but on some occations, Wicket will complain about a mismatch in the hierachy. That's obviously not the case, so I suspect the threading causes some kind of strange situation. The pertinent code:

/* The list */
final List<Tld> tlds = Collections.synchronizedList(getTlds());

/* A basic executor to spin off the threads */
Executor e = new Executor() {
        public void execute(Runnable command) {
                new Thread(command).start();
        }
};

/* Iterate over the tlds and instantiate a TldChecker */
for(Tld tld : tlds)
        e.execute(new TldChecker(tld, query)); // Args could be for instance "com", and 
"mydomain"


/* The ListView - simplified */
results = new ListView("results", tlds) {
        protected void populateItem(ListItem item) {
                final Tld tld = (Tld) item.getModelObject();
                item.setOutputMarkupId(true);

                /* Link to show who owns the domain if it's taken */
                item.add(new Link("taken") {
                        public boolean isVisible() {
                                return tld.getDone() && !tld.getAvailable() && 
!tld.getIllegal();
                        }
                        public void onClick() {
                                setResponsePage(new WhoisPage(query));
                        }
                }.setPopupSettings(new PopupSettings()));

                /* Checkbox so it can be ordered */
                item.add(new CheckBox("selected", new PropertyModel(tld, 
"selected")) {
                        public boolean isVisible() {
                                return (tld.getDone() && tld.getAvailable());
                        }
                });

                /* Some other fields, showing spinner while !tld.getDone() etc 
*/
        }
}


/* The timer - it stops when all the TldChekers are finished. 'Published' means 
it has been added to the request target */
add(new AbstractAjaxTimerBehavior(Duration.milliseconds(500)) {
        protected  void onTimer(AjaxRequestTarget target) {
                int running = 0;
                synchronized (tlds) {
                        for(int i = 0; i < tlds.size(); i++) {
                                Tld tld = tlds.get(i);
                                if(!tld.getDone())
                                        running++;
                                if(tld.getDone() && !tld.getPublished()) {
                                        Component theTr = 
results.get(String.valueOf(i));
                                        target.addComponent(theTr);
                                        target.appendJavascript("fadein('" + 
theTr.getMarkupId() +"');"); // JQuery Magick, has nothing to do with the problem, tried 
to remove it
                                        tld.setPublished(true);
                                }
                        }
                }
                if(running == 0)
                        stop();
        }
});

/* The HTML for the ListView */
            <tr wicket:id="results">
                <td class="domain"><span wicket:id="domain">Domain</span></td>
                <td>
                    <input type="checkbox" wicket:id="selected"/>
                    <a class="taken" wicket:id="taken">taken</a>
                    <!-- Some more markup, removed for brevity, like this one:
                       <span class="searching" 
wicket:id="searching">searching</span>
                    -->
                </td>
            </tr>

Wicket will complain about the checkbox with wicket:id "selected". If I remove 
the isVisible() method, it never fails:

public boolean isVisible() {
        return (tld.getDone() && tld.getAvailable());
}

What might I be doing wrong? Any idea? :))

Here's Wicket's complaint at the time of the error:

13:13:39,186 ERROR [RequestCycle] [btpool0-1 - /?wicket:interface=:5:searchInputPanel:searchInputForm::IFormSubmitListener::] The component(s) below failed to render. A common problem is that you have added a component in code but forgot to reference it in the markup (thus the component will never be rendered).

1. [MarkupContainer [Component id = selected, page = no.tornado.web.modules.domorder.DomainSearchPage, path = 6:searchResultPanel:f:results:0:selected.DomainSearchResultPanel$3$2, isVisible = true, isVersioned = false]]

org.apache.wicket.WicketRuntimeException: The component(s) below failed to render. A common problem is that you have added a component in code but forgot to reference it in the markup (thus the component will never be rendered).

1. [MarkupContainer [Component id = selected, page = no.tornado.web.modules.domorder.DomainSearchPage, path = 6:searchResultPanel:f:results:0:selected.DomainSearchResultPanel$3$2, isVisible = true, isVersioned = false]]

        at org.apache.wicket.Page.checkRendering(Page.java:1116)
        at org.apache.wicket.Page.renderPage(Page.java:914)
        at 
org.apache.wicket.protocol.http.WebRequestCycle.redirectTo(WebRequestCycle.java:163)
        at 
org.apache.wicket.request.target.component.PageRequestTarget.respond(PageRequestTarget.java:58)
        at 
org.apache.wicket.request.AbstractRequestCycleProcessor.respond(AbstractRequestCycleProcessor.java:104)
        at 
org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1172)
        at org.apache.wicket.RequestCycle.step(RequestCycle.java:1243)
        at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1330)
        at org.apache.wicket.RequestCycle.request(RequestCycle.java:493)
        at 
org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:358)
        at 
org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:194)
        at 
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
        at 
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
        at 
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
        at 
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
        at 
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
        at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
        at 
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
        at org.mortbay.jetty.Server.handle(Server.java:320)
        at 
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
        at 
org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:842)
        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:648)
        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
        at 
org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
        at 
org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450)

Normally, I need to search for a few domain names before the error occurs.

-- Edvin

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to