From dcbff0df93448ef786c2e5cb0320f3895759171b Mon Sep 17 00:00:00 2001 From: slaws Date: Thu, 19 Mar 2009 16:12:22 +0000 Subject: Switch over to new endpoint reference/endpoint model. These are the changes required to exploit the model in the runtime up to the point were the old EndpointReference is retrieved from a wire. The next step is to convert this over too and exploit the new endpoint references fully. There is still tidying to do (search for TODO - EPR) in particular I haven't removed any of the old files yet. So beware don't put changes into CompositeActivator or RuntimeWire as the runtime isn't using them git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@756070 13f79535-47bb-0310-9956-ffa450edef68 --- .../main/resources/META-INF/sca-contribution.xml | 4 +- .../tuscany/sca/test/callback/MyClientImpl1.java | 2 +- .../tuscany/sca/test/callback/MyClientImpl2.java | 2 +- .../java/test/sca/tests/MultiLevelTestCase.java | 1 + .../resources/AutoWiredReferencesTest.composite | 4 - .../main/resources/InnerReferencesTest.composite | 3 - .../resources/ManualWiredReferencesTest.composite | 4 - .../references/AutoWiredReferenceTestCase.java | 3 +- .../itest/references/InnerReferenceTestCase.java | 2 +- .../org/apache/tuscany/sca/assembly/Endpoint2.java | 17 + .../assembly/builder/EndpointReferenceBuilder.java | 17 - .../sca/assembly/builder/impl/BaseBuilderImpl.java | 1 + .../impl/ComponentConfigurationBuilderImpl.java | 2 +- ...onentReferenceEndpointReferenceBuilderImpl.java | 435 +++++++++++++++++++++ .../ComponentReferencePromotionBuilderImpl.java | 171 ++++++++ ...ComponentReferencePromotionWireBuilderImpl.java | 7 +- .../impl/ComponentReferenceWireBuilderImpl.java | 8 +- .../impl/ComponentServiceEndpointBuilderImpl.java | 153 ++++++++ .../builder/impl/CompositeBuilderImpl.java | 91 +++-- ...CompositeReferenceConfigurationBuilderImpl.java | 1 + ...ositeReferenceEndpointReferenceBuilderImpl.java | 418 -------------------- .../CompositeServiceConfigurationBuilderImpl.java | 1 + .../impl/CompositeServiceEndpointBuilderImpl.java | 124 ------ .../builder/impl/ReferenceConfigurationUtil.java | 76 +--- .../tuscany/sca/assembly/impl/Endpoint2Impl.java | 24 +- .../sca/assembly/impl/EndpointReference2Impl.java | 8 +- .../tuscany/sca/assembly/impl/ReferenceImpl.java | 2 + .../src/test/resources/RMIBindingTest.composite | 23 +- .../itests/QuestionMarkWSDLImportTestCase.java | 4 +- .../itests/QuestionMarkWSDLIncludeTestCase.java | 4 +- .../ws/axis2/itests/QuestionMarkWSDLTestCase.java | 7 +- .../binding/ws/axis2/itests/HelloWorld.composite | 30 +- .../ws/axis2/itests/HelloWorldNoWSDL.composite | 33 +- .../itests/endpoints/DefaultMultiService.composite | 23 +- .../endpoints/DefaultSingleService.composite | 23 +- .../itests/endpoints/WSDLExplicitURI.composite | 20 +- .../itests/endpoints/WSDLRelativeURI.composite | 21 +- .../ws/axis2/itests/epr/HelloWorld.composite | 33 +- .../ws/axis2/itests/helloworld-om-merged.composite | 18 +- .../ws/axis2/itests/helloworld-om.composite | 20 +- .../ws/axis2/itests/helloworld-prec.composite | 20 +- .../itests/questionmark-wsdl-import.composite | 7 +- .../itests/questionmark-wsdl-include.composite | 7 +- .../ws/axis2/itests/questionmark-wsdl.composite | 15 +- .../binding/ws/wsdlgen/WSDLServiceGenerator.java | 1 + .../sca/runtime/RuntimeComponentReference.java | 8 + .../apache/tuscany/sca/runtime/RuntimeWire.java | 15 + .../assembly/impl/CompositeActivatorImpl2.java | 21 +- .../sca/core/assembly/impl/EndpointWireImpl.java | 5 + .../impl/RuntimeComponentReferenceImpl.java | 17 +- .../sca/core/assembly/impl/RuntimeWireImpl.java | 5 + .../sca/core/assembly/impl/RuntimeWireImpl2.java | 29 +- .../core/context/impl/CallableReferenceImpl.java | 25 +- .../core/context/impl/ComponentContextImpl.java | 37 ++ .../invocation/impl/CallbackReferenceImpl.java | 53 ++- .../impl/JDKCallbackInvocationHandler.java | 5 +- .../core/invocation/impl/JDKInvocationHandler.java | 4 +- ...he.tuscany.sca.core.assembly.CompositeActivator | 2 +- .../impl/EndpointReferenceBuilderImpl.java | 406 ++----------------- .../org/apache/tuscany/sca/node/impl/NodeImpl.java | 16 +- .../src/main/resources/helloworld.composite | 4 + 61 files changed, 1273 insertions(+), 1269 deletions(-) create mode 100644 java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceEndpointReferenceBuilderImpl.java create mode 100644 java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferencePromotionBuilderImpl.java create mode 100644 java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentServiceEndpointBuilderImpl.java delete mode 100644 java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeReferenceEndpointReferenceBuilderImpl.java delete mode 100644 java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeServiceEndpointBuilderImpl.java (limited to 'java/sca') diff --git a/java/sca/itest/callback-basic/src/main/resources/META-INF/sca-contribution.xml b/java/sca/itest/callback-basic/src/main/resources/META-INF/sca-contribution.xml index 5816a12c70..b58fabcd79 100644 --- a/java/sca/itest/callback-basic/src/main/resources/META-INF/sca-contribution.xml +++ b/java/sca/itest/callback-basic/src/main/resources/META-INF/sca-contribution.xml @@ -17,7 +17,7 @@ * specific language governing permissions and limitations * under the License. --> - + \ No newline at end of file diff --git a/java/sca/itest/callback-multiple-wires/src/main/java/org/apache/tuscany/sca/test/callback/MyClientImpl1.java b/java/sca/itest/callback-multiple-wires/src/main/java/org/apache/tuscany/sca/test/callback/MyClientImpl1.java index 0fe34b9d68..c3ea6c3032 100644 --- a/java/sca/itest/callback-multiple-wires/src/main/java/org/apache/tuscany/sca/test/callback/MyClientImpl1.java +++ b/java/sca/itest/callback-multiple-wires/src/main/java/org/apache/tuscany/sca/test/callback/MyClientImpl1.java @@ -43,7 +43,7 @@ public class MyClientImpl1 implements MyClient, MyServiceCallback { public void receiveResult(String result) { System.out.println("Work thread " + Thread.currentThread()); - System.out.println("Result: " + result); + System.out.println("Result in client1: " + result); MyClientImpl1.result = result; } } diff --git a/java/sca/itest/callback-multiple-wires/src/main/java/org/apache/tuscany/sca/test/callback/MyClientImpl2.java b/java/sca/itest/callback-multiple-wires/src/main/java/org/apache/tuscany/sca/test/callback/MyClientImpl2.java index 6b455a1f5b..84ca158c97 100644 --- a/java/sca/itest/callback-multiple-wires/src/main/java/org/apache/tuscany/sca/test/callback/MyClientImpl2.java +++ b/java/sca/itest/callback-multiple-wires/src/main/java/org/apache/tuscany/sca/test/callback/MyClientImpl2.java @@ -43,7 +43,7 @@ public class MyClientImpl2 implements MyClient, MyServiceCallback { public void receiveResult(String result) { System.out.println("Work thread " + Thread.currentThread()); - System.out.println("Result: " + result); + System.out.println("Result in client2: " + result); MyClientImpl2.result = result; } } diff --git a/java/sca/itest/recursive-multi-level/src/test/java/test/sca/tests/MultiLevelTestCase.java b/java/sca/itest/recursive-multi-level/src/test/java/test/sca/tests/MultiLevelTestCase.java index da14cdef13..b9b4e3ba7c 100644 --- a/java/sca/itest/recursive-multi-level/src/test/java/test/sca/tests/MultiLevelTestCase.java +++ b/java/sca/itest/recursive-multi-level/src/test/java/test/sca/tests/MultiLevelTestCase.java @@ -27,6 +27,7 @@ import org.apache.tuscany.sca.node.Node; import org.apache.tuscany.sca.node.NodeFactory; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; /** diff --git a/java/sca/itest/references/src/main/resources/AutoWiredReferencesTest.composite b/java/sca/itest/references/src/main/resources/AutoWiredReferencesTest.composite index 46cc6fa8da..5300107706 100644 --- a/java/sca/itest/references/src/main/resources/AutoWiredReferencesTest.composite +++ b/java/sca/itest/references/src/main/resources/AutoWiredReferencesTest.composite @@ -19,10 +19,6 @@ - - - - diff --git a/java/sca/itest/references/src/main/resources/InnerReferencesTest.composite b/java/sca/itest/references/src/main/resources/InnerReferencesTest.composite index 02ee7dd3f7..be4ac75b3c 100644 --- a/java/sca/itest/references/src/main/resources/InnerReferencesTest.composite +++ b/java/sca/itest/references/src/main/resources/InnerReferencesTest.composite @@ -19,9 +19,6 @@ - - - diff --git a/java/sca/itest/references/src/main/resources/ManualWiredReferencesTest.composite b/java/sca/itest/references/src/main/resources/ManualWiredReferencesTest.composite index 084b86a3b1..d5596e3da4 100644 --- a/java/sca/itest/references/src/main/resources/ManualWiredReferencesTest.composite +++ b/java/sca/itest/references/src/main/resources/ManualWiredReferencesTest.composite @@ -19,10 +19,6 @@ - - - - diff --git a/java/sca/itest/references/src/test/java/org/apache/tuscany/sca/itest/references/AutoWiredReferenceTestCase.java b/java/sca/itest/references/src/test/java/org/apache/tuscany/sca/itest/references/AutoWiredReferenceTestCase.java index 1034bda02d..76264d308f 100644 --- a/java/sca/itest/references/src/test/java/org/apache/tuscany/sca/itest/references/AutoWiredReferenceTestCase.java +++ b/java/sca/itest/references/src/test/java/org/apache/tuscany/sca/itest/references/AutoWiredReferenceTestCase.java @@ -28,6 +28,7 @@ import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; +import org.oasisopen.sca.ServiceUnavailableException; public class AutoWiredReferenceTestCase { private static Node node; @@ -69,7 +70,7 @@ public class AutoWiredReferenceTestCase { assertEquals("BCComponent", acomponent.fooBC()); } - @Test(expected = NullPointerException.class) + @Test(expected = Exception.class) public void testD1Reference() { acomponent.fooD1(); } diff --git a/java/sca/itest/references/src/test/java/org/apache/tuscany/sca/itest/references/InnerReferenceTestCase.java b/java/sca/itest/references/src/test/java/org/apache/tuscany/sca/itest/references/InnerReferenceTestCase.java index db2e3f175d..6e4212fd9a 100644 --- a/java/sca/itest/references/src/test/java/org/apache/tuscany/sca/itest/references/InnerReferenceTestCase.java +++ b/java/sca/itest/references/src/test/java/org/apache/tuscany/sca/itest/references/InnerReferenceTestCase.java @@ -91,7 +91,7 @@ public class InnerReferenceTestCase { Assert.assertTrue(components.contains("DComponent1")); } - @Test(expected = NullPointerException.class) + @Test(expected = Exception.class) public void testRequiredFalseReference() { acomponent.getDReference().dFoo(); } diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/Endpoint2.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/Endpoint2.java index 2fe3595292..254432434c 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/Endpoint2.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/Endpoint2.java @@ -18,6 +18,8 @@ */ package org.apache.tuscany.sca.assembly; +import java.util.List; + import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.policy.PolicySubject; @@ -95,6 +97,21 @@ public interface Endpoint2 extends Base, PolicySubject, Cloneable { */ void setInterfaceContract(InterfaceContract interfaceContract); + /** + * Get the services callbacl enpoint references that + * represent endpoint references from which callbacks + * originate + * + * @return callbackEndpoint the reference callback endpoint + */ + List getCallbackEndpointReferences(); + + /** + * Set the reference callback endpoint refefences + * + * @param callbackEndpoint the reference callback endpoint + */ + void setCallbackEndpointReferences(List callbackEndpointReferences); // not sure these are required diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/EndpointReferenceBuilder.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/EndpointReferenceBuilder.java index f84648c203..d8e9888aef 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/EndpointReferenceBuilder.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/EndpointReferenceBuilder.java @@ -38,23 +38,6 @@ import org.apache.tuscany.sca.monitor.Monitor; */ public interface EndpointReferenceBuilder { - /** - * Create endpoint references for a component reference - * - * @param composite - * @param component - * @param reference - * @param components - * @param componentServices - * @param monitor - */ - public void createEndpointReferences(Composite composite, - Component component, - ComponentReference reference, - Map components, - Map componentServices, - Monitor monitor); - /** * Build an endpoint reference matching reference bindings * with service bindings. diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseBuilderImpl.java index 3e8022863d..6720aecb50 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseBuilderImpl.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/BaseBuilderImpl.java @@ -199,6 +199,7 @@ public abstract class BaseBuilderImpl implements CompositeBuilder { String uri = component.getName() + '/' + componentService.getName(); componentServices.put(uri, componentService); + // TODO - EPR - $promoted$ no longer used but it doesn't do any harm here boolean promotedService = false; if (componentService.getName() != null && componentService.getName().indexOf("$promoted$") > -1) { promotedService = true; diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentConfigurationBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentConfigurationBuilderImpl.java index 64747978a5..812e06942a 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentConfigurationBuilderImpl.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentConfigurationBuilderImpl.java @@ -233,7 +233,7 @@ public class ComponentConfigurationBuilderImpl extends BaseBuilderImpl implement for (ComponentReference reference : component.getReferences()) { if (reference.getInterfaceContract() != null && // can be null in // unit tests - reference.getInterfaceContract().getCallbackInterface() != null) { + reference.getInterfaceContract().getCallbackInterface() != null) { ComponentService service = componentServices.get(reference.getName()); if (service == null) { diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceEndpointReferenceBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceEndpointReferenceBuilderImpl.java new file mode 100644 index 0000000000..1c60428afa --- /dev/null +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceEndpointReferenceBuilderImpl.java @@ -0,0 +1,435 @@ +/* + * 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.assembly.builder.impl; + +import java.net.URI; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.Binding; +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.ComponentReference; +import org.apache.tuscany.sca.assembly.ComponentService; +import org.apache.tuscany.sca.assembly.Composite; +import org.apache.tuscany.sca.assembly.CompositeReference; +import org.apache.tuscany.sca.assembly.Endpoint; +import org.apache.tuscany.sca.assembly.Endpoint2; +import org.apache.tuscany.sca.assembly.EndpointFactory; +import org.apache.tuscany.sca.assembly.EndpointReference2; +import org.apache.tuscany.sca.assembly.Implementation; +import org.apache.tuscany.sca.assembly.Multiplicity; +import org.apache.tuscany.sca.assembly.OptimizableBinding; +import org.apache.tuscany.sca.assembly.Reference; +import org.apache.tuscany.sca.assembly.SCABinding; +import org.apache.tuscany.sca.assembly.builder.CompositeBuilder; +import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException; +import org.apache.tuscany.sca.assembly.builder.DefaultEndpointBuilder; +import org.apache.tuscany.sca.definitions.Definitions; +import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper; +import org.apache.tuscany.sca.monitor.Monitor; +import org.apache.tuscany.sca.policy.PolicySet; +import org.apache.tuscany.sca.policy.PolicySubject; + +/** + * A composite builder that creates endpoint reference models. + * + * @version $Rev$ $Date$ + */ +public class ComponentReferenceEndpointReferenceBuilderImpl extends BaseBuilderImpl implements CompositeBuilder { + + + public ComponentReferenceEndpointReferenceBuilderImpl(AssemblyFactory assemblyFactory, InterfaceContractMapper interfaceContractMapper) { + super(assemblyFactory, null, null, null, interfaceContractMapper); + } + + public String getID() { + return "org.apache.tuscany.sca.assembly.builder.ComponentReferenceEndpointReferenceBuilder"; + } + + /** + * Create endpoint references for all component references. + * + * @param composite + */ + public void build(Composite composite, Definitions definitions, Monitor monitor) throws CompositeBuilderException + { + // process top level composite references + // TODO - I don't think OASIS allows for these + // + //processCompositeReferences(composite); + + // process component services + processComponentReferences(composite, monitor); + } + + private void processCompositeReferences(Composite composite) { + // TODO do we need this for OASIS? + } + + private void processComponentReferences(Composite composite, Monitor monitor) { + + // index all of the components in the composite + Map components = new HashMap(); + indexComponents(composite, components); + + // index all of the services in the composite + Map componentServices = new HashMap(); + indexServices(composite, componentServices); + + // create endpoint references for each component's references + for (Component component : composite.getComponents()) { + // recurse for composite implementations + Implementation implementation = component.getImplementation(); + if (implementation instanceof Composite) { + processComponentReferences((Composite)implementation, monitor); + } + + // create endpoint references to represent the component reference + for (ComponentReference reference : component.getReferences()) { + createReferenceEndpointReferences(composite, component, reference, components, componentServices, monitor); + } + } + } + + private void createReferenceEndpointReferences(Composite composite, + Component component, + ComponentReference reference, + Map components, + Map componentServices, + Monitor monitor) + { + if (reference.getAutowire() == Boolean.TRUE && + reference.getTargets().isEmpty()) { + + // Find suitable targets in the current composite for an + // autowired reference + Multiplicity multiplicity = reference.getMultiplicity(); + for (Component targetComponent : composite.getComponents()) { + + // prevent autowire connecting to self + boolean skipSelf = false; + for (ComponentReference targetComponentReference : targetComponent.getReferences()) { + if (reference == targetComponentReference) { + skipSelf = true; + } + } + + if (!skipSelf) { + for (ComponentService targetComponentService : targetComponent.getServices()) { + if (reference.getInterfaceContract() == null || + interfaceContractMapper.isCompatible(reference.getInterfaceContract(), + targetComponentService.getInterfaceContract())) { + // create endpoint reference + EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); + endpointRef.setComponent(component); + endpointRef.setReference(reference); + endpointRef.setTargetName(targetComponentService.getName()); + endpointRef.setUnresolved(false); + + // create dummy endpoint. This will be replaced when policies + // are matched and bindings are configured later + Endpoint2 endpoint = assemblyFactory.createEndpoint(); + endpoint.setComponent(targetComponent); + endpoint.setService(targetComponentService); + endpoint.setUnresolved(true); + endpointRef.setTargetEndpoint(endpoint); + + reference.getEndpointReferences().add(endpointRef); + + if (multiplicity == Multiplicity.ZERO_ONE || + multiplicity == Multiplicity.ONE_ONE) { + break; + } + } + } + } + } + + if (multiplicity == Multiplicity.ONE_N || + multiplicity == Multiplicity.ONE_ONE) { + if (reference.getEndpointReferences().size() == 0) { + warning(monitor, + "NoComponentReferenceTarget", + reference, + reference.getName()); + } + } + + } else if (!reference.getTargets().isEmpty()) { + + // Check that the component reference does not mix the use of + // endpoint references specified via the target attribute with + // the presence of binding elements + if (reference.getBindings().size() > 0) { + warning(monitor, "ReferenceEndPointMixWithTarget", + composite, reference.getName()); + } + + // Resolve targets specified on the component reference + for (ComponentService target : reference.getTargets()) { + + String targetName = target.getName(); + ComponentService targetComponentService = componentServices.get(targetName); + + Component targetComponent; + int s = targetName.indexOf('/'); + if (s == -1) { + targetComponent = components.get(targetName); + } else { + targetComponent = components.get(targetName.substring(0, s)); + } + + if (targetComponentService != null) { + + // Check that the target component service provides + // a superset of the component reference interface + if (reference.getInterfaceContract() == null || + interfaceContractMapper.isCompatible(reference.getInterfaceContract(), + targetComponentService.getInterfaceContract())) { + + // create endpoint reference + EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); + endpointRef.setComponent(component); + endpointRef.setReference(reference); + endpointRef.setTargetName(targetComponentService.getName()); + endpointRef.setUnresolved(false); + + // create dummy endpoint. This will be replaced when policies + // are matched and bindings are configured later + Endpoint2 endpoint = assemblyFactory.createEndpoint(); + endpoint.setComponent(targetComponent); + endpoint.setService(targetComponentService); + endpoint.setUnresolved(true); + endpointRef.setTargetEndpoint(endpoint); + + reference.getEndpointReferences().add(endpointRef); + } else { + warning(monitor, + "ReferenceIncompatibleInterface", + composite, + composite.getName().toString(), + reference.getName(), + targetName); + } + } else { + // add an unresolved endpoint reference + EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); + endpointRef.setComponent(component); + endpointRef.setReference(reference); + endpointRef.setTargetName(targetName); + endpointRef.setUnresolved(true); + + // create an unresolved endpoint to go with it + Endpoint2 endpoint = assemblyFactory.createEndpoint(); + endpoint.setUnresolved(true); + endpointRef.setTargetEndpoint(endpoint); + + warning(monitor, + "ComponentReferenceTargetNotFound", + composite, + composite.getName().toString(), + targetName); + } + } + } else if ((reference.getReference() != null) + && (!reference.getReference().getTargets().isEmpty())) { + + // Resolve targets from the corresponding reference in the + // componentType + for (ComponentService target : reference.getReference().getTargets()) { + + String targetName = target.getName(); + ComponentService targetComponentService = componentServices.get(targetName); + + Component targetComponent; + int s = targetName.indexOf('/'); + if (s == -1) { + targetComponent = components.get(targetName); + } else { + targetComponent = components.get(targetName.substring(0, s)); + } + + if (targetComponentService != null) { + + // Check that the target component service provides + // a superset of the component reference interface + if (reference.getInterfaceContract() == null || + interfaceContractMapper.isCompatible(reference.getInterfaceContract(), + targetComponentService.getInterfaceContract())) { + + // create endpoint reference + EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); + endpointRef.setComponent(component); + endpointRef.setReference(reference); + endpointRef.setTargetName(targetComponentService.getName()); + endpointRef.setUnresolved(false); + + // create dummy endpoint. This will be replaced when policies + // are matched and bindings are configured later + Endpoint2 endpoint = assemblyFactory.createEndpoint(); + endpoint.setComponent(targetComponent); + endpoint.setService(targetComponentService); + endpoint.setUnresolved(true); + endpointRef.setTargetEndpoint(endpoint); + + reference.getEndpointReferences().add(endpointRef); + } else { + warning(monitor, + "ReferenceIncompatibleInterface", + composite, + composite.getName().toString(), + reference.getName(), + targetName); + } + } else { + // add an unresolved endpoint reference + EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); + endpointRef.setComponent(component); + endpointRef.setReference(reference); + endpointRef.setTargetName(targetName); + endpointRef.setUnresolved(true); + + // create an unresolved endpoint to go with it + Endpoint2 endpoint = assemblyFactory.createEndpoint(); + endpoint.setUnresolved(true); + endpointRef.setTargetEndpoint(endpoint); + + warning(monitor, + "ComponentReferenceTargetNotFound", + composite, + composite.getName().toString(), + targetName); + } + } + } + + + // if no endpoints have found so far the bindings become targets. + if (reference.getEndpointReferences().isEmpty()) { + for (Binding binding : reference.getBindings()) { + + String uri = binding.getURI(); + + // user hasn't put a uri on the binding so it's not a target + // name + if (uri == null) { + // create endpoint reference for manually configured bindings + EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); + endpointRef.setComponent(component); + endpointRef.setReference(reference); + endpointRef.setBinding(binding); + endpointRef.setTargetName(null); + endpointRef.setTargetEndpoint(null); + endpointRef.setUnresolved(false); + + // create a resolved endpoint to signify that this + // reference is pointing at some unwired endpoint + Endpoint2 endpoint = assemblyFactory.createEndpoint(); + endpoint.setUnresolved(false); + endpointRef.setTargetEndpoint(endpoint); + + reference.getEndpointReferences().add(endpointRef); + + continue; + } + + // user might have put a local target name in the uri + // see if it refers to a target we know about + // - if it does the reference binding will be matched with a + // service binding + // - if it doesn't it is assumed to be an external reference + Component targetComponent = null; + ComponentService targetComponentService = null; + + + if (uri.startsWith("/")) { + uri = uri.substring(1); + } + + // Resolve the target component and service + targetComponentService = componentServices.get(uri); + int s = uri.indexOf('/'); + if (s == -1) { + targetComponent = components.get(uri); + } else { + targetComponent = components.get(uri.substring(0, s)); + } + + // if the binding URI matches a component in the + // composite then configure an endpoint reference with this component as + // the target. If not then the binding URI will be assumed to reference an + // external service + if (targetComponentService != null) { + + // Check that the target component service provides + // a superset of the component reference interface + if (reference.getInterfaceContract() == null || + interfaceContractMapper.isCompatible(reference.getInterfaceContract(), + targetComponentService.getInterfaceContract())) { + // create enpoint reference + EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); + endpointRef.setComponent(component); + endpointRef.setReference(reference); + endpointRef.setBinding(binding); + endpointRef.setTargetName(targetComponentService.getName()); + endpointRef.setUnresolved(false); + + // create dummy endpoint. This will be replaced when policies + // are matched and bindings are configured later + Endpoint2 endpoint = assemblyFactory.createEndpoint(); + endpoint.setComponent(targetComponent); + endpoint.setService(targetComponentService); + endpoint.setUnresolved(true); + endpointRef.setTargetEndpoint(endpoint); + + reference.getEndpointReferences().add(endpointRef); + } else { + warning(monitor, + "ReferenceIncompatibleInterface", + composite, + composite.getName().toString(), + reference.getName(), + uri); + } + } else { + // create endpoint reference for manually configured bindings + EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); + endpointRef.setComponent(component); + endpointRef.setReference(reference); + endpointRef.setBinding(binding); + endpointRef.setTargetName(null); + endpointRef.setTargetEndpoint(null); + endpointRef.setUnresolved(false); + + // create a resolved endpoint to signify that this + // reference is pointing at some unwired endpoint + Endpoint2 endpoint = assemblyFactory.createEndpoint(); + endpoint.setUnresolved(false); + endpointRef.setTargetEndpoint(endpoint); + + reference.getEndpointReferences().add(endpointRef); + } + } + } + } +} diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferencePromotionBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferencePromotionBuilderImpl.java new file mode 100644 index 0000000000..2d3c89ca7b --- /dev/null +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferencePromotionBuilderImpl.java @@ -0,0 +1,171 @@ +/* + * 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.assembly.builder.impl; + +import java.util.List; + +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.ComponentReference; +import org.apache.tuscany.sca.assembly.ComponentService; +import org.apache.tuscany.sca.assembly.Composite; +import org.apache.tuscany.sca.assembly.CompositeReference; +import org.apache.tuscany.sca.assembly.CompositeService; +import org.apache.tuscany.sca.assembly.EndpointFactory; +import org.apache.tuscany.sca.assembly.Implementation; +import org.apache.tuscany.sca.assembly.Multiplicity; +import org.apache.tuscany.sca.assembly.Reference; +import org.apache.tuscany.sca.assembly.SCABinding; +import org.apache.tuscany.sca.assembly.builder.CompositeBuilder; +import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException; +import org.apache.tuscany.sca.definitions.Definitions; +import org.apache.tuscany.sca.monitor.Monitor; + +/** + * A composite builder that handles the creation of promoted composite services. + * + * @version $Rev$ $Date$ + */ +public class ComponentReferencePromotionBuilderImpl implements CompositeBuilder { + private AssemblyFactory assemblyFactory; + private EndpointFactory endpointFactory; + + public ComponentReferencePromotionBuilderImpl(AssemblyFactory assemblyFactory, EndpointFactory endpointFactory) { + this.assemblyFactory = assemblyFactory; + this.endpointFactory = endpointFactory; + } + + public void build(Composite composite, Definitions definitions, Monitor monitor) throws CompositeBuilderException { + configureNestedCompositeReferences(composite, monitor); + } + + public String getID() { + return "org.apache.tuscany.sca.assembly.builder.ComponentReferencePromotionBuilder"; + } + + /** + * Push down reference configuration into nested composites. + * + * @param composite + * @param problems + */ + private void configureNestedCompositeReferences(Composite composite, Monitor monitor) { + + // Process nested composites recursively + for (Component component : composite.getComponents()) { + Implementation implementation = component.getImplementation(); + if (implementation instanceof Composite) { + configureNestedCompositeReferences((Composite)implementation, monitor); + } + } + + // Process component references declared on components in this composite + for (Component component : composite.getComponents()) { + Implementation implementation = component.getImplementation(); + if (implementation instanceof Composite) { + for (ComponentReference componentReference : component.getReferences()) { + Reference implReference = componentReference.getReference(); + if (implReference != null && implReference instanceof CompositeReference) { + + // If the component reference is wired, it is a promotion override + if (!componentReference.getEndpointReferences().isEmpty()) { + componentReference.setPromotionOverride(true); + } + + // If the component reference is a promotion override, override the + // configuration of the promoted reference + if (componentReference.isPromotionOverride()) { + CompositeReference compositeReference = (CompositeReference)implReference; + List promotedReferences = + ReferenceConfigurationUtil.getPromotedComponentReferences(compositeReference); + for (ComponentReference promotedReference : promotedReferences) { + ReferenceConfigurationUtil.reconcileReferenceBindings( + componentReference, promotedReference, assemblyFactory, endpointFactory, monitor); + if (componentReference.getInterfaceContract() != null && // can be null in unit tests + componentReference.getInterfaceContract().getCallbackInterface() != null) { + SCABinding scaCallbackBinding = promotedReference.getCallbackBinding(SCABinding.class); + if (promotedReference.getCallback() != null) { + promotedReference.getCallback().getBindings().clear(); + } else { + promotedReference.setCallback(assemblyFactory.createCallback()); + } + if (scaCallbackBinding != null) { + promotedReference.getCallback().getBindings().add(scaCallbackBinding); + } + if (componentReference.getCallback() != null) { + promotedReference.getCallback().getBindings().addAll(componentReference + .getCallback().getBindings()); + } + } + /* TODO - let endpoint references worry about target service + // Wire the promoted reference to the actual non-composite component services + if (promotedReference.getMultiplicity() == Multiplicity.ONE_ONE) { + // promotedReference.getTargets().clear(); + } + for (ComponentService target : componentReference.getTargets()) { + if (target.getService() instanceof CompositeService) { + + // Wire to the actual component service + // promoted by a composite service + CompositeService compositeService = (CompositeService)target.getService(); + // Find the promoted component service + ComponentService componentService = + ServiceConfigurationUtil.getPromotedComponentService(compositeService); + if (componentService != null) { + promotedReference.getTargets().add(componentService); + } + } else { + + // Wire to a non-composite target service + promotedReference.getTargets().add(target); + } + } +*/ + } + } + } + } + } else { +/* TODO - let endpoint references worry about target servicep + for (ComponentReference componentReference : component.getReferences()) { + + // Wire the component reference to the actual + // non-composite component services + List targets = componentReference.getTargets(); + for (int i = 0, n = targets.size(); i < n; i++) { + ComponentService target = targets.get(i); + if (target.getService() instanceof CompositeService) { + + // Wire to the actual component service + // promoted by a composite service + CompositeService compositeService = (CompositeService)target.getService(); + ComponentService componentService = compositeService.getPromotedService(); + if (componentService != null) { + targets.set(i, componentService); + } + } + } + } +*/ + } + } + } + +} diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferencePromotionWireBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferencePromotionWireBuilderImpl.java index 4ceb4bb079..c6b6b38851 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferencePromotionWireBuilderImpl.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferencePromotionWireBuilderImpl.java @@ -85,7 +85,7 @@ public class ComponentReferencePromotionWireBuilderImpl implements CompositeBuil if (implReference != null && implReference instanceof CompositeReference) { // If the component reference is wired, it is a promotion override - if (!componentReference.getEndpoints().isEmpty()) { + if (!componentReference.getEndpointReferences().isEmpty()) { componentReference.setPromotionOverride(true); } @@ -114,7 +114,7 @@ public class ComponentReferencePromotionWireBuilderImpl implements CompositeBuil .getCallback().getBindings()); } } - + /* TODO - let endpoint references worry about target service // Wire the promoted reference to the actual non-composite component services if (promotedReference.getMultiplicity() == Multiplicity.ONE_ONE) { // promotedReference.getTargets().clear(); @@ -137,11 +137,13 @@ public class ComponentReferencePromotionWireBuilderImpl implements CompositeBuil promotedReference.getTargets().add(target); } } +*/ } } } } } else { +/* TODO - let endpoint references worry about target servicep for (ComponentReference componentReference : component.getReferences()) { // Wire the component reference to the actual @@ -161,6 +163,7 @@ public class ComponentReferencePromotionWireBuilderImpl implements CompositeBuil } } } +*/ } } } diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceWireBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceWireBuilderImpl.java index dc99d1dc3d..99d4defb21 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceWireBuilderImpl.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceWireBuilderImpl.java @@ -104,7 +104,7 @@ public class ComponentReferenceWireBuilderImpl extends BaseBuilderImpl implement connectWires(composite, componentServices, componentReferences, monitor); // Connect component references to their targets - connectComponentReferences(composite, components, componentServices, componentReferences, monitor); +// connectComponentReferences(composite, components, componentServices, componentReferences, monitor); // Validate that references are wired or promoted, according // to their multiplicity @@ -133,9 +133,9 @@ public class ComponentReferenceWireBuilderImpl extends BaseBuilderImpl implement // Finally clear the original reference target lists as we now have // bindings to represent the targets - for (ComponentReference componentReference : componentReferences.values()) { - componentReference.getTargets().clear(); - } + // for (ComponentReference componentReference : componentReferences.values()) { + // componentReference.getTargets().clear(); + // } } /** diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentServiceEndpointBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentServiceEndpointBuilderImpl.java new file mode 100644 index 0000000000..1205bfeef4 --- /dev/null +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentServiceEndpointBuilderImpl.java @@ -0,0 +1,153 @@ +/* + * 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.assembly.builder.impl; + +import java.util.List; + +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.Binding; +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.ComponentReference; +import org.apache.tuscany.sca.assembly.ComponentService; +import org.apache.tuscany.sca.assembly.Composite; +import org.apache.tuscany.sca.assembly.CompositeReference; +import org.apache.tuscany.sca.assembly.CompositeService; +import org.apache.tuscany.sca.assembly.Endpoint2; +import org.apache.tuscany.sca.assembly.EndpointFactory; +import org.apache.tuscany.sca.assembly.EndpointReference2; +import org.apache.tuscany.sca.assembly.Implementation; +import org.apache.tuscany.sca.assembly.Reference; +import org.apache.tuscany.sca.assembly.SCABinding; +import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.assembly.builder.CompositeBuilder; +import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException; +import org.apache.tuscany.sca.definitions.Definitions; +import org.apache.tuscany.sca.monitor.Monitor; + +/** + * A composite builder that creates endpoint models for component services. + * + * @version $Rev$ $Date$ + */ +public class ComponentServiceEndpointBuilderImpl implements CompositeBuilder { + private AssemblyFactory assemblyFactory; + + public ComponentServiceEndpointBuilderImpl(AssemblyFactory assemblyFactory) { + this.assemblyFactory = assemblyFactory; + } + + public String getID() { + return "org.apache.tuscany.sca.assembly.builder.ComponentReferenceEndpointReferenceBuilder"; + } + + /** + * Create endpoint models for all component services. + * + * @param composite + */ + public void build(Composite composite, Definitions definitions, Monitor monitor) throws CompositeBuilderException { + + // process top level composite services + // TODO - I don't think OASIS spec doesn't allows composite references in the domain composite + // + // processCompositeServices(composite); + + // process component services + processComponentServices(composite); + + } + + private void processCompositeServices(Composite composite) { + // top level services are treated slightly differently + // as no component will use these top level services + // as part of its component type. In this case we push down + // the service configuration to create a new endpoint on the + // component from which the service is promoted + for (Service service : composite.getServices()) { + + Component promotedComponent = ((CompositeService)service).getPromotedComponent(); + ComponentService promotedService = ((CompositeService)service).getPromotedService(); + + if (promotedService != null) { + for (Binding binding : service.getBindings()){ + Endpoint2 endpoint = assemblyFactory.createEndpoint(); + endpoint.setComponent(promotedComponent); + endpoint.setService(promotedService); + endpoint.setBinding(binding); + endpoint.setUnresolved(false); + promotedService.getEndpoints().add(endpoint); + } + } + } + } + + private void processComponentServices(Composite composite) { + + for (Component component : composite.getComponents()) { + + // recurse for composite implementations + Implementation implementation = component.getImplementation(); + if (implementation instanceof Composite) { + processComponentServices((Composite)implementation); + } + + // create an endpoint for each component service binding + for (ComponentService service : component.getServices()) { + + Component endpointComponent = component; + ComponentService endpointService = service; + + // TODO - EPR - We maintain all endpoints at the right level now + // but endpoints for promoting services must point down + // to the services they promote. + if (service.getService() instanceof CompositeService) { + CompositeService compositeService = (CompositeService)service.getService(); + endpointService = ServiceConfigurationUtil.getPromotedComponentService(compositeService); + endpointComponent = ServiceConfigurationUtil.getPromotedComponent(compositeService); + } + + // if this service has a callback get the callback endpoint references + List callbackEndpointReferences = null; + + if ((service.getInterfaceContract() != null) && + (service.getInterfaceContract().getCallbackInterface() != null)){ + // find the callback reference + for ( Reference reference : component.getReferences()){ + if ( reference.getName().equals(service.getName())){ + callbackEndpointReferences = reference.getEndpointReferences(); + break; + } + } + } + + for (Binding binding : service.getBindings()){ + Endpoint2 endpoint = assemblyFactory.createEndpoint(); + endpoint.setComponent(endpointComponent); + endpoint.setService(endpointService); + endpoint.setBinding(binding); + endpoint.setCallbackEndpointReferences(callbackEndpointReferences); + endpoint.setUnresolved(false); + service.getEndpoints().add(endpoint); + } + } + } + } + +} diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java index 7157d8a217..6c8228d58a 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java @@ -46,22 +46,23 @@ public class CompositeBuilderImpl implements CompositeBuilder { private static final Logger logger = Logger.getLogger(CompositeBuilderImpl.class.getName()); private CompositeBuilder compositeIncludeBuilder; private CompositeBuilder componentReferenceWireBuilder; - private CompositeBuilder componentReferencePromotionWireBuilder; - private CompositeBuilder compositeReferenceWireBuilder; + //private CompositeBuilder componentReferencePromotionWireBuilder; + private CompositeBuilder componentReferencePromotionBuilder; + //private CompositeBuilder compositeReferenceWireBuilder; private CompositeBuilder compositeCloneBuilder; private CompositeBuilder componentConfigurationBuilder; private CompositeBuilder compositeServiceConfigurationBuilder; private CompositeBuilder compositeReferenceConfigurationBuilder; private CompositeBuilder compositeBindingURIBuilder; - private CompositeBuilder componentServicePromotionBuilder; - private CompositeBuilder compositeServicePromotionBuilder; + //private CompositeBuilder componentServicePromotionBuilder; + //private CompositeBuilder compositeServicePromotionBuilder; private CompositeBuilder compositePromotionBuilder; private CompositeBuilder compositePolicyBuilder; private CompositeBuilder componentServiceBindingBuilder; private CompositeBuilder componentReferenceBindingBuilder; - private CompositeBuilder compositeReferenceEndpointReferenceBuilder; - private CompositeBuilder compositeServiceEndpointBuilder; + private CompositeBuilder componentReferenceEndpointReferenceBuilder; + private CompositeBuilder componentServiceEndpointBuilder; //private CompositeBuilder endpointReferenceBuilder; public CompositeBuilderImpl(FactoryExtensionPoint factories, InterfaceContractMapper mapper) { @@ -161,22 +162,23 @@ public class CompositeBuilderImpl implements CompositeBuilder { compositeIncludeBuilder = new CompositeIncludeBuilderImpl(); componentReferenceWireBuilder = new ComponentReferenceWireBuilderImpl(assemblyFactory, endpointFactory, interfaceContractMapper); - componentReferencePromotionWireBuilder = new ComponentReferencePromotionWireBuilderImpl(assemblyFactory, endpointFactory); - compositeReferenceWireBuilder = new CompositeReferenceWireBuilderImpl(assemblyFactory, endpointFactory); + //componentReferencePromotionWireBuilder = new ComponentReferencePromotionWireBuilderImpl(assemblyFactory, endpointFactory); + componentReferencePromotionBuilder = new ComponentReferencePromotionBuilderImpl(assemblyFactory, endpointFactory); + //compositeReferenceWireBuilder = new CompositeReferenceWireBuilderImpl(assemblyFactory, endpointFactory); compositeCloneBuilder = new CompositeCloneBuilderImpl(); componentConfigurationBuilder = new ComponentConfigurationBuilderImpl(assemblyFactory, scaBindingFactory, documentBuilderFactory, transformerFactory, interfaceContractMapper); compositeServiceConfigurationBuilder = new CompositeServiceConfigurationBuilderImpl(assemblyFactory); compositeReferenceConfigurationBuilder = new CompositeReferenceConfigurationBuilderImpl(assemblyFactory); compositeBindingURIBuilder = new CompositeBindingURIBuilderImpl(assemblyFactory, scaBindingFactory, documentBuilderFactory, transformerFactory, interfaceContractMapper); - componentServicePromotionBuilder = new ComponentServicePromotionBuilderImpl(assemblyFactory); - compositeServicePromotionBuilder = new CompositeServicePromotionBuilderImpl(assemblyFactory); + //componentServicePromotionBuilder = new ComponentServicePromotionBuilderImpl(assemblyFactory); + //compositeServicePromotionBuilder = new CompositeServicePromotionBuilderImpl(assemblyFactory); compositePromotionBuilder = new CompositePromotionBuilderImpl(assemblyFactory, endpointFactory, interfaceContractMapper); compositePolicyBuilder = new CompositePolicyBuilderImpl(assemblyFactory, endpointFactory, interfaceContractMapper); componentServiceBindingBuilder = new ComponentServiceBindingBuilderImpl(); componentReferenceBindingBuilder = new ComponentReferenceBindingBuilderImpl(); - compositeReferenceEndpointReferenceBuilder = new CompositeReferenceEndpointReferenceBuilderImpl(assemblyFactory, interfaceContractMapper); - compositeServiceEndpointBuilder = new CompositeServiceEndpointBuilderImpl(assemblyFactory); + componentReferenceEndpointReferenceBuilder = new ComponentReferenceEndpointReferenceBuilderImpl(assemblyFactory, interfaceContractMapper); + componentServiceEndpointBuilder = new ComponentServiceEndpointBuilderImpl(assemblyFactory); //endpointReferenceBuilder = new EndpointReference2BuilderImpl(assemblyFactory, interfaceContractMapper); } @@ -201,51 +203,58 @@ public class CompositeBuilderImpl implements CompositeBuilder { // Compute the policies across the model hierarchy compositePolicyBuilder.build(composite, definitions, monitor); - // Configure composite services + // Configure composite services by copying bindings up the promotion + // hierarchy overwriting automatic bindings with those added manually compositeServiceConfigurationBuilder.build(composite, definitions, monitor); - // Configure composite references + // Configure composite references by copying bindings down promotion + // hierarchy overwriting automatic bindings with those added manually compositeReferenceConfigurationBuilder.build(composite, definitions, monitor); - // Configure binding URIs + // Configure service binding URIs and names. Creates an SCA defined URI based + // on the scheme base URI, the component name and the binding name compositeBindingURIBuilder.build(composite, definitions, monitor); - // Create promoted component services - componentServicePromotionBuilder.build(composite, definitions, monitor); + // Create $promoted$ component services on bottom level components + // to represent promoted services + // TODO - EPR replaced by endpoints on the promoted services + //componentServicePromotionBuilder.build(composite, definitions, monitor); - // Create promoted composite services - compositeServicePromotionBuilder.build(composite, definitions, monitor); + // Create $promoted$ component services on bottom level components + // to represent promoted composite services + // TODO - EPR OASIS doesn't deploy top level composite services + // if it did it would be replaced by endpoints + //compositeServicePromotionBuilder.build(composite, definitions, monitor); - // Build component service binding-related information + // Perform and service binding related build activities. The binding + // will provide the builder. componentServiceBindingBuilder.build(composite, definitions, monitor); - // =============================================== - // TODO - temporarily add OASIS endpoint builders - // create service endpoint models - compositeServiceEndpointBuilder.build(composite, definitions, monitor); - // create reference enpointreference models - compositeReferenceEndpointReferenceBuilder.build(composite, definitions, monitor); - // =============================================== - + // create endpoints on component services. + componentServiceEndpointBuilder.build(composite, definitions, monitor); - // Wire the components + // Apply any wires in the composite to create new component reference targets componentReferenceWireBuilder.build(composite, definitions, monitor); + + // create reference endpoint reference models + componentReferenceEndpointReferenceBuilder.build(composite, definitions, monitor); + + // Push down configuration from promoted references to the + // references they promote + componentReferencePromotionBuilder.build(composite, definitions, monitor); - // Wire the promoted component references - componentReferencePromotionWireBuilder.build(composite, definitions, monitor); + // Push down configuration from promoted references to the + // references they promote + // TODO - EPR Seems to be a repeat of compositeReferenceConfigurationBuilder + // componentReferencePromotionWireBuilder.build(composite, definitions, monitor); // Wire the composite references - compositeReferenceWireBuilder.build(composite, definitions, monitor); - - // Build component reference binding-related information - componentReferenceBindingBuilder.build(composite, definitions, monitor); + // TODO - EPR OASIS doesn't deploy top level composite references + // compositeReferenceWireBuilder.build(composite, definitions, monitor); - // =============================================== - // TODO this needs to be offloaded to a plugpoint - // could be called upon when rebuilding wires - // wire endpoint references to endpoints - //endpointReferenceBuilder.build(composite, definitions, monitor); - // =============================================== + // Perform and reference binding related build activities. The binding + // will provide the builder. + componentReferenceBindingBuilder.build(composite, definitions, monitor); } } diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeReferenceConfigurationBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeReferenceConfigurationBuilderImpl.java index a89f0d402f..1623591a9f 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeReferenceConfigurationBuilderImpl.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeReferenceConfigurationBuilderImpl.java @@ -56,6 +56,7 @@ public class CompositeReferenceConfigurationBuilderImpl implements CompositeBuil configureNestedCompositeReferences(composite); // Process top level composite references + // TODO - In OASIS the treament of top level composite references is different so need to review for (Reference reference : composite.getReferences()) { CompositeReference compositeReference = (CompositeReference)reference; diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeReferenceEndpointReferenceBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeReferenceEndpointReferenceBuilderImpl.java deleted file mode 100644 index 5de60c114d..0000000000 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeReferenceEndpointReferenceBuilderImpl.java +++ /dev/null @@ -1,418 +0,0 @@ -/* - * 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.assembly.builder.impl; - -import java.net.URI; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.tuscany.sca.assembly.AssemblyFactory; -import org.apache.tuscany.sca.assembly.Binding; -import org.apache.tuscany.sca.assembly.Component; -import org.apache.tuscany.sca.assembly.ComponentReference; -import org.apache.tuscany.sca.assembly.ComponentService; -import org.apache.tuscany.sca.assembly.Composite; -import org.apache.tuscany.sca.assembly.CompositeReference; -import org.apache.tuscany.sca.assembly.Endpoint; -import org.apache.tuscany.sca.assembly.Endpoint2; -import org.apache.tuscany.sca.assembly.EndpointFactory; -import org.apache.tuscany.sca.assembly.EndpointReference2; -import org.apache.tuscany.sca.assembly.Implementation; -import org.apache.tuscany.sca.assembly.Multiplicity; -import org.apache.tuscany.sca.assembly.OptimizableBinding; -import org.apache.tuscany.sca.assembly.Reference; -import org.apache.tuscany.sca.assembly.SCABinding; -import org.apache.tuscany.sca.assembly.builder.CompositeBuilder; -import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException; -import org.apache.tuscany.sca.assembly.builder.DefaultEndpointBuilder; -import org.apache.tuscany.sca.definitions.Definitions; -import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper; -import org.apache.tuscany.sca.monitor.Monitor; -import org.apache.tuscany.sca.policy.PolicySet; -import org.apache.tuscany.sca.policy.PolicySubject; - -/** - * A composite builder that creates endpoint reference models. - * - * @version $Rev$ $Date$ - */ -public class CompositeReferenceEndpointReferenceBuilderImpl extends BaseBuilderImpl implements CompositeBuilder { - - - public CompositeReferenceEndpointReferenceBuilderImpl(AssemblyFactory assemblyFactory, InterfaceContractMapper interfaceContractMapper) { - super(assemblyFactory, null, null, null, interfaceContractMapper); - } - - public String getID() { - return "org.apache.tuscany.sca.assembly.builder.ComponentReferenceEndpointReferenceBuilder"; - } - - /** - * Create endpoint references for all component references. - * - * @param composite - */ - public void build(Composite composite, Definitions definitions, Monitor monitor) throws CompositeBuilderException - { - // process top level composite references - // TODO - I don't think OASIS allows for these - // - //processCompositeReferences(composite); - - // process component services - processComponentReferences(composite, monitor); - } - - private void processCompositeReferences(Composite composite) { - // TODO do we need this for OASIS? - } - - private void processComponentReferences(Composite composite, Monitor monitor) { - - // index all of the components in the composite - Map components = new HashMap(); - indexComponents(composite, components); - - // index all of the services in the composite - Map componentServices = new HashMap(); - indexServices(composite, componentServices); - - // create endpoint references for each component's references - for (Component component : composite.getComponents()) { - // recurse for composite implementations - Implementation implementation = component.getImplementation(); - if (implementation instanceof Composite) { - processComponentReferences((Composite)implementation, monitor); - } - - // create endpoint references to represent the component reference - for (ComponentReference reference : component.getReferences()) { - createReferenceEndpointReferences(composite, component, reference, components, componentServices, monitor); - } - } - } - - private void createReferenceEndpointReferences(Composite composite, - Component component, - ComponentReference reference, - Map components, - Map componentServices, - Monitor monitor) - { - if (reference.getAutowire() == Boolean.TRUE && - reference.getTargets().isEmpty()) { - - // Find suitable targets in the current composite for an - // autowired reference - Multiplicity multiplicity = reference.getMultiplicity(); - for (Component targetComponent : composite.getComponents()) { - - // prevent autowire connecting to self - boolean skipSelf = false; - for (ComponentReference targetComponentReference : targetComponent.getReferences()) { - if (reference == targetComponentReference) { - skipSelf = true; - } - } - - if (!skipSelf) { - for (ComponentService targetComponentService : targetComponent.getServices()) { - if (reference.getInterfaceContract() == null || - interfaceContractMapper.isCompatible(reference.getInterfaceContract(), - targetComponentService.getInterfaceContract())) { - // create endpoint reference - EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setTargetName(targetComponentService.getName()); - endpointRef.setUnresolved(false); - - // create dummy endpoint. This will be replaced when policies - // are matched and bindings are configured later - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setComponent(targetComponent); - endpoint.setService(targetComponentService); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - reference.getEndpointReferences().add(endpointRef); - - if (multiplicity == Multiplicity.ZERO_ONE || - multiplicity == Multiplicity.ONE_ONE) { - break; - } - } - } - } - } - - if (multiplicity == Multiplicity.ONE_N || - multiplicity == Multiplicity.ONE_ONE) { - if (reference.getEndpointReferences().size() == 0) { - warning(monitor, - "NoComponentReferenceTarget", - reference, - reference.getName()); - } - } - - } else if (!reference.getTargets().isEmpty()) { - - // Check that the component reference does not mix the use of - // endpoint references specified via the target attribute with - // the presence of binding elements - if (reference.getBindings().size() > 0) { - warning(monitor, "ReferenceEndPointMixWithTarget", - composite, reference.getName()); - } - - // Resolve targets specified on the component reference - for (ComponentService target : reference.getTargets()) { - - String targetName = target.getName(); - ComponentService targetComponentService = componentServices.get(targetName); - - Component targetComponent; - int s = targetName.indexOf('/'); - if (s == -1) { - targetComponent = components.get(targetName); - } else { - targetComponent = components.get(targetName.substring(0, s)); - } - - if (targetComponentService != null) { - - // Check that the target component service provides - // a superset of the component reference interface - if (reference.getInterfaceContract() == null || - interfaceContractMapper.isCompatible(reference.getInterfaceContract(), - targetComponentService.getInterfaceContract())) { - - // create endpoint reference - EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setTargetName(targetComponentService.getName()); - endpointRef.setUnresolved(false); - - // create dummy endpoint. This will be replaced when policies - // are matched and bindings are configured later - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setComponent(targetComponent); - endpoint.setService(targetComponentService); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - reference.getEndpointReferences().add(endpointRef); - } else { - warning(monitor, - "ReferenceIncompatibleInterface", - composite, - composite.getName().toString(), - reference.getName(), - targetName); - } - } else { - // add an unresolved endpoint reference - EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setTargetName(targetName); - endpointRef.setUnresolved(true); - - // create an unresolved endpoint to go with it - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - warning(monitor, - "ComponentReferenceTargetNotFound", - composite, - composite.getName().toString(), - targetName); - } - } - } else if ((reference.getReference() != null) - && (!reference.getReference().getTargets().isEmpty())) { - - // Resolve targets from the corresponding reference in the - // componentType - for (ComponentService target : reference.getReference().getTargets()) { - - String targetName = target.getName(); - ComponentService targetComponentService = componentServices.get(targetName); - - Component targetComponent; - int s = targetName.indexOf('/'); - if (s == -1) { - targetComponent = components.get(targetName); - } else { - targetComponent = components.get(targetName.substring(0, s)); - } - - if (targetComponentService != null) { - - // Check that the target component service provides - // a superset of the component reference interface - if (reference.getInterfaceContract() == null || - interfaceContractMapper.isCompatible(reference.getInterfaceContract(), - targetComponentService.getInterfaceContract())) { - - // create endpoint reference - EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setTargetName(targetComponentService.getName()); - endpointRef.setUnresolved(false); - - // create dummy endpoint. This will be replaced when policies - // are matched and bindings are configured later - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setComponent(targetComponent); - endpoint.setService(targetComponentService); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - reference.getEndpointReferences().add(endpointRef); - } else { - warning(monitor, - "ReferenceIncompatibleInterface", - composite, - composite.getName().toString(), - reference.getName(), - targetName); - } - } else { - // add an unresolved endpoint reference - EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setTargetName(targetName); - endpointRef.setUnresolved(true); - - // create an unresolved endpoint to go with it - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - warning(monitor, - "ComponentReferenceTargetNotFound", - composite, - composite.getName().toString(), - targetName); - } - } - } - - - // if no endpoints have found so far the bindings become targets. - if (reference.getEndpointReferences().isEmpty()) { - for (Binding binding : reference.getBindings()) { - - String uri = binding.getURI(); - - // user hasn't put a uri on the binding so it's not a target - // name - if (uri == null) { - continue; - } - - // user might have put a local target name in the uri - // see if it refers to a target we know about - // - if it does the reference binding will be matched with a - // service binding - // - if it doesn't it is assumed to be an external reference - Component targetComponent = null; - ComponentService targetComponentService = null; - - - if (uri.startsWith("/")) { - uri = uri.substring(1); - } - - // Resolve the target component and service - targetComponentService = componentServices.get(uri); - int s = uri.indexOf('/'); - if (s == -1) { - targetComponent = components.get(uri); - } else { - targetComponent = components.get(uri.substring(0, s)); - } - - // if the binding URI matches a component in the - // composite then configure an endpoint reference with this component as - // the target. If not then the binding URI will be assumed to reference an - // external service - if (targetComponentService != null) { - - // Check that the target component service provides - // a superset of the component reference interface - if (reference.getInterfaceContract() == null || - interfaceContractMapper.isCompatible(reference.getInterfaceContract(), - targetComponentService.getInterfaceContract())) { - // create enpoint reference - EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setBinding(binding); - endpointRef.setTargetName(targetComponentService.getName()); - endpointRef.setUnresolved(false); - - // create dummy endpoint. This will be replaced when policies - // are matched and bindings are configured later - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setComponent(targetComponent); - endpoint.setService(targetComponentService); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - reference.getEndpointReferences().add(endpointRef); - } else { - warning(monitor, - "ReferenceIncompatibleInterface", - composite, - composite.getName().toString(), - reference.getName(), - uri); - } - } else { - // create endpoint reference for manually configured bindings - EndpointReference2 endpointRef = assemblyFactory.createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setBinding(binding); - endpointRef.setTargetName(null); - endpointRef.setTargetEndpoint(null); - endpointRef.setUnresolved(false); - - // create a resolved endpoint to signify that this - // reference is pointing at some unwired endpoint - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setUnresolved(false); - endpointRef.setTargetEndpoint(endpoint); - - reference.getEndpointReferences().add(endpointRef); - } - } - } - } -} diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeServiceConfigurationBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeServiceConfigurationBuilderImpl.java index 2fc5e571b2..2bdcf7b19d 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeServiceConfigurationBuilderImpl.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeServiceConfigurationBuilderImpl.java @@ -55,6 +55,7 @@ public class CompositeServiceConfigurationBuilderImpl implements CompositeBuilde // Process nested composites recursively configureNestedCompositeServices(composite); + // TODO - In OASIS the treatment of top level composite services it different // Process top level composite services for (Service service : composite.getServices()) { CompositeService compositeService = (CompositeService)service; diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeServiceEndpointBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeServiceEndpointBuilderImpl.java deleted file mode 100644 index a933fd6991..0000000000 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeServiceEndpointBuilderImpl.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * 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.assembly.builder.impl; - -import java.util.List; - -import org.apache.tuscany.sca.assembly.AssemblyFactory; -import org.apache.tuscany.sca.assembly.Binding; -import org.apache.tuscany.sca.assembly.Component; -import org.apache.tuscany.sca.assembly.ComponentReference; -import org.apache.tuscany.sca.assembly.ComponentService; -import org.apache.tuscany.sca.assembly.Composite; -import org.apache.tuscany.sca.assembly.CompositeReference; -import org.apache.tuscany.sca.assembly.CompositeService; -import org.apache.tuscany.sca.assembly.Endpoint2; -import org.apache.tuscany.sca.assembly.EndpointFactory; -import org.apache.tuscany.sca.assembly.Implementation; -import org.apache.tuscany.sca.assembly.Reference; -import org.apache.tuscany.sca.assembly.SCABinding; -import org.apache.tuscany.sca.assembly.Service; -import org.apache.tuscany.sca.assembly.builder.CompositeBuilder; -import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException; -import org.apache.tuscany.sca.definitions.Definitions; -import org.apache.tuscany.sca.monitor.Monitor; - -/** - * A composite builder that creates endpoint models for component services. - * - * @version $Rev$ $Date$ - */ -public class CompositeServiceEndpointBuilderImpl implements CompositeBuilder { - private AssemblyFactory assemblyFactory; - - public CompositeServiceEndpointBuilderImpl(AssemblyFactory assemblyFactory) { - this.assemblyFactory = assemblyFactory; - } - - public String getID() { - return "org.apache.tuscany.sca.assembly.builder.ComponentReferenceEndpointReferenceBuilder"; - } - - /** - * Create endpoint models for all component services. - * - * @param composite - */ - public void build(Composite composite, Definitions definitions, Monitor monitor) throws CompositeBuilderException { - - // process top level composite services - // TODO - I don't think OASIS spec doesn't allows composite references in the domain composite - // - // processCompositeServices(composite); - - // process component services - processComponentServices(composite); - - } - - private void processCompositeServices(Composite composite) { - // top level services are treated slightly differently - // as no component will use these top level services - // as part of its component type. In this case we push down - // the service configuration to create a new endpoint on the - // component from which the service is promoted - for (Service service : composite.getServices()) { - - Component promotedComponent = ((CompositeService)service).getPromotedComponent(); - ComponentService promotedService = ((CompositeService)service).getPromotedService(); - - if (promotedService != null) { - for (Binding binding : service.getBindings()){ - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setComponent(promotedComponent); - endpoint.setService(promotedService); - endpoint.setBinding(binding); - endpoint.setUnresolved(false); - promotedService.getEndpoints().add(endpoint); - } - } - } - } - - private void processComponentServices(Composite composite) { - - for (Component component : composite.getComponents()) { - - // recurse for composite implementations - Implementation implementation = component.getImplementation(); - if (implementation instanceof Composite) { - processComponentServices((Composite)implementation); - } - - // create an endpoint for each component service binding - for (ComponentService service : component.getServices()) { - for (Binding binding : service.getBindings()){ - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setComponent(component); - endpoint.setService(service); - endpoint.setBinding(binding); - endpoint.setUnresolved(false); - service.getEndpoints().add(endpoint); - } - } - } - } - -} diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ReferenceConfigurationUtil.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ReferenceConfigurationUtil.java index 0612f9ae0e..adf03a1b32 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ReferenceConfigurationUtil.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ReferenceConfigurationUtil.java @@ -174,76 +174,22 @@ abstract class ReferenceConfigurationUtil { if (promotedReference.getMultiplicity() == Multiplicity.ONE_ONE || promotedReference.getMultiplicity() == Multiplicity.ZERO_ONE) { - // if necessary override the promoted endpoints (and bindings) with the top level bindings - if (reference.getBindings().size() > 0 ){ - - List bindingsToCopyDown = new ArrayList(); - List endpointsToCopyDown = new ArrayList(); - - for (Binding binding : reference.getBindings()) { - if ((!(binding instanceof OptimizableBinding)) || binding.getURI() != null) { - bindingsToCopyDown.add(binding); - - if (reference instanceof ComponentReference){ - for (Endpoint endpoint : ((ComponentReference)reference).getEndpoints()){ - if ( endpoint.getSourceBinding() == binding){ - endpointsToCopyDown.add(endpoint); - break; - } - } - } else { - // create a new endpoint to represent this promoted binding - Endpoint endpoint = endpointFactory.createEndpoint(); - endpoint.setTargetName(binding.getURI()); - endpoint.setSourceComponent(null); // TODO - fixed up at start - endpoint.setSourceComponentReference(promotedReference); - endpoint.setInterfaceContract(reference.getInterfaceContract()); - endpoint.setSourceBinding(binding); - endpointsToCopyDown.add(endpoint); - } - } - } - - if (bindingsToCopyDown.size() > 0) { - promotedReference.getBindings().clear(); - promotedReference.getBindings().addAll(bindingsToCopyDown); - - promotedReference.getEndpoints().clear(); - promotedReference.getEndpoints().addAll(endpointsToCopyDown); - } + // override the promoted endpoint references (and bindings) + // with configuration from the top level + + if (reference.getEndpointReferences().size() > 0){ + promotedReference.getEndpointReferences().clear(); + promotedReference.getEndpointReferences().addAll(reference.getEndpointReferences()); } - if (promotedReference.getBindings().size() > 1) { + if (promotedReference.getEndpointReferences().size() > 1) { warning(monitor, "ComponentReferenceMoreWire", promotedReference, promotedReference.getName()); } } else { - // if necessary merge the promoted endpoints (and bindings) with the top level bindings - if (reference.getBindings().size() > 0 ){ - - for (Binding binding : reference.getBindings()) { - if ((!(binding instanceof OptimizableBinding)) || binding.getURI() != null) { - promotedReference.getBindings().add(binding); - - if (reference instanceof ComponentReference){ - for (Endpoint endpoint : ((ComponentReference)reference).getEndpoints()){ - if ( endpoint.getSourceBinding() == binding){ - promotedReference.getEndpoints().add(endpoint); - break; - } - } - } else { - // create a new endpoint to represent this promoted binding - Endpoint endpoint = endpointFactory.createEndpoint(); - endpoint.setTargetName(binding.getURI()); - endpoint.setSourceComponent(null); // TODO - fixed up at start - endpoint.setSourceComponentReference(promotedReference); - endpoint.setInterfaceContract(reference.getInterfaceContract()); - endpoint.setSourceBinding(binding); - promotedReference.getEndpoints().add(endpoint); - } - } - } - } + // merge the promoted endpoint reference with the those from the top level + if (reference.getEndpointReferences().size() > 0){ + promotedReference.getEndpointReferences().addAll(reference.getEndpointReferences()); + } } Set callbackBindings = new HashSet(); diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/Endpoint2Impl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/Endpoint2Impl.java index 67041fc66a..d1fc0123eb 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/Endpoint2Impl.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/Endpoint2Impl.java @@ -25,6 +25,7 @@ import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.ComponentService; import org.apache.tuscany.sca.assembly.Endpoint2; +import org.apache.tuscany.sca.assembly.EndpointReference2; import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.policy.ExtensionType; import org.apache.tuscany.sca.policy.Intent; @@ -42,8 +43,8 @@ public class Endpoint2Impl implements Endpoint2 { private Component component; private ComponentService service; private Binding binding; - private Binding callbackBinding; private InterfaceContract interfaceContract; + private List callbackEndpointReferences; //private String uri; private List policySets = new ArrayList(); private List requiredIntents = new ArrayList(); @@ -95,6 +96,27 @@ public class Endpoint2Impl implements Endpoint2 { public void setInterfaceContract(InterfaceContract interfaceContract) { this.interfaceContract = interfaceContract; } + + /** + * Get the services callbacl enpoint references that + * represent endpoint references from which callbacks + * originate + * + * @return callbackEndpoint the reference callback endpoint + */ + public List getCallbackEndpointReferences(){ + return callbackEndpointReferences; + } + + /** + * Set the reference callback endpoint refefences + * + * @param callbackEndpoint the reference callback endpoint + */ + public void setCallbackEndpointReferences(List callbackEndpointReferences) + { + this.callbackEndpointReferences = callbackEndpointReferences; + } /* public String getURI() { return uri; diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReference2Impl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReference2Impl.java index 699d2e89f4..e47eb1c6fe 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReference2Impl.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReference2Impl.java @@ -62,7 +62,13 @@ public class EndpointReference2Impl implements EndpointReference2 { @Override public Object clone() throws CloneNotSupportedException { - return super.clone(); + EndpointReference2 cloned = (EndpointReference2)super.clone(); + + if (targetEndpoint != null){ + cloned.setTargetEndpoint((Endpoint2)targetEndpoint.clone()); + } + + return cloned; } public boolean isUnresolved() { diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/ReferenceImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/ReferenceImpl.java index 82026b40db..41d090c9d4 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/ReferenceImpl.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/ReferenceImpl.java @@ -55,6 +55,8 @@ public class ReferenceImpl extends AbstractReferenceImpl implements Reference, C clone.bindings.addAll(getBindings()); clone.targets = new ArrayList(); clone.targets.addAll(getTargets()); + clone.endpointReferences = new ArrayList(); + clone.endpointReferences.addAll(getEndpointReferences()); return clone; } diff --git a/java/sca/modules/binding-rmi-runtime/src/test/resources/RMIBindingTest.composite b/java/sca/modules/binding-rmi-runtime/src/test/resources/RMIBindingTest.composite index b71d789c74..dd74f849ac 100644 --- a/java/sca/modules/binding-rmi-runtime/src/test/resources/RMIBindingTest.composite +++ b/java/sca/modules/binding-rmi-runtime/src/test/resources/RMIBindingTest.composite @@ -20,24 +20,21 @@ - - - - - - + + + + + - + - + + + + - - - - - diff --git a/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLImportTestCase.java b/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLImportTestCase.java index 6c62d52cc6..15807c76de 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLImportTestCase.java +++ b/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLImportTestCase.java @@ -68,7 +68,9 @@ public class QuestionMarkWSDLImportTestCase extends TestCase { Definition definition = wsdlReader.readWSDL("http://localhost:8086/AccountService?wsdl"); assertNotNull(definition); - Service service = definition.getService(new QName("http://account2/AccountService/$promoted$ep1", "AccountService")); + // TODO - EPR - $promoted$ no longer used + //Service service = definition.getService(new QName("http://account2/AccountService/$promoted$ep1", "AccountService")); + Service service = definition.getService(new QName("http://account2/AccountService/Account", "AccountService")); Port port = service.getPort("AccountSoapPort"); String endpoint = getEndpoint(port); diff --git a/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLIncludeTestCase.java b/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLIncludeTestCase.java index a9d31fb9a8..fd95ff7473 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLIncludeTestCase.java +++ b/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLIncludeTestCase.java @@ -68,7 +68,9 @@ public class QuestionMarkWSDLIncludeTestCase extends TestCase { Definition definition = wsdlReader.readWSDL("http://localhost:8085/AccountService?wsdl"); assertNotNull(definition); - Service service = definition.getService(new QName("http://accounts/AccountService/$promoted$ep1", "AccountService")); + // TODO - EPR - $promoted$ no longer used + //Service service = definition.getService(new QName("http://accounts/AccountService/$promoted$ep1", "AccountService")); + Service service = definition.getService(new QName("http://accounts/AccountService/Account", "AccountService")); Port port = service.getPort("AccountSoapPort"); String endpoint = getEndpoint(port); diff --git a/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLTestCase.java b/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLTestCase.java index 63026f95f7..bbec9dd342 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLTestCase.java +++ b/java/sca/modules/binding-ws-axis2/src/test/java/org/apache/tuscany/sca/binding/ws/axis2/itests/QuestionMarkWSDLTestCase.java @@ -68,8 +68,11 @@ public class QuestionMarkWSDLTestCase extends TestCase { Definition definition = wsdlReader.readWSDL("http://localhost:8085/services/HelloWorldWebService?wsdl"); assertNotNull(definition); - Service service = definition.getService(new QName("http://helloworld/HelloWorldService/$promoted$ep1", - "HelloWorldService")); + // TODO - EPR - $promoted$ no longer used + //Service service = definition.getService(new QName("http://helloworld/HelloWorldService/$promoted$ep1", + // "HelloWorldService")); + Service service = definition.getService(new QName("http://helloworld/HelloWorldService/HelloWorld", + "HelloWorldService")); Port port = service.getPort("HelloWorldSoapPort"); String endpoint = getEndpoint(port); diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/HelloWorld.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/HelloWorld.composite index 37c9f336f9..061b68450c 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/HelloWorld.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/HelloWorld.composite @@ -22,30 +22,26 @@ targetNamespace="http://www.tuscany.apache.org/tests/binding/ws/axis2" name="HelloWorld"> - - - - - - http://localhost:8085/services/HelloWorldWebService - - - - - + + + + + http://localhost:8085/services/HelloWorldWebService + + + - + + + + - - - - - + diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/HelloWorldNoWSDL.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/HelloWorldNoWSDL.composite index 471c9bf42c..992d4463de 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/HelloWorldNoWSDL.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/HelloWorldNoWSDL.composite @@ -22,41 +22,32 @@ targetNamespace="http://www.tuscany.apache.org/tests/binding/ws/axis2" name="HelloWorldNoWSDL"> - - - - - + + + - + + + - - - - - - - - - - + + + - + + + - - - - diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/DefaultMultiService.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/DefaultMultiService.composite index 85c26b78c1..0c5646e888 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/DefaultMultiService.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/DefaultMultiService.composite @@ -28,25 +28,26 @@ http://localhost:8085/HelloWorldService/service1 --> - - - - + + + + + - + + + + - - - - + diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/DefaultSingleService.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/DefaultSingleService.composite index 1096b867e2..5778f98593 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/DefaultSingleService.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/DefaultSingleService.composite @@ -28,25 +28,24 @@ so for this composite: http://localhost:8085/HelloWorldService --> - - - - - + + + + - + + + + - - - - + diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/WSDLExplicitURI.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/WSDLExplicitURI.composite index 0cf9a9ef90..990093bc8c 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/WSDLExplicitURI.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/WSDLExplicitURI.composite @@ -27,24 +27,24 @@ so for this composite the service is: http://localhost:8085/myExplicitURI --> - - - - + + + + - + + + + - - - - + diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/WSDLRelativeURI.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/WSDLRelativeURI.composite index 0c74144385..ea598f8e23 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/WSDLRelativeURI.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/endpoints/WSDLRelativeURI.composite @@ -27,24 +27,25 @@ so for this composite the service is: http://localhost:8085/HelloWorldService/myRelativeURI --> - - - - + + + + + - + + + + - - - - + diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/epr/HelloWorld.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/epr/HelloWorld.composite index 5554b79216..ef012f1803 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/epr/HelloWorld.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/epr/HelloWorld.composite @@ -22,30 +22,27 @@ targetNamespace="http://www.tuscany.apache.org/tests/binding/ws/axis2" name="HelloWorld"> - - - - - http://localhost:8085/myService - - - - + + + + + http://localhost:8085/myService + + + - + + + + http://localhost:8085/myService + + + - - - - http://localhost:8085/myService - - - - diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-om-merged.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-om-merged.composite index 24594744e5..023f392085 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-om-merged.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-om-merged.composite @@ -22,22 +22,22 @@ targetNamespace="http://www.tuscany.apache.org/tests/binding/ws/axis2" name="HelloWorldOM-Merged"> - - - - + + + + - - - - - + + + + + diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-om.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-om.composite index 3d966117f4..ccd3082f88 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-om.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-om.composite @@ -21,24 +21,22 @@ xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200903" targetNamespace="http://www.tuscany.apache.org/tests/binding/ws/axis2" name="HelloWorldOM"> - - - - - + + + + - + + + + - - - - - + diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-prec.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-prec.composite index 38509f9d2d..91175c476c 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-prec.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/helloworld-prec.composite @@ -25,24 +25,22 @@ targetNamespace="http://www.tuscany.apache.org/tests/binding/ws/axis2" name="HelloWorldPrec"> - - - - + + + + - + + + + - - - - - diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl-import.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl-import.composite index f92c4356a8..a8fd8d4d5d 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl-import.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl-import.composite @@ -21,12 +21,11 @@ targetNamespace="http://www.tuscany.apache.org/tests/binding/ws/axis2" name="QuestionMarkWSDLImport"> - - - - + + + diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl-include.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl-include.composite index 73804b87ca..d795329db0 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl-include.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl-include.composite @@ -21,12 +21,11 @@ targetNamespace="http://www.tuscany.apache.org/tests/binding/ws/axis2" name="QuestionMarkWSDLInclude"> - - - - + + + diff --git a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl.composite b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl.composite index affedb23a8..3ed8b206a7 100644 --- a/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl.composite +++ b/java/sca/modules/binding-ws-axis2/src/test/resources/org/apache/tuscany/sca/binding/ws/axis2/itests/questionmark-wsdl.composite @@ -22,19 +22,12 @@ targetNamespace="http://www.tuscany.apache.org/tests/binding/ws/axis2" name="QuestionMarkWSDLTests"> - - - - - - - - - + + + + diff --git a/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLServiceGenerator.java b/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLServiceGenerator.java index 6d11febc5b..c573f5f62e 100644 --- a/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLServiceGenerator.java +++ b/java/sca/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLServiceGenerator.java @@ -131,6 +131,7 @@ public class WSDLServiceGenerator { //[nash] changes to the builder sequence avoid calling this for a CompositeService assert !(contract instanceof CompositeService); + // TODO - EPR - $promoted$ no longer used /* // For every promoted composite service, the underlying component // gets a copy of the service with the name prefixed by "$promoted$." diff --git a/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeComponentReference.java b/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeComponentReference.java index 44ae7f552a..84e2f4588b 100644 --- a/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeComponentReference.java +++ b/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeComponentReference.java @@ -24,6 +24,7 @@ import java.util.List; import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.ComponentReference; import org.apache.tuscany.sca.assembly.Endpoint; +import org.apache.tuscany.sca.assembly.EndpointReference2; import org.apache.tuscany.sca.endpointresolver.EndpointResolver; import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.invocation.Invoker; @@ -52,6 +53,13 @@ public interface RuntimeComponentReference extends ComponentReference { * @return The runtime wire */ RuntimeWire getRuntimeWire(Binding binding); + + /** + * Get the runtime wire for the given endpoint reference + * @param endpointReference The assembly model endpoint reference + * @return The runtime wire + */ + RuntimeWire getRuntimeWire(EndpointReference2 endpointReference); /** * Returns the reference binding provider associated with this diff --git a/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeWire.java b/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeWire.java index a2e7152202..7366d511ae 100644 --- a/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeWire.java +++ b/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeWire.java @@ -22,6 +22,7 @@ package org.apache.tuscany.sca.runtime; import java.lang.reflect.InvocationTargetException; import java.util.List; +import org.apache.tuscany.sca.assembly.EndpointReference2; import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.invocation.InvocationChain; import org.apache.tuscany.sca.invocation.Message; @@ -34,6 +35,11 @@ import org.apache.tuscany.sca.invocation.Message; */ public interface RuntimeWire extends Cloneable { + + // ================================================================= + // TODO - EPR - remove the following three methods when we have + // changes the rest of the instructure over to using EndpointReference2 + // and EndpointReference2 throughout /** * Get the source of the wire * @@ -54,6 +60,15 @@ public interface RuntimeWire extends Cloneable { */ void setTarget(EndpointReference target); + //================================================================== + + /** + * return the endpoint reference that configured this wire + * + * @return the endpoint reference that configured this wire + */ + EndpointReference2 getEndpointReference(); + /** * Force the invocation chains to be rebuilt */ diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl2.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl2.java index b84717467f..8efee3a0ec 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl2.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl2.java @@ -289,9 +289,14 @@ public class CompositeActivatorImpl2 implements CompositeActivator { } return; } + + /* TODO - EPR - activate services at all levels as promoted endpoin references are maintained + * on the higher level services if (service.getService() instanceof CompositeService) { return; } + */ + if (logger.isLoggable(Level.FINE)) { logger.fine("Activating component service: " + component.getURI() + "#" + service.getName()); } @@ -367,6 +372,7 @@ public class CompositeActivatorImpl2 implements CompositeActivator { // so we need to represent the reference that will call us EndpointReference2 endpointReference = assemblyFactory.createEndpointReference(); endpointReference.setBinding(endpoint.getBinding()); + endpointReference.setTargetEndpoint(endpoint); // create the interface contract for the binding and service ends of the wire // that are created as forward only contracts @@ -496,7 +502,7 @@ public class CompositeActivatorImpl2 implements CompositeActivator { return; } - // TODO - what is this all about? + // TODO - EPR what is this all about? // [rfeng] Comment out the following statements to avoid the on-demand activation // RuntimeComponentReference runtimeRef = (RuntimeComponentReference)reference; // runtimeRef.getRuntimeWires().clear(); @@ -539,7 +545,7 @@ public class CompositeActivatorImpl2 implements CompositeActivator { configureComponentContext(runtimeComponent); -/* TODO - won't start until reference is actually started later +/* TODO - EPR won't start until reference is actually started later for (ComponentReference reference : component.getReferences()) { if (logger.isLoggable(Level.FINE)) { logger.fine("Starting component reference: " + component.getURI() + "#" + reference.getName()); @@ -679,11 +685,11 @@ public class CompositeActivatorImpl2 implements CompositeActivator { // Service start/stop - // TODO - done as part of the component start above + // TODO - EPR done as part of the component start above // Reference start/stop // Used by component context start - // TODO - I don't know why reference wires don't get added until component start + // TODO - EPR I don't know why reference wires don't get added until component start public void start(RuntimeComponent component, RuntimeComponentReference componentReference) { synchronized (componentReference) { @@ -692,13 +698,12 @@ public class CompositeActivatorImpl2 implements CompositeActivator { return; } - // create wire for all endpoint references. An endpoint reference says that a + // create a wire for each endpoint reference. An endpoint reference says that a // target has been specified and hence the reference has been wired in some way. // The service may not have been found yet, depending on the way the composite // is deployed, but it is expected to be found. In the case where the reference // is unwired (a target has not been specified) there will be no endpoint // reference and this will lead to null being injected - for (EndpointReference2 endpointReference : componentReference.getEndpointReferences()){ // if there is a binding an endpoint has been found for the endpoint reference @@ -762,7 +767,7 @@ public class CompositeActivatorImpl2 implements CompositeActivator { endpointReference.setInterfaceContract(sourceContract.makeUnidirectional(false)); -/* TODO - should have been done previously during matching +/* TODO - EPR should have been done previously during matching ComponentService callbackService = reference.getCallbackService(); if (callbackService != null) { // select a reference callback binding to pass with invocations on this wire @@ -790,7 +795,7 @@ public class CompositeActivatorImpl2 implements CompositeActivator { Endpoint2 endpoint = endpointReference.getTargetEndpoint(); endpoint.setInterfaceContract(bindingContract); -/* TODO - review in the light of new matching code +/* TODO - EPR review in the light of new matching code // TUSCANY-2029 - We should use the URI of the serviceBinding because the target may be a Component in a // nested composite. if (serviceBinding != null) { diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/EndpointWireImpl.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/EndpointWireImpl.java index b089abba4f..1e11c7062e 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/EndpointWireImpl.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/EndpointWireImpl.java @@ -23,6 +23,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.List; import org.apache.tuscany.sca.assembly.Endpoint; +import org.apache.tuscany.sca.assembly.EndpointReference2; import org.apache.tuscany.sca.assembly.Reference; import org.apache.tuscany.sca.core.assembly.CompositeActivator; import org.apache.tuscany.sca.core.invocation.impl.InvocationChainImpl; @@ -183,4 +184,8 @@ public class EndpointWireImpl implements RuntimeWire { EndpointWireImpl copy = (EndpointWireImpl)super.clone(); return copy; } + + public EndpointReference2 getEndpointReference(){ + return null; + } } diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeComponentReferenceImpl.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeComponentReferenceImpl.java index eda274bd29..994094ab23 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeComponentReferenceImpl.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeComponentReferenceImpl.java @@ -25,6 +25,7 @@ import java.util.List; import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Endpoint; +import org.apache.tuscany.sca.assembly.EndpointReference2; import org.apache.tuscany.sca.assembly.impl.ComponentReferenceImpl; import org.apache.tuscany.sca.endpointresolver.EndpointResolver; import org.apache.tuscany.sca.interfacedef.Operation; @@ -63,6 +64,7 @@ public class RuntimeComponentReferenceImpl extends ComponentReferenceImpl implem return wires; } + // TODO - EPR - shouldn't rely on this anymore public RuntimeWire getRuntimeWire(Binding binding) { for (RuntimeWire wire : getRuntimeWires()) { if (wire.getSource().getBinding() == binding) { @@ -70,17 +72,16 @@ public class RuntimeComponentReferenceImpl extends ComponentReferenceImpl implem } } - // TODO: TUSCANY-2580: before returning null see if a candidate binding matches + return null; + } + + public RuntimeWire getRuntimeWire(EndpointReference2 endpointReference) { for (RuntimeWire wire : getRuntimeWires()) { - if (wire instanceof EndpointWireImpl) { - Endpoint endpoint = ((EndpointWireImpl)wire).getEndpoint(); - for (Binding b : endpoint.getCandidateBindings()) { - if (b == binding) { - return wire; - } - } + if (wire.getEndpointReference() == endpointReference) { + return wire; } } + return null; } diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeWireImpl.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeWireImpl.java index 62c2791060..a9ff97d770 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeWireImpl.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeWireImpl.java @@ -28,6 +28,7 @@ import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.ComponentReference; import org.apache.tuscany.sca.assembly.ComponentService; import org.apache.tuscany.sca.assembly.Contract; +import org.apache.tuscany.sca.assembly.EndpointReference2; import org.apache.tuscany.sca.core.conversation.ConversationManager; import org.apache.tuscany.sca.core.invocation.NonBlockingInterceptor; import org.apache.tuscany.sca.core.invocation.RuntimeWireInvoker; @@ -458,4 +459,8 @@ public class RuntimeWireImpl implements RuntimeWire { private void setClonedFrom(RuntimeWireImpl wire) { clonedFrom = wire; } + + public EndpointReference2 getEndpointReference(){ + return null; + } } diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeWireImpl2.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeWireImpl2.java index a9150a8dc7..945045ed32 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeWireImpl2.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeWireImpl2.java @@ -275,16 +275,32 @@ public class RuntimeWireImpl2 implements RuntimeWire { } + // =============================================================== + // TODO - EPR remove when we convert fully over to EndpointReference2 + // TODO - remove. Just here during development static EndpointReference epr; public EndpointReference getSource() { - // TODO - convert this into method that returns EndpointReference2 + // TODO - EPR convert this into method that returns EndpointReference2 + + // convert the source info into old endpoint reference format epr = new EndpointReferenceImpl((RuntimeComponent)endpointReference.getComponent(), endpointReference.getReference(), endpointReference.getBinding(), endpointReference.getInterfaceContract()); + if (endpointReference.getCallbackEndpoint() != null){ + // convert the source callback endpoint into old endpoint reference format + EndpointReference cepr; + cepr = new EndpointReferenceImpl((RuntimeComponent)endpointReference.getComponent(), + endpointReference.getCallbackEndpoint().getService(), + endpointReference.getCallbackEndpoint().getBinding(), + endpointReference.getCallbackEndpoint().getInterfaceContract()); + epr.setCallbackEndpoint(cepr); + } + + // TODO - somtimes used to reset the interface contract so we // copy it back in in the rebuild method below return epr; @@ -293,8 +309,9 @@ public class RuntimeWireImpl2 implements RuntimeWire { public EndpointReference getTarget() { - // TODO - convert this into method that return Endpoint2 + // TODO - EPR convert this into method that returns Endpoint2 + // convert the target info into old endpoint reference format EndpointReference epr = new EndpointReferenceImpl((RuntimeComponent)endpoint.getComponent(), endpoint.getService(), endpoint.getBinding(), @@ -306,6 +323,8 @@ public class RuntimeWireImpl2 implements RuntimeWire { // TODO - can we use the idea of setTarget to rebuild the wire? } + + // =================================================================== public void rebuild() { // TODO - can we use the idea of setTarget to rebuild the wire? @@ -317,6 +336,10 @@ public class RuntimeWireImpl2 implements RuntimeWire { // to call this when it resets the interface contract endpointReference.setInterfaceContract(epr.getInterfaceContract()); } + + public EndpointReference2 getEndpointReference(){ + return endpointReference; + } /** * Add the interceptor for a reference binding @@ -440,7 +463,7 @@ public class RuntimeWireImpl2 implements RuntimeWire { public Object clone() throws CloneNotSupportedException { RuntimeWireImpl2 copy = (RuntimeWireImpl2)super.clone(); copy.endpointReference = (EndpointReference2)endpointReference.clone(); - copy.endpoint = (Endpoint2)endpoint.clone(); + copy.endpoint = copy.endpointReference.getTargetEndpoint(); copy.invoker = new RuntimeWireInvoker(copy.messageFactory, copy.conversationManager, copy); copy.cachedWire = null; // TUSCANY-2630 return copy; diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallableReferenceImpl.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallableReferenceImpl.java index c2264302b4..9e5bf6b1ff 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallableReferenceImpl.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/CallableReferenceImpl.java @@ -31,6 +31,7 @@ import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.ComponentService; import org.apache.tuscany.sca.assembly.CompositeService; +import org.apache.tuscany.sca.assembly.EndpointReference2; import org.apache.tuscany.sca.assembly.OptimizableBinding; import org.apache.tuscany.sca.assembly.Reference; import org.apache.tuscany.sca.assembly.SCABinding; @@ -81,7 +82,10 @@ public class CallableReferenceImpl implements CallableReferenceExt { protected transient RuntimeComponent component; protected transient RuntimeComponentReference reference; + // TODO - EPR - remove wire indexing on bindings as enpoint references + // can share reference bindings protected transient Binding binding; + protected transient EndpointReference2 endpointReference; protected String scdl; @@ -89,8 +93,6 @@ public class CallableReferenceImpl implements CallableReferenceExt { private transient ReferenceParameters refParams; private transient XMLStreamReader xmlReader; - private transient RuntimeWire endpointWire; - /* * Public constructor for Externalizable serialization/deserialization */ @@ -133,6 +135,16 @@ public class CallableReferenceImpl implements CallableReferenceExt { } } } + + // TODO - EPR - If not binding specified assume default binding and find the enpoint reference + // related to it + for (EndpointReference2 endpointReference : this.reference.getEndpointReferences()){ + if ((endpointReference.getBinding() != null) && + (endpointReference.getBinding() instanceof SCABinding)){ + this.endpointReference = endpointReference; + break; + } + } } // FIXME: Should we normalize the componentName/serviceName URI into an absolute SCA URI in the SCA binding? @@ -151,8 +163,8 @@ public class CallableReferenceImpl implements CallableReferenceExt { public RuntimeWire getRuntimeWire() { try { resolve(); - if (endpointWire != null) { - return endpointWire; + if (endpointReference != null){ + return reference.getRuntimeWire(endpointReference); } else if (reference != null) { return reference.getRuntimeWire(binding); } else { @@ -165,13 +177,10 @@ public class CallableReferenceImpl implements CallableReferenceExt { protected void bind(RuntimeWire wire) { if (wire != null) { - - if (wire instanceof EndpointWireImpl) { - endpointWire = wire; - } this.component = wire.getSource().getComponent(); this.reference = (RuntimeComponentReference)wire.getSource().getContract(); this.binding = wire.getSource().getBinding(); + this.endpointReference = wire.getEndpointReference(); this.compositeActivator = ((ComponentContextExt)component.getComponentContext()).getCompositeActivator(); this.conversationManager = this.compositeActivator.getCompositeContext().getConversationManager(); initCallbackID(); diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java index d935f6b93a..75c82a8861 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/context/impl/ComponentContextImpl.java @@ -23,6 +23,8 @@ import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import org.apache.tuscany.sca.assembly.AssemblyFactory; import org.apache.tuscany.sca.assembly.Binding; @@ -30,10 +32,15 @@ import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.ComponentProperty; import org.apache.tuscany.sca.assembly.ComponentReference; import org.apache.tuscany.sca.assembly.ComponentService; +import org.apache.tuscany.sca.assembly.Endpoint2; +import org.apache.tuscany.sca.assembly.EndpointReference2; import org.apache.tuscany.sca.assembly.Multiplicity; import org.apache.tuscany.sca.assembly.OptimizableBinding; import org.apache.tuscany.sca.assembly.Reference; import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.assembly.builder.CompositeBuilder; +import org.apache.tuscany.sca.assembly.builder.CompositeBuilderExtensionPoint; +import org.apache.tuscany.sca.assembly.builder.EndpointReferenceBuilder; import org.apache.tuscany.sca.context.ContextFactoryExtensionPoint; import org.apache.tuscany.sca.context.PropertyValueFactory; import org.apache.tuscany.sca.context.RequestContextFactory; @@ -51,6 +58,8 @@ import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; import org.apache.tuscany.sca.interfacedef.java.JavaInterface; import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; +import org.apache.tuscany.sca.monitor.Monitor; +import org.apache.tuscany.sca.monitor.MonitorFactory; import org.apache.tuscany.sca.runtime.RuntimeComponent; import org.apache.tuscany.sca.runtime.RuntimeComponentReference; import org.apache.tuscany.sca.runtime.RuntimeComponentService; @@ -73,6 +82,8 @@ public class ComponentContextImpl implements ComponentContextExt { private final AssemblyFactory assemblyFactory; private final JavaInterfaceFactory javaInterfaceFactory; private final PropertyValueFactory propertyFactory; + private final EndpointReferenceBuilder endpointReferenceBuilder; + private final Monitor monitor; public ComponentContextImpl(ExtensionPointRegistry registry, RuntimeComponent component) { this.component = component; @@ -85,6 +96,11 @@ public class ComponentContextImpl implements ComponentContextExt { registry.getExtensionPoint(ContextFactoryExtensionPoint.class).getFactory(RequestContextFactory.class); this.proxyFactory = new ExtensibleProxyFactory(registry.getExtensionPoint(ProxyFactoryExtensionPoint.class)); this.propertyFactory = factories.getFactory(PropertyValueFactory.class); + + this.endpointReferenceBuilder = utilities.getUtility(EndpointReferenceBuilder.class); + + MonitorFactory monitorFactory = utilities.getUtility(MonitorFactory.class); + this.monitor = monitorFactory.createMonitor(); } public String getURI() { @@ -304,6 +320,7 @@ public class ComponentContextImpl implements ComponentContextExt { InvalidInterfaceException { ComponentReference componentReference = assemblyFactory.createComponentReference(); componentReference.setName("$self$." + service.getName()); + for (Binding binding : service.getBindings()) { if (binding instanceof OptimizableBinding) { OptimizableBinding optimizableBinding = (OptimizableBinding)((OptimizableBinding)binding).clone(); @@ -330,6 +347,26 @@ public class ComponentContextImpl implements ComponentContextExt { componentReference.setInterfaceContract(interfaceContract); componentReference.setMultiplicity(Multiplicity.ONE_ONE); // component.getReferences().add(componentReference); + + // create endpoint reference + EndpointReference2 endpointReference = assemblyFactory + .createEndpointReference(); + endpointReference.setComponent(component); + endpointReference.setReference(componentReference); + endpointReference.setUnresolved(false); + + // create endpoint. + Endpoint2 endpoint = assemblyFactory.createEndpoint(); + endpoint.setComponent(component); + endpoint.setService(service); + endpoint.setUnresolved(true); + endpointReference.setTargetEndpoint(endpoint); + + componentReference.getEndpointReferences().add(endpointReference); + + // do binding matching + endpointReferenceBuilder.build(endpointReference, monitor); + return componentReference; } diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/CallbackReferenceImpl.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/CallbackReferenceImpl.java index 79daf537ea..fe2b5a6bde 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/CallbackReferenceImpl.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/CallbackReferenceImpl.java @@ -27,10 +27,13 @@ import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.ComponentService; import org.apache.tuscany.sca.assembly.Contract; +import org.apache.tuscany.sca.assembly.Endpoint2; +import org.apache.tuscany.sca.assembly.EndpointReference2; import org.apache.tuscany.sca.assembly.OptimizableBinding; import org.apache.tuscany.sca.core.assembly.impl.EndpointReferenceImpl; import org.apache.tuscany.sca.core.assembly.impl.RuntimeComponentReferenceImpl; import org.apache.tuscany.sca.core.assembly.impl.RuntimeWireImpl; +import org.apache.tuscany.sca.core.assembly.impl.RuntimeWireImpl2; import org.apache.tuscany.sca.core.context.CompositeContext; import org.apache.tuscany.sca.core.context.impl.CallableReferenceImpl; import org.apache.tuscany.sca.core.invocation.ProxyFactory; @@ -149,7 +152,7 @@ public class CallbackReferenceImpl extends CallableReferenceImpl { private RuntimeWire cloneAndBind(RuntimeWire wire) { RuntimeWire boundWire = null; if (resolvedEndpoint != null) { - boundWire = ((RuntimeWireImpl)wire).lookupCache(resolvedEndpoint); + boundWire = ((RuntimeWireImpl2)wire).lookupCache(resolvedEndpoint); if (boundWire != null) { return boundWire; } @@ -157,20 +160,27 @@ public class CallbackReferenceImpl extends CallableReferenceImpl { Contract contract = resolvedEndpoint.getContract(); RuntimeComponentReference ref = null; if (contract == null) { + //TODO - EPR - does it ever go through here? boundWire = (RuntimeWire)wire.clone(); } else if (contract instanceof RuntimeComponentReference) { ref = (RuntimeComponentReference)contract; - boundWire = ref.getRuntimeWire(resolvedEndpoint.getBinding()); + //TODO - EPR - get the bound wire based on endpont reference no binding + //boundWire = ref.getRuntimeWire(resolvedEndpoint.getBinding()); + for (RuntimeWire runtimeWire : ref.getRuntimeWires()){ + if (runtimeWire.getEndpointReference().getBinding().getName().equals(resolvedEndpoint.getBinding().getName())){ + boundWire = runtimeWire; + break; + } + } } else { // contract instanceof RuntimeComponentService ref = bind((RuntimeComponentReference)wire.getSource().getContract(), - resolvedEndpoint.getComponent(), - (RuntimeComponentService)contract); + resolvedEndpoint); boundWire = ref.getRuntimeWires().get(0); } configureWire(boundWire); - ((RuntimeWireImpl)wire).addToCache(resolvedEndpoint, boundWire); + ((RuntimeWireImpl2)wire).addToCache(resolvedEndpoint, boundWire); } catch (CloneNotSupportedException e) { // will not happen } @@ -178,9 +188,12 @@ public class CallbackReferenceImpl extends CallableReferenceImpl { return boundWire; } + // TODO - EPR - why static & convert to ne endpoint reference private static RuntimeComponentReference bind(RuntimeComponentReference reference, - RuntimeComponent component, - RuntimeComponentService service) throws CloneNotSupportedException { + EndpointReference resolvedEndpoint) throws CloneNotSupportedException { + RuntimeComponent component = resolvedEndpoint.getComponent(); + RuntimeComponentService service = (RuntimeComponentService)resolvedEndpoint.getContract(); + RuntimeComponentReference ref = (RuntimeComponentReference)reference.clone(); ref.getTargets().add(service); ref.getBindings().clear(); @@ -195,10 +208,28 @@ public class CallbackReferenceImpl extends CallableReferenceImpl { ref.getBindings().add(binding); } } + + ref.getEndpointReferences().clear(); + + for(EndpointReference2 endpointReference : reference.getEndpointReferences()){ + EndpointReference2 clone = (EndpointReference2)endpointReference.clone(); + + clone.setReference(ref); + clone.getBinding().setURI(resolvedEndpoint.getURI()); + + clone.getTargetEndpoint().setComponent(resolvedEndpoint.getComponent()); + clone.getTargetEndpoint().setService((ComponentService)resolvedEndpoint.getContract()); + clone.getTargetEndpoint().setBinding(resolvedEndpoint.getBinding()); + + ref.getEndpointReferences().add(clone); + } + return ref; } - private void configureWire(RuntimeWire wire) { + private void configureWire(RuntimeWire wire ) { + + // TODO - EPR - do we actiually need this code? Combine with bind? // need to set the endpoint on the binding also so that when the chains are created next // the sca binding can decide whether to provide local or remote invokers. // TODO - there is a problem here though in that I'm setting a target on a @@ -208,10 +239,12 @@ public class CallbackReferenceImpl extends CallableReferenceImpl { Binding binding = wire.getSource().getBinding(); binding.setURI(resolvedEndpoint.getURI()); - // also need to set the target contract as it varies for the sca binding depending on + // set the target contract as it varies for the sca binding depending on // whether it is local or remote RuntimeComponentReference ref = (RuntimeComponentReference)wire.getSource().getContract(); - wire.getTarget().setInterfaceContract(ref.getBindingProvider(binding).getBindingInterfaceContract()); + + // TODO - EPR + wire.getEndpointReference().getTargetEndpoint().setInterfaceContract(ref.getBindingProvider(binding).getBindingInterfaceContract()); } /** diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKCallbackInvocationHandler.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKCallbackInvocationHandler.java index 2d88ed36d9..0a8d40c8db 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKCallbackInvocationHandler.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKCallbackInvocationHandler.java @@ -22,6 +22,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.apache.tuscany.sca.core.assembly.impl.RuntimeWireImpl; +import org.apache.tuscany.sca.core.assembly.impl.RuntimeWireImpl2; import org.apache.tuscany.sca.core.context.impl.CallableReferenceImpl; import org.apache.tuscany.sca.core.conversation.ConversationState; import org.apache.tuscany.sca.invocation.InvocationChain; @@ -78,7 +79,7 @@ public class JDKCallbackInvocationHandler extends JDKInvocationHandler { if (convID == null) { convID = ((CallbackReferenceImpl)callableReference).getConvID(); if (convID != null) { - conversation = ((RuntimeWireImpl)wire).getConversationManager().getConversation(convID); + conversation = ((RuntimeWireImpl2)wire).getConversationManager().getConversation(convID); if (callableReference != null) { ((CallableReferenceImpl)callableReference).attachConversation(conversation); } @@ -103,7 +104,7 @@ public class JDKCallbackInvocationHandler extends JDKInvocationHandler { throw e; } finally { // allow the cloned wire to be reused by subsequent callbacks - ((RuntimeWireImpl)wire).releaseWire(); + ((RuntimeWireImpl2)wire).releaseWire(); } } diff --git a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKInvocationHandler.java b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKInvocationHandler.java index ff58a116b7..6f3e3514bc 100644 --- a/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKInvocationHandler.java +++ b/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKInvocationHandler.java @@ -29,6 +29,7 @@ import java.util.Map; import java.util.UUID; import org.apache.tuscany.sca.core.assembly.impl.RuntimeWireImpl; +import org.apache.tuscany.sca.core.assembly.impl.RuntimeWireImpl2; import org.apache.tuscany.sca.core.context.CallableReferenceExt; import org.apache.tuscany.sca.core.context.impl.CallableReferenceImpl; import org.apache.tuscany.sca.core.conversation.ConversationExt; @@ -100,6 +101,7 @@ public class JDKInvocationHandler implements InvocationHandler, Serializable { } protected void init(RuntimeWire wire) { + // TODO - EPR needs fixing when we remove the old EndpointReference if (wire != null) { try { // Clone the endpoint reference so that reference parameters can be changed @@ -387,7 +389,7 @@ public class JDKInvocationHandler implements InvocationHandler, Serializable { return; } - ConversationManager conversationManager = ((RuntimeWireImpl)wire).getConversationManager(); + ConversationManager conversationManager = ((RuntimeWireImpl2)wire).getConversationManager(); if (conversation == null || conversation.getState() == ConversationState.ENDED) { diff --git a/java/sca/modules/core/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.assembly.CompositeActivator b/java/sca/modules/core/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.assembly.CompositeActivator index d5e13292d2..67f5bede89 100644 --- a/java/sca/modules/core/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.assembly.CompositeActivator +++ b/java/sca/modules/core/src/main/resources/META-INF/services/org.apache.tuscany.sca.core.assembly.CompositeActivator @@ -15,4 +15,4 @@ # specific language governing permissions and limitations # under the License. -org.apache.tuscany.sca.core.assembly.impl.CompositeActivatorImpl +org.apache.tuscany.sca.core.assembly.impl.CompositeActivatorImpl2 diff --git a/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointReferenceBuilderImpl.java b/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointReferenceBuilderImpl.java index e99d2cc63c..004b907d78 100644 --- a/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointReferenceBuilderImpl.java +++ b/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointReferenceBuilderImpl.java @@ -36,6 +36,7 @@ import org.apache.tuscany.sca.assembly.Implementation; import org.apache.tuscany.sca.assembly.Multiplicity; import org.apache.tuscany.sca.assembly.OptimizableBinding; import org.apache.tuscany.sca.assembly.SCABinding; +import org.apache.tuscany.sca.assembly.Service; import org.apache.tuscany.sca.assembly.builder.CompositeBuilder; import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException; import org.apache.tuscany.sca.assembly.builder.EndpointReferenceBuilder; @@ -243,11 +244,9 @@ public class EndpointReferenceBuilderImpl implements CompositeBuilder, EndpointR // TODO - bring resolution and binding matching together // just do binding matching matchForwardBinding(endpointReference, - endpointReference.getTargetEndpoint().getService(), monitor); matchCallbackBinding(endpointReference, - endpointReference.getTargetEndpoint().getService(), monitor); } else { // resolve the endpoint reference in the domain and then @@ -256,19 +255,19 @@ public class EndpointReferenceBuilderImpl implements CompositeBuilder, EndpointR } } - // TODO - In OASIS case there are no bindings to match with on the - // reference side. This code will be factored out into a pluggable - // piece + // TODO - EPR - In OASIS case there are no bindings to match with on the + // reference side. private void matchForwardBinding(EndpointReference2 endpointReference, - ComponentService service, Monitor monitor) { + + Endpoint2 endpoint = endpointReference.getTargetEndpoint(); List matchedReferenceBinding = new ArrayList(); List matchedServiceEndpoint = new ArrayList(); // Find the corresponding bindings from the service side for (Binding referenceBinding : endpointReference.getReference().getBindings()) { - for (Endpoint2 serviceEndpoint : service.getEndpoints()) { + for (Endpoint2 serviceEndpoint : endpoint.getService().getEndpoints()) { if (referenceBinding.getClass() == serviceEndpoint.getBinding().getClass() && hasCompatiblePolicySets(referenceBinding, serviceEndpoint.getBinding())) { @@ -287,7 +286,7 @@ public class EndpointReferenceBuilderImpl implements CompositeBuilder, EndpointR "NoMatchingBinding", endpointReference.getReference(), endpointReference.getReference().getName(), - service.getName()); + endpoint.getService().getName()); return; } else { // default to using the first matched binding @@ -314,7 +313,7 @@ public class EndpointReferenceBuilderImpl implements CompositeBuilder, EndpointR cloned.setURI(serviceEndpoint.getBinding().getURI()); } - // TODO - can we remove this? + // TODO - EPR can we remove this? if (cloned instanceof OptimizableBinding) { OptimizableBinding optimizableBinding = (OptimizableBinding)cloned; optimizableBinding.setTargetComponent(serviceEndpoint.getComponent()); @@ -322,7 +321,7 @@ public class EndpointReferenceBuilderImpl implements CompositeBuilder, EndpointR optimizableBinding.setTargetBinding(serviceEndpoint.getBinding()); } - endpointReference.setBinding(referenceBinding); + endpointReference.setBinding(cloned); endpointReference.setTargetEndpoint(serviceEndpoint); } catch (Exception ex) { @@ -331,68 +330,61 @@ public class EndpointReferenceBuilderImpl implements CompositeBuilder, EndpointR } } - // TODO - // Pretty much a duplicate of matchForwardBinding to handle callback bindings - // will rationalize when I understand what we need to do with callbacks + // TODO - EPR + // Find the callback endpoint for the endpoint reference by matching + // callback bindings between reference and service private void matchCallbackBinding(EndpointReference2 endpointReference, - ComponentService service, Monitor monitor) { - // if no callback on the interface do nothing + // if no callback on the interface or we are creating a self reference do nothing if (endpointReference.getReference().getInterfaceContract() == null || - endpointReference.getReference().getInterfaceContract().getCallbackInterface() == null){ + endpointReference.getReference().getInterfaceContract().getCallbackInterface() == null || + endpointReference.getReference().getName().startsWith("$self$.")){ return; } - List matchedReferenceBinding = new ArrayList(); - List matchedServiceBinding = new ArrayList(); + Endpoint2 endpoint = endpointReference.getTargetEndpoint(); - // Find the corresponding bindings from the service side - for (Binding referenceBinding : endpointReference.getReference().getCallback().getBindings()) { - for (Binding serviceBinding : service.getCallback().getBindings()) { - - if (referenceBinding.getClass() == serviceBinding.getClass() && - hasCompatiblePolicySets(referenceBinding, serviceBinding)) { - - matchedReferenceBinding.add(referenceBinding); - matchedServiceBinding.add(serviceBinding); + List callbackEndpoints = endpointReference.getReference().getCallbackService().getEndpoints(); + List callbackEndpointReferences = endpoint.getCallbackEndpointReferences(); + + List matchedEndpoint = new ArrayList(); + + if ((callbackEndpoints != null) && (callbackEndpointReferences != null)){ + // Find the corresponding bindings from the service side + for (EndpointReference2 epr : callbackEndpointReferences) { + for (Endpoint2 ep : callbackEndpoints) { + + if (epr.getBinding().getClass() == ep.getBinding().getClass() && + hasCompatiblePolicySets(epr.getBinding(), ep.getBinding())) { + + matchedEndpoint.add(ep); + } } } } - if (matchedReferenceBinding.isEmpty()) { + if (matchedEndpoint.isEmpty()) { // No matching binding endpointReference.setCallbackEndpoint(null); warning(monitor, "NoMatchingCallbackBinding", endpointReference.getReference(), endpointReference.getReference().getName(), - service.getName()); + endpoint.getService().getName()); return; } else { // default to using the first matched binding - int selectedBinding = 0; + int selectedEndpoint = 0; - for (int i = 0; i < matchedReferenceBinding.size(); i++){ + for (int i = 0; i < matchedEndpoint.size(); i++){ // If binding.sca is present, use it - if (SCABinding.class.isInstance(matchedReferenceBinding.get(i))) { - selectedBinding = i; + if (SCABinding.class.isInstance(matchedEndpoint.get(i).getBinding())) { + selectedEndpoint = i; } } - Binding selectedCallbackBinding = matchedReferenceBinding.get(selectedBinding); - - ComponentService callbackService = endpointReference.getReference().getCallbackService(); - - if (callbackService != null) { - // find the callback endpoint that has the selected binding - for (Endpoint2 endpoint : callbackService.getEndpoints()){ - if (endpoint.getBinding().getName().startsWith(selectedCallbackBinding.getName())){ - endpointReference.setCallbackEndpoint(endpoint); - break; - } - } - } + endpointReference.setCallbackEndpoint(matchedEndpoint.get(selectedEndpoint)); } } @@ -416,326 +408,4 @@ public class EndpointReferenceBuilderImpl implements CompositeBuilder, EndpointR } return isCompatible; } - - public void createEndpointReferences(Composite composite, - Component component, - ComponentReference reference, - Map components, - Map componentServices, - Monitor monitor) { - - if (reference.getAutowire() == Boolean.TRUE - && reference.getTargets().isEmpty()) { - - // Find suitable targets in the current composite for an - // autowired reference - Multiplicity multiplicity = reference.getMultiplicity(); - for (Component targetComponent : composite.getComponents()) { - - // prevent autowire connecting to self - boolean skipSelf = false; - for (ComponentReference targetComponentReference : targetComponent - .getReferences()) { - if (reference == targetComponentReference) { - skipSelf = true; - } - } - - if (!skipSelf) { - for (ComponentService targetComponentService : targetComponent - .getServices()) { - if (reference.getInterfaceContract() == null - || interfaceContractMapper.isCompatible( - reference.getInterfaceContract(), - targetComponentService - .getInterfaceContract())) { - // create endpoint reference - EndpointReference2 endpointRef = assemblyFactory - .createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setTargetName(targetComponentService - .getName()); - endpointRef.setUnresolved(false); - - // create dummy endpoint. This will be replaced when - // policies - // are matched and bindings are configured later - Endpoint2 endpoint = assemblyFactory - .createEndpoint(); - endpoint.setComponent(targetComponent); - endpoint.setService(targetComponentService); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - reference.getEndpointReferences().add(endpointRef); - - if (multiplicity == Multiplicity.ZERO_ONE - || multiplicity == Multiplicity.ONE_ONE) { - break; - } - } - } - } - } - - if (multiplicity == Multiplicity.ONE_N - || multiplicity == Multiplicity.ONE_ONE) { - if (reference.getEndpointReferences().size() == 0) { - warning(monitor, "NoComponentReferenceTarget", reference, - reference.getName()); - } - } - - } else if (!reference.getTargets().isEmpty()) { - - // Check that the component reference does not mix the use of - // endpoint references specified via the target attribute with - // the presence of binding elements - if (reference.getBindings().size() > 0) { - warning(monitor, "ReferenceEndPointMixWithTarget", composite, - reference.getName()); - } - - // Resolve targets specified on the component reference - for (ComponentService target : reference.getTargets()) { - - String targetName = target.getName(); - ComponentService targetComponentService = componentServices - .get(targetName); - - Component targetComponent; - int s = targetName.indexOf('/'); - if (s == -1) { - targetComponent = components.get(targetName); - } else { - targetComponent = components - .get(targetName.substring(0, s)); - } - - if (targetComponentService != null) { - - // Check that the target component service provides - // a superset of the component reference interface - if (reference.getInterfaceContract() == null - || interfaceContractMapper.isCompatible(reference - .getInterfaceContract(), - targetComponentService - .getInterfaceContract())) { - - // create endpoint reference - EndpointReference2 endpointRef = assemblyFactory - .createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setTargetName(targetComponentService - .getName()); - endpointRef.setUnresolved(false); - - // create dummy endpoint. This will be replaced when - // policies - // are matched and bindings are configured later - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setComponent(targetComponent); - endpoint.setService(targetComponentService); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - reference.getEndpointReferences().add(endpointRef); - } else { - warning(monitor, "ReferenceIncompatibleInterface", - composite, composite.getName().toString(), - reference.getName(), targetName); - } - } else { - // add an unresolved endpoint reference - EndpointReference2 endpointRef = assemblyFactory - .createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setTargetName(targetName); - endpointRef.setUnresolved(true); - - // create an unresolved endpoint to go with it - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - warning(monitor, "ComponentReferenceTargetNotFound", - composite, composite.getName().toString(), - targetName); - } - } - } else if ((reference.getReference() != null) - && (!reference.getReference().getTargets().isEmpty())) { - - // Resolve targets from the corresponding reference in the - // componentType - for (ComponentService target : reference.getReference() - .getTargets()) { - - String targetName = target.getName(); - ComponentService targetComponentService = componentServices - .get(targetName); - - Component targetComponent; - int s = targetName.indexOf('/'); - if (s == -1) { - targetComponent = components.get(targetName); - } else { - targetComponent = components - .get(targetName.substring(0, s)); - } - - if (targetComponentService != null) { - - // Check that the target component service provides - // a superset of the component reference interface - if (reference.getInterfaceContract() == null - || interfaceContractMapper.isCompatible(reference - .getInterfaceContract(), - targetComponentService - .getInterfaceContract())) { - - // create endpoint reference - EndpointReference2 endpointRef = assemblyFactory - .createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setTargetName(targetComponentService - .getName()); - endpointRef.setUnresolved(false); - - // create dummy endpoint. This will be replaced when - // policies - // are matched and bindings are configured later - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setComponent(targetComponent); - endpoint.setService(targetComponentService); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - reference.getEndpointReferences().add(endpointRef); - } else { - warning(monitor, "ReferenceIncompatibleInterface", - composite, composite.getName().toString(), - reference.getName(), targetName); - } - } else { - // add an unresolved endpoint reference - EndpointReference2 endpointRef = assemblyFactory - .createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setTargetName(targetName); - endpointRef.setUnresolved(true); - - // create an unresolved endpoint to go with it - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - warning(monitor, "ComponentReferenceTargetNotFound", - composite, composite.getName().toString(), - targetName); - } - } - } - - // if no endpoints have found so far the bindings become targets. - if (reference.getEndpointReferences().isEmpty()) { - for (Binding binding : reference.getBindings()) { - - String uri = binding.getURI(); - - // user hasn't put a uri on the binding so it's not a target - // name - if (uri == null) { - continue; - } - - // user might have put a local target name in the uri - // see if it refers to a target we know about - // - if it does the reference binding will be matched with a - // service binding - // - if it doesn't it is assumed to be an external reference - Component targetComponent = null; - ComponentService targetComponentService = null; - - if (uri.startsWith("/")) { - uri = uri.substring(1); - } - - // Resolve the target component and service - targetComponentService = componentServices.get(uri); - int s = uri.indexOf('/'); - if (s == -1) { - targetComponent = components.get(uri); - } else { - targetComponent = components.get(uri.substring(0, s)); - } - - // if the binding URI matches a component in the - // composite then configure an endpoint reference with this - // component as - // the target. If not then the binding URI will be assumed to - // reference an - // external service - if (targetComponentService != null) { - - // Check that the target component service provides - // a superset of the component reference interface - if (reference.getInterfaceContract() == null - || interfaceContractMapper.isCompatible(reference - .getInterfaceContract(), - targetComponentService - .getInterfaceContract())) { - // create enpoint reference - EndpointReference2 endpointRef = assemblyFactory - .createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setBinding(binding); - endpointRef.setTargetName(targetComponentService - .getName()); - endpointRef.setUnresolved(false); - - // create dummy endpoint. This will be replaced when - // policies - // are matched and bindings are configured later - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setComponent(targetComponent); - endpoint.setService(targetComponentService); - endpoint.setUnresolved(true); - endpointRef.setTargetEndpoint(endpoint); - - reference.getEndpointReferences().add(endpointRef); - } else { - warning(monitor, "ReferenceIncompatibleInterface", - composite, composite.getName().toString(), - reference.getName(), uri); - } - } else { - // create endpoint reference for manually configured - // bindings - EndpointReference2 endpointRef = assemblyFactory - .createEndpointReference(); - endpointRef.setComponent(component); - endpointRef.setReference(reference); - endpointRef.setBinding(binding); - endpointRef.setTargetName(null); - endpointRef.setTargetEndpoint(null); - endpointRef.setUnresolved(false); - - // create a resolved endpoint to signify that this - // reference is pointing at some unwired endpoint - Endpoint2 endpoint = assemblyFactory.createEndpoint(); - endpoint.setUnresolved(false); - endpointRef.setTargetEndpoint(endpoint); - - reference.getEndpointReferences().add(endpointRef); - } - } - } -} } diff --git a/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java b/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java index 1f9e085590..f841f96e75 100644 --- a/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java +++ b/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java @@ -124,6 +124,7 @@ public class NodeImpl implements Node, Client { private XMLInputFactory inputFactory; private ContributionBuilder contributionDependencyBuilder; private CompositeBuilder compositeBuilder; + private CompositeBuilder endpointReferenceBuilder; private StAXArtifactProcessorExtensionPoint xmlProcessors; private StAXArtifactProcessor compositeProcessor; private ProxyFactory proxyFactory; @@ -358,6 +359,10 @@ public class NodeImpl implements Node, Client { CompositeBuilderExtensionPoint compositeBuilders = extensionPoints.getExtensionPoint(CompositeBuilderExtensionPoint.class); compositeBuilder = compositeBuilders.getCompositeBuilder("org.apache.tuscany.sca.assembly.builder.CompositeBuilder"); + // Get endpoint builders + // TODO - new extension point? + endpointReferenceBuilder = compositeBuilders.getCompositeBuilder("org.apache.tuscany.sca.endpoint.impl.EndpointReferenceBuilderImpl"); + // Initialize runtime // Get proxy factory @@ -549,6 +554,10 @@ public class NodeImpl implements Node, Client { compositeBuilder.build(composite, systemDefinitions, monitor); analyzeProblems(); + // build the endpoint references + endpointReferenceBuilder.build(composite, systemDefinitions, monitor); + analyzeProblems(); + // Create a top level composite to host our composite // This is temporary to make the activator happy Composite tempComposite = assemblyFactory.createComposite(); @@ -673,9 +682,10 @@ public class NodeImpl implements Node, Client { if (serviceName == null || serviceName.equals(componentService.getName())) { CompositeService compositeService = (CompositeService)componentService.getService(); if (compositeService != null) { - if (serviceName != null) { - serviceName = "$promoted$" + component.getName() + "$slash$" + serviceName; - } + // TODO - EPR - $promoted$ no longer used + //if (serviceName != null) { + // serviceName = "$promoted$" + component.getName() + "$slash$" + serviceName; + //} componentContext = ((RuntimeComponent)compositeService.getPromotedComponent()).getComponentContext(); return componentContext.createSelfReference(businessInterface, compositeService diff --git a/java/sca/samples/helloworld-bpel/src/main/resources/helloworld.composite b/java/sca/samples/helloworld-bpel/src/main/resources/helloworld.composite index 603cc17af9..91ce1f22d4 100644 --- a/java/sca/samples/helloworld-bpel/src/main/resources/helloworld.composite +++ b/java/sca/samples/helloworld-bpel/src/main/resources/helloworld.composite @@ -24,6 +24,10 @@ + + + + -- cgit v1.2.3