users@glassfish.java.net

Re: Can a web service deployed in Grizzly access Felix

From: Sahoo <Sahoo_at_Sun.COM>
Date: Wed, 20 May 2009 23:10:38 +0530

I understand very well you are not developing a HK2 bundle. You don't
have to develop a HK2 bundle - a simple OSGi bundle is good enough. My
understanding is you are registering some service with interface
MyAPI.class in the OSGi service registry. as I told you, we
automatically register it with Habitat under contract called
MyAPI.class. Hope this is clear. Since you have access to Habitat from
your web app, you can access the service by using Habitat.getByContract().

About your deployment failure, that seems unrelated. Looks like some
broken web service functionality.

Thanks,
Sahoo

paulbrickell wrote:
> Sahoo,
>
> Just want to check I am doing the right thing here.
>
> I am creating an OSGi bundle, not an H2K module. I have no interfaces in
> this bundle annotated with Contract.
>
> I have taken the latest nightly build and put my bundle in the
> autodeploy-bundles directory. When I start Glassfish I see logging from
> bundle. So that's good.
>
> I am having problems deploying my web application into this server. When I
> deploy It I get an error...
>
> cannot Deploy testservice
> Deployment Error for module: test-service: Exception while loading the app
> : java.lang.Exception: java.lang.IllegalStateException:
> ContainerBase.addChild: start: LifecycleException:
> java.lang.ClassCastException:
> com.sun.xml.ws.transport.http.servlet.WSServlet cannot be cast to
> javax.servlet.Servlet
>
> Not sure what this all about. Will continue investigating.
>
> Regards,
> Paul B.
>
>
> Sahoo wrote:
>
>> Hold on. You are using Habitat.getAllByType(). I asked you to use
>> Habitat.getByContract(). If at all you have to iterate over all the
>> implementations of a contract, you should use
>> Habitat.getAllByContracts(). Oh yes, I understand the method name
>> getAllByType() is not so user friendly. In HK2, type means
>> implementation type!
>>
>> Sahoo
>>
>> paulbrickell wrote:
>>
>>> Sahoo,
>>>
>>> You right of course.
>>>
>>> Anyhoo, using that repository and building my war gives me no compilation
>>> problems.
>>>
>>> My code is now doing this...
>>>
>>> MessageContext mc = _wsContext.getMessageContext();
>>> ServletContext sCtx = (ServletContext)
>>> mc.get(MessageContext.SERVLET_CONTEXT);
>>> Habitat habitat = (Habitat)
>>> sCtx.getAttribute("org.glassfish.servlet.habitat");
>>> Collection<MyAPI> apis = habitat.getAllByType(MyAPI.class);
>>>
>>> This works OK, but I get a zero length collection. I will get the latest
>>> build and try dropping my bundle jar in the autodeploy dir as you
>>> suggested.
>>>
>>> I will let you know how I get on.
>>>
>>> Thanks again,
>>> Paul B.
>>>
>>>
>>>
>>> Sahoo wrote:
>>>
>>>
>>>> May be my understanding of our maven repositories are wrong, but AFAIK,
>>>> only artifacts produced by GlassFish build should go to
>>>>
>>>> http://download.java.net/maven/glassfish/,
>>>>
>>>> but, that appears not to be true. So, go ahead and use that repo.
>>>> Anyway, this is not the core of the problems being discussed here.
>>>>
>>>> Thanks,
>>>> Sahoo
>>>> paulbrickell wrote:
>>>>
>>>>
>>>>> but, did find it in...
>>>>>
>>>>> http://download.java.net/maven/glassfish/
>>>>>
>>>>>
>>>>>
>>>>> paulbrickell wrote:
>>>>>
>>>>>
>>>>>
>>>>>> Sahoo,
>>>>>>
>>>>>> Really appreciate your help.
>>>>>>
>>>>>> I'm afraid I do not find com.sun.enterprise.hk2 in either of the
>>>>>> repositories you listed.
>>>>>>
>>>>>> Thanks,
>>>>>> Paul B.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Sahoo wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>> OK, thanks for clarifying about the deployment part.
>>>>>>>
>>>>>>> You should be able to do this in your code:
>>>>>>>
>>>>>>> org.jvnet.hk2.component.Habitat =
>>>>>>> org.jvnet.hk2.component.Habitat.class.cast(sCtx.getAttribute("org.glassfish.servlet.habitat"));
>>>>>>>
>>>>>>>
>>>>>>> org.jvnet.hk2.component package is part of HK2 project, so you can
>>>>>>> set
>>>>>>> up your maven dependency like this:
>>>>>>>
>>>>>>> <dependency>
>>>>>>> <groupId>com.sun.enterprise</groupId>
>>>>>>> <artifactId>hk2</artifactId>
>>>>>>> <version>RELEASE</version>
>>>>>>> <scope>provided</scope>
>>>>>>> <dependency>
>>>>>>>
>>>>>>> Ensure that you have added http://download.java.net/maven/2 and
>>>>>>> http://download.java.net/maven/1 as additional maven 2 and maven 1
>>>>>>> repositories either in your pom.xml or in your maven settings.xml.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Sahoo
>>>>>>>
>>>>>>> paulbrickell wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> Sahoo,
>>>>>>>>
>>>>>>>> Sorry. You are of course right about the web service deployment.
>>>>>>>> It's
>>>>>>>> just a
>>>>>>>> war file deployed in glassfish (atually I am debugging in Eclipse).
>>>>>>>>
>>>>>>>> I did try just dropping the bundle in the autodeploy-bundles dir,
>>>>>>>> but
>>>>>>>> it
>>>>>>>> did
>>>>>>>> not seem to start (I saw none of the logging from my
>>>>>>>> BundleActivator.start
>>>>>>>> method) . I suspect I might be behind on the build. I will pick up
>>>>>>>> the
>>>>>>>> latest nightly today.
>>>>>>>>
>>>>>>>> As described in my original post I have pulled the Habitat object
>>>>>>>> from
>>>>>>>> the
>>>>>>>> app context. But I cannot cast it to the right type. I still do not
>>>>>>>> know
>>>>>>>> an
>>>>>>>> appropriate maven dependency I can add to get it.
>>>>>>>>
>>>>>>>> Thanks for your help.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Sahoo wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>> Paul,
>>>>>>>>>
>>>>>>>>> 1. You don't have to modify Felix config file. You can drop your
>>>>>>>>> OSGi
>>>>>>>>> bundle in domain1/autodeploy-bundles dir and it will be
>>>>>>>>> automatically
>>>>>>>>> started when server starts. Please use the latest nightly build as
>>>>>>>>> I
>>>>>>>>> fixed an important bug around this.
>>>>>>>>>
>>>>>>>>> 2. What do you mean by deploying a web service in Grizzly? Can you
>>>>>>>>> tell
>>>>>>>>> us how you packaged your web service and how you deployed such a
>>>>>>>>> thing?
>>>>>>>>> Did you really mean GlassFish or Grizzly?
>>>>>>>>>
>>>>>>>>> 3. All the registered OSGi services can be accessed via Habitat
>>>>>>>>> object.
>>>>>>>>> The OSGi service interface names are mapped to contract names in
>>>>>>>>> Habitat.
>>>>>>>>> e.g., if you have an OSGi service Foo.class which implements I1 and
>>>>>>>>> I2,
>>>>>>>>> then you can access it via Habitat.getByContract(I1 or I2.class)
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Sahoo
>>>>>>>>>
>>>>>>>>> paulbrickell wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> I don't know if this is a silly question, but I am having some
>>>>>>>>>> fundamental
>>>>>>>>>> issues understanding the Glassfish v3 architecture and could use a
>>>>>>>>>> pointer.
>>>>>>>>>>
>>>>>>>>>> I have created a bundle and added an entry in the
>>>>>>>>>> glassfish/felix.conf
>>>>>>>>>> e.g.
>>>>>>>>>>
>>>>>>>>>> file:///home/me/myworkspace/my-bundle/target/my-bundle-1.0-SNAPSHOT.jar
>>>>>>>>>>
>>>>>>>>>> I see this bundle starting and all is well. It opens a socket to
>>>>>>>>>> which
>>>>>>>>>> I
>>>>>>>>>> can
>>>>>>>>>> connect and exchange data, which is nice. The reason I created a
>>>>>>>>>> bundle
>>>>>>>>>> and
>>>>>>>>>> not a H2K module is that I want it to be activated at server
>>>>>>>>>> start-up
>>>>>>>>>> time.
>>>>>>>>>> I could not see a way of doing this with H2K. Maybe I missed
>>>>>>>>>> something.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Now I want to reference this service from a web service that I
>>>>>>>>>> have
>>>>>>>>>> deployed
>>>>>>>>>> in Grizzly. I simply cannot figure out how to do this. The docs do
>>>>>>>>>> not
>>>>>>>>>> really cover this, which leads me to believe I am doing something
>>>>>>>>>> fundamentally wrong.
>>>>>>>>>>
>>>>>>>>>> Do Felix and Grizzly share any kind of context or is there a
>>>>>>>>>> static
>>>>>>>>>> way
>>>>>>>>>> to
>>>>>>>>>> access the Felix services from a web application deployed in
>>>>>>>>>> Grizzly?
>>>>>>>>>>
>>>>>>>>>> I have tried this....
>>>>>>>>>>
>>>>>>>>>> wsContext.getMessageContext();
>>>>>>>>>> ServletContext sCtx = (ServletContext)
>>>>>>>>>> mc.get(MessageContext.SERVLET_CONTEXT);
>>>>>>>>>> Object habitat =
>>>>>>>>>> sCtx.getAttribute("org.glassfish.servlet.habitat");
>>>>>>>>>>
>>>>>>>>>> This, I believe, gets me a reference to the H2K habitat, but my
>>>>>>>>>> bundle
>>>>>>>>>> is
>>>>>>>>>> an
>>>>>>>>>> OSGi bundle deployed in Felix, not an H2K service. Can I navigate
>>>>>>>>>> to
>>>>>>>>>> my
>>>>>>>>>> bundle through this habitat? Is it right to try? If so is there a
>>>>>>>>>> maven
>>>>>>>>>> dependency I need to pick up the Habitat class as I cannot seem to
>>>>>>>>>> find
>>>>>>>>>> it
>>>>>>>>>> anywhere.
>>>>>>>>>>
>>>>>>>>>> I would appreciate any pointers. TIA.
>>>>>>>>>> Paul B.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe_at_glassfish.dev.java.net
>>>>>>>>> For additional commands, e-mail: users-help_at_glassfish.dev.java.net
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: users-unsubscribe_at_glassfish.dev.java.net
>>>>>>> For additional commands, e-mail: users-help_at_glassfish.dev.java.net
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe_at_glassfish.dev.java.net
>>>> For additional commands, e-mail: users-help_at_glassfish.dev.java.net
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe_at_glassfish.dev.java.net
>> For additional commands, e-mail: users-help_at_glassfish.dev.java.net
>>
>>
>>
>>
>
>