> On 30 Jan 2019, at 16:52, Nhut Thai Le <n...@castortech.com> wrote: > > Tim, > > Thank you for quickly identify my problems :D, please see my comments inline > > On Wed, Jan 30, 2019 at 10:13 AM Tim Ward <tim.w...@paremus.com > <mailto:tim.w...@paremus.com>> wrote: > Hi, > > Firstly: > > Why does DiagramRestApp do this? > >> @Override >> public Set<Object> getSingletons() { >> return Collections.singleton(this); >> } > > That is just all kinds of wrong! > i'm using aries-jaxrs-whiteboard for our REST api and i was was looking at > the test to see how to build the Application class, i think this is what i > was following: > https://github.com/apache/aries-jax-rs-whiteboard/blob/master/jax-rs.itests/src/main/java/test/types/TestApplication.java > > <https://github.com/apache/aries-jax-rs-whiteboard/blob/master/jax-rs.itests/src/main/java/test/types/TestApplication.java>. > I got some errors at that time without the getSingletons() so i left it > there. Now i just removed it and it seem fine.
In this case the TestApplication class is a resource class (it declares resource methods). It’s still horrible to do this, but it’s being done to reduce the number of types in the test. > > Secondly, you’re using String properties everywhere rather than the > annotations. This is asking for trouble with typos and inconsistencies. > You are right, i should change to annotations > > Next: > > The following: > >> @Component( >> service = CommonDiagramRESTService.class, >> property = { >> "osgi.jaxrs.extension=true", >> "osgi.jaxrs.name >> <http://osgi.jaxrs.name/>=CommonDiagramRESTService", >> "osgi.jaxrs.application.select=(osgi.jaxrs.name >> <http://osgi.jaxrs.name/>=DiagramRestApp)" >> } >> ) >> @Path("/common") >> public final class CommonDiagramRESTService {..} > > > and > >> @Component( >> service = GridDiagramRESTService.class, >> property = { >> "osgi.jaxrs.extension=true" , >> "osgi.jaxrs.name >> <http://osgi.jaxrs.name/>=GridDiagramRESTService", >> >> "osgi.jaxrs.application.select=(osgi.jaxrs.name >> <http://osgi.jaxrs.name/>=DiagramRestApp)" >> } >> ) >> @Path("/grid") >> public final class GridDiagramRESTService {...} > > > These types declare that they are extensions - why? They don’t advertise any > extension interfaces. They should advertise themselves as resources (which is > what they are). I would not expect these to be picked up properly by the > whiteboard as they are not extensions and they don’t advertise being > resources. > Sorry, this is my typo, I'm using const so i replaced the const with their > values here so u can see how those classes are related, somehow i replaced > the property osgi.jaxrs.resource=true by osgi.jaxrs.extension=true when > copying here > > >> What I observe is that the filter got activated 25 times, although all the >> resource classes and the filter bind to the same jaxrs application. Is this >> normal? > > Depending on the underlying implementation of the whiteboard and the > registration order of the services this may or may not happen. Some JAX-RS > implementations are not dynamic, in this case the whole application must be > bounced when a change occurs. This will result in the currently registered > services being discarded and re-created. > > Best Regards, > > Tim > > >> On 30 Jan 2019, at 15:01, Nhut Thai Le <n...@castortech.com >> <mailto:n...@castortech.com>> wrote: >> >> Tim, >> >> I have one jaxrs application: >> @Component( >> service = Application.class, >> property= { >> "osgi.jaxrs.name <http://osgi.jaxrs.name/>=DiagramRestApp", >> "osgi.jaxrs.application.base=/diagram/services/diagrams/rest" >> } >> ) >> public final class DiagramRestApp extends Application { >> @Override >> public Set<Object> getSingletons() { >> return Collections.singleton(this); >> } >> } >> but multiple resource classes, about 25 of them, here is one >> @Component( >> service = CommonDiagramRESTService.class, >> property = { >> "osgi.jaxrs.extension=true", >> "osgi.jaxrs.name >> <http://osgi.jaxrs.name/>=CommonDiagramRESTService", >> "osgi.jaxrs.application.select=(osgi.jaxrs.name >> <http://osgi.jaxrs.name/>=DiagramRestApp)" >> } >> ) >> @Path("/common") >> public final class CommonDiagramRESTService {..} >> >> and another one: >> @Component( >> service = GridDiagramRESTService.class, >> property = { >> "osgi.jaxrs.extension=true" , >> "osgi.jaxrs.name >> <http://osgi.jaxrs.name/>=GridDiagramRESTService", >> >> "osgi.jaxrs.application.select=(osgi.jaxrs.name >> <http://osgi.jaxrs.name/>=DiagramRestApp)" >> } >> ) >> @Path("/grid") >> public final class GridDiagramRESTService {...} >> >> and finally my jaxrs filter: >> @Component( >> service = { >> ContainerRequestFilter.class, >> ContainerResponseFilter.class >> }, >> scope = ServiceScope.PROTOTYPE, >> property = { >> "osgi.jaxrs.extension=true", >> "osgi.jaxrs.name <http://osgi.jaxrs.name/>=DiagramRestFilter", >> "osgi.jaxrs.application.select=(osgi.jaxrs.name >> <http://osgi.jaxrs.name/>=DiagramRestApp)" >> } >> ) >> @PreMatching >> @Priority(Priorities.AUTHENTICATION) >> public final class DiagramRestFilter extends OsgiJaxrsBearerTokenFilterImpl >> implements ContainerResponseFilter {..} >> >> What I observe is that the filter got activated 25 times, although all the >> resource classes and the filter bind to the same jaxrs application. Is this >> normal? >> >> Thai >> >> On Tue, Jan 29, 2019 at 11:17 AM Nhut Thai Le <n...@castortech.com >> <mailto:n...@castortech.com>> wrote: >> Thank you for clarifying. >> >> Thai >> >> >> >> On Tue, Jan 29, 2019 at 10:24 AM Tim Ward <tim.w...@paremus.com >> <mailto:tim.w...@paremus.com>> wrote: >> Hi, >> >> As described in the JAX-RS Whiteboard spec >> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html#d0e133685> >> JAX-RS extension instances are required to be singletons (I’m talking about >> the objects, not the services) by the JAX-RS specification itself. Therefore >> within an application you will only ever see one instance of a whiteboard >> extension service. >> >> The reason that you should make extension services prototype is therefore >> not related to per-request handling, but instead because of what happens >> when the same extension service is applied to *multiple applications*. In >> this scenario you will have multiple applications with different >> configuration and different context objects. If your extension service is >> injected with these objects by the JAX-RS runtime (for example being >> injected with the Application using @Context) then which application is that >> for? In the general case you have no idea whether the context object you >> have been injected with relates to the current request or not. >> >> If your extension service is singleton or bundle scoped then the JAX-RS >> whiteboard can only get one instance. It therefore has to use this same >> instance for all of the whiteboard applications and you run into the >> potential “multiple injections” trap. This is obviously fine if you don’t >> have any injection sites, or if all your injection sites are method >> parameters, but it is a risky thing to do as someone may add an injection >> site later without realising that they’ve broken things. This will probably >> also make it through testing as you’ll typically only have one application >> at a time when testing! >> >> If your extension service is prototype scope then the JAX-RS Whiteboard is >> able to get a different instance to use in each whiteboard application. At >> this point you no longer need to worry about multiple injections because the >> injections happen on different instances. >> >> I hope this answers your question, and helps to further explain why >> prototype scope is a good thing for filters! >> >> Best Regards, >> >> Tim >> >>> On 29 Jan 2019, at 15:18, Raymond Auge via osgi-dev <osgi-dev@mail.osgi.org >>> <mailto:osgi-dev@mail.osgi.org>> wrote: >>> >>> I'm going to assume you are talking about: >>> >>> HttpService[1] or Http Whiteboard[2] w.r.t. the reference to Servlet >>> AND >>> JAX-RS Whiteboard[3] w.r.t. the reference to ContainerRequestFilter >>> >>> These 2(3) features are separate concerns and the ContainerRequestFilter of >>> the JAX-RS whiteboard spec doesn't apply to the Servlets of the Http >>> Whiteboard. You probably just want a regular old servlet Filter[4] >>> >>> Now it's possible that you are talking about some other runtime that packs >>> all these things together. If so, you probably want to ask the implementors >>> about this. >>> >>> Hope that helps clear things up, >>> - Ray >>> >>> [1] https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.html >>> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.html> >>> [2] >>> https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html >>> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html> >>> [3] https://osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html >>> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.jaxrs.html> >>> [4] >>> https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e121055 >>> >>> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e121055> >>> >>> On Tue, Jan 29, 2019 at 9:59 AM Nhut Thai Le via osgi-dev >>> <osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>> wrote: >>> Hello, >>> >>> I have a component implementing ContainerRequestFilter to intercept REST >>> calls and another component implements servlet.Filter. Both have PROTOTYPE >>> scope, my understanding is that these filter are instantiated and activated >>> for each web request but yesterday when i put some breakpoints in the >>> @activate method, i did not see them get called when a web request arrives. >>> Did I miss something? If they are not init/activate per request why are >>> they recomeded to be prototype? >>> >>> Thai Le >>> _______________________________________________ >>> OSGi Developer Mail List >>> osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> >>> https://mail.osgi.org/mailman/listinfo/osgi-dev >>> <https://mail.osgi.org/mailman/listinfo/osgi-dev> >>> >>> -- >>> Raymond Augé <http://www.liferay.com/web/raymond.auge/profile> (@rotty3000) >>> Senior Software Architect Liferay, Inc. <http://www.liferay.com/> (@Liferay) >>> Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org/> >>> (@OSGiAlliance) >>> _______________________________________________ >>> OSGi Developer Mail List >>> osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> >>> https://mail.osgi.org/mailman/listinfo/osgi-dev >>> <https://mail.osgi.org/mailman/listinfo/osgi-dev> >> >> >> -- >> 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 >> n...@castortech.com <mailto:n...@castortech.com> >> www.castortech.com <http://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. >> >> >> -- >> 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 >> n...@castortech.com <mailto:n...@castortech.com> >> www.castortech.com <http://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. > > > > -- > 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 > n...@castortech.com <mailto:n...@castortech.com> > www.castortech.com <http://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.
_______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev