diff options
Diffstat (limited to '')
7 files changed, 190 insertions, 41 deletions
diff --git a/branches/sca-java-2.0-M4/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java b/branches/sca-java-2.0-M4/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java index 7b5b5f2ea1..9111a7d03c 100644 --- a/branches/sca-java-2.0-M4/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java +++ b/branches/sca-java-2.0-M4/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java @@ -37,6 +37,7 @@ import org.apache.tuscany.sca.assembly.Extensible; import org.apache.tuscany.sca.core.invocation.ProxyFactory; import org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint; import org.apache.tuscany.sca.implementation.osgi.OSGiImplementation; +import org.apache.tuscany.sca.implementation.osgi.OSGiImplementationFactory; import org.apache.tuscany.sca.implementation.osgi.OSGiProperty; import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.interfacedef.Operation; @@ -63,14 +64,18 @@ public class OSGiImplementationProvider implements ImplementationProvider { private RuntimeComponent component; private ProxyFactoryExtensionPoint proxyFactoryExtensionPoint; private Bundle osgiBundle; + private boolean startedByMe; private OSGiImplementation implementation; private List<ServiceRegistration> registrations = new ArrayList<ServiceRegistration>(); + private OSGiImplementationFactory implementationFactory; public OSGiImplementationProvider(RuntimeComponent component, OSGiImplementation impl, - ProxyFactoryExtensionPoint proxyFactoryExtensionPoint) throws BundleException { + ProxyFactoryExtensionPoint proxyFactoryExtensionPoint, + OSGiImplementationFactory implementationFactory) throws BundleException { this.component = component; this.proxyFactoryExtensionPoint = proxyFactoryExtensionPoint; + this.implementationFactory = implementationFactory; this.implementation = impl; this.osgiBundle = impl.getBundle(); } @@ -85,6 +90,7 @@ public class OSGiImplementationProvider implements ImplementationProvider { int state = osgiBundle.getState(); if ((state & Bundle.STARTING) == 0 && (state & Bundle.ACTIVE) == 0) { osgiBundle.start(); + startedByMe = true; } } catch (BundleException e) { throw new ServiceRuntimeException(e); @@ -93,8 +99,8 @@ public class OSGiImplementationProvider implements ImplementationProvider { for (ComponentReference ref : component.getReferences()) { RuntimeComponentReference reference = (RuntimeComponentReference)ref; InterfaceContract interfaceContract = reference.getInterfaceContract(); - JavaInterface javaInterface = (JavaInterface)interfaceContract.getInterface(); - final Class<?> interfaceClass = javaInterface.getJavaClass(); + final JavaInterface javaInterface = (JavaInterface)interfaceContract.getInterface(); + // final Class<?> interfaceClass = javaInterface.getJavaClass(); // final Hashtable<String, Object> props = new Hashtable<String, Object>(); // props.put(FILTER_MATCH_CRITERIA, ""); @@ -109,20 +115,39 @@ public class OSGiImplementationProvider implements ImplementationProvider { osgiProps.put(SERVICE_IMPORTED_CONFIGS, new String[] {REMOTE_CONFIG_SCA}); for (RuntimeWire wire : reference.getRuntimeWires()) { - final OSGiServiceFactory serviceFactory = new OSGiServiceFactory(interfaceClass.getName(), wire); + final OSGiServiceFactory serviceFactory = new OSGiServiceFactory(javaInterface.getName(), wire); ServiceRegistration registration = AccessController.doPrivileged(new PrivilegedAction<ServiceRegistration>() { public ServiceRegistration run() { // Register the proxy as OSGi service BundleContext context = osgiBundle.getBundleContext(); ServiceRegistration registration = - context.registerService(interfaceClass.getName(), serviceFactory, osgiProps); + context.registerService(javaInterface.getName(), serviceFactory, osgiProps); return registration; } }); registrations.add(registration); } } + + // Set the OSGi service reference properties into the SCA service + for (ComponentService service : component.getServices()) { + // The properties might have been set by the export service + boolean found = false; + for (Object ext : service.getExtensions()) { + if (ext instanceof OSGiProperty) { + found = true; + break; + } + } + if (found) { + continue; + } + ServiceReference serviceReference = getServiceReference(osgiBundle.getBundleContext(), service); + if (serviceReference != null) { + service.getExtensions().addAll(implementationFactory.createOSGiProperties(serviceReference)); + } + } } public void stop() { @@ -134,13 +159,18 @@ public class OSGiImplementationProvider implements ImplementationProvider { } } registrations.clear(); - try { - int state = osgiBundle.getState(); - if ((state & Bundle.STOPPING) == 0 && (state & Bundle.ACTIVE) != 0) { - osgiBundle.stop(); + // [REVIEW] Shoud it take care of stopping the bundle? + if (startedByMe) { + try { + int state = osgiBundle.getState(); + if ((state & Bundle.STOPPING) == 0 && (state & Bundle.ACTIVE) != 0) { + osgiBundle.stop(); + } + } catch (BundleException e) { + throw new ServiceRuntimeException(e); + } finally { + startedByMe = false; } - } catch (BundleException e) { - throw new ServiceRuntimeException(e); } } @@ -165,24 +195,29 @@ public class OSGiImplementationProvider implements ImplementationProvider { } protected Object getOSGiService(ComponentService service) { + BundleContext bundleContext = osgiBundle.getBundleContext(); + ServiceReference ref = getServiceReference(bundleContext, service); + if (ref != null) { + Object instance = bundleContext.getService(ref); + return instance; + } else { + return null; + } + } + + private ServiceReference getServiceReference(BundleContext bundleContext, ComponentService service) { JavaInterface javaInterface = (JavaInterface)service.getInterfaceContract().getInterface(); // String filter = getOSGiFilter(provider.getOSGiProperties(service)); // FIXME: What is the filter? String filter = "(!(" + SERVICE_IMPORTED + "=*))"; // "(sca.service=" + component.getURI() + "#service-name\\(" + service.getName() + "\\))"; - BundleContext bundleContext = osgiBundle.getBundleContext(); ServiceReference ref; try { ref = bundleContext.getServiceReferences(javaInterface.getName(), filter)[0]; } catch (InvalidSyntaxException e) { throw new ServiceRuntimeException(e); } - if (ref != null) { - Object instance = bundleContext.getService(ref); - return instance; - } else { - return null; - } + return ref; } RuntimeComponent getComponent() { diff --git a/branches/sca-java-2.0-M4/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProviderFactory.java b/branches/sca-java-2.0-M4/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProviderFactory.java index 0e4a3ef995..11b29de248 100644 --- a/branches/sca-java-2.0-M4/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProviderFactory.java +++ b/branches/sca-java-2.0-M4/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProviderFactory.java @@ -19,8 +19,10 @@ 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.invocation.ProxyFactoryExtensionPoint; import org.apache.tuscany.sca.implementation.osgi.OSGiImplementation; +import org.apache.tuscany.sca.implementation.osgi.OSGiImplementationFactory; import org.apache.tuscany.sca.provider.ImplementationProvider; import org.apache.tuscany.sca.provider.ImplementationProviderFactory; import org.apache.tuscany.sca.runtime.RuntimeComponent; @@ -32,20 +34,20 @@ import org.osgi.framework.BundleException; * @version $Rev$ $Date$ */ public class OSGiImplementationProviderFactory implements ImplementationProviderFactory<OSGiImplementation> { - + private OSGiImplementationFactory implementationFactory; private ProxyFactoryExtensionPoint proxyFactoryExtensionPoint; - public OSGiImplementationProviderFactory(ExtensionPointRegistry extensionPoints) { - proxyFactoryExtensionPoint = extensionPoints.getExtensionPoint(ProxyFactoryExtensionPoint.class); + public OSGiImplementationProviderFactory(ExtensionPointRegistry registry) { + proxyFactoryExtensionPoint = registry.getExtensionPoint(ProxyFactoryExtensionPoint.class); + FactoryExtensionPoint factoryExtensionPoint = registry.getExtensionPoint(FactoryExtensionPoint.class); + this.implementationFactory = factoryExtensionPoint.getFactory(OSGiImplementationFactory.class); } public ImplementationProvider createImplementationProvider(RuntimeComponent component, OSGiImplementation implementation) { - try { - - return new OSGiImplementationProvider(component, implementation, proxyFactoryExtensionPoint); - + return new OSGiImplementationProvider(component, implementation, proxyFactoryExtensionPoint, + implementationFactory); } catch (BundleException e) { throw new RuntimeException(e); } diff --git a/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementationFactory.java b/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementationFactory.java index 0a83624e76..be39e4d3e0 100644 --- a/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementationFactory.java +++ b/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementationFactory.java @@ -19,6 +19,10 @@ package org.apache.tuscany.sca.implementation.osgi; +import java.util.Collection; + +import org.osgi.framework.ServiceReference; + /** * The factory interface to create OSGiImplementation instances */ @@ -34,4 +38,7 @@ public interface OSGiImplementationFactory { * @return */ OSGiProperty createOSGiProperty(); + OSGiProperty createOSGiProperty(String name, String stringValue, String type); + OSGiProperty createOSGiProperty(String name, Object value); + Collection<OSGiProperty> createOSGiProperties(ServiceReference reference); } diff --git a/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiProperty.java b/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiProperty.java index e0b7f43add..ebe4ef2dbc 100644 --- a/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiProperty.java +++ b/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiProperty.java @@ -26,6 +26,8 @@ import javax.xml.namespace.QName; */ public interface OSGiProperty { String NAME = "name"; + String TYPE = "type"; + String VALUE = "value"; QName PROPERTY_QNAME = new QName(OSGiImplementation.SCA11_TUSCANY_NS, "osgi.property"); String REMOTE_CONFIG_SCA = "org.osgi.sca"; @@ -169,11 +171,16 @@ public interface OSGiProperty { public final String SERVICE_IMPORTED_CONFIGS = "service.imported.configs"; - String getValue(); - - void setValue(String value); + Object getValue(); + void setValue(Object value); String getName(); void setName(String name); + + String getType(); + void setType(String type); + + String getStringValue(); + void setStringValue(String value); } diff --git a/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiImplementationFactoryImpl.java b/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiImplementationFactoryImpl.java index 9fab65272f..2978e8e823 100644 --- a/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiImplementationFactoryImpl.java +++ b/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiImplementationFactoryImpl.java @@ -19,10 +19,15 @@ package org.apache.tuscany.sca.implementation.osgi.impl; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.implementation.osgi.OSGiImplementation; import org.apache.tuscany.sca.implementation.osgi.OSGiImplementationFactory; import org.apache.tuscany.sca.implementation.osgi.OSGiProperty; +import org.osgi.framework.ServiceReference; /** * @@ -40,4 +45,72 @@ public class OSGiImplementationFactoryImpl implements OSGiImplementationFactory return new OSGiPropertyImpl(); } + public OSGiProperty createOSGiProperty(String propName, String propValue, String propType) { + OSGiProperty prop = new OSGiPropertyImpl(); + if (propType == null) { + propType = "String"; + } + prop.setName(propName); + prop.setStringValue(propValue); + prop.setType(propType); + + Object value = propValue; + if ("Integer".equals(propType)) { + value = Integer.valueOf(propValue); + } else if ("Long".equals(propType)) { + value = Long.valueOf(propValue); + } else if ("Float".equals(propType)) { + value = Float.valueOf(propValue); + } else if ("Double".equals(propType)) { + value = Double.valueOf(propValue); + } else if ("Short".equals(propType)) { + value = Short.valueOf(propValue); + } else if ("Character".equals(propType)) { + value = propValue.charAt(0); + } else if ("Byte".equals(propType)) { + value = Byte.valueOf(propValue); + } else if ("Boolean".equals(propType)) { + value = Boolean.valueOf(propValue); + } else if ("String+".equals(propType)) { + value = propValue.split(" "); + } else { + // String + value = propValue; + } + prop.setValue(value); + return prop; + } + + public OSGiProperty createOSGiProperty(String propName, Object value) { + OSGiProperty prop = new OSGiPropertyImpl(); + prop.setName(propName); + prop.setValue(value); + + if (value instanceof String[]) { + StringBuffer sb = new StringBuffer(); + for (String s : (String[])value) { + sb.append(s).append(' '); + } + if (sb.length() > 0) { + sb.deleteCharAt(sb.length() - 1); + } + prop.setStringValue(sb.toString()); + prop.setType("String+"); + } else if (value != null) { + prop.setStringValue(String.valueOf(value)); + prop.setType(value.getClass().getSimpleName()); + } + return prop; + } + + public Collection<OSGiProperty> createOSGiProperties(ServiceReference reference) { + List<OSGiProperty> props = new ArrayList<OSGiProperty>(); + for(String key: reference.getPropertyKeys()) { + Object value = reference.getProperty(key); + OSGiProperty prop = createOSGiProperty(key, value); + props.add(prop); + } + return props; + } + } diff --git a/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiPropertyImpl.java b/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiPropertyImpl.java index ec8b98f53f..b3e934a970 100644 --- a/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiPropertyImpl.java +++ b/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/impl/OSGiPropertyImpl.java @@ -25,13 +25,15 @@ import org.apache.tuscany.sca.implementation.osgi.OSGiProperty; * Implementation of OSGiProperty */ public class OSGiPropertyImpl implements OSGiProperty { + private String name; + private String type; + private Object value; + private String stringValue; + public OSGiPropertyImpl() { super(); } - private String name; - private String value; - public String getName() { return name; } @@ -40,12 +42,28 @@ public class OSGiPropertyImpl implements OSGiProperty { this.name = name; } - public String getValue() { + public Object getValue() { return value; } - public void setValue(String value) { + public void setValue(Object value) { this.value = value; } + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(String stringValue) { + this.stringValue = stringValue; + } + } diff --git a/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiPropertyProcessor.java b/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiPropertyProcessor.java index 9bd469df06..84734b88db 100644 --- a/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiPropertyProcessor.java +++ b/branches/sca-java-2.0-M4/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiPropertyProcessor.java @@ -23,6 +23,8 @@ import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; import static org.apache.tuscany.sca.implementation.osgi.OSGiProperty.NAME; import static org.apache.tuscany.sca.implementation.osgi.OSGiProperty.PROPERTY_QNAME; +import static org.apache.tuscany.sca.implementation.osgi.OSGiProperty.TYPE; +import static org.apache.tuscany.sca.implementation.osgi.OSGiProperty.VALUE; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamException; @@ -57,14 +59,18 @@ public class OSGiPropertyProcessor implements StAXArtifactProcessor<OSGiProperty case START_ELEMENT: QName name = reader.getName(); if (PROPERTY_QNAME.equals(name)) { - prop = factory.createOSGiProperty(); - prop.setName(reader.getAttributeValue(null, NAME)); - // After the following call, the reader will be positioned at END_ELEMENT - String text = reader.getElementText(); - if (text != null) { - text = text.trim(); + String propName = reader.getAttributeValue(null, NAME); + String propValue = reader.getAttributeValue(null, VALUE); + String propType = reader.getAttributeValue(null, TYPE); + + if (propValue == null) { + propValue = reader.getElementText(); + } + if (propValue != null) { + propValue = propValue.trim(); } - prop.setValue(text); + + prop = factory.createOSGiProperty(propName, propValue, propType); return prop; } break; @@ -90,7 +96,8 @@ public class OSGiPropertyProcessor implements StAXArtifactProcessor<OSGiProperty public void write(OSGiProperty model, XMLStreamWriter writer, ProcessorContext context) throws ContributionWriteException, XMLStreamException { writer.writeStartElement(PROPERTY_QNAME.getNamespaceURI(), PROPERTY_QNAME.getLocalPart()); writer.writeAttribute(NAME, model.getName()); - writer.writeCharacters(model.getValue()); + writer.writeAttribute(TYPE, model.getType()); + writer.writeCharacters(model.getStringValue()); writer.writeEndElement(); } |