i will try to look over it in the few coming days and give you some feedback.
-igor On Mon, Feb 7, 2011 at 3:43 AM, Joo Hama <[email protected]> wrote: > Thanks Igor and Jeremy, > > I managed to resolve these issues and committed a patch to JIRA: > > https://issues.apache.org/jira/browse/WICKET-3422 > > It introduces an "inline" Enclosure defined as an attribute of a > html tag, and a listener to find the right inline Enclosures at the > time of Ajax request handling. It seems to work well with the existing > wicket > code base, and all tests are green. What do you guys think? Is it suitable > material to commit to wicket? > > - Joonas > <https://issues.apache.org/jira/browse/WICKET-3422> > > On Fri, Jan 21, 2011 at 8:41 PM, Joo Hama <[email protected]>wrote: > >> >> The EnclosureResolver... container.autoAdd seems to be invoked only in the >> parsing >> phase of the original request, whereas the onBeforeRender is invoked during >> handling >> of the AjaxRequest (when the listener is attached to the >> AjaxRequestTarget). >> >> I found out that the Enclosure is not a child of a Page, thus making it >> quite elusive >> to get hold of in the onBeforeRespond event. I even attempted to >> read MarkupStream, >> and indeed found the tag there. (source below) However, in order to add it >> to the requestTarget, we >> need to get hold of the component. I tried to read the path of the tag in >> the document >> using ComponentTag.getPath(), but it was null. This is where i hit brick >> wall. >> >> Is it possible to get hold of the Enclosure component with only >> the WicketTag from the >> MarkupStream as reference? If not, i think this approach might not be >> viable. >> >> >> // Override of the application class method newAjaxRequestTarget, trying to >> find enclosures that have >> // the child id of a component >> // in the ajaxTarget: >> //----------------------- >> @Override >> public AjaxRequestTarget newAjaxRequestTarget(Page page) { >> AjaxRequestTarget target = super.newAjaxRequestTarget(page); >> target.addListener(new AjaxRequestTarget.IListener() { >> >> public void onBeforeRespond(Map<String, Component> map, >> AjaxRequestTarget target) { List<String> ids = new ArrayList<String>(); >> Page page = null; // first read all the component id:s from the target for >> (Component component : map.values()) { page = component.getPage(); >> ids.add(component.getId()); } // then traverse the markupStream to find >> enclosureTags if (page != null) { MarkupStream stream = >> page.getMarkupStream(); stream.setCurrentIndex(0); while (stream.hasMore()) >> { stream.skipRawMarkup(); if (stream.hasMore()) { WicketTag tag = new >> WicketTag(stream.getTag()); if (tag.isEnclosureTag()) { // Try to match the >> enclosureTag:s child id to the ids in the target String childId = >> tag.getAttribute("child"); if (childId != null) { String[] parts = >> childId.split(":"); childId = parts[parts.length - 1]; for (String id : ids) >> { if (id.equals(childId)) { System.err .println("Found enclosure " + >> tag.getId() + " at path:" + tag.getPath() + ", who's child is targeted Id=" >> + childId); } } } } stream.next(); } } } } >> public void onAfterRespond(Map<String, Component> map, IJavascriptResponse >> response) { System.err.println("onAfterRespond"); } }); return target; } >> //------------- >> >> >> On Fri, Jan 21, 2011 at 3:58 PM, Martin Makundi < >> [email protected]> wrote: >> >>> Hi! >>> >>> EnclosureResolver....container.autoAdd is invoked at render phase? >>> Would it be necessary to hook into a different event (instead of >>> onBeforeRender) or could it be pre-sniffed at onBeforeRender? >>> >>> ** >>> Martin >>> >>> 2011/1/21 Joo Hama <[email protected]>: >>> > I tested this idea by adding the code below to my web application >>> > object. Problem was though, >>> > that when viewing the variables in debugger, the enclosure object didn't >>> > seem to be included in >>> > the tree of the parent objects. It was as if the enclosure was invisible >>> to >>> > them. Perhaps because >>> > Enclosure is a transparent resolver? >>> > >>> > object tree in my application: >>> > >>> > - page >>> > - enclosure >>> > - div (the parent of this was shown to be page, not the enclosure) >>> > >>> > >>> > Code: >>> > //----------------------------- >>> > @Override public AjaxRequestTarget newAjaxRequestTarget(Page page) { >>> > AjaxRequestTarget target = super.newAjaxRequestTarget(page); >>> > target.addListener(new AjaxRequestTarget.IListener() { public void >>> > onBeforeRespond(Map<String, Component> map, AjaxRequestTarget target) { >>> > for(Component component : map.values()) { Enclosure parentEnclosure = >>> > component.findParent(Enclosure.class); if (parentEnclosure != null) { >>> > Enclosure topParent = new Enclosure("DUMMY", "DUMMY"); while (topParent >>> != >>> > null) { topParent = parentEnclosure.findParent(Enclosure.class); if >>> > (topParent != null) { parentEnclosure = topParent; } } >>> > target.addComponent(parentEnclosure); } } } public void >>> > onAfterRespond(Map<String, Component> map, IJavascriptResponse response) >>> {} >>> > }); return target; }; >>> > //----------------------- >>> > >>> > >>> > On Fri, Jan 21, 2011 at 3:07 AM, Jeremy Thomerson < >>> [email protected] >>> >> wrote: >>> > >>> >> On Thu, Jan 20, 2011 at 1:51 PM, Igor Vaynberg < >>> [email protected] >>> >> >wrote: >>> >> >>> >> > interesting idea. i think this would require a bit of a trick. >>> >> > >>> >> > a) modify enclosure tag handler to accept an attribute instead of a >>> tag >>> >> > b) modify enclosure tag handler to add a bit of metadata to the >>> >> > component marking that it belongs to an enclosure >>> >> > c) add a ajaxrequesttarget.listener to the request target that checks >>> >> > for this bit of metadata and adds the enclosure container to the ajax >>> >> > request target. >>> >> > >>> >> > not sure how feasible this all is because the enclosure container is >>> >> > an auto component. but, you are welcome to tinker around. >>> >> > >>> >> > -igor >>> >> >>> >> >>> >> I, too, like the idea. Couldn't it be simpler? Couldn't he: >>> >> >>> >> 1: Override newAjaxRequestTarget in WebApplication >>> >> 2: When he creates an ART, add a listener to it. >>> >> 3: In the listener, in onBeforeRespond, do this: >>> >> >>> >> for(Component component : map.values()) { >>> >> Enclosure parentEnclosure = component.findParent(Enclosure.class); >>> >> while (parentEnclosure != null) { >>> >> Enclosure topParent = >>> parentEnclosure.findParent(Enclosure.class); >>> >> if (topParent != null) { >>> >> parentEnclosure = topParent; >>> >> } >>> >> } >>> >> if (parentEnclosure != null) { >>> >> addComponent(parentEnclosure); >>> >> } >>> >> } >>> >> >>> >> >>> >> >>> >> -- >>> >> Jeremy Thomerson >>> >> http://wickettraining.com >>> >> *Need a CMS for Wicket? Use Brix! http://brixcms.org* >>> >> >>> > >>> >> >> >
