From 5809eb91a5a212df926ad67ee7b34f26ffbb4de3 Mon Sep 17 00:00:00 2001 From: Simon Laws Date: Fri, 23 Mar 2012 17:26:56 +0000 Subject: [PATCH] TUSCANY-4032 - serialize the "isForCallback" flag for an endpoint service so that the SCAClient can ignore callback endpoints in the remote case. git-svn-id: https://svn.apache.org/repos/asf/tuscany/sca-java-2.x/trunk@1304510 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/assembly/xml/EndpointProcessor.java | 17 ++- .../interfaces/ClientClientComponentImpl.java | 81 ++++++++++++ .../sca/itest/interfaces/ClientComponent.java | 2 + .../MatchDistributedClient.composite | 5 + .../MatchDistributedClientClient.composite | 29 +++++ .../interfaces/InerfaceMatchTestCase.java | 119 +++++++++++++++++- 6 files changed, 251 insertions(+), 2 deletions(-) create mode 100644 testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientClientComponentImpl.java create mode 100644 testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClientClient.composite diff --git a/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/EndpointProcessor.java b/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/EndpointProcessor.java index 2102113ea1..6bfc775117 100644 --- a/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/EndpointProcessor.java +++ b/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/EndpointProcessor.java @@ -49,6 +49,8 @@ public class EndpointProcessor extends BaseAssemblyProcessor implements StAXArtifactProcessor { private final static String ENDPOINT = "endpoint"; private final static QName ENDPOINT_QNAME = new QName(Constants.SCA11_TUSCANY_NS, ENDPOINT); + private final static String CALLBACK_ENDPOINT = "callbackEndpoint"; + private final static QName CALLBACK_ENDPOINT_QNAME = new QName(Constants.SCA11_TUSCANY_NS, CALLBACK_ENDPOINT); private ExtensionPointRegistry registry; @@ -93,6 +95,12 @@ public Endpoint read(XMLStreamReader reader, ProcessorContext context) throws Co endpoint.setService(service); endpoint.setBinding(binding); + // We use the name of the composite to indicate if this is a callback endpoint + // saves passing other extension attributes + if (composite.getName().equals(CALLBACK_ENDPOINT_QNAME)){ + service.setForCallback(true); + } + // retrieve the stash of intents and policy sets from the component endpoint.getRequiredIntents().addAll(component.getRequiredIntents()); endpoint.getPolicySets().addAll(component.getPolicySets()); @@ -109,7 +117,14 @@ public void write(Endpoint model, XMLStreamWriter writer, ProcessorContext conte private Composite wrap(Endpoint endpoint) { try { Composite composite = assemblyFactory.createComposite(); - composite.setName(ENDPOINT_QNAME); + // We use the name of the composite (which just wraps the single endpoint + // to indicate whether this endpoint represents a callback or not + if (endpoint.getService() != null && + endpoint.getService().isForCallback()){ + composite.setName(CALLBACK_ENDPOINT_QNAME); + } else { + composite.setName(ENDPOINT_QNAME); + } composite.setLocal(false); if (endpoint.getComponent() != null) { Component component = (Component)endpoint.getComponent().clone(); diff --git a/testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientClientComponentImpl.java b/testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientClientComponentImpl.java new file mode 100644 index 0000000000..66988094e7 --- /dev/null +++ b/testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientClientComponentImpl.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.sca.itest.interfaces; + +import org.oasisopen.sca.annotation.Reference; +import org.oasisopen.sca.annotation.Service; + +/* + * Test that a client can be reference using a target name containing only the component + * name when the client has callback services registered. + */ +@Service(ClientComponent.class) +public class ClientClientComponentImpl implements ClientComponent{ + + @Reference + protected ClientComponent aClient; + + public String foo(ParameterObject po) { + return aClient.foo(po); + } + + public String foo1(ParameterObject po) { + return aClient.foo1(po); + } + + public String foo2(String str) throws Exception { + return str + "AComponent"; + } + + public String foo3(String str, int i) { + return str + "AComponent" + i; + } + + public String foo4(int i, String str) throws Exception { + return str + "AComponent" + i; + } + + public void callback(String str) { + } + + public void callbackMethod(String str) { + } + + public void callbackMethod1(String str) { + } + + public void callModifyParameter() { + } + + public String getCallbackValue() { + return null; + } + + public void onewayMethod(String str) { + } + + public String getOnewayValue() { + return null; + } + + public void modifyParameter(ParameterObject po) { + } + +} diff --git a/testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientComponent.java b/testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientComponent.java index ac5c2c5817..c6a6499126 100644 --- a/testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientComponent.java +++ b/testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientComponent.java @@ -20,10 +20,12 @@ package org.apache.tuscany.sca.itest.interfaces; import org.oasisopen.sca.annotation.OneWay; +import org.oasisopen.sca.annotation.Remotable; /* * itest for interface: local,method-overloading */ +@Remotable public interface ClientComponent { String foo(ParameterObject po); diff --git a/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClient.composite b/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClient.composite index 5a423f8561..7a373f2f31 100644 --- a/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClient.composite +++ b/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClient.composite @@ -21,6 +21,11 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MatchDistributedClient" > + + + + + diff --git a/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClientClient.composite b/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClientClient.composite new file mode 100644 index 0000000000..d0f2bc25ba --- /dev/null +++ b/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClientClient.composite @@ -0,0 +1,29 @@ + + + + + + + + + + \ No newline at end of file diff --git a/testing/itest/interface-matching/src/test/java/org/apache/tuscany/sca/itest/interfaces/InerfaceMatchTestCase.java b/testing/itest/interface-matching/src/test/java/org/apache/tuscany/sca/itest/interfaces/InerfaceMatchTestCase.java index 6afb0ecd27..ade96178d2 100644 --- a/testing/itest/interface-matching/src/test/java/org/apache/tuscany/sca/itest/interfaces/InerfaceMatchTestCase.java +++ b/testing/itest/interface-matching/src/test/java/org/apache/tuscany/sca/itest/interfaces/InerfaceMatchTestCase.java @@ -23,6 +23,7 @@ import junit.framework.Assert; +import org.apache.tuscany.sca.TuscanyRuntime; import org.apache.tuscany.sca.assembly.SCABinding; import org.apache.tuscany.sca.binding.ws.WebServiceBinding; import org.apache.tuscany.sca.node.Node; @@ -31,6 +32,7 @@ import org.junit.Ignore; import org.junit.Test; import org.oasisopen.sca.ServiceRuntimeException; +import org.oasisopen.sca.client.SCAClientFactory; public class InerfaceMatchTestCase { @@ -248,5 +250,120 @@ public void testWSDistributedRemotable() throws Exception { node1.stop(); node2.stop(); - } + } + + /** + * Remotable client and service interfaces where the interfaces match. + * Components running in the separate composite/JVM, i.e. there is a remote registry + * Access from an SCALient call to make sure that it is able to connect to the remote + * registry. + * + * + * @throws Exception + */ + @Test + public void testDistributedRemotableSCAClient() throws Exception { + + // Force the remote default binding to be web services + System.setProperty("org.apache.tuscany.sca.binding.sca.provider.SCABindingMapper.mappedBinding", + "{http://docs.oasis-open.org/ns/opencsa/sca/200912}binding.ws"); + + TuscanyRuntime runtime = TuscanyRuntime.newInstance(); + +/* + org.apache.tuscany.sca.Node nodeA = runtime.createNode("default"); + nodeA.installContribution("nodeAContrib", "./target/classes", null, null); + nodeA.startComposite("node1Contrib", "org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClient.composite"); + + org.apache.tuscany.sca.Node nodeB = runtime.createNode("default"); + nodeB.installContribution("nodeAContrib", "./target/classes", null, null); + nodeB.startComposite("node1Contrib", "org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedService.composite"); +*/ + + String [] contributions = {"./target/classes"}; + Node node1 = NodeFactory.newInstance().createNode(URI.create("uri:default"), + "org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClient.composite", + contributions); + node1.start(); + + Node node2 = NodeFactory.newInstance().createNode(URI.create("uri:default"), + "org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedService.composite", + contributions); + + // force default binding on node2 to use a different port from node 1(which will default to 8080 + ((NodeImpl)node2).getConfiguration().addBinding(WebServiceBinding.TYPE, "http://localhost:8081/"); + ((NodeImpl)node2).getConfiguration().addBinding(SCABinding.TYPE, "http://localhost:8081/"); + node2.start(); + + SCAClientFactory clientFactory = SCAClientFactory.newInstance(URI.create("default")); + ClientComponent local = clientFactory.getService(ClientComponent.class, "LocalClientClientComponent"); + + ParameterObject po = new ParameterObject(); + + try { + String response = local.foo1(po); + Assert.assertEquals("AComponent", response); + } catch (ServiceRuntimeException ex){ + Assert.fail("Unexpected exception with foo " + ex.toString()); + } + +/* Used to keep the composites alive when running the next (ignored) test manually + System.out.println("Press a key to end"); + try { + System.in.read(); + } catch (Exception ex) { + } + System.out.println("Continuing"); +*/ + node1.stop(); + node2.stop(); + } + + /** + * Allows you to manually call the previous test from a separate VM to + * ensure that endpoint serialization to the client work OK. It's not + * intended to run as part of the test suite. + * + * + * @throws Exception + */ + @Test + @Ignore + public void testDistributedRemotableSCAClientSeparateVM() throws Exception { + // Force the remote default binding to be web services + System.setProperty("org.apache.tuscany.sca.binding.sca.provider.SCABindingMapper.mappedBinding", + "{http://docs.oasis-open.org/ns/opencsa/sca/200912}binding.ws"); + + // Make a reference target point across VMs to a component that has callback services + String [] contributions = {"./target/classes"}; + + Node node3 = NodeFactory.newInstance().createNode(URI.create("uri:default"), + "org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClientClient.composite", + contributions); + node3.start(); + + SCAClientFactory clientFactory = SCAClientFactory.newInstance(URI.create("default")); + ClientComponent clientClient = clientFactory.getService(ClientComponent.class, "DistributedClientClientComponent"); + + ParameterObject po = new ParameterObject(); + + try { + String response = clientClient.foo1(po); + Assert.assertEquals("AComponent", response); + } catch (ServiceRuntimeException ex){ + Assert.fail("Unexpected exception with foo " + ex.toString()); + } + + // Make an SCAClient point across VMs to a component that has callback services + ClientComponent client = clientFactory.getService(ClientComponent.class, "DistributedClientComponent"); + + try { + String response = client.foo1(po); + Assert.assertEquals("AComponent", response); + } catch (ServiceRuntimeException ex){ + Assert.fail("Unexpected exception with foo " + ex.toString()); + } + + node3.stop(); + } }