Hi Ulf,

this thread got me thinking, it shouldn't be that hard to register a
custom wiki event listener.. Starting with 2.12.2-git-10, the
CustomWikiEventListener interface has been pushed to the public API,
in order to make really easy to use custom event listeners. The
related doc is at
https://jspwiki-wiki.apache.org/Wiki.jsp?page=HowToWriteACustomWikiEventListener

Anyone interested, please give it a try and share your impressions! O:-)


cheers,
juan pablo

On Sat, Nov 25, 2023 at 3:33 PM Juan Pablo Santos Rodríguez
<[email protected]> wrote:
>
> Hi Ulf,
>
> I've just merged the PR, a snapshot with the change should be
> available in a few minutes.
>
> thanks for following this through! :-)
>
>
> best regards,
> juan pablo
>
> On Fri, Nov 24, 2023 at 4:34 PM Ulf Dittmer
> <[email protected]> wrote:
> >
> > 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
> > > > >> > > > >
> > > > >> > > >
> > > > >> > >
> > > > >> >
> > > > >>
> > > > >
> > > >
> > >

Reply via email to