Hello (see answers inline) (I also invited you to OPS4J JIRA).
czw., 21 sty 2021 o 12:03 Denis Anisimov <[email protected]> napisał(a): > Thanks a lot for your reply. > > Looks like you are talking about this issue: > https://ops4j1.jira.com/browse/PAXWEB-62 > But it's extremely old and it's closed so I though it's resolved. > Yes - it's not about this issue... It's about lifecycle mismatch between the container (like Jetty) and Pax Web Whiteboard. > > In my example it's not known when the listener is registered: before the > servlet is registered and servlet context is initialized or after. > You are right here. > But I've started from another example where the listener is declared via > DS in a separate bundle. > And I had deployed this bundle first : so it's registered as a service by > PAX. > Then I've deployed the web bundle and the listener has not been called > anyway. > > So personally for me regardless of the order of listener registration > (before or after servlet) it's never called. > After reading your later email I think it works in some combination ;) > > The related topic for this : it's possible to declare > `ServletContexHelper` with a given name. Then I can > require to register a `Servlet` , any listener for the context identified > by the name. But what happens if there > is no such context helper registered YET ? In the same way I may declare > the helper in a different bundle and > it's not possible to say when it will be registered : before or after the > servlet. > See for example this specially crafted test: https://github.com/ops4j/org.ops4j.pax.web/blob/master-improvements/pax-web-itest/pax-web-itest-server/src/test/java/org/ops4j/pax/web/itest/server/whiteboard/WhiteboardDynamicContextsTest.java#L92-L118 This test first registers a Servlet and only then a ServletContextHelper matching the servlet's osgi.http.whiteboard.context.select selector. It is then handled by reRegisterWebElements() method <https://github.com/ops4j/org.ops4j.pax.web/blob/785781c3a074481237b7afbbcdd3d67fcac9558e/pax-web-extender-whiteboard/src/main/java/org/ops4j/pax/web/extender/whiteboard/internal/WhiteboardExtenderContext.java#L374> . > So what will happen in that case: will it wait until the context helper > appear with the given name or just > simply fails because there is no helper with this name ? > It can't fail according to specification. What's even more confusing is this scenario: 1) you register a ServletContextHelper with name "x" and context path "/x" 2) you register a Servlet targetting "x" context with /s mapping - so it's available under /x/s 3) you register a ServletContextHelper with name "x" (so conflicting with the first one), "/x2" context path and higher service ranking - your servlet should automatically re-register itself to be available under /x2/s path See also https://github.com/ops4j/org.ops4j.pax.web/blob/master-improvements/pax-web-itest/pax-web-itest-server/src/test/java/org/ops4j/pax/web/itest/server/controller/ServerControllerBasicRegistrationTest.java#L681-L708 to check how servlets conflicting by name impact the context they're registered in... > I expect that it won't fail and wait until the helper appears . Because > otherwise I need to write boilerplate > code which waits for the appearance of the service which normally I should > not even know about > (via ServiceTracker or via @Reference). This is extremely inconvenient. > Yes - this is assured by proper Whiteboard implementation which I believe Pax Web 8 already is. > And the same situation is here with `ServletContexListener`: I have to > wait until it's registered and register the servlet > only after that. > By the way I will check that : whether this work at all or not. > > But anyway: this looks like a bug because you may not rely on the order of > listener registration: the listener should be called even if the servlet > context > of the web app "has been already initialized". As I understand this is > exactly what https://ops4j1.jira.com/browse/PAXWEB-62 issue says. > PAXWEB-62 probably concerned something more fundamental and I think it was created even before OSGi CMPN Whiteboard spec was created. > Also this is exactly how felix-jetty work: the servlet may be already > intialized (registered and then even initialized) but once the servlet > context listener > is registered it's called anyway. > felix.http is good HttpService/Whiteboard implementation, but everything is implemented under/inside single "dispatcher servlet" registered ONCE to Jetty. Pax Web attempts to leverage as much as possible from the underlying container, which may be dynamically swapped. > That's why the behavior was quite confusing for me. > > But as I understand you confirmed that this does't work properly in pax > web 7 and this is what you are working on for pax web 8. > Yes. It takes so long, because in my daily work I'm a software maintainer and my usual practice is to code in conservative way to 1) not break anything, 2) anticipate all potential problems with the fix. kind regards Grzegorz Grzybek > Thank you . > > >And about Pax Web issues - please let me know the login/email you've used > in ops4j JIRA and I'll give you proper permissions. I can't see > [email protected] <https://groups.google.com/> in OPS4j JIRA user list. > > I've been trying to login with my Google account [email protected] > <https://groups.google.com/> but then it immediately says that this > account has no access to JIRA. > I've registered another account "den *@* admincomps *dot* > ru" > At least I've received the e-mail which confirms the registration. > Could you please try that ? > > > On Thursday, January 21, 2021 at 1:20:49 PM UTC+3 [email protected] > wrote: > >> Hello >> >> I've checked your project and you're nicely using SCRs to register a >> listener and a servlet. >> >> But you can't be sure which SCR component registers its service first! >> And even if you could know it (there are tricks to add a @Reference from >> one @Component to a service of other @Component), you would STILL not be >> sure which will be first tracked by pax-web-extender-whiteboard! >> >> I found this SCR problem which was never resolved in pax web 7 and >> earlier and I described it in my Pax Web 8 refactoring branch: >> https://github.com/ops4j/org.ops4j.pax.web/tree/master-improvements/samples/samples-whiteboard/whiteboard-ds >> >> So I checked that Jetty's "context" is started immediately after your >> servlet is being registered. This is the thread trace that starts Jetty: >> >> "pipe-start 109@10061" prio=5 tid=0x17f nid=NA runnable >> java.lang.Thread.State: RUNNABLE >> at >> org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:348) >> at >> org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.startContext(HttpServiceContext.java:392) >> at >> org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:855) >> at >> org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:275) >> at >> org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doStart(HttpServiceContext.java:268) >> at >> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72) >> - locked <0x283c> (a java.lang.Object) >> at >> org.ops4j.pax.web.service.jetty.internal.JettyServerImpl$1.start(JettyServerImpl.java:327) >> at >> org.ops4j.pax.web.service.internal.HttpServiceStarted.registerServlet(HttpServiceStarted.java:255) >> ... >> at >> org.ops4j.pax.web.extender.whiteboard.internal.element.ServletWebElement.register(ServletWebElement.java:102) >> ... >> at >> org.ops4j.pax.web.extender.whiteboard.internal.tracker.AbstractTracker.addingService(AbstractTracker.java:44) >> ... >> at org.apache.felix.framework.Felix.registerService(Felix.java:3804) >> at >> org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:328) >> at >> org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:929) >> ... >> at >> org.apache.karaf.bundle.command.BundlesCommand.execute(BundlesCommand.java:55) >> at >> org.apache.karaf.shell.impl.action.command.ActionCommand.execute(ActionCommand.java:84) >> >> and when org.eclipse.jetty.servlet.ServletContextHandler starts, there's >> only one listener available - >> org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer$ContextDestroyListener. >> >> org.eclipse.jetty.server.handler.ContextHandler#callContextInitialized() >> is called when the context is at >> org.eclipse.jetty.server.handler.ContextHandler.ContextStatus#NOTSET state >> and then switches to INITIALIZED. >> >> Then when your listener is added (after the servlet), Pax Web 7 tries >> hard to unregister your first servlet (correctly) to register it again >> after registering the listener. >> org.eclipse.jetty.server.handler.ContextHandler#addEventListener() is >> properly called, then >> org.eclipse.jetty.servlet.ServletHandler#setServletMappings(), cache of >> mappings is invalidated. >> >> And while >> org.eclipse.jetty.server.handler.ContextHandler#_servletContextListeners >> contains your org.example.TestServletContextListener, it is NOT called >> because org.eclipse.jetty.server.handler.ContextHandler#_contextStatus is >> not NOTSET, but INITIALIZED. >> >> So that's the problem with Pax Web 7. >> >> I'm really trying hard to handle all such cases in Pax Web 8, but I can't >> do it 8hrs a day ;) That's why it's still not ready yet. >> >> And about Pax Web issues - please let me know the login/email you've used >> in ops4j JIRA and I'll give you proper permissions. I can't see >> [email protected] in OPS4j JIRA user list. >> >> regards >> Grzegorz Grzybek >> >> czw., 21 sty 2021 o 10:12 Denis Anisimov <[email protected]> napisał(a): >> >>> Hi I have the same problem. >>> >>> I'm trying to get it working in Karaf. >>> So I'm not sure whether this a Karaf issue or PAX-web. >>> >>> I can provide steps to reproduce with Karaf: >>> - Download Karaf 4.3.0 >>> - Extract it. >>> - Run it via ./bin/karaf >>> - invoke commands in the Karaf shell: "feature:install >>> httpfeature:install war" >>> - install logger via the Karaf shell: "bundle:install -s >>> mvn:org.slf4j/slf4j-simple/1.7.25 bundle:install -s >>> mvn:org.slf4j/slf4j-api/1.7.25" >>> - Use this project https://github.com/denis-anisimov/simple-web >>> - install the project locally >>> - install the attached project : "bundle:install -s >>> mvn:org.example/simple-web/1.0.0" >>> - open the browser "http://localhost:8181/". >>> - the servlet is working : the message is shown in the browser. >>> - but the "TestServletContextListener::contextInitialized" is never >>> invoked. Neither console not log contains expected message. >>> >>> Is it a bug in PAX-web? Karaf ? >>> Or am I doing somethig wrong ? >>> ServletContextListener works as expected in the felix-jetty . >>> >>> By the way : how can I create an issue for PAX? Once I create an account >>> to login to JIRA it says I don't have access to it. >>> And I may not create a ticket. >>> On Tuesday, March 5, 2019 at 8:20:45 AM UTC+3 [email protected] wrote: >>> >>>> Hello >>>> >>>> Did you try registering separate listeners instead of one with >>>> different interfaces? >>>> >>>> I'm not sure about this ValidatorException. Try running mvn with -e >>>> option to show full stack traces. >>>> >>>> regards >>>> Grzegorz Grzybek >>>> >>>> czw., 14 lut 2019 o 23:45 Nhut Thai Le <[email protected]> >>>> napisał(a): >>>> >>>>> Hello again, >>>>> For some reason, i was able to get my ServletContextListener working >>>>> for a while then now i need to added another one (for different app >>>>> context) and i found that both the new and old one does not work anymore. >>>>> My other HttpSessionListener is still working fine. Funny is that both the >>>>> ServletContextListener and the HttpSessionListener is extended by the same >>>>> class: >>>>> >>>>> @Component( >>>>> service= { >>>>> javax.servlet.http.HttpSessionListener.class, >>>>> ServletContextListener.class >>>>> }, >>>>> property= { >>>>> "osgi.http.whiteboard.listener=true", >>>>> "osgi.http.whiteboard.context.select=( >>>>> osgi.http.whiteboard.context.name=WebviewerServletContextHelper)", >>>>> "listener.name=WebviewerServletContextListener" >>>>> } >>>>> ) >>>>> public final class ZkListener implements >>>>> javax.servlet.http.HttpSessionListener, ServletContextListener {} >>>>> >>>>> Where should i start debugging this? >>>>> >>>>> By the way, I tried to the command to run test on jetty that you >>>>> suggested and i got: >>>>> [INFO] >>>>> ------------------------------------------------------------------------ >>>>> [INFO] BUILD FAILURE >>>>> [INFO] >>>>> ------------------------------------------------------------------------ >>>>> [INFO] Total time: 19.390 s >>>>> [INFO] Finished at: 2019-02-14T17:32:16-05:00 >>>>> [INFO] Final Memory: 24M/274M >>>>> [INFO] >>>>> ------------------------------------------------------------------------ >>>>> [ERROR] Failed to execute goal on project >>>>> pax-web-itest-container-jetty: Could not resolve dependencies for project >>>>> org.ops4j.pax.web.itest.container:pax-web-itest-container-jetty:jar:7.2.9-SNAPSHOT: >>>>> Failed to collect dependencies at >>>>> org.ops4j.pax.web.itest:pax-web-itest-base:jar:7.2.9-SNAPSHOT: Failed to >>>>> read artifact descriptor for >>>>> org.ops4j.pax.web.itest:pax-web-itest-base:jar:7.2.9-SNAPSHOT: Could not >>>>> transfer artifact >>>>> org.ops4j.pax.web.itest:pax-web-itest-base:pom:7.2.9-SNAPSHOT from/to >>>>> prime-repo (http://repository.primefaces.org): >>>>> sun.security.validator.ValidatorException: PKIX path building failed: >>>>> sun.security.provider.certpath.SunCertPathBuilderException: unable to find >>>>> valid certification path to requested target -> [Help 1] >>>>> >>>>> Not sure what is wrong with my cert. >>>>> >>>>> On Tue, Oct 2, 2018 at 4:19 AM Grzegorz Grzybek <[email protected]> >>>>> wrote: >>>>> >>>>>> Hello >>>>>> >>>>>> Sorry for late answer. There's testListenersWithHttpContext() test >>>>>> here: >>>>>> https://github.com/ops4j/org.ops4j.pax.web/blob/pax-web-7.2.x/pax-web-itest/pax-web-itest-common/src/main/java/org/ops4j/pax/web/itest/common/AbstractWhiteboardR6IntegrationTest.java#L289 >>>>>> >>>>>> It does exactly what you're trying to achieve, but without SCR - only >>>>>> by registering relevant services. You can run the test from within any of >>>>>> three container itest projects: >>>>>> >>>>>> mvn clean verify -f >>>>>> pax-web-itest/pax-web-itest-container/pax-web-itest-container-jetty/ >>>>>> -Dit.test=WhiteboardR6IntegrationTest#testListenersWithHttpContext >>>>>> mvn clean verify -f >>>>>> pax-web-itest/pax-web-itest-container/pax-web-itest-container-tomcat/ >>>>>> -Dit.test=WhiteboardR6IntegrationTest#testListenersWithHttpContext >>>>>> mvn clean verify -f >>>>>> pax-web-itest/pax-web-itest-container/pax-web-itest-container-undertow/ >>>>>> -Dit.test=WhiteboardR6IntegrationTest#testListenersWithHttpContext >>>>>> >>>>>> I'm not sure what may be your problem (maybe you'll share your maven >>>>>> project via github?) - but this may be related to some other bundles you >>>>>> have installed in your runtime (pure Equinox? pax-exam test? Karaf based >>>>>> on >>>>>> Equinox?) - which may cause problems with finding services you register >>>>>> by >>>>>> pax-web-extender-whiteboard. >>>>>> >>>>>> best regards >>>>>> Grzegorz Grzybek >>>>>> >>>>>> pon., 24 wrz 2018 o 22:13 Nhut Thai Le <[email protected]> >>>>>> napisał(a): >>>>>> >>>>>>> Hello, >>>>>>> >>>>>>> I tried to hook a servletContextListener to my custom >>>>>>> ServletContextHelper but the contextInitialized method is not called. >>>>>>> -------------------Here is my ServletContextHelper:------------ >>>>>>> @Component( >>>>>>> service = ServletContextHelper.class, >>>>>>> property = { >>>>>>> "osgi.http.whiteboard.context.name >>>>>>> =ZkComponentsServletContextHelper", >>>>>>> "osgi.http.whiteboard.context.path=/components" >>>>>>> } >>>>>>> ) >>>>>>> public class ZkComponentsServletContextHelper extends >>>>>>> ServletContextHelper {...} >>>>>>> --------------------------------My ServletContextListener---------- >>>>>>> @Component( >>>>>>> name="ZkListener", >>>>>>> service= { >>>>>>> ServletContextListener.class >>>>>>> }, >>>>>>> property= { >>>>>>> "osgi.http.whiteboard.listener=true", >>>>>>> "osgi.http.whiteboard.context.select=( >>>>>>> osgi.http.whiteboard.context.name=ZkComponentsServletContextHelper)" >>>>>>> } >>>>>>> ) >>>>>>> public final class ZkSessionListener implements >>>>>>> ServletContextListener { >>>>>>> private WebManager webManager; >>>>>>> >>>>>>> @Override >>>>>>> public void contextInitialized(ServletContextEvent sce) { >>>>>>> final ServletContext ctx = sce.getServletContext(); >>>>>>> if (WebManager.getWebManagerIfAny(ctx) == null) { >>>>>>> webManager = new WebManager(ctx, "/zkau"); >>>>>>> } else { >>>>>>> throw new IllegalStateException("ZK WebManager already exists. Could >>>>>>> not initialize via Spring Boot configuration."); >>>>>>> } >>>>>>> } >>>>>>> ------------------------------Finally, my simple servlet------------- >>>>>>> @Component( >>>>>>> service = Servlet.class, >>>>>>> property= { >>>>>>> "osgi.http.whiteboard.servlet.pattern=*.zul", >>>>>>> "osgi.http.whiteboard.servlet.pattern=*.zhtml", >>>>>>> "osgi.http.whiteboard.context.select=( >>>>>>> osgi.http.whiteboard.context.name=ZkComponentsServletContextHelper)" >>>>>>> } >>>>>>> ) >>>>>>> public class ZulExtensionServlet extends HttpServlet{..} >>>>>>> ---------------------equinox bundle info------------- >>>>>>> {org.osgi.service.http.context.ServletContextHelper}={service.id=95, >>>>>>> osgi.http.whiteboard.context.name=ZkComponentsServletContextHelper, >>>>>>> service.bundleid=59, service.scope=bundle, >>>>>>> component.name=com.castortech.iris.zk.components.ZkComponentsServletContextHelper, >>>>>>> osgi.http.whiteboard.context.path=/components, component.id=3} >>>>>>> >>>>>>> {javax.servlet.Servlet}={service.id=97, service.bundleid=59, >>>>>>> service.scope=bundle, >>>>>>> osgi.http.whiteboard.servlet.pattern=[*.zul,*.zhtml], >>>>>>> osgi.http.whiteboard.context.select=( >>>>>>> osgi.http.whiteboard.context.name=ZkComponentsServletContextHelper), >>>>>>> component.name=com.castortech.iris.zk.components.ZulExtensionServlet, >>>>>>> component.id=5} >>>>>>> >>>>>>> {javax.servlet.ServletContextListener}={service.id=98, >>>>>>> service.bundleid=59, service.scope=bundle, >>>>>>> osgi.http.whiteboard.context.select=( >>>>>>> osgi.http.whiteboard.context.name=ZkComponentsServletContextHelper), >>>>>>> osgi.http.whiteboard.listener=true, component.name=ZkListener, >>>>>>> component.id=6} >>>>>>> >>>>>>> {javax.servlet.ServletContext}={osgi.web.version=1.0.0.qualifier, >>>>>>> osgi.web.contextpath=/components, service.id=124, >>>>>>> osgi.web.symbolicname=com.castortech.iris.zk.components, >>>>>>> service.bundleid=59, service.scope=singleton, >>>>>>> osgi.web.contextname=ZkComponentsServletContextHelper} >>>>>>> >>>>>>> >>>>>>> As you can see, both the ServletContextListener and the servlet are >>>>>>> bound to the same ServletContextHelper and there is a ServletContext >>>>>>> created from the ServletContextHelper, however, the contextInitialized >>>>>>> method was never called. Am I missing anything? >>>>>>> >>>>>>> Thai >>>>>>> >>>>>>> -- >>>>>>> -- >>>>>>> ------------------ >>>>>>> OPS4J - http://www.ops4j.org - [email protected] >>>>>>> >>>>>>> --- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "OPS4J" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to [email protected]. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> -- >>>>>> -- >>>>>> ------------------ >>>>>> OPS4J - http://www.ops4j.org - [email protected] >>>>>> >>>>>> --- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "OPS4J" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to [email protected]. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> >>>>> -- >>>>> Castor Technologies Inc >>>>> 460 rue St-Catherine St Ouest, Suite 613 >>>>> Montréal, Québec H3B-1A7 >>>>> (514) 360-7208 o >>>>> (514) 798-2044 f >>>>> [email protected] >>>>> www.castortech.com >>>>> >>>>> CONFIDENTIALITY NOTICE: The information contained in this e-mail is >>>>> confidential and may be proprietary information intended only for the use >>>>> of the individual or entity to whom it is addressed. If the reader of this >>>>> message is not the intended recipient, you are hereby notified that any >>>>> viewing, dissemination, distribution, disclosure, copy or use of the >>>>> information contained in this e-mail message is strictly prohibited. If >>>>> you >>>>> have received and/or are viewing this e-mail in error, please immediately >>>>> notify the sender by reply e-mail, and delete it from your system without >>>>> reading, forwarding, copying or saving in any manner. Thank you. >>>>> AVIS DE CONFIDENTIALITE: L’information contenue dans ce message est >>>>> confidentiel, peut être protégé par le secret professionnel et est réservé >>>>> à l'usage exclusif du destinataire. Toute autre personne est par les >>>>> présentes avisée qu'il lui est strictement interdit de diffuser, >>>>> distribuer >>>>> ou reproduire ce message. Si vous avez reçu cette communication par >>>>> erreur, >>>>> veuillez la détruire immédiatement et en aviser l'expéditeur. Merci. >>>>> >>>>> -- >>>>> -- >>>>> ------------------ >>>>> OPS4J - http://www.ops4j.org - [email protected] >>>>> >>>>> --- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "OPS4J" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to [email protected]. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> -- >>> -- >>> ------------------ >>> OPS4J - http://www.ops4j.org - [email protected] >>> >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "OPS4J" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> >> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/ops4j/cb747b43-f883-4c89-92a7-176f03e7f991n%40googlegroups.com >>> <https://groups.google.com/d/msgid/ops4j/cb747b43-f883-4c89-92a7-176f03e7f991n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- > -- > ------------------ > OPS4J - http://www.ops4j.org - [email protected] > > --- > You received this message because you are subscribed to the Google Groups > "OPS4J" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/ops4j/7bfbad5c-0945-4585-9739-6c166a1f21a2n%40googlegroups.com > <https://groups.google.com/d/msgid/ops4j/7bfbad5c-0945-4585-9739-6c166a1f21a2n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- -- ------------------ OPS4J - http://www.ops4j.org - [email protected] --- You received this message because you are subscribed to the Google Groups "OPS4J" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/ops4j/CAAdXmhr5WQ%3D51z0g%3DhX7KC8ACAYzv5-1pzzBh6GAEDjcEqKdqg%40mail.gmail.com.
