Modified: tuscany/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java?rev=675040&r1=675039&r2=675040&view=diff ============================================================================== --- tuscany/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java (original) +++ tuscany/java/sca/modules/osgi-runtime/src/main/java/org/apache/tuscany/sca/osgi/runtime/OSGiBundleActivator.java Tue Jul 8 16:10:31 2008 @@ -5,9 +5,9 @@ import java.util.Collections; import java.util.Enumeration; import java.util.HashSet; -import java.util.concurrent.ConcurrentHashMap; import org.apache.tuscany.sca.extensibility.ServiceDiscovery; +import org.apache.tuscany.sca.extensibility.osgi.OSGiServiceDiscoverer; import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; @@ -20,162 +20,159 @@ * @version $Rev$ $Date$ */ public class OSGiBundleActivator implements BundleActivator, BundleListener { - - private static final String TUSCANY_SCA_BUNDLE_PREFIX = "org.apache.tuscany.sca"; - private static final String TUSCANY_3RD_PARTY_BUNDLE_PREFIX = "org.apache.tuscany.sca.3rdparty"; - private OSGiRuntime runtime; - private ConcurrentHashMap<Bundle, ClassLoader> serviceDiscoveryClassLoaders = new ConcurrentHashMap<Bundle, ClassLoader>(); - private BundleClassLoader threadContextClassLoader; - private ClassLoader origTCCL; - private Bundle thisBundle; - - public void start(BundleContext bundleContext) throws Exception { - - initializeTuscanyClassLoaders(bundleContext); - - runtime = OSGiRuntime.findRuntime(); - runtime.setBundleContext(bundleContext); + + private static final String TUSCANY_SCA_BUNDLE_PREFIX = "org.apache.tuscany.sca"; + private static final String TUSCANY_3RD_PARTY_BUNDLE_PREFIX = "org.apache.tuscany.sca.3rdparty"; + private OSGiRuntime runtime; + /* + private ConcurrentHashMap<Bundle, ClassLoader> serviceDiscoveryClassLoaders = + new ConcurrentHashMap<Bundle, ClassLoader>(); + */ + private BundleClassLoader threadContextClassLoader; + private ClassLoader origTCCL; + private Bundle thisBundle; + + public void start(BundleContext bundleContext) throws Exception { + + initializeTuscanyClassLoaders(bundleContext); + + runtime = OSGiRuntime.findRuntime(); + runtime.setBundleContext(bundleContext); runtime.setContextClassLoader(threadContextClassLoader); - runtime.initialize(); - - } + runtime.initialize(); + + } + + public void stop(BundleContext bundleContext) throws Exception { - public void stop(BundleContext bundleContext) throws Exception { - // runtime.shutdown(); if (Thread.currentThread().getContextClassLoader() == threadContextClassLoader) - Thread.currentThread().setContextClassLoader(origTCCL); - } - - /** - * Create a bundle ClassLoader which has visibility of all Tuscany related - * bundles. Use this ClassLoader as TCCL, and the Tuscany service discovery - * ClassLoader. - * - * @param bundleContext - */ - private void initializeTuscanyClassLoaders(BundleContext bundleContext) { - - thisBundle = bundleContext.getBundle(); - - origTCCL = Thread.currentThread().getContextClassLoader(); - - threadContextClassLoader = new BundleClassLoader(thisBundle, origTCCL); - - Thread.currentThread().setContextClassLoader(threadContextClassLoader); - + Thread.currentThread().setContextClassLoader(origTCCL); + } + + /** + * Create a bundle ClassLoader which has visibility of all Tuscany related + * bundles. Use this ClassLoader as TCCL, and the Tuscany service discovery + * ClassLoader. + * + * @param bundleContext + */ + private void initializeTuscanyClassLoaders(BundleContext bundleContext) { + + OSGiServiceDiscoverer discoverer = new OSGiServiceDiscoverer(bundleContext); + ServiceDiscovery.setServiceDiscoverer(discoverer); + thisBundle = bundleContext.getBundle(); + + origTCCL = Thread.currentThread().getContextClassLoader(); + + threadContextClassLoader = new BundleClassLoader(thisBundle, origTCCL); + + Thread.currentThread().setContextClassLoader(threadContextClassLoader); + ClassLoader cl = new BundleClassLoader(thisBundle, null); - ServiceDiscovery.getInstance().registerClassLoader(cl); - serviceDiscoveryClassLoaders.put(thisBundle, cl); + // ServiceDiscovery.getInstance().registerClassLoader(cl); + // serviceDiscoveryClassLoaders.put(thisBundle, cl); + + Bundle[] bundles = bundleContext.getBundles(); + for (Bundle bundle : bundles) { + updateBundleClassLoader(bundle); + } + bundleContext.addBundleListener(this); + + } + + /** + * Add an installed bundle to the list of bundles in the service discovery classpath + * if the installed bundle is a Tuscany bundle using the same Core-SPI bundle. + * Since the bundle containing this activator is in Tuscany Runtime, this bundle + * will provide access to Runtime and its dependencies (SPI, SCA-API). Third party + * bundles don't need to be in the service discovery classpath, since they will be automatically + * imported by bundles which require them. That leaves Tuscany extension bundles, + * which are added to the service discovery classpath here. + * + * 3rd party bundle should be explicitly added to TCCL since classes from these + * bundles use TCCL to load other classes from the bundle. + * + * Load one class from the bundle to check if the new bundle matches this runtime bundle. + * + * @param bundle + */ + private void updateBundleClassLoader(Bundle bundle) { + + if (bundle.getSymbolicName().startsWith(TUSCANY_SCA_BUNDLE_PREFIX)) { + + // This may be the third party bundle. + if (bundle.getSymbolicName().startsWith(TUSCANY_3RD_PARTY_BUNDLE_PREFIX)) { + + threadContextClassLoader.addBundle(bundle); + } else { - Bundle[] bundles = bundleContext.getBundles(); - for (Bundle bundle : bundles) { - updateBundleClassLoader(bundle); - } - bundleContext.addBundleListener(this); - - } - - /** - * Add an installed bundle to the list of bundles in the service discovery classpath - * if the installed bundle is a Tuscany bundle using the same Core-SPI bundle. - * Since the bundle containing this activator is in Tuscany Runtime, this bundle - * will provide access to Runtime and its dependencies (SPI, SCA-API). Third party - * bundles don't need to be in the service discovery classpath, since they will be automatically - * imported by bundles which require them. That leaves Tuscany extension bundles, - * which are added to the service discovery classpath here. - * - * 3rd party bundle should be explicitly added to TCCL since classes from these - * bundles use TCCL to load other classes from the bundle. - * - * Load one class from the bundle to check if the new bundle matches this runtime bundle. - * - * @param bundle - */ - private void updateBundleClassLoader(Bundle bundle) { - - if (bundle.getSymbolicName().startsWith(TUSCANY_SCA_BUNDLE_PREFIX)) { - - - // This may be the third party bundle. - if (bundle.getSymbolicName().startsWith(TUSCANY_3RD_PARTY_BUNDLE_PREFIX)) { - - threadContextClassLoader.addBundle(bundle); - } - else { - String thisBundleVersion = (String)thisBundle.getHeaders().get("Bundle-Version"); String bundleVersion = (String)bundle.getHeaders().get("Bundle-Version"); - + if (thisBundleVersion == null || bundleVersion == null || thisBundleVersion.equals(bundleVersion)) { - + if (!threadContextClassLoader.bundles.contains(bundle)) { ClassLoader cl = new BundleClassLoader(bundle, null); - ServiceDiscovery.getInstance().registerClassLoader(cl); - serviceDiscoveryClassLoaders.put(bundle, cl); - threadContextClassLoader.addBundle(bundle); + // ServiceDiscovery.getInstance().registerClassLoader(cl); + // serviceDiscoveryClassLoaders.put(bundle, cl); + threadContextClassLoader.addBundle(bundle); } } - } - } else { - threadContextClassLoader.addBundle(bundle); - } - } - - - /** - * Handle bundle install/uninstall events - */ - public void bundleChanged(BundleEvent event) { - - Bundle bundle = event.getBundle(); - if (event.getType() == BundleEvent.UNINSTALLED) { - ClassLoader cl = serviceDiscoveryClassLoaders.get(bundle); - if (cl != null) { - ServiceDiscovery.getInstance().unregisterClassLoader(cl); } - threadContextClassLoader.removeBundle(bundle); - } - else if (event.getType() == BundleEvent.INSTALLED) { - updateBundleClassLoader(bundle); - } - } + } else { + threadContextClassLoader.addBundle(bundle); + } + } + /** + * Handle bundle install/uninstall events + */ + public void bundleChanged(BundleEvent event) { + + Bundle bundle = event.getBundle(); + if (event.getType() == BundleEvent.UNINSTALLED) { +// ClassLoader cl = serviceDiscoveryClassLoaders.get(bundle); +// if (cl != null) { +// ServiceDiscovery.getInstance().unregisterClassLoader(cl); +// } + threadContextClassLoader.removeBundle(bundle); + } else if (event.getType() == BundleEvent.INSTALLED) { + updateBundleClassLoader(bundle); + } + } + /** + * Bundle ClassLoader that searches a bundle classpath consisting of + * a list of bundles. The parent ClassLoader is searched only if a class + * cannot be loaded from the bundle classpath. Tuscany bundles are + * dynamically added and removed from the bundle classpath when the bundles + * are installed and uninstalled. + * + * No ordering of bundles is maintained at the moment. + * + */ + private static class BundleClassLoader extends ClassLoader { + + private HashSet<Bundle> bundles; + + BundleClassLoader(Bundle bundle, ClassLoader parent) { + super(parent); + this.bundles = new HashSet<Bundle>(); + bundles.add(bundle); + } + private synchronized void addBundle(Bundle bundle) { + bundles.add(bundle); + } + + private synchronized void removeBundle(Bundle bundle) { + if (bundles.contains(bundle)) + bundles.remove(bundle); + } - /** - * Bundle ClassLoader that searches a bundle classpath consisting of - * a list of bundles. The parent ClassLoader is searched only if a class - * cannot be loaded from the bundle classpath. Tuscany bundles are - * dynamically added and removed from the bundle classpath when the bundles - * are installed and uninstalled. - * - * No ordering of bundles is maintained at the moment. - * - */ - private static class BundleClassLoader extends ClassLoader { - - private HashSet<Bundle> bundles; - - BundleClassLoader(Bundle bundle, ClassLoader parent) { - super(parent); - this.bundles = new HashSet<Bundle>(); - bundles.add(bundle); - } - - private synchronized void addBundle(Bundle bundle) { - bundles.add(bundle); - } - - private synchronized void removeBundle(Bundle bundle) { - if (bundles.contains(bundle)) - bundles.remove(bundle); - } - - - @Override + @Override protected Class<?> findClass(String className) throws ClassNotFoundException { Class<?> clazz = null; synchronized (this) { @@ -188,53 +185,50 @@ } } - } + } if (clazz != null) { return clazz; } return super.findClass(className); } + @Override + @SuppressWarnings("unchecked") + public Enumeration<URL> getResources(String resName) throws IOException { + HashSet<URL> urlSet = new HashSet<URL>(); + Enumeration<URL> urls = null; + synchronized (this) { + for (Bundle bundle : bundles) { + urls = bundle.getResources(resName); + if (urls != null) { + while (urls.hasMoreElements()) { + urlSet.add(urls.nextElement()); + } + } + } + } + if (urlSet.size() > 0) + return Collections.enumeration(urlSet); + return super.getResources(resName); + } + + @Override + public URL getResource(String resName) { + URL url = null; + synchronized (this) { + for (Bundle bundle : bundles) { + url = bundle.getResource(resName); + if (url != null) + return url; + } + } + return super.getResource(resName); + } + + @Override + public String toString() { + return "Tuscany BundleClassLoader " + bundles.iterator().next(); + } - @Override - @SuppressWarnings("unchecked") - public Enumeration<URL> getResources(String resName) throws IOException { - HashSet<URL> urlSet = new HashSet<URL>(); - Enumeration<URL> urls = null; - synchronized (this) { - for (Bundle bundle : bundles) { - urls = bundle.getResources(resName); - if (urls != null) { - while (urls.hasMoreElements()) { - urlSet.add(urls.nextElement()); - } - } - } - } - if (urlSet.size() > 0) - return Collections.enumeration(urlSet); - return super.getResources(resName); - } - - @Override - public URL getResource(String resName) { - URL url = null; - synchronized (this) { - for (Bundle bundle : bundles) { - url = bundle.getResource(resName); - if (url != null) - return url; - } - } - return super.getResource(resName); - } - - @Override - public String toString() { - return "Tuscany BundleClassLoader " + bundles.iterator().next(); - } - - - - } + } }
Modified: tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerDefinitionsLoader.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerDefinitionsLoader.java?rev=675040&r1=675039&r2=675040&view=diff ============================================================================== --- tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerDefinitionsLoader.java (original) +++ tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerDefinitionsLoader.java Tue Jul 8 16:10:31 2008 @@ -38,7 +38,7 @@ */ public class PolicyHandlerDefinitionsLoader { - public static Map<ClassLoader, List<PolicyHandlerTuple>> loadPolicyHandlerClassnames() { + public static List<PolicyHandlerTuple> loadPolicyHandlerClassnames() { // Get the processor service declarations Set<ServiceDeclaration> sds; try { @@ -47,15 +47,10 @@ throw new IllegalStateException(e); } - Map<ClassLoader, List<PolicyHandlerTuple>> handlerTuples = new Hashtable<ClassLoader, List<PolicyHandlerTuple>>(); + List<PolicyHandlerTuple> handlerTupleList = new ArrayList<PolicyHandlerTuple>(); + + Map<Object, List<PolicyHandlerTuple>> handlerTuples = new Hashtable<Object, List<PolicyHandlerTuple>>(); for (ServiceDeclaration sd : sds) { - ClassLoader cl = sd.getClassLoader(); - - List<PolicyHandlerTuple> handlerTupleList = handlerTuples.get(cl); - if ( handlerTupleList == null ) { - handlerTupleList = new ArrayList<PolicyHandlerTuple>(); - handlerTuples.put(cl, handlerTupleList); - } Map<String, String> attributes = sd.getAttributes(); String intentName = attributes.get("intent"); QName intentQName = getQName(intentName); @@ -64,10 +59,10 @@ if ( appliesTo != null && !appliesTo.startsWith("/") ) { appliesTo = "//" + appliesTo; } - handlerTupleList.add(new PolicyHandlerTuple(sd.getClassName(), intentQName, policyModelClassName, appliesTo)); + handlerTupleList.add(new PolicyHandlerTuple(sd, sd.getClassName(), intentQName, policyModelClassName, appliesTo)); } - return handlerTuples; + return handlerTupleList; } private static QName getQName(String qname) { Modified: tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerTuple.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerTuple.java?rev=675040&r1=675039&r2=675040&view=diff ============================================================================== --- tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerTuple.java (original) +++ tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerTuple.java Tue Jul 8 16:10:31 2008 @@ -21,34 +21,48 @@ import javax.xml.namespace.QName; +import org.apache.tuscany.sca.extensibility.ServiceDeclaration; + /** * PolicyHanlder tuples stored in policy handler services files * * @version $Rev$ $Date$ */ public class PolicyHandlerTuple { + private ServiceDeclaration declaration; private String policyHandlerClassName; private QName providedIntentName; private String policyModelClassName; private String appliesTo; - - public String getAppliesTo() { - return appliesTo; - } - public void setAppliesTo(String appliesTo) { - this.appliesTo = appliesTo; - } - - public PolicyHandlerTuple(String handlerClassName, + public PolicyHandlerTuple(ServiceDeclaration declaration, + String handlerClassName, QName providedIntentName, String policyModelClassName, String appliesTo) { + this.declaration = declaration; this.policyHandlerClassName = handlerClassName; this.providedIntentName = providedIntentName; this.policyModelClassName = policyModelClassName; this.appliesTo = appliesTo; } + + public ServiceDeclaration getDeclaration() { + return declaration; + } + + public void setDeclaration(ServiceDeclaration declaration) { + this.declaration = declaration; + } + + public String getAppliesTo() { + return appliesTo; + } + + public void setAppliesTo(String appliesTo) { + this.appliesTo = appliesTo; + } + public String getPolicyHandlerClassName() { return policyHandlerClassName; Modified: tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerUtils.java URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerUtils.java?rev=675040&r1=675039&r2=675040&view=diff ============================================================================== --- tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerUtils.java (original) +++ tuscany/java/sca/modules/policy/src/main/java/org/apache/tuscany/sca/policy/util/PolicyHandlerUtils.java Tue Jul 8 16:10:31 2008 @@ -20,7 +20,6 @@ package org.apache.tuscany.sca.policy.util; import java.util.List; -import java.util.Map; import org.apache.tuscany.sca.policy.Intent; import org.apache.tuscany.sca.policy.PolicySet; @@ -31,43 +30,34 @@ * @version $Rev$ $Date$ */ public class PolicyHandlerUtils { - public static PolicyHandler findPolicyHandler(PolicySet policySet, - Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassNames) - throws IllegalAccessException, ClassNotFoundException, InstantiationException { - + public static PolicyHandler findPolicyHandler(PolicySet policySet, List<PolicyHandlerTuple> policyHandlerClassNames) + throws IllegalAccessException, ClassNotFoundException, InstantiationException { + PolicyHandler handler = null; - - for (ClassLoader classLoader : policyHandlerClassNames.keySet()) { - for ( PolicyHandlerTuple handlerTuple : policyHandlerClassNames.get(classLoader) ) { - //System.out.println(handlerTuple); - for ( Intent intent : policySet.getProvidedIntents() ) { - if ( intent.getName().equals(handlerTuple.getProvidedIntentName())) { - for ( Object policy : policySet.getPolicies() ) { - if ( policy.getClass().getName().equals(handlerTuple.getPolicyModelClassName())) { - if ( handlerTuple.getAppliesTo() != null ) { - if ( handlerTuple.getAppliesTo().equals(policySet.getAppliesTo() )) { - handler = - (PolicyHandler)Class.forName(handlerTuple.getPolicyHandlerClassName(), - true, - classLoader).newInstance(); - handler.setApplicablePolicySet(policySet); - return handler; - } - } else { - handler = - (PolicyHandler)Class.forName(handlerTuple.getPolicyHandlerClassName(), - true, - classLoader).newInstance(); - handler.setApplicablePolicySet(policySet); - return handler; + + for (PolicyHandlerTuple handlerTuple : policyHandlerClassNames) { + //System.out.println(handlerTuple); + for (Intent intent : policySet.getProvidedIntents()) { + if (intent.getName().equals(handlerTuple.getProvidedIntentName())) { + for (Object policy : policySet.getPolicies()) { + if (policy.getClass().getName().equals(handlerTuple.getPolicyModelClassName())) { + if (handlerTuple.getAppliesTo() != null) { + if (handlerTuple.getAppliesTo().equals(policySet.getAppliesTo())) { + handler = (PolicyHandler)handlerTuple.getDeclaration().loadClass().newInstance(); + handler.setApplicablePolicySet(policySet); + return handler; } + } else { + handler = (PolicyHandler)handlerTuple.getDeclaration().loadClass().newInstance(); + handler.setApplicablePolicySet(policySet); + return handler; } } } } } } - + return handler; } Modified: tuscany/java/sca/modules/pom.xml URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/pom.xml?rev=675040&r1=675039&r2=675040&view=diff ============================================================================== --- tuscany/java/sca/modules/pom.xml (original) +++ tuscany/java/sca/modules/pom.xml Tue Jul 8 16:10:31 2008 @@ -103,6 +103,8 @@ <module>domain-manager</module> <module>endpoint</module> <module>extensibility</module> + <module>extensibility-osgi</module> + <module>extensibility-eclipse</module> <module>extension-helper</module> <module>host-corba</module> <module>host-corba-jdk</module>
