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

org.apache.tuscany.sca.runtime.BaseDomainRegistry 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.runtime;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;

import javax.xml.namespace.QName;

import org.apache.tuscany.sca.assembly.AssemblyFactory;
import org.apache.tuscany.sca.assembly.Base;
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.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.core.FactoryExtensionPoint;
import org.apache.tuscany.sca.core.LifeCycleListener;

/**
 * A replicated DomainRegistry based on Apache Tomcat Tribes
 * @tuscany.spi.extension.inheritfrom
 */
public abstract class BaseDomainRegistry implements DomainRegistry, LifeCycleListener {
    protected final static Logger logger = Logger.getLogger(BaseDomainRegistry.class.getName());

    protected String domainRegistryURI;
    protected String domainURI;

    protected List endpointreferences = new CopyOnWriteArrayList();
    protected List listeners = new CopyOnWriteArrayList();
    protected List contributionlisteners = new CopyOnWriteArrayList();
    protected ExtensionPointRegistry registry;
    protected Map attributes;

    public BaseDomainRegistry(ExtensionPointRegistry registry,
                                Map attributes,
                                String domainRegistryURI,
                                String domainURI) {
        this.registry = registry;
        this.domainURI = domainURI;
        this.domainRegistryURI = domainRegistryURI;
        this.attributes = attributes;
    }

    public abstract void addEndpoint(Endpoint endpoint);

    public void addEndpointReference(EndpointReference endpointReference) {
        endpointreferences.add(endpointReference);
        ((RuntimeEndpointReference)endpointReference).bind(registry, this);
        logger.fine("Add endpoint reference - " + endpointReference);
    }

    public void addEndpointListener(EndpointListener listener) {
        listeners.add(listener);
    }

    protected void endpointAdded(Endpoint endpoint) {
        ((RuntimeEndpoint)endpoint).bind(registry, this);
        for (EndpointListener listener : listeners) {
            listener.endpointAdded(endpoint);
        }
    }

    protected void endpointRemoved(Endpoint endpoint) {
        ((RuntimeEndpoint)endpoint).bind(registry, this);
        for (EndpointListener listener : listeners) {
            listener.endpointRemoved(endpoint);
        }
    }

    protected void endpointUpdated(Endpoint oldEp, Endpoint newEp) {
        ((RuntimeEndpoint)newEp).bind(registry, this);
        for (EndpointListener listener : listeners) {
            listener.endpointUpdated(oldEp, newEp);
        }
    }

    public boolean isOutOfDate(EndpointReference endpointReference) {
        return ! findEndpoint(endpointReference).contains(endpointReference.getTargetEndpoint());
    }
    
    public List findEndpoint(EndpointReference endpointReference) {
        logger.fine("Find endpoint for reference - " + endpointReference);

        if (endpointReference.getReference() != null) {
            Endpoint targetEndpoint = endpointReference.getTargetEndpoint();
            String uri = targetEndpoint.getURI();
            // [rfeng] This is a workaround to deal with the case that the endpoint URI doesn't have the 
            // service name to avoid confusion between structural URIs and service URIs
            if (uri.indexOf('#') == -1) {
                uri = uri + "#service()";
            }
            return findEndpoint(uri);
        }

        return new ArrayList();
    }

    public abstract List findEndpoint(String uri);

    public List findEndpointReference(Endpoint endpoint) {
        return endpointreferences;
    }
    
    /** 
     * Returns a list of EndpointReferences that have a URI that matches a given URI
     * @param uri - the URI to match
     * @return a List of EndpointReferences that match the supplied URI - if there are none
     * an *empty* list is returned (not null)
     */
    public List findEndpointReferences( String uri ) {
    	List theRefs = new ArrayList();
    	if( uri == null ) return theRefs;
    	
    	for( EndpointReference ref : endpointreferences ) {
    		if( uri.equals(ref.getURI()) ) theRefs.add(ref);
    	} // end for
    	
    	return theRefs;
    } // end method findEndpointReference

    public abstract Endpoint getEndpoint(String uri);

    public List getEndpointReferences() {
        return endpointreferences;
    }

    public abstract Collection getEndpoints();

    public List getListeners() {
        return listeners;
    }

    public abstract void removeEndpoint(Endpoint endpoint);

    public void removeEndpointReference(EndpointReference endpointReference) {
        endpointreferences.remove(endpointReference);
        logger.fine("Remove endpoint reference - " + endpointReference);
    }

    public void removeEndpointListener(EndpointListener listener) {
        listeners.remove(listener);
    }

    public String getDomainURI() {
        return domainRegistryURI;
    }

    public String getDomainName() {
        return domainURI;
    }

    public void addContributionListener(ContributionListener listener) {
        contributionlisteners.add(listener);
    }

    public void removeContributionListener(ContributionListener listener) {
        contributionlisteners.remove(listener);
    }

    public Composite getDomainComposite() {
        FactoryExtensionPoint factories = registry.getExtensionPoint(FactoryExtensionPoint.class);
        AssemblyFactory assemblyFactory = factories.getFactory(AssemblyFactory.class);
        Composite domainComposite = assemblyFactory.createComposite();
        domainComposite.setName(new QName(Base.SCA11_TUSCANY_NS, getDomainName()));
        domainComposite.setAutowire(false);
        domainComposite.setLocal(false);
        List domainIncludes = domainComposite.getIncludes();
        Map> runningCompositeURIs = getRunningCompositeURIs();
        for (String curi : runningCompositeURIs.keySet()) {
            for (String compositeURI : runningCompositeURIs.get(curi)) {
                domainIncludes.add(getRunningComposite(curi, compositeURI));
            }
        }
        return domainComposite;
    }

    @Override
    public boolean isDistributed() {
        return true;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy