From bdd0a41aed7edf21ec2a65cfa17a86af2ef8c48a Mon Sep 17 00:00:00 2001 From: dims Date: Tue, 17 Jun 2008 00:23:01 +0000 Subject: Move Tuscany from Incubator to top level. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@668359 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/tuscany/osgi/LauncherActivator.java | 79 +++++++++++++++ .../tuscany/osgi/OSGILauncherInitException.java | 41 ++++++++ .../java/org/apache/tuscany/osgi/OSGiHost.java | 32 ++++++ .../osgi/binding/NoRemoteMethodException.java | 36 +++++++ .../osgi/binding/NoRemoteServiceException.java | 41 ++++++++ .../apache/tuscany/osgi/binding/OSGiBinding.java | 47 +++++++++ .../tuscany/osgi/binding/OSGiBindingBuilder.java | 73 ++++++++++++++ .../tuscany/osgi/binding/OSGiBindingException.java | 41 ++++++++ .../tuscany/osgi/binding/OSGiBindingLoader.java | 64 ++++++++++++ .../apache/tuscany/osgi/binding/OSGiInvoker.java | 81 +++++++++++++++ .../apache/tuscany/osgi/binding/OSGiReference.java | 62 ++++++++++++ .../apache/tuscany/osgi/binding/OSGiService.java | 109 +++++++++++++++++++++ .../tuscany/osgi/util/BundleContextUtil.java | 93 ++++++++++++++++++ .../apache/tuscany/osgi/util/ClassloaderHook.java | 82 ++++++++++++++++ .../osgi/src/main/resources/META-INF/MANIFEST.MF | 14 +++ .../main/resources/META-INF/sca/osgibinding.scdl | 41 ++++++++ 16 files changed, 936 insertions(+) create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/LauncherActivator.java create mode 100644 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGILauncherInitException.java create mode 100644 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGiHost.java create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteMethodException.java create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteServiceException.java create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBinding.java create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingBuilder.java create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingException.java create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingLoader.java create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiInvoker.java create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiReference.java create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiService.java create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/BundleContextUtil.java create mode 100644 branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/ClassloaderHook.java create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/resources/META-INF/MANIFEST.MF create mode 100755 branches/sca-java-M2/sca/runtime/osgi/src/main/resources/META-INF/sca/osgibinding.scdl (limited to 'branches/sca-java-M2/sca/runtime/osgi/src') diff --git a/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/LauncherActivator.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/LauncherActivator.java new file mode 100755 index 0000000000..2d7027e208 --- /dev/null +++ b/branches/sca-java-M2/sca/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/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGILauncherInitException.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGILauncherInitException.java new file mode 100644 index 0000000000..b01f18314d --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGILauncherInitException.java @@ -0,0 +1,41 @@ +/* + * 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() { + } + + public OSGILauncherInitException(String string) { + super(string); + } + + public OSGILauncherInitException(String string, Throwable throwable) { + super(string, throwable); + } + + public OSGILauncherInitException(Throwable throwable) { + super(throwable); + } +} diff --git a/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGiHost.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/OSGiHost.java new file mode 100644 index 0000000000..c16d27a937 --- /dev/null +++ b/branches/sca-java-M2/sca/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/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteMethodException.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteMethodException.java new file mode 100755 index 0000000000..657640d854 --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteMethodException.java @@ -0,0 +1,36 @@ +/* + * 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.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/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteServiceException.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteServiceException.java new file mode 100755 index 0000000000..0df2a282c9 --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/NoRemoteServiceException.java @@ -0,0 +1,41 @@ +/* + * 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.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/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBinding.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBinding.java new file mode 100755 index 0000000000..11d96ebe9e --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBinding.java @@ -0,0 +1,47 @@ +/* + * 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.binding; + +import org.apache.tuscany.spi.model.Binding; + +/** + * Represents a binding to an OSGi service. + * + * @version $Rev$ $Date$ + */ +public class OSGiBinding extends Binding { + 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/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingBuilder.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingBuilder.java new file mode 100755 index 0000000000..99977e9166 --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingBuilder.java @@ -0,0 +1,73 @@ +/* + * 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.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.Service; +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 { + + OSGiHost host; + + @Constructor + public OSGiBindingBuilder(@Autowire OSGiHost host) { + this.host = host; + } + + protected Class getBindingType() { + return OSGiBinding.class; + } + + public Service build(CompositeComponent parent, + BoundServiceDefinition boundServiceDefinition, + DeploymentContext deploymentContext) { + String name = boundServiceDefinition.getName(); + Class service = getServiceInterface(boundServiceDefinition); + String osgiServiceName = boundServiceDefinition.getBinding().getService(); + return new OSGiService(name, parent, wireService, osgiServiceName, service, host); + } + + public OSGiReference build(CompositeComponent parent, + BoundReferenceDefinition boundReferenceDefinition, + DeploymentContext deploymentContext) { + String name = boundReferenceDefinition.getName(); + String uri = boundReferenceDefinition.getBinding().getURI(); + Class interfaze = boundReferenceDefinition.getServiceContract().getInterfaceClass(); + return new OSGiReference(name, interfaze, parent, wireService, uri); + } + + protected Class getServiceInterface(BoundServiceDefinition boundServiceDefinition) { + return boundServiceDefinition.getServiceContract().getInterfaceClass(); + } + +} diff --git a/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingException.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingException.java new file mode 100755 index 0000000000..a8b913bad0 --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingException.java @@ -0,0 +1,41 @@ +/* + * 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.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/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingLoader.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingLoader.java new file mode 100755 index 0000000000..7f335a4dbe --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiBindingLoader.java @@ -0,0 +1,64 @@ +/** + * + * 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; + +/** + * Loader for handling binding.osgi elements. + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class OSGiBindingLoader extends LoaderExtension { + 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 OSGiBinding load(CompositeComponent parent, XMLStreamReader reader, DeploymentContext deploymentContext) + throws XMLStreamException, LoaderException { + String uri = reader.getAttributeValue(null, "uri"); + String service = reader.getAttributeValue(null, "service"); + LoaderUtil.skipToEndElement(reader); + + OSGiBinding binding = new OSGiBinding(); + binding.setURI(uri); + binding.setService(service); + return binding; + } + +} diff --git a/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiInvoker.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiInvoker.java new file mode 100755 index 0000000000..b6fb480101 --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiInvoker.java @@ -0,0 +1,81 @@ +/* + * 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.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()); + msg.setBody(resp); + } catch (InvocationTargetException e) { + msg.setBody(e.getCause()); + } + return msg; + } + + public Object invokeTarget(Object payload) 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 services are thread-safe + public void setCacheable(boolean cacheable) { + } +} diff --git a/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiReference.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiReference.java new file mode 100755 index 0000000000..e365c4c6a2 --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiReference.java @@ -0,0 +1,62 @@ +/* + * 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.binding; + +import java.lang.reflect.Method; +import java.rmi.Remote; + +import org.apache.tuscany.spi.component.CompositeComponent; +import org.apache.tuscany.spi.extension.ReferenceExtension; +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; +import org.apache.tuscany.spi.wire.WireService; + +/** + * @version $Rev$ $Date$ + */ +public class OSGiReference extends ReferenceExtension { + //private final String uri; + + public OSGiReference(String name, Class interfaze, CompositeComponent parent, WireService service, String uri) { + super(name, interfaze, parent, service); + //this.uri = uri; + } + + 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/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiService.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiService.java new file mode 100755 index 0000000000..afca35a71b --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/binding/OSGiService.java @@ -0,0 +1,109 @@ +/* + * 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.binding; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Properties; + +import org.apache.tuscany.spi.component.CompositeComponent; +import org.apache.tuscany.spi.extension.ServiceExtension; +import org.apache.tuscany.spi.wire.WireService; + +import org.apache.tuscany.osgi.OSGiHost; +import org.osgi.framework.ServiceFactory; + +/** + * @version $Rev$ $Date$ + */ +public class OSGiService extends ServiceExtension { + private final String osgiServiceName; + //private final Class service; + private OSGiHost host; + + /** + * 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 service the service type + * @param host the OSGi host + */ + public OSGiService(String name, + CompositeComponent parent, + WireService wireService, + String osgiServiceName, + Class service, + OSGiHost host) { + super(name, service, parent, wireService); + this.osgiServiceName = osgiServiceName; + //this.service = service; + this.host = host; + } + + public void start() { + super.start(); + Properties properties = new Properties(); + Object instance = getServiceInstance(); + 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 + } + + 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/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/BundleContextUtil.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/BundleContextUtil.java new file mode 100755 index 0000000000..02549a59fd --- /dev/null +++ b/branches/sca-java-M2/sca/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/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/ClassloaderHook.java b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/ClassloaderHook.java new file mode 100644 index 0000000000..9e08c04ded --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/java/org/apache/tuscany/osgi/util/ClassloaderHook.java @@ -0,0 +1,82 @@ +/* + * 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.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() { + 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/branches/sca-java-M2/sca/runtime/osgi/src/main/resources/META-INF/MANIFEST.MF b/branches/sca-java-M2/sca/runtime/osgi/src/main/resources/META-INF/MANIFEST.MF new file mode 100755 index 0000000000..bb72ca36e5 --- /dev/null +++ b/branches/sca-java-M2/sca/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/branches/sca-java-M2/sca/runtime/osgi/src/main/resources/META-INF/sca/osgibinding.scdl b/branches/sca-java-M2/sca/runtime/osgi/src/main/resources/META-INF/sca/osgibinding.scdl new file mode 100755 index 0000000000..14dfbbbbca --- /dev/null +++ b/branches/sca-java-M2/sca/runtime/osgi/src/main/resources/META-INF/sca/osgibinding.scdl @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3