diff options
2 files changed, 65 insertions, 135 deletions
diff --git a/java/sca/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java b/java/sca/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java index b5a3da11f4..6ff385db38 100644 --- a/java/sca/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java +++ b/java/sca/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java @@ -27,32 +27,31 @@ import java.util.Dictionary; import java.util.HashSet; import java.util.Hashtable; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import org.apache.tuscany.sca.assembly.ComponentProperty; +import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.ComponentReference; import org.apache.tuscany.sca.assembly.ComponentService; +import org.apache.tuscany.sca.assembly.Extensible; import org.apache.tuscany.sca.assembly.Multiplicity; import org.apache.tuscany.sca.assembly.Reference; import org.apache.tuscany.sca.assembly.Service; -import org.apache.tuscany.sca.core.factory.InstanceWrapper; import org.apache.tuscany.sca.core.factory.ObjectCreationException; -import org.apache.tuscany.sca.core.factory.ObjectFactory; -import org.apache.tuscany.sca.core.invocation.impl.JDKProxyFactory; +import org.apache.tuscany.sca.core.invocation.ProxyFactory; +import org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint; import org.apache.tuscany.sca.core.scope.Scope; -import org.apache.tuscany.sca.core.scope.ScopeContainer; import org.apache.tuscany.sca.core.scope.ScopeRegistry; -import org.apache.tuscany.sca.core.scope.ScopedImplementationProvider; -import org.apache.tuscany.sca.core.scope.ScopedRuntimeComponent; import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint; -import org.apache.tuscany.sca.implementation.java.IntrospectionException; import org.apache.tuscany.sca.implementation.osgi.OSGiImplementation; +import org.apache.tuscany.sca.implementation.osgi.OSGiProperty; import org.apache.tuscany.sca.interfacedef.Interface; import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper; import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.interfacedef.java.JavaInterface; import org.apache.tuscany.sca.invocation.Invoker; import org.apache.tuscany.sca.invocation.MessageFactory; +import org.apache.tuscany.sca.provider.ImplementationProvider; import org.apache.tuscany.sca.runtime.EndpointReference; import org.apache.tuscany.sca.runtime.RuntimeComponent; import org.apache.tuscany.sca.runtime.RuntimeComponentReference; @@ -69,6 +68,7 @@ import org.osgi.framework.FrameworkListener; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceListener; +import org.osgi.framework.ServiceReference; import org.osgi.service.packageadmin.PackageAdmin; /** @@ -76,7 +76,7 @@ import org.osgi.service.packageadmin.PackageAdmin; * * @version $Rev$ $Date$ */ -public class OSGiImplementationProvider implements ScopedImplementationProvider, FrameworkListener, BundleListener { +public class OSGiImplementationProvider implements ImplementationProvider, FrameworkListener, BundleListener { private static final String COMPONENT_SERVICE_NAME = "component.service.name"; @@ -105,6 +105,7 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, private ScopeRegistry scopeRegistry; private DataBindingExtensionPoint dataBindingRegistry; + private ProxyFactoryExtensionPoint proxyFactoryExtensionPoint; private boolean packagesRefreshed; @@ -116,6 +117,7 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, DataBindingExtensionPoint dataBindingRegistry, ScopeRegistry scopeRegistry, MessageFactory messageFactory, + ProxyFactoryExtensionPoint proxyFactoryExtensionPoint, InterfaceContractMapper mapper) throws BundleException { this.implementation = impl; @@ -123,6 +125,7 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, this.dataBindingRegistry = dataBindingRegistry; this.scopeRegistry = scopeRegistry; this.messageFactory = messageFactory; + this.proxyFactoryExtensionPoint = proxyFactoryExtensionPoint; this.mapper = mapper; BundleContext bundleContext = OSGiImplementationActivator.getBundleContext(); @@ -303,8 +306,6 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, resolveBundle(); - processAnnotations(true); - for (Bundle bundle : dependentBundles) { try { if (bundle.getState() != Bundle.ACTIVE && bundle.getState() != Bundle.STARTING) { @@ -354,14 +355,15 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, // This method is called by OSGiInstanceWrapper.getInstance to obtain the OSGi service reference // corresponding to the specified service. The properties used to filter the service should // be chosen based on whether this is a normal service or a callback. - protected org.osgi.framework.ServiceReference getOSGiServiceReference(ComponentService service) + /** + * @param component + * @param service + * @return + */ + protected ServiceReference getOSGiServiceReference(Component component, ComponentService service) throws ObjectCreationException { - Hashtable<String, Object> props = new Hashtable<String, Object>(); - if (!service.isCallback()) - processProperties(implementation.getServiceProperties(service.getName()), props); - else - processProperties(implementation.getServiceCallbackProperties(service.getName()), props); + Hashtable<String, Object> props = getOSGiProperties(service); String filter = getOSGiFilter(props); Interface serviceInterface = service.getInterfaceContract().getInterface(); @@ -371,8 +373,23 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, } - protected org.osgi.framework.ServiceReference getOSGiServiceReference(EndpointReference from, - Interface callbackInterface) + /** + * Get all the OSGi properties from the extension list + * @param extensible + * @return + */ + private Hashtable<String, Object> getOSGiProperties(Extensible extensible) { + Hashtable<String, Object> props = new Hashtable<String, Object>(); + for (Object ext : extensible.getExtensions()) { + if (ext instanceof OSGiProperty) { + OSGiProperty p = (OSGiProperty)ext; + props.put(p.getName(), p.getValue()); + } + } + return props; + } + + protected ServiceReference getOSGiServiceReference(EndpointReference from, Interface callbackInterface) throws ObjectCreationException { RuntimeWire refWire = null; @@ -384,25 +401,22 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, } } if (refWire != null) { - Hashtable<String, Object> props = new Hashtable<String, Object>(); ComponentReference scaRef = componentReferenceWires.get(refWire); - processProperties(implementation.getReferenceCallbackProperties(scaRef.getName()), props); + Hashtable<String, Object> props = getOSGiProperties(scaRef); filter = getOSGiFilter(props); } return getOSGiServiceReference(callbackInterface, filter, null); } - private org.osgi.framework.ServiceReference getOSGiServiceReference(Interface serviceInterface, - String filter, - String scaServiceName) + private ServiceReference getOSGiServiceReference(Interface serviceInterface, String filter, String scaServiceName) throws ObjectCreationException { try { String serviceInterfaceName = null; - org.osgi.framework.ServiceReference osgiServiceReference = null; + ServiceReference osgiServiceReference = null; if (serviceInterface instanceof JavaInterface) { serviceInterfaceName = ((JavaInterface)serviceInterface).getJavaClass().getName(); @@ -438,46 +452,6 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, } } - - - private static String getPackageName(Class<?> cls) { - String name = cls.getName(); - int index = name.lastIndexOf('.'); - return index == -1 ? "" : name.substring(0, index); - } - - public InstanceWrapper<?> createInstanceWrapper() throws ObjectCreationException { - - return new OSGiInstanceWrapper<Object>(this, osgiAnnotations, bundleContext); - } - - private void resolveWireCreateDummyBundles(final Class interfaceClass) throws Exception { - - try { - - osgiBundle.loadClass(interfaceClass.getName()); - - } catch (ClassNotFoundException e) { - - // The interface used by the proxy is not in the source bundle - // A dummy bundle needs to be installed to create the proxy - // Allow privileged access to file system. Requires FileSystem permission in security - // policy. - Bundle dummyBundle = AccessController.doPrivileged(new PrivilegedExceptionAction<Bundle>() { - public Bundle run() throws Exception { - return installDummyBundle(interfaceClass); - } - }); - - if (packageAdmin != null) { - - packageAdmin.resolveBundles(new Bundle[] {dummyBundle, osgiBundle}); - - } - - } - } - /** * For OSGi->Java wires, create a proxy corresponding to the Java interfaces * and register the proxy with the OSGi registry, so that the source OSGi bundle can @@ -494,7 +468,7 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, * wires of the component, the bundle should be resolved. Phase2 registers the proxy service. */ private boolean resolveWireResolveReferences(Bundle bundle, - Class interfaceClass, + Class<?> interfaceClass, RuntimeWire wire, boolean isOSGiToOSGiWire) throws Exception { @@ -505,8 +479,7 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, boolean createProxy = true; ComponentReference scaRef = componentReferenceWires.get(wire); - Hashtable<String, Object> targetProperties = new Hashtable<String, Object>(); - processProperties(implementation.getReferenceProperties(scaRef.getName()), targetProperties); + Hashtable<String, Object> targetProperties = getOSGiProperties(scaRef); if (isOSGiToOSGiWire) { @@ -569,8 +542,7 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, throws Exception { ComponentReference scaRef = componentReferenceWires.get(wire); - Hashtable<String, Object> targetProperties = new Hashtable<String, Object>(); - processProperties(implementation.getReferenceProperties(scaRef.getName()), targetProperties); + Hashtable<String, Object> targetProperties = getOSGiProperties(scaRef); targetProperties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE); if (targetProperties.get(COMPONENT_SERVICE_NAME) == null && wire.getTarget().getComponent() != null) { @@ -579,7 +551,10 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, targetProperties.put(COMPONENT_SERVICE_NAME, compServiceName); } - JDKProxyFactory proxyService = new JDKProxyFactory(messageFactory, mapper); + ProxyFactory proxyService = proxyFactoryExtensionPoint.getInterfaceProxyFactory(); + if (!interfaceClass.isInterface()) { + proxyService = proxyFactoryExtensionPoint.getClassProxyFactory(); + } // Allow privileged access to load classes. Requires getClassLoader permission in security // policy. @@ -593,7 +568,7 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, final Hashtable<String, Object> finalTargetProperties = targetProperties; AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { public Object run() throws Exception { - bundleContext.registerService(proxyInterface.getName(), proxy, finalTargetProperties); + osgiBundle.getBundleContext().registerService(proxyInterface.getName(), proxy, finalTargetProperties); return null; } }); @@ -649,8 +624,8 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, if (refInterface instanceof JavaInterface) { interfaceClasses[index] = ((JavaInterface)refInterface).getJavaClass(); - if (!isOSGiToOSGiWire[index]) - resolveWireCreateDummyBundles(interfaceClasses[index]); + // if (!isOSGiToOSGiWire[index]) + // resolveWireCreateDummyBundles(interfaceClasses[index]); } @@ -666,7 +641,7 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, if (callbackInterface instanceof JavaInterface) { interfaceClasses[index] = ((JavaInterface)callbackInterface).getJavaClass(); - resolveWireCreateDummyBundles(interfaceClasses[index]); +// resolveWireCreateDummyBundles(interfaceClasses[index]); } index++; @@ -713,10 +688,10 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, return; org.osgi.framework.ServiceReference configAdminReference = - bundleContext.getServiceReference("org.osgi.service.cm.ConfigurationAdmin"); + osgiBundle.getBundleContext().getServiceReference("org.osgi.service.cm.ConfigurationAdmin"); if (configAdminReference != null) { - Object cm = bundleContext.getService(configAdminReference); + Object cm = osgiBundle.getBundleContext().getService(configAdminReference); Class cmClass = cm.getClass().getClassLoader().loadClass("org.osgi.service.cm.ConfigurationAdmin"); Method getConfigMethod = cmClass.getMethod("getConfiguration", String.class, String.class); @@ -730,16 +705,12 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, for (Service service : services) { - List<ComponentProperty> serviceProps = implementation.getServiceProperties(service.getName()); + Hashtable<String, Object> properties = getOSGiProperties(service); String pid = null; - if (serviceProps != null) { - for (ComponentProperty prop : serviceProps) { - if (prop.getName().equals("service.pid")) { - ObjectFactory objFactory = - propertyValueFactory.createValueFactory(prop, prop.getValue(), String.class); - pid = (String)objFactory.getInstance(); - } + if (properties != null) { + for (Map.Entry<String, Object> prop : properties.entrySet()) { + pid = (String)prop.getValue(); } } if (pid == null || pidsProcessed.contains(pid)) @@ -747,8 +718,9 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, Object config = getConfigMethod.invoke(cm, pid, null); Dictionary props = (Dictionary)getMethod.invoke(config); - if (props == null) + if (props == null) { props = new Hashtable<String, Object>(); + } for (String propertyName : componentProperties.keySet()) { props.put(propertyName, componentProperties.get(propertyName)); @@ -786,16 +758,8 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, return 0l; } - protected ScopeContainer<?> getScopeContainer() { - startBundle(true); - return ((ScopedRuntimeComponent)runtimeComponent).getScopeContainer(); - } - public Invoker createTargetInvoker(RuntimeComponentService service, Operation operation) { - Interface serviceInterface = operation.getInterface(); - boolean isRemotable = serviceInterface.isRemotable(); - Invoker invoker = new OSGiTargetInvoker(operation, this, service); return invoker; } @@ -843,7 +807,7 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, } - processProperties(runtimeComponent.getProperties(), componentProperties); + componentProperties = getOSGiProperties(runtimeComponent); return true; @@ -853,40 +817,6 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, setReferencesAndProperties(); } - public void processAnnotations(boolean doWait) throws IntrospectionException { - - if (!enterMethod(doWait, processAnnotationsEntryCount)) - return; - - try { - osgiAnnotations.processAnnotations(); - - Scope scope = osgiAnnotations.getScope(); - if (scope.equals(Scope.SYSTEM) || scope.equals(Scope.COMPOSITE)) { - // Nothing - } else { - - if (runtimeComponent instanceof ScopedRuntimeComponent) { - - ScopedRuntimeComponent component = (ScopedRuntimeComponent)runtimeComponent; - - ScopeContainer oldScopeContainer = component.getScopeContainer(); - component.setScopeContainer(null); - ScopeContainer scopeContainer = scopeRegistry.getScopeContainer(runtimeComponent); - - if (oldScopeContainer != null && oldScopeContainer.getLifecycleState() == ScopeContainer.RUNNING) { - scopeContainer.start(); - } - - component.setScopeContainer(scopeContainer); - } - - } - } finally { - exitMethod(processAnnotationsEntryCount); - } - } - public void stop() { if (osgiServiceListener != null) { @@ -906,11 +836,7 @@ public class OSGiImplementationProvider implements ScopedImplementationProvider, public void bundleChanged(BundleEvent event) { if (event.getType() == BundleEvent.RESOLVED && event.getBundle() == osgiBundle) { - try { - processAnnotations(false); - } catch (Throwable e) { - e.printStackTrace(); - } + // TODO } } diff --git a/java/sca/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProviderFactory.java b/java/sca/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProviderFactory.java index 210a93858a..408b864252 100644 --- a/java/sca/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProviderFactory.java +++ b/java/sca/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProviderFactory.java @@ -21,6 +21,7 @@ package org.apache.tuscany.sca.implementation.osgi.runtime; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.core.UtilityExtensionPoint; +import org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint; import org.apache.tuscany.sca.core.scope.ScopeRegistry; import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint; import org.apache.tuscany.sca.implementation.osgi.OSGiImplementation; @@ -38,6 +39,7 @@ import org.osgi.framework.BundleException; */ public class OSGiImplementationProviderFactory implements ImplementationProviderFactory<OSGiImplementation> { + private ProxyFactoryExtensionPoint proxyFactoryExtensionPoint; private DataBindingExtensionPoint dataBindings; private ScopeRegistry scopeRegistry; private MessageFactory messageFactory; @@ -51,6 +53,8 @@ public class OSGiImplementationProviderFactory implements ImplementationProvider // to implementation.osgi since it needs to change scope after the component is // created. Do we need to find a better way? scopeRegistry = extensionPoints.getExtensionPoint(ScopeRegistry.class); + + proxyFactoryExtensionPoint = extensionPoints.getExtensionPoint(ProxyFactoryExtensionPoint.class); FactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class); messageFactory = modelFactories.getFactory(MessageFactory.class); @@ -65,7 +69,7 @@ public class OSGiImplementationProviderFactory implements ImplementationProvider try { return new OSGiImplementationProvider(component, implementation, dataBindings, scopeRegistry, - messageFactory, mapper); + messageFactory, proxyFactoryExtensionPoint, mapper); } catch (BundleException e) { throw new RuntimeException(e); |