diff options
author | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-11 23:11:56 +0000 |
---|---|---|
committer | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-11 23:11:56 +0000 |
commit | 9bed5ae38c581999db465b42b504026a7097af95 (patch) | |
tree | a32b086a857a4556b8aec1aa9ed3a586efd9461e /sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main | |
parent | ece4fd35da7b7fc76264776f81705e6b5b52d3e0 (diff) |
Moving 1.x branches
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@835141 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main')
16 files changed, 903 insertions, 0 deletions
diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/LauncherActivator.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/LauncherActivator.java new file mode 100755 index 0000000000..2d7027e208 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/LauncherActivator.java @@ -0,0 +1,79 @@ +/* + * 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.osgi; + +import java.io.File; +import java.net.URL; + +import org.apache.tuscany.spi.component.CompositeComponent; + +import org.apache.tuscany.api.TuscanyException; +import org.apache.tuscany.core.launcher.LauncherImpl; +import org.apache.tuscany.core.monitor.NullMonitorFactory; +import org.apache.tuscany.osgi.util.BundleContextUtil; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +/** + * Responsible for launching the Tuscany Runtime in as part of an OSGi bundle + */ +public class LauncherActivator implements BundleActivator { + + private LauncherImpl launcher; + + public void start(BundleContext context) throws Exception { + BundleContextUtil.setContext(context); + startRuntime(context); + + } + + public void stop(BundleContext context) throws Exception { + if (launcher != null) { + launcher.shutdownRuntime(); + } + } + + + private void startRuntime(BundleContext context) throws OSGILauncherInitException { + launcher = new LauncherImpl(); + // Current thread context classloader should be the webapp classloader + ClassLoader webappClassLoader = Thread.currentThread().getContextClassLoader(); + launcher.setApplicationLoader(webappClassLoader); + + try { + System.out.println(":::" + new File(".").toURL().toString()); + // URL systemScdl = getSystemSCDL(systemScdlPath); + CompositeComponent rt = + launcher.bootRuntime(new File("./sca/system.scdl").toURI().toURL(), new NullMonitorFactory()); + } catch (Exception e) { + throw new OSGILauncherInitException(e); + } + } + + private void bootApplication(String name, URL scdl) throws TuscanyException { + CompositeComponent root = launcher.bootApplication(name, scdl); + root.start(); + } + + private void loadExtension(String name, URL scdl) throws TuscanyException { + CompositeComponent root = launcher.bootApplication(name, scdl); + root.start(); + } + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGILauncherInitException.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGILauncherInitException.java new file mode 100644 index 0000000000..9951183aea --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGILauncherInitException.java @@ -0,0 +1,31 @@ +/* + * 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.osgi; + +import org.apache.tuscany.api.TuscanyException; + +/** + * @version $Rev$ $Date$ + */ +public class OSGILauncherInitException extends TuscanyException { + + public OSGILauncherInitException(Throwable throwable) { + super(throwable); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGiHost.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGiHost.java new file mode 100644 index 0000000000..c16d27a937 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGiHost.java @@ -0,0 +1,32 @@ +/* + * 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.osgi; + +import java.util.Properties; + +import org.apache.tuscany.spi.host.ServletHost; + +/** + * @version $Rev$ $Date$ + */ +public interface OSGiHost extends ServletHost { + + void registerService(String serviceName, Object service, Properties properties); + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteMethodException.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteMethodException.java new file mode 100755 index 0000000000..0f59da4709 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteMethodException.java @@ -0,0 +1,34 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.osgi.binding; + +public class NoRemoteMethodException extends OSGiBindingException { + + private static final long serialVersionUID = 5037327699117168707L; + + public NoRemoteMethodException(String message) { + super(message); + } + + public NoRemoteMethodException(String message, Throwable cause) { + super(message, cause); + } + + public NoRemoteMethodException(Throwable cause) { + super("", cause); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteServiceException.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteServiceException.java new file mode 100755 index 0000000000..a370cb28c6 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteServiceException.java @@ -0,0 +1,39 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.osgi.binding; + +import org.osgi.framework.BundleException; + +/** + * FIXME class not used + * + * @version $Rev$ $Date$ + */ +public class NoRemoteServiceException extends BundleException { + + public NoRemoteServiceException(String message) { + super(message); + } + + public NoRemoteServiceException(String message, Throwable cause) { + super(message, cause); + } + + public NoRemoteServiceException(Throwable cause) { + super("", cause); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingBuilder.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingBuilder.java new file mode 100755 index 0000000000..0967abf210 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingBuilder.java @@ -0,0 +1,69 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.osgi.binding; + +import org.osoa.sca.annotations.Constructor; + +import org.apache.tuscany.spi.annotation.Autowire; +import org.apache.tuscany.spi.component.CompositeComponent; +import org.apache.tuscany.spi.component.ServiceBinding; +import org.apache.tuscany.spi.deployer.DeploymentContext; +import org.apache.tuscany.spi.extension.BindingBuilderExtension; +import org.apache.tuscany.spi.model.BoundReferenceDefinition; +import org.apache.tuscany.spi.model.BoundServiceDefinition; + +import org.apache.tuscany.osgi.OSGiHost; + +/** + * Builds a Service or Reference for an OSGi binding. + * + * @version $Rev$ $Date$ + */ +public class OSGiBindingBuilder extends BindingBuilderExtension<OSGiBindingDefinition> { + + OSGiHost host; + + @Constructor + public OSGiBindingBuilder(@Autowire OSGiHost host) { + this.host = host; + } + + protected Class<OSGiBindingDefinition> getBindingType() { + return OSGiBindingDefinition.class; + } + + public ServiceBinding build(CompositeComponent parent, + BoundServiceDefinition boundServiceDefinition, + OSGiBindingDefinition bindingDefinition, + DeploymentContext deploymentContext) { + String name = boundServiceDefinition.getName(); + String osgiServiceName = bindingDefinition.getService(); + return new OSGiServiceBinding(name, parent, wireService, osgiServiceName, host); + } + + public OSGiReferenceBinding build(CompositeComponent parent, + BoundReferenceDefinition boundReferenceDefinition, + OSGiBindingDefinition bindingDefinition, DeploymentContext deploymentContext) { + String name = boundReferenceDefinition.getName(); + return new OSGiReferenceBinding(name, parent); + } + + protected Class<? extends Object> getServiceInterface(BoundServiceDefinition boundServiceDefinition) { + return boundServiceDefinition.getServiceContract().getInterfaceClass(); + } + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingDefinition.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingDefinition.java new file mode 100755 index 0000000000..15cacff25d --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingDefinition.java @@ -0,0 +1,45 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.osgi.binding; + +import org.apache.tuscany.spi.model.BindingDefinition; + +/** + * Represents a binding to an OSGi service. + * + * @version $Rev$ $Date$ + */ +public class OSGiBindingDefinition extends BindingDefinition { + private String uri; + private String service; + + public String getURI() { + return uri; + } + + public void setURI(String uri) { + this.uri = uri; + } + + public void setService(String service) { + this.service = service; + } + + public String getService() { + return service; + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingException.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingException.java new file mode 100755 index 0000000000..288d4940f0 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingException.java @@ -0,0 +1,39 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.osgi.binding; + +import org.apache.tuscany.api.TuscanyRuntimeException; + +/** + * @version $Rev$ $Date$ + */ +public abstract class OSGiBindingException extends TuscanyRuntimeException { + protected OSGiBindingException() { + } + + protected OSGiBindingException(String message) { + super(message); + } + + protected OSGiBindingException(String message, Throwable cause) { + super(message, cause); + } + + protected OSGiBindingException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingLoader.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingLoader.java new file mode 100755 index 0000000000..80465feabb --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingLoader.java @@ -0,0 +1,66 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.osgi.binding; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.osoa.sca.annotations.Constructor; +import org.osoa.sca.annotations.Scope; + +import org.apache.tuscany.spi.annotation.Autowire; +import org.apache.tuscany.spi.component.CompositeComponent; +import org.apache.tuscany.spi.deployer.DeploymentContext; +import org.apache.tuscany.spi.extension.LoaderExtension; +import org.apache.tuscany.spi.loader.LoaderException; +import org.apache.tuscany.spi.loader.LoaderRegistry; +import org.apache.tuscany.spi.loader.LoaderUtil; +import org.apache.tuscany.spi.model.ModelObject; + +/** + * Loader for handling <code>binding.osgi</code> elements. + * + * @version $Rev$ $Date$ + */ +@Scope("COMPOSITE") +public class OSGiBindingLoader extends LoaderExtension<OSGiBindingDefinition> { + public static final QName BINDING_OSGI = new QName("http://tuscany.apache.org/xmlns/osgi/1.0", "binding.osgi"); + + @Constructor + public OSGiBindingLoader(@Autowire LoaderRegistry registry) { + super(registry); + } + + public QName getXMLType() { + return BINDING_OSGI; + } + + public OSGiBindingDefinition load(CompositeComponent parent, ModelObject object, XMLStreamReader reader, + DeploymentContext deploymentContext) + throws XMLStreamException, LoaderException { + String uri = reader.getAttributeValue(null, "uri"); + String service = reader.getAttributeValue(null, "service"); + LoaderUtil.skipToEndElement(reader); + + OSGiBindingDefinition binding = new OSGiBindingDefinition(); + binding.setURI(uri); + binding.setService(service); + return binding; + } + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiInvoker.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiInvoker.java new file mode 100755 index 0000000000..bb48a8b1e1 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiInvoker.java @@ -0,0 +1,79 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.osgi.binding; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.apache.tuscany.spi.wire.InvocationRuntimeException; +import org.apache.tuscany.spi.wire.Message; +import org.apache.tuscany.spi.wire.TargetInvoker; + +/** + * Invokes the target service of an OSGi reference. + * + * @version $Rev$ $Date$ + */ +public class OSGiInvoker implements TargetInvoker { + private final Method remoteMethod; + private final Object proxy; + + OSGiInvoker(Object proxy, Method remoteMethod) { + assert remoteMethod.isAccessible(); + this.remoteMethod = remoteMethod; + this.proxy = proxy; + } + + public Message invoke(Message msg) throws InvocationRuntimeException { + try { + Object resp = invokeTarget(msg.getBody(), TargetInvoker.NONE); + msg.setBody(resp); + } catch (InvocationTargetException e) { + msg.setBody(e.getCause()); + } + return msg; + } + + public Object invokeTarget(Object payload, final short sequence) throws InvocationTargetException { + try { + return remoteMethod.invoke(proxy, (Object[]) payload); + } catch (IllegalAccessException e) { + // the method we are passed must be accessible + throw new AssertionError(e); + } + } + + public Object clone() throws CloneNotSupportedException { + try { + return super.clone(); + } catch (CloneNotSupportedException e) { + throw new AssertionError(e); + } + } + + public boolean isOptimizable() { + return false; + } + + public boolean isCacheable() { + return false; + } + + // FIXME I think we can always have this cacheable as OSGi serviceBindings are thread-safe + public void setCacheable(boolean cacheable) { + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiReferenceBinding.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiReferenceBinding.java new file mode 100755 index 0000000000..4523d7e001 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiReferenceBinding.java @@ -0,0 +1,65 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.osgi.binding; + +import java.lang.reflect.Method; +import java.rmi.Remote; +import javax.xml.namespace.QName; + +import org.apache.tuscany.spi.component.CompositeComponent; +import org.apache.tuscany.spi.extension.ReferenceBindingExtension; +import org.apache.tuscany.spi.idl.java.JavaIDLUtils; +import org.apache.tuscany.spi.model.Operation; +import org.apache.tuscany.spi.model.ServiceContract; +import org.apache.tuscany.spi.wire.TargetInvoker; + +/** + * @version $Rev$ $Date$ + */ +public class OSGiReferenceBinding extends ReferenceBindingExtension { + private static final QName BINDING_OSGI = new QName("http://tuscany.apache.org/xmlns/osgi/1.0", "binding.osgi"); + //private final String uri; + + public OSGiReferenceBinding(String name, CompositeComponent parent) { + super(name, parent); + //this.uri = uri; + } + + public QName getBindingType() { + return BINDING_OSGI; + } + + public TargetInvoker createTargetInvoker(ServiceContract contract, Operation operation) { + try { + Object proxy = getProxy(); + String name = operation.getName(); + Method method = JavaIDLUtils.findMethod(operation, contract.getInterfaceClass().getMethods()); + Class<?>[] parameterTypes = method.getParameterTypes(); + Method remoteMethod = proxy.getClass().getMethod(name, parameterTypes); + return new OSGiInvoker(proxy, remoteMethod); + } catch (NoSuchMethodException e) { + // FIXME we should probably have this as a checked exception, which will entail adding to the SPI signature + throw new NoRemoteMethodException(operation.toString(), e); + } + } + + protected Remote getProxy() { + //FIXME use service reference + return null; + } + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiServiceBinding.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiServiceBinding.java new file mode 100755 index 0000000000..57cae13779 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiServiceBinding.java @@ -0,0 +1,116 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.osgi.binding; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Properties; +import javax.xml.namespace.QName; + +import org.apache.tuscany.spi.component.CompositeComponent; +import org.apache.tuscany.spi.component.SCAObjectStartException; +import org.apache.tuscany.spi.extension.ServiceBindingExtension; +import org.apache.tuscany.spi.wire.WireService; + +import org.apache.tuscany.osgi.OSGiHost; +import org.osgi.framework.ServiceFactory; + +/** + * @version $Rev$ $Date$ + */ +public class OSGiServiceBinding extends ServiceBindingExtension { + private static final QName BINDING_OSGI = new QName("http://tuscany.apache.org/xmlns/osgi/1.0", "binding.osgi"); + private final String osgiServiceName; + //private final Class<? extends Object> service; + private OSGiHost host; + private WireService wireService; + + /** + * Creates a new service instance + * + * @param name the name of the SCA service + * @param parent the containing composite + * @param wireService the wire service to use for creating proxies + * @param osgiServiceName the name to publish the service as to the OSGi hose + * @param host the OSGi host + */ + public OSGiServiceBinding(String name, + CompositeComponent parent, + WireService wireService, + String osgiServiceName, + OSGiHost host) { + super(name, parent); + this.osgiServiceName = osgiServiceName; + //this.service = service; + this.wireService = wireService; + this.host = host; + } + + public void start() throws SCAObjectStartException { + super.start(); + Properties properties = new Properties(); + Object instance; + Class<?> clazz = inboundWire.getServiceContract().getInterfaceClass(); + instance = wireService.createProxy(clazz, inboundWire); + if (instance instanceof ServiceFactory) { + host.registerService(osgiServiceName, instance, properties); + } else { + ServiceFactoryProxyHandler factoryProxy = new ServiceFactoryProxyHandler(instance); + Class<?> interfaces[] = instance.getClass().getInterfaces(); + Class<?> proxyInterfaces[] = new Class<?>[interfaces.length + 1]; + int i; + for (i = 0; i < interfaces.length; i++) { + proxyInterfaces[i] = interfaces[i]; + } + proxyInterfaces[i] = ServiceFactory.class; + ClassLoader classLoader = instance.getClass().getClassLoader(); + // TODO It seems we need a mixin capability for the service. We could add that to WireService + Object targetProxy = Proxy.newProxyInstance(classLoader, proxyInterfaces, factoryProxy); + host.registerService(osgiServiceName, targetProxy, properties); + } + //Register the service with OSGi + } + + public void stop() { + super.stop(); + //Unregister the service with OSGi + } + + public QName getBindingType() { + return BINDING_OSGI; + } + + private class ServiceFactoryProxyHandler implements InvocationHandler { + + private Object instance; + + public ServiceFactoryProxyHandler(Object instance) { + this.instance = instance; + } + + public Object invoke(Object object, Method method, Object[] parms) throws Throwable { + if (method.getName().equals("getService")) { + return instance; + } else if (method.getName().equals("ungetService")) { + return null; + } + return method.invoke(instance, parms); + } + + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/BundleContextUtil.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/BundleContextUtil.java new file mode 100755 index 0000000000..02549a59fd --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/BundleContextUtil.java @@ -0,0 +1,93 @@ +/* + * 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.osgi.util; + +import java.util.Dictionary; + +import org.osgi.framework.BundleContext; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceListener; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; + +public final class BundleContextUtil { + + private static BundleContext context; + private static final ServiceReference EMPTY_REFERENCE_ARRAY[] = {}; + + private BundleContextUtil() { + } + + public static void setContext(BundleContext ctx) { + context = ctx; + } + + public static ServiceReference[] getServiceReference(String clazz, String filter) throws InvalidSyntaxException { + ServiceReference[] references; + references = context.getServiceReferences(clazz, filter); + if (references == null) { + references = EMPTY_REFERENCE_ARRAY; + } + return references; + } + + public static Object getService(ServiceReference reference) { + return context.getService(reference); + } + + public static Object getService(ServiceReference references[]) { + if (references == null) { + return null; + } + return context.getService(references[0]); + } + + public static void addServiceListener(ServiceListener listener, String filter) { + try { + if (filter != null) { + context.addServiceListener(listener, filter); + } else { + context.addServiceListener(listener); + } + } catch (InvalidSyntaxException e) { + //FIXME + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public static void removeServiceListener(ServiceListener listener) { + context.removeServiceListener(listener); + } + + public static ServiceRegistration registerService(String serviceName, + Object serviceFactory, + Dictionary properties) { + return context.registerService(serviceName, serviceFactory, properties); + } + + public static boolean trackServiceReference(String filter, ServiceListener listener) { + try { + context.addServiceListener(listener, filter); + return true; + } catch (InvalidSyntaxException e) { + return false; + } + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/ClassloaderHook.java b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/ClassloaderHook.java new file mode 100644 index 0000000000..33f7706c3e --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/ClassloaderHook.java @@ -0,0 +1,64 @@ +package org.apache.tuscany.osgi.util; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.security.AccessController; +import java.security.PrivilegedAction; + +import org.osgi.framework.Bundle; + +public class ClassloaderHook { + + /** + * Return the BundleContext Classloader for the specified bundle. + * + * @param bundle The bundle whose BundleContext is desired. + * @return The BundleContext classloader for the specified bundle. + */ + ClassLoader getClassLoader(final Bundle bundle) { + if (System.getSecurityManager() == null) { + Object bundleLoader = invokeMethod(bundle, "checkLoader", null, null); + return (ClassLoader) invokeMethod(bundleLoader, "createClassLoader", null, null); + } + return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() { + public ClassLoader run() { + Object bundleLoader = invokeMethod(bundle, "checkLoader", null, null); + return (ClassLoader) invokeMethod(bundleLoader, "createClassLoader", null, null); + } + }); + } + + /** + * Throws an IllegalStateException if the reflection logic cannot find what it is looking for. This probably means + * this class does not properly recognize the framework implementation. + * + * @param e Exception which indicates the reflection logic is confused. + */ + protected void reflectionException(Exception e) { + throw new IllegalStateException( + "ClassLoaderHook does not recognize the framework implementation: " + e.getMessage()); + } + + private Object invokeMethod(Object target, String methodName, Class[] parms, Object[] args) { + Method method; + try { + method = target.getClass().getMethod(methodName, parms); + if (method != null) { + return method.invoke(target, parms, args); + } + } catch (SecurityException e) { + reflectionException(e); + } catch (NoSuchMethodException e) { + reflectionException(e); + } catch (IllegalArgumentException e) { + reflectionException(e); + } catch (IllegalAccessException e) { + reflectionException(e); + } catch (InvocationTargetException e) { + reflectionException(e); + } + return null; + } + + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/resources/META-INF/MANIFEST.MF b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/resources/META-INF/MANIFEST.MF new file mode 100755 index 0000000000..bb72ca36e5 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,14 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Tuscany_binding_osgi Plug-in +Bundle-SymbolicName: tuscany_binding_osgi +Bundle-Version: 1.0.0 +Bundle-Activator: org.apache.tuscany.binding.osgi.LauncherActivator +Bundle-Localization: plugin +Import-Package: org.osgi.framework;version="1.3.0", + org.osgi.util.tracker;version="1.3.1", + org.osoa.sca, + org.osoa.sca.annotations +Require-Bundle: tuscany.osgi.sca.spi, + tuscany_external_dependencies, + tuscany.osgi.sca.core diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/resources/META-INF/sca/osgibinding.scdl b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/resources/META-INF/sca/osgibinding.scdl new file mode 100755 index 0000000000..94dca99a73 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/osgi/src/main/resources/META-INF/sca/osgibinding.scdl @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:system="http://tuscany.apache.org/xmlns/system/1.0-SNAPSHOT" + + name="binding.osgi"> + + <component name="osgi.implementationLoader"> + <system:implementation.system class="org.apache.tuscany.osgOSGiBindingBuilderi.binding.OSGiBindingLoader"/> + </component> + <component name="osgi.bindingBuilder"> + <system:implementation.system class="org.apache.tuscany.osgi.binding.OSGiBindingBuilder"/> + </component> + <component name="osgi.componentLoader"> + <system:implementation.system class="org.apache.tuscany.implementation.osgi.OSGiImplementationLoader"/> + </component> + <component name="osgi.componentTypeLoader"> + <system:implementation.system class="org.apache.tuscany.implementation.osgi.OSGiComponentTypeLoader"/> + </component> + <component name="osgi.componentBuilder"> + <system:implementation.system class="org.apache.tuscany.implementation.osgi.OSGiComponentBuilder"/> + </component> + +</composite> |