All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.tuscany.sca.assembly.impl.EndpointReferenceImpl Maven / Gradle / Ivy

There is a newer version: 2.0.1
Show newest version
/*
 * 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: 1304128 $ $Date: 2012-03-22 23:19:17 +0000 (Thu, 22 Mar 2012) $
 */
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




© 2015 - 2024 Weber Informatics LLC | Privacy Policy