Well, this just proves it's (almost) never what you think....

The problem seems to be with how I'm constructing the StreamSource: I'm
giving it the InputStream from the URL.  The problem appears to be then that
JAX-WS always expects a valid SystemId from the StreamSource, but it gets
back null.  The solution is to construct the StreamSource using the string
form of the URL, something like this: new StreamSource(url.toString()).

Rich

On Mon, Jan 10, 2011 at 11:14 AM, Steele, Richard <[email protected]>wrote:

> I did that this morning: created a simple bundle with an activator that
> uses Bundle.findEntries() to dump out everything it finds in META-INF.  And
> it works as expected.
>
> I'm beginning to think what I've stumbled across is a more general problem
> trying to use JAX-WS inside an OSGi container.  In particular, I suspect
> that Endpoint.publish() is making assumptions about class loaders and such.
> Some searching this morning seems to reinforce this viewpoint.  (In fact, it
> looks like Glassfish 3 uses OSGi-enabled versions of Metro/JAX-WS/JAXB, but
> since these appear to import container-specific packages the don't do me
> much good.)
>
> If this is correct, then this is obviously not an issue specific to Felix.
> Still, if anyone has a specific solution to the problem I'd appreciate some
> hints.
>
> Thanks,
> Rich
>
>
> On Mon, Jan 10, 2011 at 10:25 AM, Richard S. Hall <[email protected]>wrote:
>
>> If URL Handlers is enabled, then it should register a handler to deal with
>> the bundle: protocol. You can create a simple bundle that tries to create
>> such a URL to make sure it is working.
>>
>> -> richard
>>
>>
>> On 1/7/11 14:05, Steele, Richard wrote:
>>
>>> I'm working on a prototype implementation of a bundle that publishes
>>> JAX-WS
>>> endpoints for specially marked services.  (I realize there are off the
>>> shelf
>>> implementations of various tools that ought to do the same thing, but
>>> right
>>> now I'm just getting my feet wet.)
>>>
>>> I've actually been able to get the endpoint published just fine, using
>>> something like this:
>>>
>>>     private Object startEndpoint(ServiceReference reference) {
>>>
>>>         Object service = getBundleContext().getService(reference);
>>>         if (service != null) {
>>>             ClassLoader originalClassLoader =
>>> Thread.currentThread().getContextClassLoader();
>>>             try {
>>>                 Object instance = createEndpointImpl(service);
>>>
>>>
>>> Thread.currentThread().setContextClassLoader(instance.getClass().getClassLoader());
>>>                 endpoint = Endpoint.create(instance);
>>>                 endpoint.setMetadata(getMetadata(reference));
>>>                 // TODO: remove hard-coded port number
>>>                 endpoint.publish("http://0.0.0.0:7001/hello/";);
>>>             } finally {
>>>
>>> Thread.currentThread().setContextClassLoader(originalClassLoader);
>>>             }
>>>         }
>>>
>>>         return service;
>>>     }
>>>
>>> The problem I'm running to, however, is with setting the endpoint
>>> metadata;
>>> this is a list of the WSDLs and schema types used to generate the
>>> endpoint.
>>> (Without specifying this JAX-WS attempt to create one at runtime; it
>>> manages
>>> to get close, but close isn't enough.)
>>>
>>> What I've been trying to do is get these files from the API bundle using
>>> Bundle.findEntries(), something like this:
>>>
>>>     Enumeration<?>  entryEnumeration =
>>> serviceBundle.findEntries("/META-INF/wsdls", null, true);
>>>     // enumeration can be null if path isn't found
>>>     if (entryEnumeration != null) {
>>>         while (entryEnumeration.hasMoreElements()) {
>>>             URL entry = (URL)entryEnumeration.nextElement();
>>>             try {
>>>                 md.add(new
>>> StreamSource(entry.openConnection().getInputStream()));
>>>             } catch (IOException e) {
>>>                 // TODO: do something
>>>             }
>>>         }
>>>     }
>>>
>>> This actually works exactly what I want: I get a list of StreamSources to
>>> the URLs' input streams.  However, when the endpoint is published I'm
>>> getting a MalformedURLException because the URL is using a bundle:
>>> protocol,
>>> which isn't known.
>>>
>>> Based on my searching I expect that Felix will start by default with the
>>> URL
>>> Handlers Service started, no?  So why can't these URLs be resolved?  I'm
>>> guessing I'm missing something silly...
>>>
>>> Thanks,
>>> Rich
>>>
>>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>>
>

Reply via email to