summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-2.0-M3/modules/endpoint/src/main
diff options
context:
space:
mode:
authorantelder <antelder@13f79535-47bb-0310-9956-ffa450edef68>2009-06-16 06:48:13 +0000
committerantelder <antelder@13f79535-47bb-0310-9956-ffa450edef68>2009-06-16 06:48:13 +0000
commit6f41ef61af2268d5576448974ca447b597387e88 (patch)
treede4f94cc5b532a39f5968ff4fda6e714f52818a5 /branches/sca-java-2.0-M3/modules/endpoint/src/main
parent344bc76bba5f48b3476a8fc49d68bd3392703518 (diff)
Create 2.0 M3 release branch
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@785089 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'branches/sca-java-2.0-M3/modules/endpoint/src/main')
-rw-r--r--branches/sca-java-2.0-M3/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointReferenceBuilderImpl.java442
-rw-r--r--branches/sca-java-2.0-M3/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointRegistryImpl.java188
-rw-r--r--branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.CompositeBuilder18
-rw-r--r--branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.EndpointReferenceBuilder18
-rw-r--r--branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.runtime.EndpointRegistry18
5 files changed, 684 insertions, 0 deletions
diff --git a/branches/sca-java-2.0-M3/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointReferenceBuilderImpl.java b/branches/sca-java-2.0-M3/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointReferenceBuilderImpl.java
new file mode 100644
index 0000000000..e963848c7f
--- /dev/null
+++ b/branches/sca-java-2.0-M3/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointReferenceBuilderImpl.java
@@ -0,0 +1,442 @@
+/*
+ * 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.endpoint.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.assembly.OptimizableBinding;
+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.EndpointReferenceBuilder;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.FactoryExtensionPoint;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
+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.monitor.Problem;
+import org.apache.tuscany.sca.monitor.Problem.Severity;
+import org.apache.tuscany.sca.policy.PolicySet;
+import org.apache.tuscany.sca.policy.PolicySubject;
+import org.apache.tuscany.sca.runtime.EndpointRegistry;
+import org.oasisopen.sca.SCARuntimeException;
+
+/**
+ * An builder that takes endpoint references and resolves them. It either finds local
+ * service endpoints if they are available or asks the domain. The main function here
+ * is to perform binding and policy matching.
+ * This is a separate builder in case it is required by undresolved endpoints
+ * once the runtime has started.
+ *
+ * @version $Rev$ $Date$
+ */
+public class EndpointReferenceBuilderImpl implements CompositeBuilder, EndpointReferenceBuilder {
+
+ protected ExtensionPointRegistry extensionPoints;
+ protected AssemblyFactory assemblyFactory;
+ protected InterfaceContractMapper interfaceContractMapper;
+ protected EndpointRegistry endpointRegistry;
+
+
+ public EndpointReferenceBuilderImpl(ExtensionPointRegistry extensionPoints) {
+ this.extensionPoints = extensionPoints;
+
+ FactoryExtensionPoint factories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class);
+ this.assemblyFactory = factories.getFactory(AssemblyFactory.class);
+
+ UtilityExtensionPoint utils = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
+ this.interfaceContractMapper = utils.getUtility(InterfaceContractMapper.class);
+
+ this.endpointRegistry = utils.getUtility(EndpointRegistry.class);
+ }
+
+ public String getID() {
+ return "org.apache.tuscany.sca.assembly.builder.EndpointReferenceBuilder";
+ }
+
+ /**
+ * Report a warning.
+ *
+ * @param monitor
+ * @param problems
+ * @param message
+ * @param model
+ */
+ protected void warning(Monitor monitor, String message, Object model, String... messageParameters) {
+ if (monitor != null) {
+ Problem problem = monitor.createProblem(this.getClass().getName(), "assembly-validation-messages", Severity.WARNING, model, message, (Object[])messageParameters);
+ monitor.problem(problem);
+ }
+ }
+
+ /**
+ * Report a error.
+ *
+ * @param monitor
+ * @param problems
+ * @param message
+ * @param model
+ */
+ protected void error(Monitor monitor, String message, Object model, String... messageParameters) {
+ if (monitor != null) {
+ Problem problem = monitor.createProblem(this.getClass().getName(), "assembly-validation-messages", Severity.ERROR, model, message, (Object[])messageParameters);
+ monitor.problem(problem);
+ }
+ }
+
+ /**
+ * Report a exception.
+ *
+ * @param problems
+ * @param message
+ * @param model
+ */
+ protected void error(Monitor monitor, String message, Object model, Exception ex) {
+ if (monitor != null) {
+ Problem problem = null;
+ problem = monitor.createProblem(this.getClass().getName(), "assembly-validation-messages", Severity.ERROR, model, message, ex);
+ monitor.problem(problem);
+ }
+ }
+
+ /**
+ * Build all the endpoint references
+ *
+ * @param composite
+ */
+ public void build(Composite composite, Definitions definitions, Monitor monitor) throws CompositeBuilderException
+ {
+ // Not used now
+ }
+
+ /*
+ private void populateEndpointRegistry(Composite composite, Monitor monitor) {
+
+ // register endpoints (and endpoint references) for each component
+ for (Component component : composite.getComponents()) {
+ // recurse for composite implementations
+ Implementation implementation = component.getImplementation();
+ if (implementation instanceof Composite) {
+ populateEndpointRegistry((Composite)implementation, monitor);
+ }
+
+ // register endpoints
+ for (ComponentService service : component.getServices()) {
+ for (Endpoint2 endpoint : service.getEndpoints()){
+ endpointRegistry.addEndpoint(endpoint);
+ }
+ }
+
+ // register endpoint references
+ for (ComponentReference reference : component.getReferences()) {
+ for (EndpointReference2 endpointReference : reference.getEndpointReferences()){
+ endpointRegistry.addEndpointReference(endpointReference);
+ }
+ }
+ }
+ }
+ */
+
+ /**
+ * Build a single endpoint reference
+ *
+ * @param endpoint
+ * @param monitor
+ */
+ public void build(EndpointReference endpointReference, Monitor monitor) {
+ Endpoint endpoint = endpointReference.getTargetEndpoint();
+
+ if (endpoint == null){
+ // an error?
+ } else {
+ if (endpoint.isUnresolved() == false){
+ // Wired - service resolved - binding matched
+ // The service is in the same composite
+ return;
+ }
+
+ if (endpointReference.isUnresolved() == false ){
+ // Wired - service resolved - binding not matched
+ // The service is in the same composite
+ // TODO - How do we get to here?
+ matchForwardBinding(endpointReference,
+ true,
+ monitor);
+
+ matchCallbackBinding(endpointReference,
+ monitor);
+ } else {
+ // Wired - service specified but unresolved
+ // The service is in a remote composite somewhere else in the domain
+
+ // find the service in the endpoint registry
+ List<Endpoint> endpoints = endpointRegistry.findEndpoint(endpointReference);
+
+ // TODO - do we exepect to find more than one endpoint in
+ // anything other than the autowire case?
+ if (endpoints.size() == 0) {
+ throw new SCARuntimeException("No endpoints found for EndpointReference " + endpointReference.toString());
+ }
+
+ if (endpoints.size() > 1) {
+ throw new SCARuntimeException("More than one endpoint found for EndpointReference" + endpointReference.toString());
+ }
+
+ endpointReference.setTargetEndpoint(endpoints.get(0));
+
+ matchForwardBinding(endpointReference, false, monitor);
+
+ matchCallbackBinding(endpointReference, monitor);
+ }
+ }
+
+ if (endpointReference.isUnresolved()){
+ throw new SCARuntimeException("Can't resolve " + endpointReference.toString());
+ }
+ }
+
+ // TODO - EPR - In OASIS case there are no bindings to match with on the
+ // reference side.
+ private void matchForwardBinding(EndpointReference endpointReference,
+ boolean local,
+ Monitor monitor) {
+
+ Endpoint endpoint = endpointReference.getTargetEndpoint();
+
+ List<Binding> matchedReferenceBinding = new ArrayList<Binding>();
+ List<Endpoint> matchedServiceEndpoint = new ArrayList<Endpoint>();
+
+ // Find the corresponding bindings from the service side
+ if ((endpointReference.getReference().getBindings().size() == 0) ||
+ ((endpointReference.getReference().getBindings().size() == 1) &&
+ (endpointReference.getReference().getBindings().get(0) instanceof SCABinding))){
+ // OAISIS - choose a binding from the service side
+ // (could have been specified as part of the target string)
+ // last part of this test that is looking for binding SCA is
+ // bogus. Just a temporary fix until we get rid of the OSOA
+ // style reference side bindings.
+
+ // retrieve the user specified binding name.
+ // TODO - EPR - we don't support this yet
+
+ // otherwise pick the first binding from the service
+ endpointReference.setTargetEndpoint(endpoint.getService().getEndpoints().get(0));
+ endpointReference.setBinding(endpointReference.getTargetEndpoint().getBinding());
+ endpointReference.setUnresolved(false);
+ return;
+
+ } else {
+ // OAISIS - this is an error
+ // (for now let it match bindings while we rewrite OSOA tests)
+ for (Binding referenceBinding : endpointReference.getReference().getBindings()) {
+ if (local) {
+ for (Endpoint serviceEndpoint : endpoint.getService().getEndpoints()) {
+
+ if (referenceBinding.getClass() == serviceEndpoint.getBinding().getClass() && hasCompatiblePolicySets(referenceBinding,
+ serviceEndpoint
+ .getBinding())) {
+
+ matchedReferenceBinding.add(referenceBinding);
+ matchedServiceEndpoint.add(serviceEndpoint);
+ }
+ }
+ } else {
+ Endpoint serviceEndpoint = endpoint;
+ if (referenceBinding.getClass() == serviceEndpoint.getBinding().getClass() && hasCompatiblePolicySets(referenceBinding,
+ serviceEndpoint
+ .getBinding())) {
+
+ matchedReferenceBinding.add(referenceBinding);
+ matchedServiceEndpoint.add(serviceEndpoint);
+
+ }
+ }
+ }
+ }
+
+ if (matchedReferenceBinding.isEmpty()) {
+ // No matching binding
+ endpointReference.setBinding(null);
+ endpointReference.setUnresolved(true);
+ warning(monitor,
+ "NoMatchingBinding",
+ endpointReference.getReference(),
+ endpointReference.getReference().getName(),
+ endpoint.getService().getName());
+ return;
+ } else {
+ // default to using the first matched binding
+ int selectedBinding = 0;
+
+ for (int i = 0; i < matchedReferenceBinding.size(); i++) {
+ // If binding.sca is present, use it
+ if (SCABinding.class.isInstance(matchedReferenceBinding.get(i))) {
+ selectedBinding = i;
+ }
+ }
+
+ Binding referenceBinding = matchedReferenceBinding.get(selectedBinding);
+ Endpoint serviceEndpoint = matchedServiceEndpoint.get(selectedBinding);
+
+ // populate the endpoint reference
+ try {
+
+ Binding clonedBinding = (Binding) referenceBinding.clone();
+
+ // Set the binding URI to the URI of the target service
+ // that has been matched
+ if (referenceBinding.getURI() == null) {
+ clonedBinding.setURI(serviceEndpoint.getBinding().getURI());
+ }
+
+ // TODO - EPR can we remove this?
+ if (clonedBinding instanceof OptimizableBinding) {
+ OptimizableBinding optimizableBinding = (OptimizableBinding)clonedBinding;
+ optimizableBinding.setTargetComponent(serviceEndpoint.getComponent());
+ optimizableBinding.setTargetComponentService(serviceEndpoint.getService());
+ optimizableBinding.setTargetBinding(serviceEndpoint.getBinding());
+ }
+
+ endpointReference.setBinding(clonedBinding);
+
+ Endpoint clonedEndpoint = (Endpoint)serviceEndpoint.clone();
+
+ endpointReference.setTargetEndpoint(clonedEndpoint);
+ endpointReference.setUnresolved(false);
+
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ }
+
+ // TODO - EPR
+ // Find the callback endpoint for the endpoint reference by matching
+ // callback bindings between reference and service
+ private void matchCallbackBinding(EndpointReference endpointReference,
+ Monitor monitor) {
+
+ // 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().getName().startsWith("$self$.")){
+ return;
+ }
+
+ Endpoint endpoint = endpointReference.getTargetEndpoint();
+
+ List<Endpoint> callbackEndpoints = endpointReference.getReference().getCallbackService().getEndpoints();
+ List<EndpointReference> callbackEndpointReferences = endpoint.getCallbackEndpointReferences();
+
+ List<Endpoint> matchedEndpoint = new ArrayList<Endpoint>();
+
+ // Find the corresponding bindings from callback service side
+ if ((callbackEndpointReferences.get(0).getReference().getBindings().size() == 0) ||
+ ((callbackEndpointReferences.get(0).getReference().getBindings().size() == 1) &&
+ (callbackEndpointReferences.get(0).getReference().getBindings().get(0) instanceof SCABinding))){
+ // OAISIS - choose a binding from the service side
+ // (could have been specified as part of the target string)
+ // last part of this test that is looking for binding SCA is
+ // bogus. Just a temporary fix until we get rid of the OSOA
+ // style reference side bindings.
+
+ // retrieve the user specified binding name.
+ // TODO - EPR - we don't support this yet
+
+ // otherwise pick the first binding from the service
+ //endpointReference.setTargetEndpoint(endpoint.getService().getEndpoints().get(0));
+ //endpointReference.setBinding(endpointReference.getTargetEndpoint().getBinding());
+ endpointReference.setCallbackEndpoint(callbackEndpoints.get(0));
+ endpointReference.setUnresolved(false);
+ return;
+
+ } else {
+ // OAISIS - this is an error
+ // (for now let it match bindings while we rewrite OSOA tests)
+
+ if ((callbackEndpoints != null) && (callbackEndpointReferences != null)){
+ // Find the corresponding bindings from the service side
+ for (EndpointReference epr : callbackEndpointReferences) {
+ for (Endpoint ep : callbackEndpoints) {
+
+ if (epr.getBinding().getClass() == ep.getBinding().getClass() &&
+ hasCompatiblePolicySets(epr.getBinding(), ep.getBinding())) {
+
+ matchedEndpoint.add(ep);
+ }
+ }
+ }
+ }
+ }
+
+ if (matchedEndpoint.isEmpty()) {
+ // No matching binding
+ endpointReference.setCallbackEndpoint(null);
+ endpointReference.setUnresolved(true);
+ warning(monitor,
+ "NoMatchingCallbackBinding",
+ endpointReference.getReference(),
+ endpointReference.getReference().getName(),
+ endpoint.getService().getName());
+ return;
+ } else {
+ // default to using the first matched binding
+ int selectedEndpoint = 0;
+
+ for (int i = 0; i < matchedEndpoint.size(); i++){
+ // If binding.sca is present, use it
+ if (SCABinding.class.isInstance(matchedEndpoint.get(i).getBinding())) {
+ selectedEndpoint = i;
+ }
+ }
+
+ endpointReference.setCallbackEndpoint(matchedEndpoint.get(selectedEndpoint));
+ endpointReference.setUnresolved(false);
+ }
+ }
+
+ private boolean hasCompatiblePolicySets(Binding refBinding, Binding svcBinding) {
+ boolean isCompatible = true;
+ if ( refBinding instanceof PolicySubject && svcBinding instanceof PolicySubject ) {
+ //TODO : need to add more compatibility checks at the policy attachment levels
+ for ( PolicySet svcPolicySet : ((PolicySubject)svcBinding).getPolicySets() ) {
+ isCompatible = false;
+ for ( PolicySet refPolicySet : ((PolicySubject)refBinding).getPolicySets() ) {
+ if ( svcPolicySet.equals(refPolicySet) ) {
+ isCompatible = true;
+ break;
+ }
+ }
+ //if there exists no matching policy set in the reference binding
+ if ( !isCompatible ) {
+ return isCompatible;
+ }
+ }
+ }
+ return isCompatible;
+ }
+}
diff --git a/branches/sca-java-2.0-M3/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointRegistryImpl.java b/branches/sca-java-2.0-M3/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointRegistryImpl.java
new file mode 100644
index 0000000000..b291b0e44e
--- /dev/null
+++ b/branches/sca-java-2.0-M3/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointRegistryImpl.java
@@ -0,0 +1,188 @@
+/*
+ * 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.endpoint.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Logger;
+
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.runtime.EndpointListener;
+import org.apache.tuscany.sca.runtime.EndpointRegistry;
+
+public class EndpointRegistryImpl implements EndpointRegistry {
+ private final Logger logger = Logger.getLogger(EndpointRegistryImpl.class.getName());
+
+ static List<Endpoint> endpoints = new ArrayList<Endpoint>();
+ static List<EndpointReference> endpointreferences = new ArrayList<EndpointReference>();
+
+ private List<EndpointListener> listeners = new CopyOnWriteArrayList<EndpointListener>();
+
+ public EndpointRegistryImpl(ExtensionPointRegistry extensionPoints) {
+ }
+
+ public void addEndpoint(Endpoint endpoint) {
+ endpoints.add(endpoint);
+ for (EndpointListener listener : listeners) {
+ listener.endpointAdded(endpoint);
+ }
+ logger.info("EndpointRegistry: Add endpoint - " + endpoint.toString());
+ }
+
+ public void addEndpointReference(EndpointReference endpointReference) {
+ endpointreferences.add(endpointReference);
+ logger.info("EndpointRegistry: Add endpoint reference - " + endpointReference.toString());
+ }
+
+ /**
+ * Parse the component/service/binding URI into an array of parts (componentURI, serviceName, bindingName)
+ * @param uri
+ * @return
+ */
+ private String[] parse(String uri) {
+ String[] names = new String[3];
+ int index = uri.lastIndexOf('#');
+ if (index == -1) {
+ names[0] = uri;
+ } else {
+ names[0] = uri.substring(0, index);
+ String str = uri.substring(index + 1);
+ if (str.startsWith("service-binding(") && str.endsWith(")")) {
+ str = str.substring("service-binding(".length(), str.length() - 1);
+ String[] parts = str.split("/");
+ if (parts.length != 2) {
+ throw new IllegalArgumentException("Invalid service-binding URI: " + uri);
+ }
+ names[1] = parts[0];
+ names[2] = parts[1];
+ } else if (str.startsWith("service(") && str.endsWith(")")) {
+ str = str.substring("service(".length(), str.length() - 1);
+ names[1] = str;
+ } else {
+ throw new IllegalArgumentException("Invalid component/service/binding URI: " + uri);
+ }
+ }
+ return names;
+ }
+
+ private boolean matches(String target, String uri) {
+ String[] parts1 = parse(target);
+ String[] parts2 = parse(uri);
+ for (int i = 0; i < parts1.length; i++) {
+ if (parts1[i] == null || parts1[i].equals(parts2[i])) {
+ continue;
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public List<Endpoint> findEndpoint(EndpointReference endpointReference) {
+ List<Endpoint> foundEndpoints = new ArrayList<Endpoint>();
+
+ logger.info("EndpointRegistry: Find endpoint for reference - " + endpointReference.toString());
+
+ if (endpointReference.getReference() != null) {
+ Endpoint targetEndpoint = endpointReference.getTargetEndpoint();
+ for (Endpoint endpoint : endpoints) {
+ // TODO: implement more complete matching
+ if (matches(targetEndpoint.getURI(), endpoint.getURI())) {
+ foundEndpoints.add(endpoint);
+ logger.info("EndpointRegistry: Found endpoint with matching service - " + endpoint);
+ }
+ // else the service name doesn't match
+ }
+ }
+
+ return foundEndpoints;
+ }
+
+ public List<EndpointReference> findEndpointReference(Endpoint endpoint) {
+ return null;
+ }
+
+ public void removeEndpoint(Endpoint endpoint) {
+ endpoints.remove(endpoint);
+ for (EndpointListener listener : listeners) {
+ listener.endpointRemoved(endpoint);
+ }
+ logger.info("EndpointRegistry: Remove endpoint - " + endpoint.toString());
+ }
+
+ public void removeEndpointReference(EndpointReference endpointReference) {
+ endpointreferences.remove(endpointReference);
+ logger.info("EndpointRegistry: Remove endpoint reference - " + endpointReference.toString());
+ }
+
+ public List<EndpointReference> getEndpointRefereneces() {
+ return endpointreferences;
+ }
+
+ public List<Endpoint> getEndpoints() {
+ return endpoints;
+ }
+
+ public void addListener(EndpointListener listener) {
+ listeners.add(listener);
+ }
+
+ public List<EndpointListener> getListeners() {
+ return listeners;
+ }
+
+ public void removeListener(EndpointListener listener) {
+ listeners.remove(listener);
+ }
+
+ public Endpoint getEndpoint(String uri) {
+ for (Endpoint ep : endpoints) {
+ String epURI =
+ ep.getComponent().getURI() + "#" + ep.getService().getName() + "/" + ep.getBinding().getName();
+ if (epURI.equals(uri)) {
+ return ep;
+ }
+ if (ep.getBinding().getName() == null || ep.getBinding().getName().equals(ep.getService().getName())) {
+ epURI = ep.getComponent().getURI() + "#" + ep.getService().getName();
+ if (epURI.equals(uri)) {
+ return ep;
+ }
+ }
+ }
+ return null;
+
+ }
+
+ public void updateEndpoint(String uri, Endpoint endpoint) {
+ Endpoint oldEndpoint = getEndpoint(uri);
+ if (oldEndpoint == null) {
+ throw new IllegalArgumentException("Endpoint is not found: " + uri);
+ }
+ endpoints.remove(oldEndpoint);
+ addEndpoint(endpoint);
+ for (EndpointListener listener : listeners) {
+ listener.endpointUpdated(oldEndpoint, endpoint);
+ }
+ }
+
+}
diff --git a/branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.CompositeBuilder b/branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.CompositeBuilder
new file mode 100644
index 0000000000..541941c3d3
--- /dev/null
+++ b/branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.CompositeBuilder
@@ -0,0 +1,18 @@
+# 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.
+
+org.apache.tuscany.sca.endpoint.impl.EndpointReferenceBuilderImpl;id=org.apache.tuscany.sca.endpoint.impl.EndpointReferenceBuilderImpl
diff --git a/branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.EndpointReferenceBuilder b/branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.EndpointReferenceBuilder
new file mode 100644
index 0000000000..37f34b9aba
--- /dev/null
+++ b/branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.EndpointReferenceBuilder
@@ -0,0 +1,18 @@
+# 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.
+
+org.apache.tuscany.sca.endpoint.impl.EndpointReferenceBuilderImpl \ No newline at end of file
diff --git a/branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.runtime.EndpointRegistry b/branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.runtime.EndpointRegistry
new file mode 100644
index 0000000000..75a909199e
--- /dev/null
+++ b/branches/sca-java-2.0-M3/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.runtime.EndpointRegistry
@@ -0,0 +1,18 @@
+# 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.
+
+org.apache.tuscany.sca.endpoint.impl.EndpointRegistryImpl;ranking=100 \ No newline at end of file