Millies, Sebastian wrote:

-----Ursprüngliche Nachricht-----
Von: Simon Nash [mailto:n...@apache.org]
Gesendet: Mittwoch, 28. November 2012 16:17
An: user@tuscany.apache.org
Betreff: Re: Get Contribution at runtime?

Millies, Sebastian wrote:
Hello there,



is there a way to find out the contribution of a class at runtime?



The reason I ask:



That way, I could include versions of libraries that differ from the
Tuscany
runtime by NOT putting them in the contribution itself, but in some
other place

over which I have full control (an  “endorsed” directory or some
such).
I would then load them using my own EndorsedLibrariesClassloader at

runtime, after Tuscany has already started up all my components.

This seems like an interesting approach.  It could perhaps become part
of
Tuscany if you're willing to contribute (no pun intended) the code.


Of course, that new classloader would need access to the current
contribution

in order to resolve imports etc.
If the new classloader is just loading external libraries, why does it
need to resolve imports via the contribution?  Imports are only
relevant
when you're loading contributions.

   Simon

Of course you're right. The new classloader should look for the external libs,
then delegate to the parent (the ContributionClassLoader). I was still thinking
of changing the order in which classes are searched (contribution and imports 
first,
parent last), but that's no problem here.

The whole idea has a drawback, however: The external libraries are not visible 
to the
contributions, but the other way around. So I could not have appropriately 
typed references
in my contributions, but would have to use reflection, right?

A solution might be to make the new classloader the delegation parent
of the contribution classloader, and load the external libraries before
Tuscany loads the contributions.  I think this would be safe if the
contributions don't pass any references to these overriding external
external libraries to the Tuscany runtime.

Is there not a way to create contributions so that I can explicitly set the 
classloader?
Taking the ContributionClassLoaderTest as a point of departure, I see coding 
like this:

ExtensionPointRegistry extensionPoints = new DefaultExtensionPointRegistry();
ModelFactoryExtensionPoint modelFactories = 
extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class);
contributionFactory = modelFactories.getFactory(ContributionFactory.class);

Contribution contrib = contributionFactory.createContribution();
contrib.setURI( ...)
contrib.setLocation( url.toString() );

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
contrib.setClassLoader(new ContributionClassLoader(contrib, classLoader));

I'd need some API that would let me start a composite with contributions 
constructed like that?
I. e. some replacement for the node API
SCANode node = SCANodeFactory.newInstance().createSCANode( compositeURI, 
scaContributions);
node.start();

where I could pass in appropriately constructed Contribution instances instead 
of SCAContributions.

Is there already such an API? Otherwise I could go and try write my own. My 
best bet would be to
do the stuff that NodeImpl() does before it calls configureNode() outside of 
NodeImpl, and add a new
constructor to NodeImpl to accept Contribution arrays. Any better advice?

This seems a lot more complicated than the "delegation parent" approach,
and I'm not familiar enough with this part of the code to be able to
give useful advice.

  Simon

-- Sebastian


IDS Scheer Consulting GmbH
Geschäftsführer/Managing Directors: Michael Rehm, Ivo Totev
Sitz/Registered office: Altenkesseler Straße 17, 66115 Saarbrücken, Germany - 
Registergericht/Commercial register: Saarbrücken HRB 19681
http://www.ids-scheer-consulting.com


Reply via email to