tuscany-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Simon Nash <n...@apache.org>
Subject Re: Dynamic service references ?
Date Sun, 20 Nov 2011 21:15:09 GMT
Simon Nash wrote:
> Millies, Sebastian wrote:
>>> From: Jon Giddy [mailto:jongiddy@gmail.com]
>>> Sent: Wednesday, November 16, 2011 5:44 PM
>>> On 16/11/11 13:29, Simon Nash wrote:
>>>> Millies, Sebastian wrote:
>>>>>
>>>>> can references in composite files somehow be made dynamic? In
>>>>> particular, can I define or override
>>>>>
>>>>> the endpoints in a web service reference at run time?
>> [snip]
>>>> It might be possible to use service references for this.  A service
>>>> reference can be serialized/deserialized to/from XML.  So you could
>>>> use runtime code to create the XML-equivalent form of the service
>>>> reference that you need, then deserialize the XML to create the
>>>> service reference.
>>> We tried something like this, but failed to get it to work fully.
>>>
>> [snip]
>>> We then tried a solution where, as each service starts up, it creates a
>>> ServiceReference to itself, marshals that into Base64, and calls an
>>> endpoint on the client, passing in its ServiceReference, which is
>>> stored
>>> in an internal directory (basically a HashMap). The client is then able
>>> to retrieve the endpoints from its internal directory and use them.
>>>
>>> However, a service registering with a client is a little bizarre. We
>>> really wanted the service to register its ServiceReference with a
>>> directory service, and for the client to retrieve the
>>> ServiceReference(s) from the directory service. That is, replace the
>>> internal HashMap with an external service. This would be the classic
>>> Publish-Find-Bind model of Service Oriented Architecture.
>>>
>>> However, we couldn't get it to work. The client can get the Base64
>>> encoded ServiceReference, and perform the same actions as before, but
>>> we
>>> get a NullPointerException when attempting to use the reference.
>>>
>>> It would be great to know if anyone else succeeds at this, as we feel
>>> so
>>> close to achieving dynamic binding in Tuscany,...and yet so far.
>>>
>>> Jon.
>>
>> My problem is similar but not identical. I would need to manipulate the
>> ServiceReference itself according to Simon's suggestion. Now, how 
>> would one
>> go about serializing and deserializing a ServiceReference to/from XML. 
>> I have
>> tried two approaches, neither of which will quite work:
>>
>> private <T> ServiceReference<T> copy( ServiceReference<T> serviceRef,

>> String wsUri )
>>   throws IOException
>> {
>> // first approach
>>   ByteArrayOutputStream baos = new ByteArrayOutputStream();
>>   ObjectOutputStream out = new ObjectOutputStream( baos );
>>   out.writeObject( serviceRef );
>>   // will not yield XML, but binary data, so is not easily manipulable
>>   String xml1 = baos.toString( "UTF-8" ) ;
>>
> Agreed.  This isn't what I had in mind.
> 
>> // second approach
>>   ServiceReferenceImpl<T> sri = (ServiceReferenceImpl<T>) serviceRef;
>>   String xml2 = sri.toXMLString();
>>   // manipulate xml2 ...
>>   ComponentContextHelper cch = 
>> ComponentContextHelper.getCurrentComponentContextHelper();
>>   Component comp = cch.fromXML( xml2 );
>>   List<?> refs = comp.getReferences();
>>   // ClassCastException, because we'll get back a 
>> RuntimeComponentReferenceImpl
>>   ServiceReference<T> sr = (ServiceReference<T>) refs.get( 0 );
>>
>>   return sr;
>> }
>>
> This use of toXML() and fromXML() is the approach that I was suggesting.
> I'll look into the ClassCastException to see if I can find a way round it.
> I'm busy with another project at the moment, so it's likely to be a few
> days before I have any news.
> 
I've added a new itest in 1.x to ahow how to do this and verify that it works.
See revision r1204264 for full details.

The code to serialize a service reference to an XML string looks like this:

public static String serializeServiceReferenceXML(ServiceReference<?> sr) throws IOException
{
     ServiceReferenceImpl<?> sri = (ServiceReferenceImpl<?>) sr;
     return sri.toXMLString();
}

The code to deserialize a service reference from an XML string looks like this:

public static ServiceReference<?> deserializeServiceReferenceXML(String serializedSR)
throws Exception {
     StringReader reader = new StringReader(serializedSR);
     XMLStreamReader xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(reader);
     ServiceReferenceImpl<?> sri = new ServiceReferenceImpl(xmlReader);
     return (ServiceReference<?>) sri;
}

   Simon

>   Simon
> 
>> Sebastian
>>
>> IDS Scheer Consulting GmbH
>> Geschäftsführer/Managing Directors: Kamyar Niroumand, Ivo Totev
>> Sitz/Registered office: Altenkesseler Straße 17, 66115 Saarbrücken, 
>> Germany - Registergericht/Commercial register: Saarbrücken HRB 19681
>> http://www.softwareag.com
>>
> 
> 
> 


Mime
View raw message