Hi Grzegorz, I've followed the example provided at GitHub:
https://github.com/ops4j/org.ops4j.pax.web/blob/master/samples/whiteboard/src/main/java/org/ops4j/pax/web/extender/samples/whiteboard/internal/Activator.java Thank you for the notice. Kind regards, Miroslav V V čet., 6. feb. 2020 ob 13:27 je oseba Grzegorz Grzybek < [email protected]> napisala: > Hello > > I've checked > org.ops4j.pax.web.extender.whiteboard.internal.tracker.ServletTracker#createWebElement() > and indeed - it takes "alias" from "alias" property and may take patterns > from "urlPatterns" or "osgi.http.whiteboard.servlet.pattern" - but you > CAN'T specify "alias" property to do it. > > Please don't use: > > props.put(ExtenderConstants.PROPERTY_ALIAS, "/hello"); > > regards > Grzegorz > > czw., 6 lut 2020 o 13:07 Miroslav Beranič <[email protected]> > napisał(a): > >> Hi JB, >> >> Took the code from: >> https://github.com/ops4j/org.ops4j.pax.web/tree/master/samples/whiteboard >> >> to be able to use ExtenderConstants.PROPERTY_HTTP_CONTEXT_ID => Virtual >> hosts "feature" of Jetty. >> >> { >> Dictionary<String, Object> props; >> props = new Hashtable<>(); >> >> props.put(ExtenderConstants.PROPERTY_ALIAS, "/hello"); >> props.put(ExtenderConstants.PROPERTY_HTTP_CONTEXT_ID, "virtualhost"); >> >> // Fail with Exception: from inside constructor of class >> org.ops4j.pax.web.extender.whiteboard.internal.element.ServletWebElement >> // props.put(ExtenderConstants.PROPERTY_URL_PATTERNS, "/hello"); >> >> props.put(ExtenderConstants.DEFAULT_INIT_PREFIX_PROP + >> "exactUrlPattern", Boolean.TRUE); >> >> servletReg = bundleContext.registerService(Servlet.class, new >> WhiteboardServlet("/hello"), props); >> } >> >> Kind Regards, >> Miroslav >> >> >> Dne četrtek, 06. februar 2020 12.50.17 UTC+1 je oseba Jean-Baptiste >> Onofré napisala: >>> >>> Hi >>> >>> Can you please share how you register the servlet ? Via the >>> httpService.register, Servlet service registration or whiteboard ? >>> >>> Thanks, >>> Regards >>> JB >>> >>> On Thu, Feb 6, 2020 at 12:14 PM Miroslav Beranič <[email protected]> >>> wrote: >>> >>>> Hi all, >>>> >>>> I work with Pax Web on Karaf 4.3.0. I am trying to register Servlet >>>> with exact url, but I see url pattern is auto-generated from alias. >>>> I look at the current master branch - version 8.0.0-SNAPSHOT. Class: >>>> >>>> org.ops4j.pax.web.service.spi.model.ServletModel >>>> >>>> >>>> constructor: >>>> #ServletModel(org.ops4j.pax.web.service.spi.model.ContextModel, >>>> javax.servlet.Servlet, java.lang.String, java.lang.String[], >>>> java.lang.String, java.util.Dictionary<java.lang.String,?>, >>>> java.lang.Integer, java.lang.Boolean, javax.servlet.MultipartConfigElement) >>>> >>>> >>>> it calles method ( private static ) >>>> new String[]{aliasAsUrlPattern(alias)} >>>> >>>> >>>> private static String aliasAsUrlPattern(final String alias) { >>>> String urlPattern = alias; >>>> if (urlPattern != null && !urlPattern.equals("/") >>>> && !urlPattern.contains("*")) { >>>> if (urlPattern.endsWith("/")) { >>>> urlPattern = urlPattern + "*"; >>>> } else { >>>> urlPattern = urlPattern + "/*"; >>>> } >>>> } >>>> return urlPattern; >>>> } >>>> >>>> >>>> so it always creates a url pattern, as I guess the name suggest, but >>>> why? I would like to register exact URL, not the pattern. As it looks now, >>>> this is not possible to do - as there is no argument to pass in to control >>>> the flow. >>>> >>>> As it looks from the git history/log this is quite "old" code - from >>>> 2008 - 2013, so I guess this is not new and I guess everybody are ok with >>>> this? So in this case, what is the usecase for it? As for my usecase - this >>>> is not the required behavior. >>>> >>>> For example, Servlet, registered with /hello, also matches /hello/1, >>>> but I want /hello/1 to return HTTP 404. >>>> >>>> >>>> So for now, only really question is - is this expected behavior or is >>>> there a room to change this? If so, how can one, with existing solution, >>>> register Servlet with exact URL? >>>> >>>> Exact strack of calls looks like this: >>>> >>>> <init>:53, ServletModel (org.ops4j.pax.web.service.spi.model) >>>> registerServlet:224, HttpServiceStarted >>>> (org.ops4j.pax.web.service.internal) >>>> registerServlet:210, HttpServiceStarted >>>> (org.ops4j.pax.web.service.internal) >>>> registerServlet:69, HttpServiceProxy >>>> (org.ops4j.pax.web.service.internal) >>>> register:97, ServletWebElement >>>> (org.ops4j.pax.web.extender.whiteboard.internal.element) >>>> registerWebElement:392, WebApplication >>>> (org.ops4j.pax.web.extender.whiteboard.internal) >>>> addWebElement:188, WebApplication >>>> (org.ops4j.pax.web.extender.whiteboard.internal) >>>> addingService:193, AbstractTracker >>>> (org.ops4j.pax.web.extender.whiteboard.internal.tracker) >>>> addingService:46, AbstractTracker >>>> (org.ops4j.pax.web.extender.whiteboard.internal.tracker) >>>> customizerAdding:941, ServiceTracker$Tracked (org.osgi.util.tracker) >>>> customizerAdding:870, ServiceTracker$Tracked (org.osgi.util.tracker) >>>> trackAdding:256, AbstractTracked (org.osgi.util.tracker) >>>> track:229, AbstractTracked (org.osgi.util.tracker) >>>> serviceChanged:901, ServiceTracker$Tracked (org.osgi.util.tracker) >>>> invokeServiceListenerCallback:990, EventDispatcher >>>> (org.apache.felix.framework) >>>> fireEventImmediately:838, EventDispatcher (org.apache.felix.framework) >>>> fireServiceEvent:545, EventDispatcher (org.apache.felix.framework) >>>> fireServiceEvent:4595, Felix (org.apache.felix.framework) >>>> registerService:3587, Felix (org.apache.felix.framework) >>>> registerService:348, BundleContextImpl (org.apache.felix.framework) >>>> registerService:355, BundleContextImpl (org.apache.felix.framework) >>>> >>>> I've changed this in my branch, added additional method with same name >>>> and initParams: >>>> >>>> private static String aliasAsUrlPattern(final String alias, final >>>> Dictionary<String, ?> initParams) { >>>> final Object exactUrlPatternFromAliasParam = >>>> initParams.get("exactUrlPattern"); >>>> Boolean exactUrlPatternFromAlias = Boolean.FALSE; >>>> if (null != exactUrlPatternFromAliasParam) { >>>> if (exactUrlPatternFromAliasParam instanceof String) { >>>> final String flag = ((String) >>>> exactUrlPatternFromAliasParam).toLowerCase(); >>>> exactUrlPatternFromAlias = Boolean.parseBoolean(flag); >>>> } else if(exactUrlPatternFromAliasParam instanceof Boolean) { >>>> final Boolean flag = (Boolean) exactUrlPatternFromAliasParam; >>>> exactUrlPatternFromAlias = flag; >>>> } else if (exactUrlPatternFromAliasParam instanceof Serializable) >>>> { >>>> final String flag = >>>> exactUrlPatternFromAliasParam.toString().toLowerCase(); >>>> exactUrlPatternFromAlias = Boolean.parseBoolean(flag); >>>> } >>>> } >>>> final String result; >>>> if (Boolean.TRUE.equals(exactUrlPatternFromAlias)) { >>>> // Break the reference >>>> result = alias.toString(); >>>> } else { >>>> result = aliasAsUrlPattern(alias); >>>> } >>>> return result; >>>> } >>>> >>>> >>>> This calls original unmodified version of method aliasAsUrlPattern. >>>> >>>> Caller has to pass additional init parameter "exactUrlPattern". I >>>> usually call it with Boolean.TRUE. I guess flag could/should be added into >>>> org.ops4j.pax.web.extender.whiteboard.ExtenderConstants. >>>> >>>> To note one other thing -- this is " one of the use cases ", I as see >>>> there is also construction, that allows to pass in defined url patterns, >>>> but I did not find how to call it. The call I am using is: >>>> >>>> props.put(ExtenderConstants.DEFAULT_INIT_PREFIX_PROP + >>>> "exactUrlPattern", Boolean.TRUE); >>>> bundleContext.registerService(Servlet.class, new >>>> WhiteboardServlet("/hello"), props); >>>> >>>> Could be, that if HttpService interface is used, this is not the case. >>>> >>>> I've tried to solve this using >>>> >>>> props.put(ExtenderConstants.PROPERTY_URL_PATTERNS, "/hello"); >>>> >>>> This is illegal state as implemented by the constructor of class: >>>> >>>> org.ops4j.pax.web.extender.whiteboard.internal.element.ServletWebElement >>>> >>>> if (alias != null && urlPatterns != null && urlPatterns.length != 0) { >>>> LOG.warn("Registered servlet [{}] cannot have both alias and url >>>> patterns.", getServiceID()); >>>> valid = false; >>>> } >>>> >>>> >>>> I did not look into this yet, but why is this implemented like so? If >>>> this would be changed, it would make use of existing constants. >>>> >>>> >>>> Kind Regards, >>>> Miroslav >>>> >>>> >>>> -- >>>> -- >>>> ------------------ >>>> 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/179c33ab-fdd3-451f-b4ff-57f2fc934a04%40googlegroups.com >>>> <https://groups.google.com/d/msgid/ops4j/179c33ab-fdd3-451f-b4ff-57f2fc934a04%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/9016e27b-4059-4c2d-83ad-1ae42d5083c5%40googlegroups.com >> <https://groups.google.com/d/msgid/ops4j/9016e27b-4059-4c2d-83ad-1ae42d5083c5%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/CAAdXmhoCKVNaxKmy51dWFE2uMBmSbSZHBKb3azGJ9PwJ%2BrPVGg%40mail.gmail.com > <https://groups.google.com/d/msgid/ops4j/CAAdXmhoCKVNaxKmy51dWFE2uMBmSbSZHBKb3azGJ9PwJ%2BrPVGg%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- Miroslav Beranič MIBESIS [email protected] https://www.mibesis.si -- -- ------------------ 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/CA%2B3Fds6wckMozGkSbtESwg-70%2BJWz2CzfjHhhKkAx0c9%2BPgTRw%40mail.gmail.com.
