summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-0.99/modules/implementation-osgi/src/main
diff options
context:
space:
mode:
authorlresende <lresende@13f79535-47bb-0310-9956-ffa450edef68>2009-11-11 23:06:58 +0000
committerlresende <lresende@13f79535-47bb-0310-9956-ffa450edef68>2009-11-11 23:06:58 +0000
commit3dd7e2c4da9c80b8182a2d04dc129a67aa7910df (patch)
tree71b970aa1c5987564405511d3912044387118fd4 /branches/sca-java-0.99/modules/implementation-osgi/src/main
parent0f3f9b59b310833f31ba234ee4aefa808649833c (diff)
Moving 1.x branches
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@835121 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'branches/sca-java-0.99/modules/implementation-osgi/src/main')
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementationInterface.java47
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/context/OSGiPropertyValueObjectFactory.java225
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiImplementationProvider.java1217
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiImplementationProviderFactory.java67
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiInstanceWrapper.java205
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiRemotableInvoker.java132
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiTargetInvoker.java194
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/EquinoxRuntime.java106
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/FelixRuntime.java193
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/KnopflerfishRuntime.java156
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiRuntime.java91
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementation.java199
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementationProcessor.java494
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor19
-rw-r--r--branches/sca-java-0.99/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory19
15 files changed, 0 insertions, 3364 deletions
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementationInterface.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementationInterface.java
deleted file mode 100644
index cfc98c711a..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/OSGiImplementationInterface.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.implementation.osgi;
-
-import java.util.List;
-
-import org.apache.tuscany.sca.assembly.ComponentProperty;
-import org.apache.tuscany.sca.assembly.Extensible;
-import org.apache.tuscany.sca.assembly.Implementation;
-import org.apache.tuscany.sca.core.scope.Scope;
-
-/**
- *
- * The model representing an OSGi implementation in an SCA assembly model.
- *
- */
-public interface OSGiImplementationInterface extends Implementation, Extensible {
-
- public String getBundleName();
-
- public String getBundleLocation();
-
- public String[] getImports();
-
- public Scope getScope();
-
- public List<ComponentProperty> getReferenceProperties(String referenceName);
-
- public List<ComponentProperty> getServiceProperties(String serviceName);
-
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/context/OSGiPropertyValueObjectFactory.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/context/OSGiPropertyValueObjectFactory.java
deleted file mode 100644
index af09013b6e..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/context/OSGiPropertyValueObjectFactory.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.implementation.osgi.context;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.apache.tuscany.sca.assembly.Property;
-import org.apache.tuscany.sca.core.factory.ObjectCreationException;
-import org.apache.tuscany.sca.core.factory.ObjectFactory;
-import org.apache.tuscany.sca.databinding.Mediator;
-import org.apache.tuscany.sca.databinding.SimpleTypeMapper;
-import org.apache.tuscany.sca.databinding.impl.SimpleTypeMapperImpl;
-import org.apache.tuscany.sca.databinding.xml.DOMDataBinding;
-import org.apache.tuscany.sca.interfacedef.DataType;
-import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
-import org.apache.tuscany.sca.interfacedef.util.TypeInfo;
-import org.apache.tuscany.sca.interfacedef.util.XMLType;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- *
- * Process properties and create property values.
- *
- * This code has been copied from the Java implementation to avoid dependencies on the Java implementation.
- *
- */
-public class OSGiPropertyValueObjectFactory {
- protected SimpleTypeMapper simpleTypeMapper = new SimpleTypeMapperImpl();
- boolean isSimpleType;
-
-
- public OSGiPropertyValueObjectFactory() {
- }
-
- public OSGiPropertyValueObjectFactory(Mediator mediator) {
- }
-
- public ObjectFactory createValueFactory(Property property, Object propertyValue) {
-
- Class javaType = SimpleTypeMapperImpl.getJavaType(property.getXSDType());
- isSimpleType = isSimpleType(property);
- Document doc = (Document)propertyValue;
- Element rootElement = doc.getDocumentElement();
- if (property.isMany()) {
- if (isSimpleType) {
- String value = "";
- if (rootElement.getChildNodes().getLength() > 0) {
- value = rootElement.getChildNodes().item(0).getTextContent();
- }
- List<String> values =
- getSimplePropertyValues(value, javaType);
- return new ListObjectFactoryImpl(property,
- values,
- isSimpleType,
- javaType);
- } else {
- return new ListObjectFactoryImpl(property,
- getComplexPropertyValues(doc),
- isSimpleType,
- javaType);
- }
- } else {
- if (isSimpleType) {
- String value = "";
- if (rootElement.getChildNodes().getLength() > 0) {
- value = rootElement.getChildNodes().item(0).getTextContent();
- }
- return new ObjectFactoryImpl(property,
- value,
- isSimpleType,
- javaType);
- } else {
- Object value = getComplexPropertyValues(doc).get(0);
- return new ObjectFactoryImpl(property,
- value,
- isSimpleType,
- javaType);
- }
-
- }
- }
-
- private boolean isSimpleType(Property property) {
- if (property.getXSDType() != null) {
- return SimpleTypeMapperImpl.isSimpleXSDType(property.getXSDType());
- } else {
- if (property instanceof Document) {
- Document doc = (Document)property;
- Element element = doc.getDocumentElement();
- if (element.getChildNodes().getLength() == 1 &&
- element.getChildNodes().item(0).getNodeType() == Node.TEXT_NODE) {
- return true;
- }
- }
- }
- return false;
- }
-
- private List<String> getSimplePropertyValues(String concatenatedValue, Class javaType) {
- List<String> propValues = new ArrayList<String>();
- StringTokenizer st = null;
- if ( javaType.getName().equals("java.lang.String")) {
- st = new StringTokenizer(concatenatedValue, "\"");
- } else {
- st = new StringTokenizer(concatenatedValue);
- }
- String aToken = null;
- while (st.hasMoreTokens()) {
- aToken = st.nextToken();
- if (aToken.trim().length() > 0) {
- propValues.add(aToken);
- }
- }
- return propValues;
- }
-
- private List<Node> getComplexPropertyValues(Document document) {
- Element rootElement = document.getDocumentElement();
- List<Node> propValues = new ArrayList<Node>();
- for (int count = 0 ; count < rootElement.getChildNodes().getLength() ; ++count) {
- if (rootElement.getChildNodes().item(count).getNodeType() == Node.ELEMENT_NODE) {
- propValues.add(rootElement.getChildNodes().item(count));
- }
- }
- return propValues;
- }
-
- public abstract class ObjectFactoryImplBase implements ObjectFactory {
- protected SimpleTypeMapper simpleTypeMapper = new SimpleTypeMapperImpl();
- protected Property property;
- protected Object propertyValue;
- protected Class javaType;
- protected DataType<XMLType> sourceDataType;
- protected DataType<?> targetDataType;
- boolean isSimpleType;
-
- public ObjectFactoryImplBase(Property property, Object propertyValue, boolean isSimpleType, Class javaType) {
- this.isSimpleType = isSimpleType;
- this.property = property;
- this.propertyValue = propertyValue;
- this.javaType = javaType;
- sourceDataType =
- new DataTypeImpl<XMLType>(DOMDataBinding.NAME, Node.class,
- new XMLType(null, this.property.getXSDType()));
- TypeInfo typeInfo = null;
- if (this.property.getXSDType() != null) {
- if (SimpleTypeMapperImpl.isSimpleXSDType(this.property.getXSDType())) {
- typeInfo = new TypeInfo(property.getXSDType(), true, null);
- } else {
- typeInfo = new TypeInfo(property.getXSDType(), false, null);
- }
- } else {
- typeInfo = new TypeInfo(property.getXSDType(), false, null);
- }
-
- XMLType xmlType = new XMLType(typeInfo);
- String dataBinding = null; //(String)property.getExtensions().get(DataBinding.class.getName());
- if (dataBinding != null) {
- targetDataType = new DataTypeImpl<XMLType>(dataBinding, javaType, xmlType);
- } else {
- targetDataType = new DataTypeImpl<XMLType>(dataBinding, javaType, xmlType);
- }
- }
- }
-
- public class ObjectFactoryImpl extends ObjectFactoryImplBase {
- public ObjectFactoryImpl(Property property, Object propertyValue, boolean isSimpleType, Class javaType) {
- super(property, propertyValue, isSimpleType, javaType);
- }
-
- @SuppressWarnings("unchecked")
- public Object getInstance() throws ObjectCreationException {
- if (isSimpleType) {
- return simpleTypeMapper.toJavaObject(property.getXSDType(), (String)propertyValue, null);
- } else {
- return null;
- }
- }
- }
-
- public class ListObjectFactoryImpl extends ObjectFactoryImplBase {
- public ListObjectFactoryImpl(Property property, List<?>propertyValues, boolean isSimpleType, Class javaType) {
- super(property, propertyValues, isSimpleType, javaType);
- }
-
- @SuppressWarnings("unchecked")
- public List<?> getInstance() throws ObjectCreationException {
- if (isSimpleType) {
- List<Object> values = new ArrayList<Object>();
- for (String aValue : (List<String>)propertyValue) {
- values.add(simpleTypeMapper.toJavaObject(property.getXSDType(), aValue, null));
- }
- return values;
- } else {
- List instances = new ArrayList();
- for (Node aValue : (List<Node>)propertyValue) {
- instances.add(aValue);
- }
- return instances;
- }
- }
- }
-}
-
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiImplementationProvider.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiImplementationProvider.java
deleted file mode 100644
index c621794006..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiImplementationProvider.java
+++ /dev/null
@@ -1,1217 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.implementation.osgi.invocation;
-
-
-import java.beans.Introspector;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.StringTokenizer;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.zip.ZipEntry;
-
-
-import org.apache.tuscany.sca.assembly.ComponentProperty;
-import org.apache.tuscany.sca.assembly.ComponentReference;
-import org.apache.tuscany.sca.assembly.ComponentService;
-import org.apache.tuscany.sca.assembly.Multiplicity;
-import org.apache.tuscany.sca.assembly.Property;
-import org.apache.tuscany.sca.assembly.Reference;
-import org.apache.tuscany.sca.assembly.Service;
-import org.apache.tuscany.sca.core.context.InstanceWrapper;
-import org.apache.tuscany.sca.core.factory.ObjectCreationException;
-import org.apache.tuscany.sca.core.factory.ObjectFactory;
-import org.apache.tuscany.sca.core.invocation.JDKProxyFactory;
-import org.apache.tuscany.sca.core.scope.Scope;
-import org.apache.tuscany.sca.core.scope.ScopedImplementationProvider;
-import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
-import org.apache.tuscany.sca.runtime.EndpointReference;
-import org.apache.tuscany.sca.runtime.RuntimeComponent;
-import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
-import org.apache.tuscany.sca.runtime.RuntimeComponentService;
-import org.apache.tuscany.sca.runtime.RuntimeWire;
-import org.apache.tuscany.sca.implementation.osgi.OSGiImplementationInterface;
-import org.apache.tuscany.sca.implementation.osgi.context.OSGiPropertyValueObjectFactory;
-import org.apache.tuscany.sca.implementation.osgi.runtime.OSGiRuntime;
-import org.apache.tuscany.sca.implementation.osgi.xml.OSGiImplementation;
-import org.apache.tuscany.sca.interfacedef.Interface;
-import org.apache.tuscany.sca.interfacedef.Operation;
-import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
-import org.apache.tuscany.sca.invocation.Invoker;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.Constants;
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.FrameworkListener;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceListener;
-import org.osgi.service.packageadmin.ExportedPackage;
-import org.osgi.service.packageadmin.PackageAdmin;
-
-/**
- * The runtime instantiation of OSGi component implementations
- *
- */
-public class OSGiImplementationProvider implements ScopedImplementationProvider, FrameworkListener {
-
- private static final String COMPONENT_SERVICE_NAME = "component.service.name";
-
- private OSGiImplementation implementation;
- private BundleContext bundleContext;
-
- private Hashtable<RuntimeWire, Reference> referenceWires = new Hashtable<RuntimeWire,Reference>();
- private Hashtable<RuntimeWire, ComponentReference> componentReferenceWires
- = new Hashtable<RuntimeWire,ComponentReference>();
- private HashSet<RuntimeWire> resolvedWires = new HashSet<RuntimeWire>();
- private boolean wiresResolved;
- private OSGiPropertyValueObjectFactory propertyValueFactory = new OSGiPropertyValueObjectFactory();
-
-
- private Hashtable<String, Object> componentProperties = new Hashtable<String, Object>();
- private RuntimeComponent runtimeComponent;
-
- private Bundle osgiBundle;
- private ArrayList<Bundle> dependentBundles = new ArrayList<Bundle>();
- private OSGiServiceListener osgiServiceListener;
- private PackageAdmin packageAdmin;
-
- private OSGiRuntime osgiRuntime;
-
-
- private DataBindingExtensionPoint dataBindingRegistry;
-
- private boolean packagesRefreshed;
-
-
- public OSGiImplementationProvider(RuntimeComponent definition,
- OSGiImplementationInterface impl,
- DataBindingExtensionPoint dataBindingRegistry) throws BundleException {
-
-
- this.implementation = (OSGiImplementation)impl;
- this.runtimeComponent = definition;
- this.dataBindingRegistry = dataBindingRegistry;
-
- bundleContext = getBundleContext();
- osgiBundle = installBundle();
-
- // Install and start all dependent bundles
- String[] imports = implementation.getImports();
- for (int i = 0; i < imports.length; i++) {
- String location = imports[i].trim();
- if (location.length() > 0) {
- Bundle bundle = bundleContext.installBundle(location);
- dependentBundles.add(bundle);
- }
- }
-
-
- // PackageAdmin is used to resolve bundles
- org.osgi.framework.ServiceReference packageAdminReference =
- bundleContext.getServiceReference("org.osgi.service.packageadmin.PackageAdmin");
- if (packageAdminReference != null) {
- packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminReference);
- }
-
-
- }
-
- protected RuntimeComponent getRuntimeComponent() {
- return runtimeComponent;
- }
-
- protected OSGiImplementation getImplementation() {
- return implementation;
- }
-
- // Create a property table from the list of properties
- // The source properties are properties read from <property/> elements
- // Create property values in the table of the appropriate class based
- // on the property type specified.
- private void processProperties(List<?> props, Hashtable<String, Object> propsTable) {
-
- if (props != null) {
- for (Object p : props) {
-
- Property prop = (Property)p;
- ObjectFactory<?> objFactory = propertyValueFactory.createValueFactory(prop, prop.getValue());
- Object value = objFactory.getInstance();
-
- propsTable.put(prop.getName(), value);
- }
- }
- }
-
-
- private BundleContext getBundleContext() throws BundleException {
-
- if (bundleContext == null) {
- osgiRuntime = OSGiRuntime.getRuntime();
- bundleContext = osgiRuntime .getBundleContext();
- }
-
- return bundleContext;
- }
-
- private Bundle getBundle() throws Exception {
-
- Bundle[] bundles = bundleContext.getBundles();
- for (Bundle b : bundles) {
- if (b.getLocation().equals(implementation.getBundleName())) {
- return b;
- }
- }
- return null;
- }
-
-
- // Install the bundle corresponding to this component.
- private Bundle installBundle() throws ObjectCreationException {
- try {
-
- Bundle bundle = null;
-
- if ((bundle = getBundle()) == null) {
-
- String bundleName = implementation.getBundleLocation();
-
- bundle = bundleContext.installBundle(bundleName);
-
- }
-
- osgiServiceListener = new OSGiServiceListener(bundle);
-
- bundleContext.addServiceListener(osgiServiceListener);
-
- return bundle;
-
- } catch (Exception e) {
- throw new ObjectCreationException(e);
- }
- }
-
- private String getOSGiFilter(Hashtable<String, Object> props) {
-
- String filter = "";
-
- if (props != null && props.size() > 0) {
- int propCount = 0;
- for (String propName : props.keySet()) {
- if (propName.equals("service.pid"))
- continue;
- filter = filter + "(" + propName + "=" + props.get(propName) + ")";
- propCount++;
- }
-
- if (propCount > 1) filter = "(&" + filter + ")";
- }
- else
- filter = null;
- return filter;
- }
-
- /*
- * Return a matching service registered by the specified bundle.
- * If <implementation.osgi /> has the attribute filter defined, return a service
- * reference that matches the filter. Otherwise, return a service which has a component
- * name equal to this component's name. If not found, return a service which no
- * component name set.
- *
- * Even though services registered by this bundle can be filtered using the
- * service listener, we use this method to filter all service references so that
- * the service matching functionality of OSGi can be directly used.
- */
- private org.osgi.framework.ServiceReference getOSGiServiceReference(
- String scaServiceName,
- String osgiServiceName, String filter)
- throws InvalidSyntaxException {
-
- String compServiceName = runtimeComponent.getName() + "/" + scaServiceName;
- if (filter != null && filter.length() > 0) {
- org.osgi.framework.ServiceReference[] references =
- bundleContext.getServiceReferences(osgiServiceName, filter);
-
-
- org.osgi.framework.ServiceReference reference = null;
- if (references != null) {
- for (org.osgi.framework.ServiceReference ref : references) {
- if (ref.getBundle() != osgiBundle)
- continue;
- Object compName = ref.getProperty(COMPONENT_SERVICE_NAME);
- if (compName == null && reference == null)
- reference = ref;
- if (scaServiceName == null || compServiceName.equals(compName)) {
- reference = ref;
- break;
- }
- }
- }
-
- return reference;
-
- }
-
- filter = scaServiceName == null? null :
- "(" + COMPONENT_SERVICE_NAME + "="+ compServiceName + ")";
-
- org.osgi.framework.ServiceReference[] references =
- bundleContext.getServiceReferences(osgiServiceName, filter);
-
- if (references != null) {
- for (org.osgi.framework.ServiceReference ref : references) {
- if (ref.getBundle() == osgiBundle) {
- return ref;
- }
- }
- }
-
- references = bundleContext.getServiceReferences(osgiServiceName, null);
-
- org.osgi.framework.ServiceReference reference = null;
-
- if (references != null) {
- for (org.osgi.framework.ServiceReference ref : references) {
-
- if (ref.getBundle() != osgiBundle)
- continue;
- Object compName = ref.getProperty(COMPONENT_SERVICE_NAME);
- if (compName == null && reference == null)
- reference = ref;
- if (compServiceName.equals(compName)) {
- reference = ref;
- break;
- }
- }
- }
-
- return reference;
- }
-
- protected Bundle startBundle() throws ObjectCreationException {
-
- try {
-
- if (osgiBundle.getState() != Bundle.ACTIVE && osgiBundle.getState() != Bundle.STARTING) {
-
- configurePropertiesUsingConfigAdmin();
-
- resolveBundle();
-
- for (Bundle bundle : dependentBundles) {
- try {
- if (bundle.getState() != Bundle.ACTIVE && bundle.getState() != Bundle.STARTING) {
- bundle.start();
- }
- } catch (BundleException e) {
- if (bundle.getHeaders().get("Fragment-Host") == null)
- throw e;
- }
- }
-
- if (osgiBundle.getState() != Bundle.ACTIVE && osgiBundle.getState() != Bundle.STARTING) {
-
- int retry = 0;
-
- while (retry++ < 10) {
- try {
- osgiBundle.start();
- break;
- } catch (BundleException e) {
- // It is possible that the thread "Refresh Packages" is in the process of
- // changing the state of this bundle.
- Thread.yield();
-
- if (retry == 10)
- throw e;
- }
- }
- }
- }
-
- } catch (Exception e) {
- throw new ObjectCreationException(e);
- }
- return osgiBundle;
- }
-
-
- protected org.osgi.framework.ServiceReference getOSGiServiceReference(ComponentService service)
- throws ObjectCreationException {
-
- Hashtable<String, Object> props = new Hashtable<String, Object>();
- processProperties(implementation.getServiceProperties(service.getName()), props);
-
- String filter = getOSGiFilter(props);
- Interface serviceInterface = service.getInterfaceContract().getInterface();
- String scaServiceName = service.getName();
-
- return getOSGiServiceReference(serviceInterface, filter, scaServiceName);
-
- }
-
- protected org.osgi.framework.ServiceReference getOSGiServiceReference(
- EndpointReference from, Interface callbackInterface)
- throws ObjectCreationException {
-
- RuntimeWire refWire = null;
- String filter = null;
- for (RuntimeWire wire : referenceWires.keySet()) {
- if (wire.getSource() == from) {
- refWire = wire;
- break;
- }
- }
- if (refWire != null) {
- Hashtable<String, Object> props = new Hashtable<String, Object>();
- ComponentReference scaRef = componentReferenceWires.get(refWire);
- processProperties(implementation.getReferenceCallbackProperties(scaRef.getName()), props);
- filter = getOSGiFilter(props);
- }
-
- return getOSGiServiceReference(callbackInterface, filter, null);
- }
-
- private org.osgi.framework.ServiceReference getOSGiServiceReference(Interface serviceInterface,
- String filter, String scaServiceName)
- throws ObjectCreationException {
-
- try {
-
- String serviceInterfaceName = null;
-
- org.osgi.framework.ServiceReference osgiServiceReference = null;
-
- if (serviceInterface instanceof JavaInterface) {
- serviceInterfaceName = ((JavaInterface)serviceInterface).getJavaClass().getName();
-
- if ((osgiServiceReference = getOSGiServiceReference(
- scaServiceName,
- serviceInterfaceName, filter)) == null) {
-
- // The service listener for our bundle will notify us when the service is registered.
- synchronized (implementation) {
-
- // When declarative services are used, the component is started asynchronously
- // So this thread has to wait for the service to be registered by the component
- // activate method
- // For regular bundle activators, bundle.start activates the bundle synchronously
- // and hence the service would probably have been started by the bundle activator
- while ((osgiServiceReference = getOSGiServiceReference(
- scaServiceName,
- serviceInterfaceName, filter)) == null) {
-
- // Wait for the bundle to register the service
- implementation.wait(100);
- }
- }
-
- }
- }
-
- return osgiServiceReference;
-
- } catch (Exception e) {
- throw new ObjectCreationException(e);
- }
- }
-
-
- // Felix does not support bundle fragments. This is a temporary workaround.
- protected Bundle installDummyBundleWithoutFragments(Class<?> interfaceClass)
- throws Exception {
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
-
- String EOL = System.getProperty("line.separator");
-
- String interfaceName = interfaceClass.getName();
- String packageName = interfaceClass.getPackage().getName();
- String bundleName = "dummy.sca." + packageName;
-
- String manifestStr = "Manifest-Version: 1.0" + EOL
- + "Bundle-ManifestVersion: 2" + EOL + "Bundle-Name: "
- + bundleName + EOL + "Bundle-SymbolicName: " + bundleName + EOL
- + "Bundle-Version: " + "1.0.0" + EOL
- + "Bundle-Localization: plugin" + EOL;
-
- ArrayList<String> dummyClasses = new ArrayList<String>();
-
- StringBuilder manifestBuf = new StringBuilder();
- manifestBuf.append(manifestStr);
- manifestBuf.append("Export-Package: " + packageName + EOL);
- String exportedInterfaces = interfaceName;
- Bundle existingBundle = getDummyHostBundle(packageName);
- String existingClasses;
- dummyClasses.add(interfaceClass.getName());
- for (Class<?> clazz : interfaceClass.getClasses()) {
- dummyClasses.add(clazz.getName());
- }
- if (existingBundle != null &&
- (existingClasses = (String)existingBundle.getHeaders().get("SCA-Dummy-Classes")) != null) {
- exportedInterfaces = exportedInterfaces + " " + existingClasses;
-
- StringTokenizer tokenizer = new StringTokenizer(existingClasses);
- while (tokenizer.hasMoreTokens()) {
- String className = tokenizer.nextToken();
- if (!dummyClasses.contains(className))
- dummyClasses.add(className);
- }
- }
-
- manifestBuf.append("SCA-Dummy-Classes: " + exportedInterfaces + EOL);
-
- ByteArrayInputStream manifestStream = new ByteArrayInputStream(
- manifestBuf.toString().getBytes());
- Manifest manifest = new Manifest();
- manifest.read(manifestStream);
-
- JarOutputStream jarOut = new JarOutputStream(out, manifest);
-
- for (int i = 0; i < dummyClasses.size(); i++) {
-
- String className = dummyClasses.get(i);
-
- Class clazz = interfaceClass.getClassLoader().loadClass(className);
- className = clazz.getName().replaceAll("\\.", "/") + ".class";
- ZipEntry ze = new ZipEntry(className);
- jarOut.putNextEntry(ze);
- InputStream stream = clazz.getResourceAsStream(clazz.getSimpleName() + ".class");
-
- byte[] bytes = new byte[stream.available()];
- stream.read(bytes);
- jarOut.write(bytes);
- stream.close();
- }
-
-
- jarOut.close();
- out.close();
-
- if (existingBundle != null) {
- existingBundle.stop();
- existingBundle.uninstall();
- }
-
- ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
-
- Bundle bundle = bundleContext.installBundle("file://" + bundleName
- + ".jar", in);
-
- bundle.start();
-
- if (existingBundle != null && packageAdmin != null) {
-
-
- bundleContext.addFrameworkListener(this);
-
- packagesRefreshed = false;
- packageAdmin.refreshPackages(null);
-
- synchronized (this) {
- if (!packagesRefreshed) {
- this.wait(2000);
- }
- }
- packagesRefreshed = false;
- bundleContext.removeFrameworkListener(this);
-
- }
-
- return bundle;
-
- }
-
- private Bundle getDummyHostBundle(String packageName) {
-
- if (packageAdmin == null)
- return null;
-
- ExportedPackage exp = packageAdmin.getExportedPackage(packageName);
- if (exp == null)
- return null;
- else
- return exp.getExportingBundle();
- }
-
-
- private Bundle installDummyBundle(Class<?> interfaceClass)
- throws Exception {
-
-
- if (!osgiRuntime.supportsBundleFragments()) {
- return installDummyBundleWithoutFragments(interfaceClass);
- }
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
-
- String EOL = System.getProperty("line.separator");
- ArrayList<Class<?>> dummyClasses = new ArrayList<Class<?>>();
-
- String interfaceName = interfaceClass.getName();
- String packageName = interfaceClass.getPackage().getName();
- String bundleName = "dummy.sca." + interfaceName;
-
-
- String manifestStr = "Manifest-Version: 1.0" + EOL +
- "Bundle-ManifestVersion: 2" + EOL +
- "Bundle-Name: " + bundleName + EOL +
- "Bundle-SymbolicName: " + bundleName + EOL +
- "Bundle-Version: " + "1.0.0" + EOL +
- "Bundle-Localization: plugin" + EOL;
-
-
- StringBuilder manifestBuf = new StringBuilder();
- manifestBuf.append(manifestStr);
- manifestBuf.append("Export-Package: " + packageName + EOL);
- Bundle dummyHost = getDummyHostBundle(packageName);
- if (dummyHost != null)
- manifestBuf.append("Fragment-Host: " + dummyHost.getSymbolicName() + EOL);
-
- ByteArrayInputStream manifestStream = new ByteArrayInputStream(manifestBuf.toString().getBytes());
- Manifest manifest = new Manifest();
- manifest.read(manifestStream);
-
- dummyClasses.add(interfaceClass);
- for (Class<?> clazz : interfaceClass.getClasses()) {
- dummyClasses.add(clazz);
- }
-
- JarOutputStream jarOut = new JarOutputStream(out, manifest);
-
- for (int i = 0; i < dummyClasses.size(); i++) {
-
- Class<?> clazz = dummyClasses.get(i);
- String className = clazz.getName();
- className = clazz.getName().replaceAll("\\.", "/") + ".class";
- ZipEntry ze = new ZipEntry(className);
- jarOut.putNextEntry(ze);
- InputStream stream = clazz.getResourceAsStream(clazz.getSimpleName() + ".class");
-
- byte[] bytes = new byte[stream.available()];
- stream.read(bytes);
- jarOut.write(bytes);
- stream.close();
- }
-
- jarOut.close();
- out.close();
-
-
- ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
-
-
- Bundle bundle = bundleContext.installBundle(
- "file://" + bundleName + ".jar",
- in);
-
- if (dummyHost == null)
- bundle.start();
-
- return bundle;
-
- }
-
-
-
- public InstanceWrapper<?> createInstanceWrapper() throws ObjectCreationException {
-
- return new OSGiInstanceWrapper<Object>(this, bundleContext);
- }
-
-
-
- private void resolveWireCreateDummyBundles(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
-
- Bundle dummyBundle = 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
- * locate the target Java instance from the registry like a regular OSGi service.
- *
- * For OSGi->OSGi wires, start the target OSGi bundle, so that references of the
- * target are resolved before the source OSGi bundle is started. If the reference
- * has properties specified, create a Proxy and register a service with highest
- * possible ranking. The Proxy should wire to the correct OSGi instance specified
- * in the SCA composite.
- *
- * The first phase determines whether a proxy should be installed. It also registers
- * a dummy bundle if necessary to resolve the bundle. When phase1 is completed on all
- * wires of the component, the bundle should be resolved. Phase2 registers the proxy service.
- */
- private boolean resolveWireResolveReferences(Bundle bundle, Class interfaceClass, RuntimeWire wire,
- boolean isOSGiToOSGiWire) throws Exception {
-
- boolean createProxy = false;
-
- ComponentReference scaRef = componentReferenceWires.get(wire);
- Hashtable<String, Object> targetProperties = new Hashtable<String, Object>();
- processProperties(implementation.getReferenceProperties(scaRef.getName()), targetProperties);
-
-
- if (isOSGiToOSGiWire) {
-
- OSGiImplementationProvider implProvider = (OSGiImplementationProvider)wire.getTarget().getComponent().getImplementationProvider();
-
- // This is an OSGi->OSGi wire
- isOSGiToOSGiWire = true;
-
- // If the target component is stateless, use a proxy to create a new service each time
- if (!implProvider.getScope().equals(Scope.COMPOSITE)) createProxy = true;
-
- Interface interfaze = wire.getTarget().getInterfaceContract().getInterface();
-
- // If the target interface is remotable, create a proxy to support pass-by-value semantics
- // AllowsPassByReference is not detected until the target instance is obtained.
- if (interfaze.isRemotable())
- createProxy = true;
-
- // If any of the operations in the target interface is non-blocking, create a proxy
- List<Operation> ops = interfaze.getOperations();
- for (Operation op : ops) {
- if (op.isNonBlocking())
- createProxy = true;
- }
-
- // If properties are specified for the reference, create a proxy since rewiring may be required
- if (targetProperties.size() > 0) {
- createProxy = true;
- }
-
- // If properties are specified for the component, create a proxy for configuring
- // the component services.
- if (componentProperties.size() > 0) {
- createProxy = true;
- }
-
- // Since this is an OSGi->OSGi wire, start the target bundle before starting the
- // source bundle if there is no proxy. For direct wiring without a proxy, this ordering
- // is irrelevant in terms of class resolution, but the target needs to be started at some
- // point. But there is no opportunity later on to start the target OSGi bundle without a proxy.
- // When a Proxy is used, the target bundle needs to be resolved for the source bundle
- // to be resolved so that the interface is visible to the source. In this case the bundle
- // will be started when an instance is needed.
- if (!createProxy) {
- implProvider.startBundle();
- }
- else {
- implProvider.resolveBundle();
- }
- }
- else {
- createProxy = true;
- }
-
- return createProxy;
- }
-
-
- // Register proxy service
- private void resolveWireRegisterProxyService(Bundle bundle, Class interfaceClass, RuntimeWire wire) throws Exception {
-
- ComponentReference scaRef = componentReferenceWires.get(wire);
- Hashtable<String, Object> targetProperties = new Hashtable<String, Object>();
- processProperties(implementation.getReferenceProperties(scaRef.getName()), targetProperties);
- targetProperties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
-
- if (targetProperties.get(COMPONENT_SERVICE_NAME) == null && wire.getTarget().getComponent() != null) {
- String compServiceName = wire.getTarget().getComponent().getName() + "/" +
- wire.getTarget().getContract().getName();
- targetProperties.put(COMPONENT_SERVICE_NAME, compServiceName);
- }
-
-
- JDKProxyFactory proxyService = new JDKProxyFactory();
-
- Class<?> proxyInterface = bundle.loadClass(interfaceClass.getName());
-
-
- Object proxy = proxyService.createProxy(proxyInterface, wire);
-
-
- bundleContext.registerService(proxyInterface.getName(), proxy, targetProperties);
-
-
- }
-
- private void registerCallbackProxyService(Bundle bundle, Class interfaceClass,
- RuntimeComponentService service) throws Exception {
-
- List<RuntimeWire> wires = service.getCallbackWires();
- Hashtable<String, Object> targetProperties = new Hashtable<String, Object>();
- processProperties(implementation.getServiceCallbackProperties(service.getName()), targetProperties);
- targetProperties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
-
- JDKProxyFactory proxyService = new JDKProxyFactory();
-
- Class<?> proxyInterface = bundle.loadClass(interfaceClass.getName());
-
-
- Object proxy = proxyService.createCallbackProxy(proxyInterface, wires);
-
-
- bundleContext.registerService(proxyInterface.getName(), proxy, targetProperties);
-
-
- }
-
-
- private void resolveBundle() throws ObjectCreationException {
-
-
- try {
-
- if (!wiresResolved) {
- wiresResolved = true;
-
- int refPlusServices = referenceWires.size() + runtimeComponent.getServices().size();
- boolean[] createProxyService = new boolean[refPlusServices];
- Class<?>[] interfaceClasses = new Class<?>[refPlusServices] ;
- boolean[] isOSGiToOSGiWire = new boolean[refPlusServices];
- boolean[] wireResolved = new boolean[refPlusServices];
- int index = 0;
- for (RuntimeWire wire : referenceWires.keySet()) {
-
- Reference reference = referenceWires.get(wire);
-
- isOSGiToOSGiWire[index] = wire.getTarget().getComponent() != null &&
- wire.getTarget().getComponent().getImplementationProvider()
- instanceof OSGiImplementationProvider;
-
- Interface refInterface = reference.getInterfaceContract().getInterface();
- if (refInterface instanceof JavaInterface) {
- interfaceClasses[index] = ((JavaInterface)refInterface).getJavaClass();
-
- if (!isOSGiToOSGiWire[index])
- resolveWireCreateDummyBundles(interfaceClasses[index]);
-
- }
-
- if (!resolvedWires.contains(wire)) {
- resolvedWires.add(wire);
- }
- else
- wireResolved[index] = true;
-
- index++;
- }
- for (ComponentService service : runtimeComponent.getServices()) {
- Interface callbackInterface = service.getInterfaceContract().getCallbackInterface();
- if (callbackInterface instanceof JavaInterface) {
- interfaceClasses[index] = ((JavaInterface)callbackInterface).getJavaClass();
-
- resolveWireCreateDummyBundles(interfaceClasses[index]);
- }
-
- index++;
- }
-
- index = 0;
- for (RuntimeWire wire : referenceWires.keySet()) {
-
- if (!wireResolved[index]) {
- createProxyService[index] = resolveWireResolveReferences(osgiBundle,
- interfaceClasses[index],
- wire,
- isOSGiToOSGiWire[index]);
- }
- index++;
- }
-
-
- index = 0;
- for (RuntimeWire wire : referenceWires.keySet()) {
-
- if (createProxyService[index] && !wireResolved[index])
- resolveWireRegisterProxyService(osgiBundle, interfaceClasses[index], wire);
- index++;
- }
- for (ComponentService service : runtimeComponent.getServices()) {
- if (interfaceClasses[index] != null) {
- registerCallbackProxyService(osgiBundle, interfaceClasses[index],
- ((RuntimeComponentService)service));
- }
- index++;
- }
- }
- else if (osgiBundle.getState() == Bundle.INSTALLED && packageAdmin != null) {
- packageAdmin.resolveBundles(new Bundle[] {osgiBundle});
- }
-
- } catch (Exception e) {
- e.printStackTrace();
- throw new ObjectCreationException(e);
- }
- }
-
-
-
- private void configurePropertiesUsingConfigAdmin() {
-
- try {
-
- if (componentProperties.size() == 0)
- return;
-
- org.osgi.framework.ServiceReference configAdminReference =
- bundleContext.getServiceReference("org.osgi.service.cm.ConfigurationAdmin");
- if (configAdminReference != null) {
-
- Object cm = bundleContext.getService(configAdminReference);
- Class cmClass = cm.getClass().getClassLoader().loadClass("org.osgi.service.cm.ConfigurationAdmin");
- Method getConfigMethod = cmClass.getMethod("getConfiguration", String.class, String.class);
-
-
- Class configClass = cm.getClass().getClassLoader().loadClass("org.osgi.service.cm.Configuration");
-
- Method getMethod = configClass.getMethod("getProperties");
- Method updateMethod = configClass.getMethod("update", Dictionary.class);
-
- List<Service> services = implementation.getServices();
- HashSet<String> pidsProcessed = new HashSet<String>();
-
- for (Service service : services) {
-
- List<ComponentProperty> serviceProps = implementation.getServiceProperties(service.getName());
- String pid = null;
-
- if (serviceProps != null) {
- for (ComponentProperty prop : serviceProps) {
- if (prop.getName().equals("service.pid")) {
- ObjectFactory objFactory = propertyValueFactory.createValueFactory(prop, prop.getValue());
- pid = (String)objFactory.getInstance();
- }
- }
- }
- if (pid == null || pidsProcessed.contains(pid))
- continue;
-
-
-
-
- Object config = getConfigMethod.invoke(cm, pid, null);
- Dictionary props = (Dictionary) getMethod.invoke(config);
- if (props == null)
- props = new Hashtable<String, Object>();
- for (String propertyName : componentProperties.keySet()) {
-
- props.put(propertyName, componentProperties.get(propertyName));
- }
-
- updateMethod.invoke(config, props);
-
-
- }
-
- }
-
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- }
-
- protected void injectProperties(Object instance) {
-
- if (!implementation.needsPropertyInjection())
- return;
-
- Class implClass = instance.getClass();
- List<ComponentProperty> compProps = runtimeComponent.getProperties();
-
- for (ComponentProperty prop : compProps) {
-
- boolean hasSetProp = false;
- String propName = prop.getName();
- ObjectFactory objFactory = propertyValueFactory.createValueFactory(prop, prop.getValue());
-
- try {
- Field field = implClass.getDeclaredField(propName);
- org.osoa.sca.annotations.Property propAnn;
-
- if ((propAnn = field.getAnnotation(org.osoa.sca.annotations.Property.class)) != null
- || Modifier.isPublic(field.getModifiers())) {
-
- try {
- if (!field.isAccessible())
- field.setAccessible(true);
-
- field.set(instance, objFactory.getInstance());
- hasSetProp = true;
- } catch (IllegalAccessException e) {
- if (propAnn.required())
- throw new RuntimeException(e);
- }
-
- }
- } catch (NoSuchFieldException e) {
- // Ignore exception
- }
-
- if (!hasSetProp) {
- Method[] methods = implClass.getDeclaredMethods();
- org.osoa.sca.annotations.Property propAnn = null;
-
- for (Method method : methods) {
-
- if (!method.getName().startsWith("set"))
- continue;
- if ((propAnn = method.getAnnotation(org.osoa.sca.annotations.Property.class)) != null
- || Modifier.isPublic(method.getModifiers())) {
-
- String methodPropName = Introspector.decapitalize(method.getName().substring(3));
- if (!propName.equals(methodPropName))
- continue;
- }
- try {
- if (!method.isAccessible())
- method.setAccessible(true);
-
- method.invoke(instance, objFactory.getInstance());
- hasSetProp = true;
- } catch (Exception e) {
- if (propAnn != null && propAnn.required())
- throw new RuntimeException(e);
- }
- }
- }
-
- }
-
- }
-
- protected void injectPropertiesWithoutAnnotations(Object instance) {
-
- if (!implementation.needsPropertyInjection())
- return;
-
- Class implClass = instance.getClass();
- List<ComponentProperty> compProps = runtimeComponent.getProperties();
-
- for (ComponentProperty prop : compProps) {
-
- boolean hasSetProp = false;
- String propName = prop.getName();
- ObjectFactory objFactory = propertyValueFactory.createValueFactory(prop, prop.getValue());
-
- try {
- Field field = implClass.getDeclaredField(propName);
-
- if (Modifier.isPublic(field.getModifiers())) {
-
- try {
- field.set(instance, objFactory.getInstance());
- hasSetProp = true;
-
- } catch (Exception e) {
- // Ignore
- }
- }
- } catch (NoSuchFieldException e) {
- // Ignore exception
- }
-
- if (!hasSetProp) {
- Method[] methods = implClass.getDeclaredMethods();
- for (Method method : methods) {
-
- if (!method.getName().startsWith("set"))
- continue;
- if (Modifier.isPublic(method.getModifiers())) {
-
- String methodPropName = Introspector.decapitalize(method.getName().substring(3));
- if (!propName.equals(methodPropName))
- continue;
- }
- try {
- method.invoke(instance, objFactory.getInstance());
- } catch (Exception e) {
- // Ignore
- }
- }
- }
-
- }
-
- }
-
-
-
- public boolean isOptimizable() {
- return false;
- }
-
- public Scope getScope() {
- return implementation.getScope();
- }
-
- public boolean isEagerInit() {
- return implementation.isEagerInit();
- }
-
- public long getMaxAge() {
- return implementation.getMaxAge();
- }
-
- public long getMaxIdleTime() {
- return implementation.getMaxIdleTime();
- }
-
-
- public Invoker createTargetInvoker(RuntimeComponentService service, Operation operation) {
-
-
- Interface serviceInterface = operation.getInterface();
- boolean isRemotable = serviceInterface.isRemotable();
-
-
- Invoker invoker = new OSGiTargetInvoker(operation, runtimeComponent, service);
- if (isRemotable) {
- return new OSGiRemotableInvoker(implementation, dataBindingRegistry, operation, runtimeComponent, service);
- } else {
- return invoker;
- }
-
- }
-
-
- public Invoker createCallbackInvoker(Operation operation) {
-
- return createTargetInvoker(null, operation);
- }
-
- public Invoker createInvoker(RuntimeComponentService service, Operation operation) {
- return createTargetInvoker(service, operation);
- }
-
- public void start() {
-
- for (Reference ref: implementation.getReferences()) {
- List<RuntimeWire> wireList = null;
- ComponentReference compRef = null;
- for (ComponentReference cRef : runtimeComponent.getReferences()) {
- if (cRef.getName().equals(ref.getName())) {
- wireList = ((RuntimeComponentReference)cRef).getRuntimeWires();
- compRef = cRef;
- break;
- }
- }
-
- if (ref.getMultiplicity() == Multiplicity.ONE_N || ref.getMultiplicity() == Multiplicity.ZERO_N) {
- for (RuntimeWire wire : wireList) {
- referenceWires.put(wire, ref);
- componentReferenceWires.put(wire, compRef);
- }
-
- } else {
- if (wireList == null && ref.getMultiplicity() == Multiplicity.ONE_ONE) {
- throw new IllegalStateException("Required reference is missing: " + ref.getName());
- }
- if (wireList != null && !wireList.isEmpty()) {
- RuntimeWire wire = wireList.get(0);
- referenceWires.put(wire, ref);
- componentReferenceWires.put(wire, compRef);
- }
-
- }
-
- }
-
- processProperties(runtimeComponent.getProperties(), componentProperties);
-
- }
-
-
- public void stop() {
-
- bundleContext.removeServiceListener(osgiServiceListener);
- }
-
-
-
- public void frameworkEvent(FrameworkEvent event) {
- if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) {
- synchronized (this) {
- packagesRefreshed = true;
- this.notifyAll();
- }
- }
-
- }
-
-
-
- private class OSGiServiceListener implements ServiceListener {
-
- private Bundle bundle;
-
- OSGiServiceListener(Bundle bundle) {
- this.bundle = bundle;
- }
-
- public void serviceChanged(org.osgi.framework.ServiceEvent event) {
-
-
- org.osgi.framework.ServiceReference reference = event.getServiceReference();
-
- if (event.getType() == ServiceEvent.REGISTERED && reference.getBundle() == bundle) {
-
- synchronized (implementation) {
-
- implementation.notifyAll();
- }
- }
-
- if (event.getType() == ServiceEvent.UNREGISTERING && reference.getBundle() == bundle) {
- // TODO: Process deregistering of OSGi services.
- }
- }
- }
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiImplementationProviderFactory.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiImplementationProviderFactory.java
deleted file mode 100644
index f6bf8a8b1e..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiImplementationProviderFactory.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.implementation.osgi.invocation;
-
-
-import org.apache.tuscany.sca.core.ExtensionPointRegistry;
-import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
-import org.apache.tuscany.sca.implementation.osgi.OSGiImplementationInterface;
-import org.apache.tuscany.sca.provider.ImplementationProvider;
-import org.apache.tuscany.sca.provider.ImplementationProviderFactory;
-import org.apache.tuscany.sca.runtime.RuntimeComponent;
-import org.osgi.framework.BundleException;
-
-
-/**
- * Builds a OSGi-based implementation provider from a component definition
- *
- */
-public class OSGiImplementationProviderFactory implements ImplementationProviderFactory<OSGiImplementationInterface> {
-
- DataBindingExtensionPoint dataBindings;
-
- public OSGiImplementationProviderFactory(ExtensionPointRegistry extensionPoints) {
-
- dataBindings = extensionPoints.getExtensionPoint(DataBindingExtensionPoint.class);
- //FIXME transformers is never used
- //TransformerExtensionPoint transformers = extensionPoints.getExtensionPoint(TransformerExtensionPoint.class);
- //FIXME mediator is never used
- //MediatorImpl mediator =new MediatorImpl(dataBindings, transformers);
- //FIXME factory is never used
- //OSGiPropertyValueObjectFactory factory = new OSGiPropertyValueObjectFactory(mediator);
- }
-
- public ImplementationProvider createImplementationProvider(RuntimeComponent component,
- OSGiImplementationInterface implementation) {
-
- try {
-
- return new OSGiImplementationProvider(component, implementation, dataBindings);
-
- } catch (BundleException e) {
- throw new RuntimeException(e);
- }
-
- }
-
- public Class<OSGiImplementationInterface> getModelType() {
- return OSGiImplementationInterface.class;
- }
-
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiInstanceWrapper.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiInstanceWrapper.java
deleted file mode 100644
index 4d221d6669..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiInstanceWrapper.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.implementation.osgi.invocation;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Random;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import org.apache.tuscany.sca.assembly.ComponentService;
-import org.apache.tuscany.sca.core.context.InstanceWrapper;
-import org.apache.tuscany.sca.core.scope.Scope;
-import org.apache.tuscany.sca.core.scope.TargetDestructionException;
-import org.apache.tuscany.sca.core.scope.TargetInitializationException;
-import org.apache.tuscany.sca.interfacedef.Interface;
-import org.apache.tuscany.sca.runtime.EndpointReference;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-
-/**
- * InstanceWrapper for creating instances for OSGi components.
- * This class needs to implement InstanceWrapper since the wrapper is stored in
- * the scope container. But getInstance() is called on this wrapper only through the
- * OSGi target invoker. OSGiTargetInvoker always invokes getInstance for a specific
- * service since one OSGi SCA component can associate different objects with
- * different services (this is different from Java SCA components which always associate
- * a single component instance with multiple services).
- *
- */
-public class OSGiInstanceWrapper<T> implements InstanceWrapper<T> {
-
- private OSGiImplementationProvider provider;
- private BundleContext bundleContext;
- private Hashtable<Object,InstanceInfo<T>> instanceInfoList =
- new Hashtable<Object,InstanceInfo<T>>();
-
-
- public OSGiInstanceWrapper(OSGiImplementationProvider provider,
- BundleContext bundleContext) {
-
- this.provider = provider;
- this.bundleContext = bundleContext;
- }
-
- public synchronized T getInstance(ComponentService service) throws TargetInitializationException {
-
- if (instanceInfoList.get(service) != null)
- return instanceInfoList.get(service).osgiInstance;
-
- Bundle refBundle = provider.startBundle();
-
- if (!provider.getImplementation().getScope().equals(Scope.COMPOSITE)) {
- refBundle = getDummyReferenceBundle();
- }
-
- InstanceInfo<T> instanceInfo = new InstanceInfo<T>();
- instanceInfoList.put(service, instanceInfo);
-
- instanceInfo.osgiServiceReference = provider.getOSGiServiceReference(service);
-
- instanceInfo.refBundleContext = refBundle.getBundleContext();
- instanceInfo.osgiInstance = (T)instanceInfo.refBundleContext.getService(instanceInfo.osgiServiceReference);
-
- provider.injectProperties(instanceInfo.osgiInstance);
-
- return instanceInfo.osgiInstance;
- }
-
- public synchronized T getCallbackInstance(EndpointReference from, Interface callbackInterface)
- throws TargetInitializationException {
-
- if (instanceInfoList.get(callbackInterface) != null)
- return instanceInfoList.get(callbackInterface).osgiInstance;
-
- Bundle refBundle = provider.startBundle();
-
- if (!provider.getImplementation().getScope().equals(Scope.COMPOSITE)) {
- refBundle = getDummyReferenceBundle();
- }
-
- InstanceInfo<T> instanceInfo = new InstanceInfo<T>();
- instanceInfoList.put(callbackInterface, instanceInfo);
-
-
- instanceInfo.osgiServiceReference = provider.getOSGiServiceReference(from, callbackInterface);
-
- instanceInfo.refBundleContext = refBundle.getBundleContext();
- instanceInfo.osgiInstance = (T)instanceInfo.refBundleContext.getService(instanceInfo.osgiServiceReference);
-
- return instanceInfo.osgiInstance;
- }
-
- // This method is provided purely to implement InstanceWrapper interface, and is never called.
- public T getInstance() {
-
- return null;
- }
-
- public void start() throws TargetInitializationException {
-
- if (provider.isEagerInit()) {
- List<ComponentService> services = provider.getRuntimeComponent().getServices();
- for (ComponentService service : services) {
- getInstance(service);
- }
- }
- }
-
- public synchronized void stop() throws TargetDestructionException {
-
- for (InstanceInfo<T> instanceInfo : instanceInfoList.values()) {
- if (instanceInfo.osgiInstance != null && instanceInfo.osgiServiceReference != null) {
-
- instanceInfo.refBundleContext.ungetService(instanceInfo.osgiServiceReference);
-
- instanceInfo.osgiInstance = null;
- instanceInfo.osgiServiceReference = null;
-
- try {
- if (instanceInfo.dummyBundle != null) {
- instanceInfo.dummyBundle.uninstall();
- }
- } catch (Exception e) {
- throw new TargetDestructionException(e);
- }
- }
- }
- instanceInfoList.clear();
- }
-
- private Bundle getDummyReferenceBundle() throws TargetInitializationException {
-
- Bundle dummyBundle = null;
- ByteArrayOutputStream out = new ByteArrayOutputStream();
-
- String EOL = System.getProperty("line.separator");
- String bundleName = "dummy.sca." + new Random().nextInt();
-
-
- String manifestStr = "Manifest-Version: 1.0" + EOL +
- "Bundle-ManifestVersion: 2" + EOL +
- "Bundle-Name: " + bundleName + EOL +
- "Bundle-SymbolicName: " + bundleName + EOL +
- "Bundle-Version: " + "1.0.0" + EOL +
- "Bundle-Localization: plugin" + EOL;
-
-
- StringBuilder manifestBuf = new StringBuilder();
- manifestBuf.append(manifestStr);
-
- try {
- ByteArrayInputStream manifestStream = new ByteArrayInputStream(manifestBuf.toString().getBytes());
- Manifest manifest = new Manifest();
- manifest.read(manifestStream);
-
-
- JarOutputStream jarOut = new JarOutputStream(out, manifest);
-
- jarOut.close();
- out.close();
-
-
- ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
-
- dummyBundle = bundleContext.installBundle("file://" + bundleName + ".jar", in);
-
- dummyBundle.start();
-
- } catch (Exception e) {
- throw new TargetInitializationException(e);
- }
-
- return dummyBundle;
-
- }
-
- private static class InstanceInfo<T> {
- private T osgiInstance;
- private ServiceReference osgiServiceReference;
- private Bundle dummyBundle;
- private BundleContext refBundleContext;
-
- }
-
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiRemotableInvoker.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiRemotableInvoker.java
deleted file mode 100644
index 59efe57bae..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiRemotableInvoker.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tuscany.sca.implementation.osgi.invocation;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.IdentityHashMap;
-import java.util.Map;
-
-import org.apache.tuscany.sca.databinding.DataBinding;
-import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
-import org.apache.tuscany.sca.implementation.osgi.xml.OSGiImplementation;
-import org.apache.tuscany.sca.interfacedef.DataType;
-import org.apache.tuscany.sca.interfacedef.Operation;
-import org.apache.tuscany.sca.invocation.Message;
-import org.apache.tuscany.sca.runtime.RuntimeComponent;
-import org.apache.tuscany.sca.runtime.RuntimeComponentService;
-
-/**
- * An interceptor to enforce pass-by-value semantics for remotable interfaces
- *
- */
-public class OSGiRemotableInvoker extends OSGiTargetInvoker {
-
- private DataBindingExtensionPoint registry;
- private Operation operation;
- private OSGiImplementation osgiImplementation;
-
- /**
- * @param registry
- * @param operation
- * @param method
- * @param component
- */
- public OSGiRemotableInvoker(OSGiImplementation osgiImplementation,
- DataBindingExtensionPoint registry,
- Operation operation,
- RuntimeComponent component,
- RuntimeComponentService service) {
- super(operation, component, service);
- this.osgiImplementation = osgiImplementation;
- this.registry = registry;
- this.operation = operation;
- }
-
- @Override
- public Object invokeMethod(Object targetObject, Method m, Message msg)
- throws InvocationTargetException {
-
- Object result;
- if (osgiImplementation.isAllowsPassByReference(m)) {
- result = super.invokeMethod(targetObject, m, msg);
- }
- else {
- Object obj = msg.getBody();
- msg.setBody(copy((Object[])obj));
-
- result = super.invokeMethod(targetObject, m, msg);
-
- if (operation.getOutputType() != null) {
- String dataBindingId = operation.getOutputType().getDataBinding();
- DataBinding dataBinding = registry.getDataBinding(dataBindingId);
- result = copy(result, dataBinding);
- }
- }
- return result;
- }
-
- public Object[] copy(Object[] args) {
- if (args == null) {
- return null;
- }
- Object[] copiedArgs = new Object[args.length];
- Map<Object, Object> map = new IdentityHashMap<Object, Object>();
- for (int i = 0; i < args.length; i++) {
- if (args[i] == null) {
- copiedArgs[i] = null;
- } else {
- Object copiedArg = map.get(args[i]);
- if (copiedArg != null) {
- copiedArgs[i] = copiedArg;
- } else {
- String dataBindingId = operation.getInputType().getLogical().get(i).getDataBinding();
- DataBinding dataBinding = registry.getDataBinding(dataBindingId);
- copiedArg = copy(args[i], dataBinding);
- map.put(args[i], copiedArg);
- copiedArgs[i] = copiedArg;
- }
- }
- }
- return copiedArgs;
- }
-
- public Object copy(Object arg, DataBinding argDataBinding) {
- if (arg == null) {
- return null;
- }
- Object copiedArg;
- if (argDataBinding != null) {
- copiedArg = argDataBinding.copy(arg);
- } else {
- copiedArg = arg;
- DataType<?> dataType = registry.introspectType(arg);
- if (dataType != null) {
- DataBinding binding = registry.getDataBinding(dataType.getDataBinding());
- if (binding != null) {
- copiedArg = binding.copy(arg);
- }
- }
- // FIXME: What to do if it's not recognized?
- }
- return copiedArg;
- }
-
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiTargetInvoker.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiTargetInvoker.java
deleted file mode 100644
index b128905703..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/invocation/OSGiTargetInvoker.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tuscany.sca.implementation.osgi.invocation;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.List;
-
-import org.apache.tuscany.sca.core.context.InstanceWrapper;
-import org.apache.tuscany.sca.core.invocation.TargetInvocationException;
-import org.apache.tuscany.sca.core.invocation.ThreadMessageContext;
-import org.apache.tuscany.sca.core.scope.Scope;
-import org.apache.tuscany.sca.core.scope.ScopeContainer;
-import org.apache.tuscany.sca.core.scope.ScopedRuntimeComponent;
-import org.apache.tuscany.sca.core.scope.TargetResolutionException;
-import org.apache.tuscany.sca.interfacedef.ConversationSequence;
-import org.apache.tuscany.sca.interfacedef.Operation;
-import org.apache.tuscany.sca.interfacedef.java.impl.JavaInterfaceUtil;
-import org.apache.tuscany.sca.invocation.InvocationChain;
-import org.apache.tuscany.sca.invocation.Invoker;
-import org.apache.tuscany.sca.invocation.Message;
-import org.apache.tuscany.sca.runtime.EndpointReference;
-import org.apache.tuscany.sca.runtime.RuntimeComponent;
-import org.apache.tuscany.sca.runtime.RuntimeComponentService;
-
-/**
- * Java->OSGi references use OSGiTargetInvoker to call methods from OSGi bundles
- * OSGi->Java references use JDKProxyService and invocation handler and do not use this class
- * OSGi->OSGi references go through OSGi reference mechanisms when a proxy is not used
- * When a proxy is used, this invoker is used to call methods from OSGi bundles
- * A proxy is used for OSGi->OSGi if
- * 1) target reference properties are specified OR
- * 2) there are one or more non-blocking methods in the target interface OR
- * 3) scope is not COMPOSITE
- */
-public class OSGiTargetInvoker<T> implements Invoker {
-
- private Operation operation;
- protected InstanceWrapper<T> target;
- protected boolean stateless;
- protected boolean cacheable;
-
- private final RuntimeComponentService service;
- private final ScopeContainer scopeContainer;
-
- public OSGiTargetInvoker(
- Operation operation,
- RuntimeComponent component,
- RuntimeComponentService service) {
-
- this.operation = operation;
- this.service = service;
- this.scopeContainer = ((ScopedRuntimeComponent) component).getScopeContainer();
- this.cacheable = true;
- stateless = Scope.STATELESS == scopeContainer.getScope();
-
- }
-
- /**
- * Resolves the target service instance or returns a cached one
- */
- protected InstanceWrapper getInstance(ConversationSequence sequence, Object contextId)
- throws TargetResolutionException, TargetInvocationException {
-
- if (sequence == null) {
- if (cacheable) {
- if (target == null) {
- target = scopeContainer.getWrapper(contextId);
- }
- return target;
- } else {
- return scopeContainer.getWrapper(contextId);
- }
- } else {
- switch (sequence) {
- case CONVERSATION_START:
- assert !cacheable;
- return scopeContainer.getWrapper(contextId);
- case CONVERSATION_CONTINUE:
- case CONVERSATION_END:
- assert !cacheable;
- return scopeContainer.getAssociatedWrapper(contextId);
- default:
- throw new TargetInvocationException("Unknown sequence type: " + String.valueOf(sequence));
- }
- }
- }
-
-
- private Object invokeTarget(Message msg) throws InvocationTargetException {
-
-
- ConversationSequence sequence = msg.getConversationSequence();
- Object contextId = ThreadMessageContext.getMessageContext().getConversationID();
- EndpointReference from = ThreadMessageContext.getMessageContext().getFrom();
- try {
- OSGiInstanceWrapper wrapper = (OSGiInstanceWrapper)getInstance(sequence, contextId);
- Object instance;
-
- if (service != null)
- instance = wrapper.getInstance(service);
- else
- instance = wrapper.getCallbackInstance(from, operation.getInterface());
-
- Method m = JavaInterfaceUtil.findMethod(instance.getClass(), operation);
-
- Object ret = invokeMethod(instance, m, msg);
-
- scopeContainer.returnWrapper(wrapper, contextId);
- if (sequence == ConversationSequence.CONVERSATION_END) {
- // if end conversation, remove resource
- scopeContainer.remove(contextId);
- }
- return ret;
- } catch (InvocationTargetException e) {
- throw e;
- } catch (Exception e) {
- throw new InvocationTargetException(e);
- }
- }
-
- protected Object invokeMethod(Object instance,
- Method m,
- Message msg)
- throws InvocationTargetException {
-
-
- try {
-
- Object payload = msg.getBody();
-
- if (payload != null && !payload.getClass().isArray()) {
- return m.invoke(instance, payload);
- } else {
- return m.invoke(instance, (Object[]) payload);
- }
-
- } catch (InvocationTargetException e) {
- throw e;
- } catch (Exception e) {
- throw new InvocationTargetException(e);
- }
- }
-
- public Message invoke(Message msg) {
- try {
- Object messageId = msg.getMessageID();
- Message workContext = ThreadMessageContext.getMessageContext();
- if (messageId != null) {
- workContext.setCorrelationID(messageId);
- }
- Object resp = invokeTarget(msg);
- msg.setBody(resp);
- } catch (InvocationTargetException e) {
- msg.setFaultBody(e.getCause());
- }
- return msg;
- }
-
- public boolean isCacheable() {
- return cacheable;
- }
-
- public void setCacheable(boolean cacheable) {
- this.cacheable = cacheable;
- }
-
- protected InvocationChain getInvocationChain(List<InvocationChain> chains, Operation targetOperation) {
- for (InvocationChain chain : chains) {
- if (chain.getTargetOperation().equals(targetOperation)) {
- return chain;
- }
- }
- return null;
- }
-
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/EquinoxRuntime.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/EquinoxRuntime.java
deleted file mode 100644
index 37fc76fca1..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/EquinoxRuntime.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.implementation.osgi.runtime;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
-import org.osgi.framework.BundleContext;
-
-public class EquinoxRuntime extends OSGiRuntime {
-
-
- private static BundleContext bundleContext;
-
- private static EquinoxRuntime instance;
-
- private static Class eclipseStarterClass;
-
- public static OSGiRuntime getInstance() throws Exception {
- if (instance == null) {
- EquinoxRuntime runtime = new EquinoxRuntime();
- runtime.startRuntime();
- instance = runtime;
- }
- return instance;
- }
-
-
- protected BundleContext startRuntime() throws Exception {
-
- if (bundleContext != null)
- return bundleContext;
-
- eclipseStarterClass = EquinoxRuntime.class.getClassLoader().loadClass("org.eclipse.core.runtime.adaptor.EclipseStarter");
- Method startupMethod = eclipseStarterClass.getMethod("startup", String [].class, Runnable.class);
-
- // Equinox version 3.2 upwards have a startup method which returns BundleContext
- if (startupMethod.getReturnType() == BundleContext.class) {
- bundleContext = (BundleContext) startupMethod.invoke(null, new String[] {"-clean", "-console"}, null );
- }
- else {
-
- // Older versions of Equinox dont have a public method to obtain system bundlecontext
- // Extract bundleContext from the private field 'context'. We are assuming that
- // there is no access restriction
- Method mainMethod = eclipseStarterClass.getMethod("main", String [].class);
- mainMethod.invoke(null, (Object)new String[] {"-clean", "-console"});
-
- Field contextField = eclipseStarterClass.getDeclaredField("context");
- contextField.setAccessible(true);
- bundleContext = (BundleContext) contextField.get(null);
-
- }
-
-
- return bundleContext;
-
- }
-
- @Override
- public BundleContext getBundleContext() {
- return bundleContext;
- }
-
- @Override
- public void shutdown() throws Exception {
-
- if (bundleContext == null)
- return;
- bundleContext = null;
- instance = null;
- if (eclipseStarterClass != null) {
- Method shutdownMethod = eclipseStarterClass.getMethod("shutdown");
- try {
- shutdownMethod.invoke(eclipseStarterClass);
- } catch (Exception e) {
- // Ignore errors.
- }
- }
- }
-
-
- @Override
- public boolean supportsBundleFragments() {
- return false;
- }
-
-
-
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/FelixRuntime.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/FelixRuntime.java
deleted file mode 100644
index 1ba8ce3c6b..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/FelixRuntime.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.implementation.osgi.runtime;
-
-import java.io.File;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class FelixRuntime extends OSGiRuntime implements BundleActivator {
-
- private static BundleContext bundleContext;
-
- private static FelixRuntime instance;
-
- private static Class felixClass;
- private static Object felix;
-
- public static OSGiRuntime getInstance() throws Exception {
- if (instance == null) {
- FelixRuntime runtime = new FelixRuntime();
- runtime.startRuntime();
- instance = runtime;
- }
- return instance;
- }
-
-
- private static void deleteDirectory(File dir) {
-
- File[] files = dir.listFiles();
- for (int i = 0; i < files.length; i++) {
- if (files[i].isDirectory())
- deleteDirectory(files[i]);
- else
- files[i].delete();
- }
- dir.delete();
-
- }
-
- private BundleContext startRuntime() throws Exception {
-
- if (bundleContext != null)
- return bundleContext;
-
-
- ClassLoader cl = FelixRuntime.class.getClassLoader();
-
- Class felixMainClass = cl.loadClass("org.apache.felix.main.Main");
- felixClass = cl.loadClass("org.apache.felix.framework.Felix");
- Method propsMethod = felixMainClass.getMethod("loadConfigProperties");
- Properties props = (Properties)propsMethod.invoke(null);
-
- File profileDir = new File(".felix");
- if (profileDir.isDirectory())
- deleteDirectory(profileDir);
- else
- profileDir.delete();
- profileDir.mkdir();
- profileDir.deleteOnExit();
-
- props.put("felix.cache.profiledir", profileDir.getAbsolutePath());
- props.put("felix.embedded.execution", "true");
- props.put("org.osgi.framework.system.packages",
- "org.osgi.framework; version=1.3.0," +
- "org.osgi.service.packageadmin; version=1.2.0, " +
- "org.osgi.service.startlevel; version=1.0.0, " +
- "org.osgi.service.url; version=1.0.0, " +
- "org.osoa.sca.annotations; version=1.0.0, " +
- "org.osoa.sca; version=1.0.0");
-
-
- try {
- Constructor felixConstructor = felixClass.getConstructor(Map.class, List.class);
- List<BundleActivator> activators = new ArrayList<BundleActivator>();
- felix = felixConstructor.newInstance(props, activators);
- ((Bundle)felix).start();
- bundleContext = ((Bundle)felix).getBundleContext();
-
-
- } catch (Exception e) {
-
- // This is the older Felix API which has been retained temporarily to avoid build break
- // TODO: Remove these once Felix 1.0.0 is released.
-
- Class propertyResolverClass = cl.loadClass("org.apache.felix.framework.util.MutablePropertyResolver");
- Class propertyResolverImplClass = cl.loadClass("org.apache.felix.framework.util.MutablePropertyResolverImpl");
-
- Constructor implConstructor = propertyResolverImplClass.getConstructor(Map.class);
- Object mutableProps = implConstructor.newInstance(props);
-
-
- try {
- Constructor felixConstructor = felixClass.getConstructor(propertyResolverClass, List.class);
- List<BundleActivator> activators = new ArrayList<BundleActivator>();
- felix = felixConstructor.newInstance(mutableProps, activators);
- ((Bundle)felix).start();
- bundleContext = ((Bundle)felix).getBundleContext();
- } catch (Exception e1) {
-
-
- felix = felixClass.newInstance();
- Method startMethod = felixClass.getMethod("start", propertyResolverClass, List.class);
- List<BundleActivator> activators = new ArrayList<BundleActivator>();
- BundleActivator activator = new FelixRuntime();
- activators.add(activator);
- startMethod.invoke(felix, mutableProps, activators);
-
- synchronized (activator) {
- int retries = 0;
- while (bundleContext == null && retries++ < 10) {
- activator.wait(1000);
- }
- }
- }
- }
-
- return bundleContext;
-
- }
-
- public void start(BundleContext context) throws Exception {
-
- bundleContext = context;
- synchronized (this) {
- this.notify();
- }
- }
-
- public void stop(BundleContext context) throws Exception {
- bundleContext = null;
- }
-
-
-
- @Override
- public BundleContext getBundleContext() {
- return bundleContext;
- }
-
-
- @Override
- public void shutdown() throws Exception {
-
- if (bundleContext == null)
- return;
- bundleContext = null;
- instance = null;
-
- if (felix instanceof Bundle) {
- ((Bundle)felix).stop();
- }
- else if (felix != null) {
- Method shutdownMethod = felixClass.getMethod("shutdown");
- try {
- shutdownMethod.invoke(felix);
- } catch (Exception e) {
- // Ignore errors
- }
- felix = null;
- }
- }
-
- @Override
- public boolean supportsBundleFragments() {
- return false;
- }
-
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/KnopflerfishRuntime.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/KnopflerfishRuntime.java
deleted file mode 100644
index 6a273015f3..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/KnopflerfishRuntime.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.implementation.osgi.runtime;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.Hashtable;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-
-public class KnopflerfishRuntime extends OSGiRuntime {
-
- private static BundleContext bundleContext;
-
- private static KnopflerfishRuntime instance;
-
-
- private static Class frameworkClass;
-
- private static Object framework;
-
- public static OSGiRuntime getInstance() throws Exception {
- if (instance == null) {
- KnopflerfishRuntime runtime = new KnopflerfishRuntime();
- runtime.startRuntime();
- instance = runtime;
- }
- return instance;
- }
-
-
-
- // FIXME: Knopflerfish does not expose the methods used for configuration as public methods
- // It may be worth using the private methods in org.knopflerfish.framework.Main for
- // configuring using reflection if security policies allow it.
- // For now, a simple configuration routine reads sca.xargs from the directory in
- // the classpath which contains framework.jar. The entries in init.xargs starting with
- // -install are assumed to be single-line entries with full bundle location.
- //
- private BundleContext startRuntime() throws Exception {
-
- if (bundleContext != null)
- return bundleContext;
-
-
-
- System.setProperty("org.knopflerfish.framework.bundlestorage", "memory");
-
- frameworkClass = KnopflerfishRuntime.class.getClassLoader().loadClass("org.knopflerfish.framework.Framework");
- Constructor frameworkConstructor = frameworkClass.getConstructor(Object.class);
- framework = frameworkConstructor.newInstance(new KnopflerfishRuntime());
- Method launchMethod = frameworkClass.getMethod("launch", long.class);
- launchMethod.invoke(framework, 0);
- Method getContextMethod = frameworkClass.getMethod("getSystemBundleContext");
- bundleContext = (BundleContext)getContextMethod.invoke(framework);
-
- System.setProperty("com.gatespace.bundle.cm.store", "knopflerfish.store");
- File xargsFile = null;
- String classpath = System.getProperty("java.class.path");
- String[] classpathEntries = classpath.split(System.getProperty("path.separator"));
- for (int i = 0; i < classpathEntries.length; i++) {
- if (classpathEntries[i].endsWith("framework.jar")) {
- String path = classpathEntries[i].substring(0, classpathEntries[i].length() - "framework.jar".length());
- path = path + "sca.xargs";
- xargsFile = new File(path);
- if (!xargsFile.exists())
- xargsFile = null;
- break;
- }
- }
- if (xargsFile != null) {
- BufferedReader reader = new BufferedReader(new FileReader(xargsFile));
- String line;
- Hashtable<String, Bundle> bundles = new Hashtable<String, Bundle>();
- while ((line = reader.readLine()) != null) {
- line = line.trim();
- if (line.startsWith("-install")) {
- try {
-
- String bundleLocation = line.substring("-install".length()).trim();
- Bundle bundle = bundleContext.installBundle(bundleLocation);
- bundles.put(bundleLocation, bundle);
-
- } catch (BundleException e) {
- e.printStackTrace();
- }
-
- }
- if (line.startsWith("-start")) {
-
- try {
- String bundleLocation = line.substring("-start".length()).trim();
- Bundle bundle = bundles.get(bundleLocation);
- bundle.start();
- } catch (BundleException e) {
- e.printStackTrace();
- }
- }
- }
- }
-
-
- return bundleContext;
-
- }
-
- @Override
- public BundleContext getBundleContext() {
- return bundleContext;
- }
-
- @Override
- public void shutdown() throws Exception {
-
- if (bundleContext == null)
- return;
- bundleContext = null;
- instance = null;
- if (framework != null) {
- Method shutdownMethod = frameworkClass.getMethod("shutdown");
- try {
- shutdownMethod.invoke(framework);
- } catch (Exception e) {
- // Ignore errors
- }
- framework = null;
- }
-
- }
-
- @Override
- public boolean supportsBundleFragments() {
- return true;
- }
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiRuntime.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiRuntime.java
deleted file mode 100644
index cd416be39a..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiRuntime.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.implementation.osgi.runtime;
-
-
-import java.lang.reflect.Method;
-
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-
-public abstract class OSGiRuntime {
-
- public abstract BundleContext getBundleContext();
-
- public abstract void shutdown() throws Exception;
-
- public abstract boolean supportsBundleFragments();
-
-
- /**
- * System property org.apache.tuscany.implementation.osgi.runtime.OSGiRuntime can be set to the
- * name of the OSGiRuntime class (eg. EquinoxRuntime). If set, start this runtime and return the
- * system bundlecontext. If not set, start Equinox/Felix/Knopflerfish (in that order) from the
- * classpath.
- *
- * @throws BundleException
- */
- public static OSGiRuntime getRuntime() throws BundleException {
-
- String runtimeClassName = System.getProperty(OSGiRuntime.class.getName());
-
- if (runtimeClassName != null) {
- try {
- Class<?> runtimeClass = OSGiRuntime.class.getClassLoader().loadClass(runtimeClassName);
- Method method = runtimeClass.getMethod("getInstance");
- return (OSGiRuntime) method.invoke(null);
-
- } catch (Exception e) {
- throw new BundleException("Could not start OSGi runtime " + runtimeClassName, e);
- }
- }
-
- try {
-
- return EquinoxRuntime.getInstance();
-
- } catch (ClassNotFoundException e) {
- } catch (Throwable e) {
- e.printStackTrace();
- }
-
- try {
-
- return FelixRuntime.getInstance();
-
- } catch (ClassNotFoundException e) {
- } catch (Throwable e) {
- e.printStackTrace();
- }
-
- try {
-
- return KnopflerfishRuntime.getInstance();
-
- } catch (ClassNotFoundException e) {
- } catch (Throwable e) {
- e.printStackTrace();
- }
-
- throw new BundleException("Could not start OSGi runtime from the classpath");
- }
-
-
-
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementation.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementation.java
deleted file mode 100644
index a5d86bb92b..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementation.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.implementation.osgi.xml;
-
-
-import java.lang.reflect.Method;
-import java.util.Hashtable;
-import java.util.List;
-
-import org.apache.tuscany.sca.assembly.ComponentProperty;
-import org.apache.tuscany.sca.assembly.impl.ComponentTypeImpl;
-import org.apache.tuscany.sca.core.scope.Scope;
-import org.apache.tuscany.sca.implementation.osgi.OSGiImplementationInterface;
-import org.osoa.sca.annotations.AllowsPassByReference;
-
-
-/**
- * OSGi implementation
- * All attributes from <implementation.osgi> have getters in this class
- * This class implements OSGiImplementationInterface which is associated with OSGiImplementationProvider.
- */
-public class OSGiImplementation extends ComponentTypeImpl implements OSGiImplementationInterface {
-
- private String bundleName;
- private String bundleLocation;
- private String[] imports;
- private Scope scope;
- private boolean isEagerInit;
- private String[] allowsPassByRef;
- private boolean needsPropertyInjection;
- private Hashtable<String, List<ComponentProperty>> referenceProperties;
- private Hashtable<String, List<ComponentProperty>> serviceProperties;
-
- private Hashtable<String, List<ComponentProperty>> referenceCallbackProperties;
- private Hashtable<String, List<ComponentProperty>> serviceCallbackProperties;
-
-
- public OSGiImplementation(String bundleName,
- String bundleLocation,
- String[] imports,
- String scopeName,
- boolean isEagerInit,
- String[] allowsPassByRef,
- Hashtable<String, List<ComponentProperty>> refProperties,
- Hashtable<String, List<ComponentProperty>> serviceProperties,
- boolean needsPropertyInjection) {
-
- super();
- this.bundleName = bundleName;
- this.bundleLocation = bundleLocation;
- setURI(bundleName);
- this.imports = imports;
- this.scope = new Scope(scopeName == null?"COMPOSITE":scopeName);
- this.isEagerInit = isEagerInit;
- this.allowsPassByRef = allowsPassByRef;
- this.referenceProperties = refProperties;
- this.serviceProperties = serviceProperties;
- this.needsPropertyInjection = needsPropertyInjection;
-
- }
-
-
- public String getBundleName() {
- return bundleName;
- }
-
- public String getBundleLocation() {
- return bundleLocation;
- }
-
-
- public String[] getImports() {
- return imports;
- }
-
-
- public Scope getScope() {
- return scope;
- }
-
- public List<ComponentProperty> getReferenceProperties(String referenceName) {
- return referenceProperties.get(referenceName);
- }
-
- public List<ComponentProperty> getServiceProperties(String serviceName) {
- return serviceProperties.get(serviceName);
- }
-
- public List<ComponentProperty> getReferenceCallbackProperties(String referenceName) {
- return referenceCallbackProperties.get(referenceName);
- }
-
- public List<ComponentProperty> getServiceCallbackProperties(String serviceName) {
- return serviceCallbackProperties.get(serviceName);
- }
-
-
- public boolean isAllowsPassByReference(Method method) {
-
- if (allowsPassByRef == null || allowsPassByRef.length == 0)
- return false;
-
- String className = method.getDeclaringClass().getName();
- String methodName = className + "." + method.getName();
-
- for (String opName : allowsPassByRef) {
- if (className.equals(opName) || methodName.equals(opName))
- return true;
- }
- return false;
- }
-
- public boolean isAllowsPassByReferenceAnnotation(Method method) {
-
- if (method.getAnnotation(AllowsPassByReference.class) != null) {
- return true;
- }
- else if (method.getClass().getAnnotation(AllowsPassByReference.class) != null) {
- return true;
- }
- else
- return false;
- }
-
-
- public boolean needsPropertyInjection() {
- return needsPropertyInjection;
- }
-
-
- public boolean isEagerInit() {
- return isEagerInit;
- }
-
- public long getMaxAge() {
- return Long.MAX_VALUE;
- }
-
- public long getMaxIdleTime() {
- return Long.MAX_VALUE;
- }
-
-
- protected void setCallbackProperties(Hashtable<String, List<ComponentProperty>> refCallbackProperties,
- Hashtable<String, List<ComponentProperty>> serviceCallbackProperties) {
-
- this.referenceCallbackProperties = refCallbackProperties;
- this.serviceCallbackProperties = serviceCallbackProperties;
-
- }
-
- private boolean areEqual(Object obj1, Object obj2) {
- if (obj1 == obj2)
- return true;
- if (obj1 == null || obj2 == null)
- return false;
- return obj1.equals(obj2);
- }
-
- @Override
- public boolean equals(Object obj) {
-
- if (!(obj instanceof OSGiImplementation))
- return super.equals(obj);
- OSGiImplementation impl = (OSGiImplementation)obj;
- if (!areEqual(bundleName, impl.bundleName))
- return false;
- if (!areEqual(bundleLocation, impl.bundleLocation))
- return false;
- if (!areEqual(serviceProperties, impl.serviceProperties))
- return false;
- if (!areEqual(serviceCallbackProperties, impl.serviceCallbackProperties))
- return false;
- if (!areEqual(referenceProperties, impl.referenceProperties))
- return false;
- if (!areEqual(referenceCallbackProperties, impl.referenceCallbackProperties))
- return false;
- return super.equals(obj);
- }
-
-
-
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementationProcessor.java b/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementationProcessor.java
deleted file mode 100644
index e2f2f81dce..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/java/org/apache/tuscany/sca/implementation/osgi/xml/OSGiImplementationProcessor.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.implementation.osgi.xml;
-
-import static javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI;
-import static javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
-import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
-import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
-import static org.osoa.sca.Constants.SCA_NS;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.stream.XMLStreamWriter;
-
-import org.apache.tuscany.sca.assembly.AssemblyFactory;
-import org.apache.tuscany.sca.assembly.ComponentProperty;
-import org.apache.tuscany.sca.assembly.ComponentType;
-import org.apache.tuscany.sca.assembly.Property;
-import org.apache.tuscany.sca.assembly.Reference;
-import org.apache.tuscany.sca.assembly.Service;
-import org.apache.tuscany.sca.assembly.xml.Constants;
-import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
-import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
-import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
-import org.apache.tuscany.sca.contribution.service.ContributionReadException;
-import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
-import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
-import org.apache.tuscany.sca.databinding.impl.SimpleTypeMapperImpl;
-import org.apache.tuscany.sca.interfacedef.Interface;
-import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
-import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
-import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
-import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- *
- * Process an <implementation.osgi/> element in a component definition. An instance of
- * OSGiImplementation is created.
- * Also associates the component type file with the implementation.
- *
- *
- */
-public class OSGiImplementationProcessor implements StAXArtifactProcessor<OSGiImplementation> {
-
- public static final QName IMPLEMENTATION_OSGI = new QName(Constants.SCA10_TUSCANY_NS, "implementation.osgi");
-
- private static final String BUNDLE = "bundle";
- private static final String BUNDLE_LOCATION = "bundleLocation";
- private static final String SCOPE = "scope";
- private static final String EAGER_INIT = "eagerInit";
- private static final String IMPORTS = "imports";
- private static final String ALLOWS_PASS_BY_REF = "allowsPassByReference";
- private static final String INJECT_PROPERTIES = "injectProperties";
-
-
- private static final QName PROPERTIES_QNAME = new QName(Constants.SCA10_TUSCANY_NS, "properties");
- private static final QName PROPERTY_QNAME = new QName(Constants.SCA10_TUSCANY_NS, "property");
-
- private JavaInterfaceFactory javaInterfaceFactory;
- private AssemblyFactory assemblyFactory;
-
- private static final DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
- static {
- domFactory.setNamespaceAware(true);
- }
-
- public OSGiImplementationProcessor(ModelFactoryExtensionPoint modelFactories) {
-
- this.assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
- this.javaInterfaceFactory = modelFactories.getFactory(JavaInterfaceFactory.class);
- }
-
- public QName getArtifactType() {
- return IMPLEMENTATION_OSGI;
- }
-
- public Class<OSGiImplementation> getModelType() {
- return OSGiImplementation.class;
- }
-
- private String[] tokenize(String str) {
- StringTokenizer tokenizer = new StringTokenizer(str);
- String[] tokens = new String[tokenizer.countTokens()];
- for (int i= 0; i < tokens.length; i++) {
- tokens[i] = tokenizer.nextToken();
- }
-
- return tokens;
- }
-
- public OSGiImplementation read(XMLStreamReader reader) throws ContributionReadException {
-
- assert IMPLEMENTATION_OSGI.equals(reader.getName());
-
- try {
- String bundleName = reader.getAttributeValue(null, BUNDLE);
- String bundleLocation = reader.getAttributeValue(null, BUNDLE_LOCATION);
- String imports = reader.getAttributeValue(null, IMPORTS);
- String[] importList;
- if (imports != null)
- importList = tokenize(imports);
- else
- importList = new String[0];
- String scope = reader.getAttributeValue(null, SCOPE);
- String allowsPassByRef = reader.getAttributeValue(null, ALLOWS_PASS_BY_REF);
- String[] allowsPassByRefList;
- if (allowsPassByRef != null)
- allowsPassByRefList = tokenize(allowsPassByRef);
- else
- allowsPassByRefList = new String[0];
-
- boolean injectProperties = !"false".equalsIgnoreCase(reader.getAttributeValue(null, INJECT_PROPERTIES));
- boolean eagerInit = "true".equalsIgnoreCase(reader.getAttributeValue(null, EAGER_INIT));
-
-
- Hashtable<String, List<ComponentProperty>> refProperties =
- new Hashtable<String, List<ComponentProperty>>();
- Hashtable<String, List<ComponentProperty>> serviceProperties =
- new Hashtable<String, List<ComponentProperty>>();
- Hashtable<String, List<ComponentProperty>> refCallbackProperties =
- new Hashtable<String, List<ComponentProperty>>();
- Hashtable<String, List<ComponentProperty>> serviceCallbackProperties =
- new Hashtable<String, List<ComponentProperty>>();
-
- while (reader.hasNext()) {
-
- int next = reader.next();
- if (next == END_ELEMENT && IMPLEMENTATION_OSGI.equals(reader.getName())) {
- break;
- }
- else if (next == START_ELEMENT && PROPERTIES_QNAME.equals(reader.getName())) {
-
- // FIXME: This is temporary code which allows reference and service properties used
- // for filtering OSGi services to be specified in <implementation.osgi/>
- // This should really be provided in the component type file since these
- // properties are associated with an implementation rather than a configured
- // instance of an implementation.
- String refName = reader.getAttributeValue(null, "reference");
- String serviceName = reader.getAttributeValue(null, "service");
- String refCallbackName = reader.getAttributeValue(null, "referenceCallback");
- String serviceCallbackName = reader.getAttributeValue(null, "serviceCallback");
- List<ComponentProperty> props = readProperties(reader);
- if (refName != null)
- refProperties.put(refName, props);
- else if (serviceName != null)
- serviceProperties.put(serviceName, props);
- else if (refCallbackName != null)
- refCallbackProperties.put(refCallbackName, props);
- else if (serviceCallbackName != null)
- serviceCallbackProperties.put(serviceCallbackName, props);
- else
- throw new ContributionReadException("Properties in implementation.osgi should specify service or reference"); }
- }
-
- OSGiImplementation implementation = new OSGiImplementation(
- bundleName,
- bundleLocation,
- importList,
- scope,
- eagerInit,
- allowsPassByRefList,
- refProperties,
- serviceProperties,
- injectProperties);
- implementation.setCallbackProperties(refCallbackProperties, serviceCallbackProperties);
-
-
- implementation.setUnresolved(true);
-
- return implementation;
-
- } catch (XMLStreamException e) {
- throw new ContributionReadException(e);
- }
- }
-
- public void resolve(OSGiImplementation impl, ModelResolver resolver) throws ContributionResolveException {
-
- try {
-
- impl.setUnresolved(false);
-
-
- String bundleName = impl.getBundleName();
- String ctURI = bundleName.replaceAll("\\.", "/") + ".componentType";
-
- ComponentType componentType = assemblyFactory.createComponentType();
- componentType.setURI(ctURI);
- componentType.setUnresolved(true);
- componentType = resolver.resolveModel(ComponentType.class, componentType);
- if (componentType.isUnresolved()) {
- throw new ContributionResolveException("missing .componentType side file");
- }
-
- List<Service> services = componentType.getServices();
- for (Service service : services) {
- Interface interfaze = service.getInterfaceContract().getInterface();
- if (interfaze instanceof JavaInterface) {
- JavaInterface javaInterface = (JavaInterface)interfaze;
- if (javaInterface.getJavaClass() == null) {
- Class<?> javaClass = Class.forName(javaInterface.getName());
- javaInterface.setJavaClass(javaClass);
- }
- Class<?> callback = null;
- if (service.getInterfaceContract().getCallbackInterface() instanceof JavaInterface) {
- JavaInterface callbackInterface = (JavaInterface)service.getInterfaceContract().getCallbackInterface();
- if (callbackInterface.getJavaClass() == null) {
- Class<?> javaClass = Class.forName(javaInterface.getName());
- callbackInterface.setJavaClass(javaClass);
- }
- callback = callbackInterface.getJavaClass();
- }
-
- Service serv = createService(service, javaInterface.getJavaClass(), callback);
- impl.getServices().add(serv);
- }
- }
-
- List<Reference> references = componentType.getReferences();
- for (Reference reference : references) {
- Interface interfaze = reference.getInterfaceContract().getInterface();
- if (interfaze instanceof JavaInterface) {
- JavaInterface javaInterface = (JavaInterface)interfaze;
- if (javaInterface.getJavaClass() == null) {
- Class<?> javaClass = Class.forName(javaInterface.getName());
- javaInterface.setJavaClass(javaClass);
- }
- Reference ref = createReference(reference, javaInterface.getJavaClass());
- impl.getReferences().add(ref);
- }
- else
- impl.getReferences().add(reference);
- }
-
- List<Property> properties = componentType.getProperties();
- for (Property property : properties) {
- impl.getProperties().add(property);
- }
- impl.setConstrainingType(componentType.getConstrainingType());
-
-
- } catch (Exception e) {
- throw new ContributionResolveException(e);
- }
-
- }
-
- private Service createService(Service serv, Class<?> interfaze, Class<?> callbackInterfaze) throws InvalidInterfaceException {
- Service service = assemblyFactory.createService();
- JavaInterfaceContract interfaceContract = javaInterfaceFactory.createJavaInterfaceContract();
- service.setInterfaceContract(interfaceContract);
-
-
- // create a relative URI
- service.setName(serv.getName());
-
- JavaInterface callInterface = javaInterfaceFactory.createJavaInterface(interfaze);
- service.getInterfaceContract().setInterface(callInterface);
-
- if (callbackInterfaze != null) {
- JavaInterface callbackInterface = javaInterfaceFactory.createJavaInterface(callbackInterfaze);
- service.getInterfaceContract().setCallbackInterface(callbackInterface);
- }
- else if (callInterface.getCallbackClass() != null) {
- JavaInterface callbackInterface = javaInterfaceFactory.createJavaInterface(callInterface.getCallbackClass());
- service.getInterfaceContract().setCallbackInterface(callbackInterface);
- }
- return service;
- }
-
- private Reference createReference(Reference ref, Class<?> clazz) throws InvalidInterfaceException {
- org.apache.tuscany.sca.assembly.Reference reference = assemblyFactory.createReference();
- JavaInterfaceContract interfaceContract = javaInterfaceFactory.createJavaInterfaceContract();
- reference.setInterfaceContract(interfaceContract);
-
- reference.setName(ref.getName());
- reference.setMultiplicity(ref.getMultiplicity());
-
- JavaInterface callInterface = javaInterfaceFactory.createJavaInterface(clazz);
- reference.getInterfaceContract().setInterface(callInterface);
- if (callInterface.getCallbackClass() != null) {
- JavaInterface callbackInterface = javaInterfaceFactory.createJavaInterface(callInterface.getCallbackClass());
- reference.getInterfaceContract().setCallbackInterface(callbackInterface);
- }
-
- return reference;
- }
-
- public void write(OSGiImplementation model, XMLStreamWriter outputSource) throws ContributionWriteException {
- }
-
-
- private QName getQNameValue(XMLStreamReader reader, String value) {
- if (value != null) {
- int index = value.indexOf(':');
- String prefix = index == -1 ? "" : value.substring(0, index);
- String localName = index == -1 ? value : value.substring(index + 1);
- String ns = reader.getNamespaceContext().getNamespaceURI(prefix);
- if (ns == null) {
- ns = "";
- }
- return new QName(ns, localName, prefix);
- } else {
- return null;
- }
- }
-
- private void declareNamespace(Element element, String prefix, String ns) {
- String qname = null;
- if ("".equals(prefix)) {
- qname = "xmlns";
- } else {
- qname = "xmlns:" + prefix;
- }
- Node node = element;
- boolean declared = false;
- while (node != null && node.getNodeType() == Node.ELEMENT_NODE) {
- NamedNodeMap attrs = node.getAttributes();
- if (attrs == null) {
- break;
- }
- Node attr = attrs.getNamedItem(qname);
- if (attr != null) {
- declared = ns.equals(attr.getNodeValue());
- break;
- }
- node = node.getParentNode();
- }
- if (!declared) {
- org.w3c.dom.Attr attr = element.getOwnerDocument().createAttributeNS(XMLNS_ATTRIBUTE_NS_URI, qname);
- attr.setValue(ns);
- element.setAttributeNodeNS(attr);
- }
- }
-
- private Element createElement(Document document, QName name) {
- String prefix = name.getPrefix();
- String qname = (prefix != null && prefix.length() > 0) ? prefix + ":" + name.getLocalPart() : name
- .getLocalPart();
- return document.createElementNS(name.getNamespaceURI(), qname);
- }
-
- private void loadElement(XMLStreamReader reader, Element root) throws XMLStreamException {
- Document document = root.getOwnerDocument();
- Node current = root;
- while (true) {
- switch (reader.next()) {
- case XMLStreamConstants.START_ELEMENT:
- QName name = reader.getName();
- Element child = createElement(document, name);
-
- // push the new element and make it the current one
- current.appendChild(child);
- current = child;
-
- declareNamespace(child, name.getPrefix(), name.getNamespaceURI());
-
- int count = reader.getNamespaceCount();
- for (int i = 0; i < count; i++) {
- String prefix = reader.getNamespacePrefix(i);
- String ns = reader.getNamespaceURI(i);
- declareNamespace(child, prefix, ns);
- }
-
- // add the attributes for this element
- count = reader.getAttributeCount();
- for (int i = 0; i < count; i++) {
- String ns = reader.getAttributeNamespace(i);
- String prefix = reader.getAttributePrefix(i);
- String localPart = reader.getAttributeLocalName(i);
- String value = reader.getAttributeValue(i);
- child.setAttributeNS(ns, localPart, value);
- declareNamespace(child, prefix, ns);
- }
-
- break;
- case XMLStreamConstants.CDATA:
- current.appendChild(document.createCDATASection(reader.getText()));
- break;
- case XMLStreamConstants.CHARACTERS:
- current.appendChild(document.createTextNode(reader.getText()));
- break;
- case XMLStreamConstants.END_ELEMENT:
- // if we are back at the root then we are done
- if (current == root) {
- return;
- }
-
- // pop the element off the stack
- current = current.getParentNode();
- }
- }
- }
-
- private Document readPropertyValue(XMLStreamReader reader, QName type)
- throws XMLStreamException, ParserConfigurationException {
-
- Document doc = domFactory.newDocumentBuilder().newDocument();
-
- // root element has no namespace and local name "value"
- Element root = doc.createElementNS(null, "value");
- if (type != null) {
- org.w3c.dom.Attr xsi = doc.createAttributeNS(XMLNS_ATTRIBUTE_NS_URI, "xmlns:xsi");
- xsi.setValue(W3C_XML_SCHEMA_INSTANCE_NS_URI);
- root.setAttributeNodeNS(xsi);
-
- String prefix = type.getPrefix();
- if (prefix == null || prefix.length() == 0) {
- prefix = "ns";
- }
-
- declareNamespace(root, prefix, type.getNamespaceURI());
-
- org.w3c.dom.Attr xsiType = doc.createAttributeNS(W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:type");
- xsiType.setValue(prefix + ":" + type.getLocalPart());
- root.setAttributeNodeNS(xsiType);
- }
- doc.appendChild(root);
-
- loadElement(reader, root);
- return doc;
- }
-
- private void readProperty(ComponentProperty prop, XMLStreamReader reader)
- throws XMLStreamException, ContributionReadException {
-
-
- prop.setName(reader.getAttributeValue(null, "name"));
- String xsdType = reader.getAttributeValue(null, "type");
- if (xsdType != null)
- prop.setXSDType(getQNameValue(reader, xsdType));
- else
- prop.setXSDType(SimpleTypeMapperImpl.XSD_STRING);
-
- try {
- Document value = readPropertyValue(reader, prop.getXSDType());
- prop.setValue(value);
- } catch (ParserConfigurationException e) {
- throw new ContributionReadException(e);
- }
- }
-
- private List<ComponentProperty> readProperties(XMLStreamReader reader)
- throws XMLStreamException, ContributionReadException {
-
- List<ComponentProperty> properties = new ArrayList<ComponentProperty>();
-
- while (reader.hasNext()) {
-
- int next = reader.next();
- if (next == END_ELEMENT && PROPERTIES_QNAME.equals(reader.getName())) {
- break;
- }
- else if (next == START_ELEMENT && PROPERTY_QNAME.equals(reader.getName())) {
-
- ComponentProperty componentProperty = assemblyFactory.createComponentProperty();
- readProperty(componentProperty, reader);
- properties.add(componentProperty);
- }
- }
-
- return properties;
-
- }
-}
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor b/branches/sca-java-0.99/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
deleted file mode 100644
index 0f2b028e87..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# Implementation class for the artifact processor extension
-org.apache.tuscany.sca.implementation.osgi.xml.OSGiImplementationProcessor;qname=http://tuscany.apache.org/xmlns/sca/1.0#implementation.osgi,model=org.apache.tuscany.sca.implementation.osgi.OSGiImplementationInterface
diff --git a/branches/sca-java-0.99/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory b/branches/sca-java-0.99/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory
deleted file mode 100644
index 0f0fa03f75..0000000000
--- a/branches/sca-java-0.99/modules/implementation-osgi/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# Implementation class for the implementation extension
-org.apache.tuscany.sca.implementation.osgi.invocation.OSGiImplementationProviderFactory;model=org.apache.tuscany.sca.implementation.osgi.OSGiImplementationInterface