diff options
author | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2012-03-23 17:26:56 +0000 |
---|---|---|
committer | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2012-03-23 17:26:56 +0000 |
commit | 3d3b1538aaf57eb4dac00c808240102dc7ebebe8 (patch) | |
tree | bf7d31eb63503aaa41908afcc51dd523b6b23659 /sca-java-2.x/trunk | |
parent | 2b658cba22046ff1deee29562fe073bcabe4cdc0 (diff) |
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: http://svn.us.apache.org/repos/asf/tuscany@1304510 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
6 files changed, 251 insertions, 2 deletions
diff --git a/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/EndpointProcessor.java b/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/EndpointProcessor.java index 2102113ea1..6bfc775117 100644 --- a/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/EndpointProcessor.java +++ b/sca-java-2.x/trunk/modules/assembly-xml/src/main/java/org/apache/tuscany/sca/assembly/xml/EndpointProcessor.java @@ -49,6 +49,8 @@ import org.apache.tuscany.sca.policy.PolicySet; public class EndpointProcessor extends BaseAssemblyProcessor implements StAXArtifactProcessor<Endpoint> { 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 class EndpointProcessor extends BaseAssemblyProcessor implements StAXArti 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 class EndpointProcessor extends BaseAssemblyProcessor implements StAXArti 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/sca-java-2.x/trunk/testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientClientComponentImpl.java b/sca-java-2.x/trunk/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/sca-java-2.x/trunk/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/sca-java-2.x/trunk/testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientComponent.java b/sca-java-2.x/trunk/testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientComponent.java index ac5c2c5817..c6a6499126 100644 --- a/sca-java-2.x/trunk/testing/itest/interface-matching/src/main/java/org/apache/tuscany/sca/itest/interfaces/ClientComponent.java +++ b/sca-java-2.x/trunk/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/sca-java-2.x/trunk/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClient.composite b/sca-java-2.x/trunk/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClient.composite index 5a423f8561..7a373f2f31 100644 --- a/sca-java-2.x/trunk/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClient.composite +++ b/sca-java-2.x/trunk/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" >
+ <component name="LocalClientClientComponent">
+ <implementation.java class="org.apache.tuscany.sca.itest.interfaces.ClientClientComponentImpl" />
+ <reference name="aClient" target="DistributedClientComponent" />
+ </component>
+
<component name="DistributedClientComponent">
<implementation.java class="org.apache.tuscany.sca.itest.interfaces.ClientComponentImpl" />
<reference name="aCallBackService" target="DistributedServiceComponent" />
diff --git a/sca-java-2.x/trunk/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClientClient.composite b/sca-java-2.x/trunk/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/sca-java-2.x/trunk/testing/itest/interface-matching/src/main/resources/org/apache/tuscany/sca/itest/interfaces/match/distributed/MatchDistributedClientClient.composite @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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
+ * 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://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:foo="http://foo" targetNamespace="http://foo"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ name="MatchDistributedClientClient" >
+
+ <component name="DistributedClientClientComponent">
+ <implementation.java class="org.apache.tuscany.sca.itest.interfaces.ClientClientComponentImpl" />
+ <reference name="aClient" target="DistributedClientComponent" />
+ </component>
+
+</composite>
\ No newline at end of file diff --git a/sca-java-2.x/trunk/testing/itest/interface-matching/src/test/java/org/apache/tuscany/sca/itest/interfaces/InerfaceMatchTestCase.java b/sca-java-2.x/trunk/testing/itest/interface-matching/src/test/java/org/apache/tuscany/sca/itest/interfaces/InerfaceMatchTestCase.java index 6afb0ecd27..ade96178d2 100644 --- a/sca-java-2.x/trunk/testing/itest/interface-matching/src/test/java/org/apache/tuscany/sca/itest/interfaces/InerfaceMatchTestCase.java +++ b/sca-java-2.x/trunk/testing/itest/interface-matching/src/test/java/org/apache/tuscany/sca/itest/interfaces/InerfaceMatchTestCase.java @@ -23,6 +23,7 @@ import java.net.URI; 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.apache.tuscany.sca.node.impl.NodeImpl; 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 class InerfaceMatchTestCase { 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();
+ }
}
|