Skip to content

Commit

Permalink
TUSCANY-4032 - serialize the "isForCallback" flag for an endpoint ser…
Browse files Browse the repository at this point in the history
…vice 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
  • Loading branch information
Simon Laws committed Mar 23, 2012
1 parent b108681 commit 5809eb9
Show file tree
Hide file tree
Showing 6 changed files with 251 additions and 2 deletions.
Expand Up @@ -49,6 +49,8 @@
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;

Expand Down Expand Up @@ -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());
Expand All @@ -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();
Expand Down
@@ -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) {
}

}
Expand Up @@ -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);
Expand Down
Expand Up @@ -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" />
Expand Down
@@ -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>
Expand Up @@ -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;
Expand All @@ -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 {

Expand Down Expand Up @@ -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();
}
}

0 comments on commit 5809eb9

Please sign in to comment.