From e5b7380c874745c989d1816b8f552504f038e1bc Mon Sep 17 00:00:00 2001 From: lresende Date: Thu, 26 Sep 2013 20:33:20 +0000 Subject: 2.0 branch for possible maintenance release git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1526672 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/assembly/impl/EndpointReferenceImpl.java | 289 +++++++++++++++++++++ 1 file changed, 289 insertions(+) create mode 100644 sca-java-2.x/branches/2.0/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReferenceImpl.java (limited to 'sca-java-2.x/branches/2.0/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReferenceImpl.java') diff --git a/sca-java-2.x/branches/2.0/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReferenceImpl.java b/sca-java-2.x/branches/2.0/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReferenceImpl.java new file mode 100644 index 0000000000..ac0c7c93a8 --- /dev/null +++ b/sca-java-2.x/branches/2.0/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReferenceImpl.java @@ -0,0 +1,289 @@ +/* + * 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.impl; + +import java.util.ArrayList; +import java.util.List; + +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.Endpoint; +import org.apache.tuscany.sca.assembly.EndpointReference; +import org.apache.tuscany.sca.assembly.builder.BuilderExtensionPoint; +import org.apache.tuscany.sca.assembly.builder.ContractBuilder; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.interfacedef.InterfaceContract; +import org.apache.tuscany.sca.policy.ExtensionType; +import org.apache.tuscany.sca.policy.Intent; +import org.apache.tuscany.sca.policy.PolicySet; +import org.apache.tuscany.sca.policy.PolicySubject; + +/** + * The assembly model object for an endpoint. + * + * @version $Rev$ $Date$ + */ +public class EndpointReferenceImpl implements EndpointReference { + private static final long serialVersionUID = 8838066441709300972L; + + protected transient ExtensionPointRegistry registry; + protected transient BuilderExtensionPoint builders; + protected transient ContractBuilder contractBuilder; + protected boolean unresolved = true; + protected String uri; + protected String deployedURI; + protected Component component; + protected ComponentReference reference; + protected Binding binding; + protected List policySets = new ArrayList(); + protected List requiredIntents = new ArrayList(); + protected InterfaceContract interfaceContract; + protected Status status = Status.NOT_CONFIGURED; + + // the target of the endpoint reference + protected Endpoint targetEndpoint; + + // callback endpoint that messages across this reference + // will be directed toward + protected Endpoint callbackEndpoint; + + protected EndpointReferenceImpl(ExtensionPointRegistry registry) { + this.registry = registry; + } + + @Override + public Object clone() throws CloneNotSupportedException { + EndpointReference cloned = (EndpointReference)super.clone(); + + if (targetEndpoint != null) { + cloned.setTargetEndpoint((Endpoint)targetEndpoint.clone()); + } + + return cloned; + } + + public boolean isUnresolved() { + return unresolved; + } + + public void setUnresolved(boolean unresolved) { + this.unresolved = unresolved; + } + + public Component getComponent() { + resolve(); + return component; + } + + public void setComponent(Component component) { + this.component = component; + reset(); + } + + public ComponentReference getReference() { + resolve(); + return reference; + } + + public void setReference(ComponentReference reference) { + this.reference = reference; + reset(); + } + + public Binding getBinding() { + resolve(); + return binding; + } + + public void setBinding(Binding binding) { + this.binding = binding; + reset(); + } + + public Endpoint getTargetEndpoint() { + resolve(); + return targetEndpoint; + } + + public void setTargetEndpoint(Endpoint targetEndpoint) { + this.targetEndpoint = targetEndpoint; + reset(); + } + + public InterfaceContract getComponentReferenceInterfaceContract() { + resolve(); + if (interfaceContract == null && reference != null) { + interfaceContract = reference.getInterfaceContract(); + } + return interfaceContract; + } + + public void setInterfaceContract(InterfaceContract interfaceContract) { + this.interfaceContract = interfaceContract; + reset(); + } + + public List getPolicySets() { + resolve(); + return policySets; + } + + public List getRequiredIntents() { + resolve(); + return requiredIntents; + } + + public ExtensionType getExtensionType() { + getBinding(); + if (binding instanceof PolicySubject) { + return ((PolicySubject)binding).getExtensionType(); + } + return null; + } + + public void setExtensionType(ExtensionType type) { + throw new UnsupportedOperationException(); + } + + public Endpoint getCallbackEndpoint() { + resolve(); + return callbackEndpoint; + } + + public void setCallbackEndpoint(Endpoint callbackEndpoint) { + this.callbackEndpoint = callbackEndpoint; + reset(); + } + + public String toStringWithoutHash() { + StringBuffer output = new StringBuffer("EndpointReference: "); + + if (getURI() != null) { + output.append(" URI = ").append(getURI()); + } + + output.append(" ").append(status); + + if (targetEndpoint != null) { + output.append(" Target = ").append(targetEndpoint); + } + + return output.toString(); + } + + public String toString() { + return "(@" + this.hashCode() + ")" + toStringWithoutHash(); + } + + public String getURI() { + if (uri == null) { + if (component != null && reference != null && binding != null) { + String bindingName = binding.getName(); + if (bindingName == null) { + bindingName = reference.getName(); + } + uri = component.getURI() + "#reference-binding(" + reference.getName() + "/" + bindingName + ")"; + } else if (component != null && reference != null) { + uri = component.getURI() + "#reference(" + reference.getName() + ")"; + } else if (component != null) { + uri = component.getURI(); + } + } + return uri; + } + + public void setURI(String uri) { + this.uri = uri; + } + + protected void resolve() { + } + + protected void reset() { + this.uri = null; + } + + public void setExtensionPointRegistry(ExtensionPointRegistry registry) { + this.registry = registry; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + @Override + public String getDeployedURI() { + String targetURI = deployedURI; + if (targetURI != null) { + return targetURI; + } + if (getTargetEndpoint() != null) { + targetURI = getTargetEndpoint().getDeployedURI(); + } + if (targetURI != null) { + return targetURI; + } + if (binding != null) { + targetURI = binding.getURI(); + } + return targetURI; + } + + @Override + public void setDeployedURI(String deployedURI) { + this.deployedURI = deployedURI; + } + + /** + * Indicates whether this EndpointReference is connected to a target service which is asynchronous. + * This can be marked in one of 3 ways: + * - the EndpointReference has the "asyncInvocation" intent set + * - the EndpointReference has a name ending with "_asyncCallback" + * - there is a target Endpoint configured that itself is marked as async invocation + * @return - true if the service is asynchronous invocation, false otherwise + */ + public boolean isAsyncInvocation() { + if (reference != null && reference.getName().endsWith("_asyncCallback")){ + // this is a response reference at the service component so don't create a + // response service. The response service will be at the reference component + return false; + } // end if + + // Check if the EndpointReference is explicitly marked with the asyncInvocation intent + for(Intent intent : getRequiredIntents()){ + if (intent.getName().getLocalPart().equals("asyncInvocation")){ + return true; + } // end if + } // end for + + // Check if the target Endpoint is marked as asyncInvocation + if( targetEndpoint != null ) { + if (targetEndpoint.isAsyncInvocation()) { + return true; + } // end if + } // end if + return false; + } // end method isAsyncInvocation + +} // end class EndpointReferenceImpl -- cgit v1.2.3