Package org.apache.tuscany.sca.extension.helper.impl

Source Code of org.apache.tuscany.sca.extension.helper.impl.ImplementationsActivator

/*
* 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.extension.helper.impl;

import java.util.List;

import javax.xml.namespace.QName;

import org.apache.tuscany.sca.assembly.AssemblyFactory;
import org.apache.tuscany.sca.assembly.Implementation;
import org.apache.tuscany.sca.assembly.xml.Constants;
import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.core.ModuleActivator;
import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
import org.apache.tuscany.sca.databinding.TransformerExtensionPoint;
import org.apache.tuscany.sca.databinding.impl.MediatorImpl;
import org.apache.tuscany.sca.extension.helper.ImplementationActivator;
import org.apache.tuscany.sca.extension.helper.utils.DefaultPropertyValueObjectFactory;
import org.apache.tuscany.sca.extension.helper.utils.PropertyValueObjectFactory;
import org.apache.tuscany.sca.provider.ImplementationProvider;
import org.apache.tuscany.sca.provider.ImplementationProviderFactory;
import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint;
import org.apache.tuscany.sca.runtime.RuntimeComponent;

/**
* A Tuscany ModuleActivator which acitvates all the ImplementationActivators
*/
public class ImplementationsActivator implements ModuleActivator {

    protected List<ImplementationActivator> implementationActivators;
   
    public void start(ExtensionPointRegistry registry) {

        ModelFactoryExtensionPoint factories = registry.getExtensionPoint(ModelFactoryExtensionPoint.class);
        AssemblyFactory assemblyFactory = factories.getFactory(AssemblyFactory.class);

        DataBindingExtensionPoint dataBindings = registry.getExtensionPoint(DataBindingExtensionPoint.class);
        TransformerExtensionPoint transformers = registry.getExtensionPoint(TransformerExtensionPoint.class);
        MediatorImpl mediator = new MediatorImpl(dataBindings, transformers);
       
        //FIXME Pass this factory differently as it's not an extension point
        PropertyValueObjectFactory propertyFactory = new DefaultPropertyValueObjectFactory(mediator);
        registry.addExtensionPoint(propertyFactory);

        // FIXME The classloader should be passed in
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        this.implementationActivators = DiscoveryUtils.discoverActivators(ImplementationActivator.class, classLoader, registry);

        StAXArtifactProcessorExtensionPoint staxProcessors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
        ProviderFactoryExtensionPoint providerFactories = registry.getExtensionPoint(ProviderFactoryExtensionPoint.class);

        for (final ImplementationActivator implementationActivator : implementationActivators) {

            Class<Implementation> implClass = implementationActivator.getImplementationClass();
            QName scdlQName = getSCDLQName(implClass);
            staxProcessors.addArtifactProcessor(new SCDLProcessor(assemblyFactory, scdlQName, implClass, registry, factories));

            if (implementationActivator.getImplementationClass() != null && providerFactories != null) {
                addImplementationProvider(implementationActivator, providerFactories);
            }
        }
    }

    public void stop(ExtensionPointRegistry registry) {
        StAXArtifactProcessorExtensionPoint staxProcessors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);

        for (final ImplementationActivator implementationActivator : implementationActivators) {
            if (staxProcessors != null) {
                StAXArtifactProcessor processor = staxProcessors.getProcessor(getSCDLQName(implementationActivator.getImplementationClass()));
                if (processor != null) {
                    staxProcessors.removeArtifactProcessor(processor);
                }
            }
        }
    }

    private void addImplementationProvider(final ImplementationActivator implementationActivator, ProviderFactoryExtensionPoint providerFactories) {

        providerFactories.addProviderFactory(new ImplementationProviderFactory() {
            public ImplementationProvider createImplementationProvider(final RuntimeComponent rc, final Implementation impl) {
                if (impl instanceof PojoImplementation) {
                    return new ImplementationImplementationProvider(implementationActivator, rc, impl, ((PojoImplementation)impl).getUserImpl());
                } else {
                    return new ImplementationImplementationProvider(implementationActivator, rc, impl, impl);
                }
            }
            public Class getModelType() {
                Class c = implementationActivator.getImplementationClass();

                if (Implementation.class.isAssignableFrom(c)) {
                    return c;
                } else {
                    return PojoImplementation.class;
                }
            }
        });
    }

    protected QName getSCDLQName(Class implementationClass) {
        String localName = implementationClass.getName();
        if (localName.lastIndexOf('.') > -1) {
            localName = localName.substring(localName.lastIndexOf('.') + 1);
        }
        if (localName.endsWith("Implementation")) {
            localName = localName.substring(0, localName.length() - 14);
        }
        StringBuilder sb = new StringBuilder(localName);
        for (int i=0; i<sb.length(); i++) {
            if (Character.isUpperCase(sb.charAt(i))) {
                sb.setCharAt(i, Character.toLowerCase(sb.charAt(i)));
            } else {
                break;
            }
        }
        return new QName(Constants.SCA10_TUSCANY_NS, "implementation." + sb.toString());
    }

}
TOP

Related Classes of org.apache.tuscany.sca.extension.helper.impl.ImplementationsActivator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.