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]