Hi Juan- Done: https://github.com/apache/jspwiki/pull/322
It's strange that the URL decoding is commented out, because that is actually needed. Ulf On Fri, Nov 24, 2023 at 2:49 PM Juan Pablo Santos Rodríguez < [email protected]> wrote: > Hi Ulf! > > Hmmm seems to me that URLConstructor.parsePageFromUrl was thought with the > short URL constructors in mind. I'd rather change it so it looks like: > > static String parsePageFromURL( final HttpServletRequest request, final > Charset encoding ) { > final String name = request.getPathInfo(); > if( name == null || name.length() <= 1 ) { > return request.getParameter("page"); /////////// change here, > might still return null for front page, so perhaps it should return > engine.getFrontPage in that case? > } else if( name.charAt(0) == '/' ) { > return name.substring(1); > } > > // This is required, because by default all URLs are handled as > Latin1, even if they are really UTF-8. > // name = TextUtil.urlDecode( name, encoding ); > > return name; > } > > } > > fixing/adding appropriate unit tests. Would you mind trying that & sending > a PR if it fixes the issue? If not able, I think I can commit/push the code > myself this weekend. > > The issue with the parsePage method is that it needs the current wiki > context (attach, view, edit, etc.), which isn't there in a straightforward > way. > > > Best regards, > juan pablo > > El jue, 23 nov 2023, 11:43, Ulf Dittmer <[email protected] > .invalid> > escribió: > > > I'm confused: URLConstructor.parsePageFromURL -which is used to extract > the > > page name from the HttpServletRequest when firing the PAGE_REQUESTED and > > PAGE_DELIVERED events- looks at the path info rather than the query > string > > (which contains the page name). How is that supposed to work? Should it > be > > using URLConstructor.parsePage instead? > > > > Something like this seems to do the trick: > > > > String name = request.getParameter("page"); > > if (StringUtils.isBlank(name)) { > > // TODO: get reference to Engine > > // name = engine.getFrontPage(); > > } else { > > // This is required, because by default all URLs are handled as > Latin1, > > even if they are really UTF-8. > > name = URLDecoder.decode(name, encoding); > > } > > > > > > > > > > On Wed, Nov 22, 2023 at 7:02 PM Ulf Dittmer <[email protected]> > > wrote: > > > > > Now we're getting somewhere :-) > > > > > > In WikIEventManager, I can see my listener being added > > > in WikiEventDelegate.addWikiEventListener, but the reference is null > when > > > the event reaches WikiEventDelegate.fireEvent. Probably courtesy of the > > > WeakReference. > > > > > > Ok, making the event listener a static class, and keeping a reference > to > > > it in CoreBean, causes the listener to not be null, and to receive > > > PAGE_DELIVERED events. > > > engine.addWikiEventListener(myListener) now works fine. > > > > > > BUT: for both PAGE_REQUESTED and PAGE_DELIVERED, the event's > > getPageName() > > > method returns null > > > The javadocs state "Returns the Wiki page name associated with this > > > event. This may be null if unavailable." but why would it be > unavailable? > > > > > > Thanks, > > > Ulf > > > > > > On Wed, Nov 22, 2023 at 6:01 PM Juan Pablo Santos Rodríguez < > > > [email protected]> wrote: > > > > > >> Hi!, > > >> > > >> The lifecycle extension was just an easy entry point to register the > > >> listener, if you're doing it elsewhere it should be fine, you should > be > > >> receiving the events as soon as you've registered it. > > >> > > >> Regarding the registration, > > >> > > >> > WikiEventManager.addWikiEventListener(org.apache.wiki.WikiEngine.class, > > >> new > > >> WikiEventListener() { > > >> > > >> Having skimmed the code this morning, I think it should use the engine > > >> instance, something like > > >> > > >> WikiEventManager.addWikiEventListener(m_engine, new > > >> WikiEventListener() { > > >> > > >> As this is where WikiJSPFilter send the events. Would you mind trying > to > > >> debug inside WikiEventManager.fireEvent to see where the events are > > being > > >> dispatched? I'll try to look into this throughout the week, but can't > > >> promise anything. > > >> > > >> > > >> Best regards, > > >> juan pablo > > >> > > >> El mié, 22 nov 2023, 16:52, Ulf Dittmer <[email protected] > > >> .invalid> > > >> escribió: > > >> > > >> > Hm, creating an extension seems like a lot of effort for something > > that > > >> > should -from my reading of the javadocs- be relatively simple to do. > > >> > > > >> > I'm beefing up the CoreBean with page view statistics. So the code I > > >> posted > > >> > before would be run as part of the CoreBean constructor, which > should > > >> > ensure that it is run during startup time. > > >> > > > >> > Based on what you said I just tried > > >> > > > >> > > >> > WikiEventManager.addWikiEventListener(org.apache.wiki.WikiEngine.class, > > >> new > > >> > > >> WikiEventListener() { > > >> > > > >> > > >> but some (non-) result: The listener is just not called. I feel like > I'm > > >> > missing something very simple, but I have experimented a lot, and > > can't > > >> > figure out what it is. > > >> > > > >> > Thanks, > > >> > Ulf > > >> > > > >> > On Wed, Nov 22, 2023 at 3:33 PM Juan Pablo Santos Rodríguez < > > >> > [email protected]> wrote: > > >> > > > >> > > Hi Ulf, > > >> > > > > >> > > I haven't had time to look into this in detail, but I'd try to > > >> register > > >> > the > > >> > > listener through an Engine lifecycle extension (#1), from there > you > > >> > should > > >> > > be able to register your listener as soon as the Engine is > > >> instantiated. > > >> > > > > >> > > WikiJSPFilter fires some Page events, but fires them to the > running > > >> > > WikiEngine, so it's there where you should listen to. > > >> > > > > >> > > WikiEventUtils disappeared long ago, IIRC due to a refactor so > that > > >> the > > >> > > jspwiki-event could be extracted to it's own module. Don't > remember > > >> very > > >> > > well, but its methods ended up mostly in WiliEventManager > > >> > > > > >> > > > > >> > > HTH, > > >> > > juan pablo > > >> > > > > >> > > #1: > > >> > > > > >> > > > > >> > > > >> > > > https://jspwiki-wiki.apache.org/Wiki.jsp?page=HowToWriteAnEngineLifecycleExtension > > >> > > > > >> > > > > >> > > El mié, 22 nov 2023, 10:49, Ulf Dittmer < > [email protected] > > >> > > .invalid> > > >> > > escribió: > > >> > > > > >> > > > I also tried > > >> > > > > > >> > > > > > >> > > > > > >> > > > > >> > > > >> > > > WikiEventManager.addWikiEventListener(org.apache.wiki.ui.WikiServletFilter.class, > > >> > > > new WikiEventListener() { > > >> > > > ... > > >> > > > > > >> > > > but that doesn't get called, either. Does anyone know how that > is > > >> > > supposed > > >> > > > to work? > > >> > > > > > >> > > > If I understand > > >> > https://jspwiki-wiki.apache.org/Wiki.jsp?page=WikiEvent > > >> > > > correctly, that might need to be done BEFORE WikiServletFilter > in > > >> > > > instantiated, but I don't see how that is possible. But then, > I'm > > >> not > > >> > > sure > > >> > > > how accurate that page is - some of the other pages describing > > event > > >> > > > handling some out of date. > > >> > > > > > >> > > > Thanks, > > >> > > > Ulf > > >> > > > > > >> > > > On Tue, Nov 21, 2023 at 11:10 AM Ulf Dittmer < > > >> > [email protected] > > >> > > > > > >> > > > wrote: > > >> > > > > > >> > > > > Hi- > > >> > > > > > > >> > > > > I'm trying to get notified whenever a page is delivered by > > >> listening > > >> > to > > >> > > > > WikiPageEvent.PAGE_DELIVERED events. To that end I > implemented a > > >> > > > > WikiEventListener like this > > >> > > > > > > >> > > > > engine.addWikiEventListener(new WikiEventListener() { > > >> > > > > @Override > > >> > > > > public void actionPerformed (WikiEvent event) { > > >> > > > > log.info(event.toString()); > > >> > > > > if (event instanceof WikiPageEvent) { > > >> > > > > ... > > >> > > > > } > > >> > > > > } > > >> > > > > }); > > >> > > > > } > > >> > > > > > > >> > > > > But the listener is never called with WikiPageEvents. > According > > to > > >> > > > > https://jspwiki-wiki.apache.org/Wiki.jsp?page=WikiEventUtils > (a > > >> > class > > >> > > > > which apparently no longer exists) I may have to register the > > >> > listener > > >> > > > with > > >> > > > > WikiServletFilter rather than WikiEngine. How would I go about > > >> that? > > >> > > > > > > >> > > > > Thanks, > > >> > > > > Ulf > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > > > > >
