Package org.apache.tuscany.container.groovy

Source Code of org.apache.tuscany.container.groovy.GroovyComponentBuilder

/*
* 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.container.groovy;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.tuscany.spi.ObjectFactory;
import org.apache.tuscany.spi.builder.BuilderConfigException;
import org.apache.tuscany.spi.component.Component;
import org.apache.tuscany.spi.component.CompositeComponent;
import org.apache.tuscany.spi.deployer.DeploymentContext;
import org.apache.tuscany.spi.extension.ComponentBuilderExtension;
import org.apache.tuscany.spi.model.ComponentDefinition;
import org.apache.tuscany.spi.model.Property;
import org.apache.tuscany.spi.model.Scope;
import org.apache.tuscany.spi.model.ServiceDefinition;

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import org.codehaus.groovy.control.CompilationFailedException;

/**
* Extension point for creating {@link GroovyAtomicComponent}s from an assembly configuration
*
* @version $$Rev: 441893 $$ $$Date: 2006-09-09 20:41:09 -0700 (Sat, 09 Sep 2006) $$
*/
public class GroovyComponentBuilder extends ComponentBuilderExtension<GroovyImplementation> {

    protected Class<GroovyImplementation> getImplementationType() {
        return GroovyImplementation.class;
    }

    public Component build(CompositeComponent parent,
                              ComponentDefinition<GroovyImplementation> componentDefinition,
                              DeploymentContext deploymentContext)
        throws BuilderConfigException {

        String name = componentDefinition.getName();
        GroovyImplementation implementation = componentDefinition.getImplementation();
        GroovyComponentType componentType = implementation.getComponentType();

        int initLevel = componentType.getInitLevel();

        // get list of services provided by this component
        Collection<ServiceDefinition> collection = componentType.getServices().values();
        List<Class<?>> services = new ArrayList<Class<?>>(collection.size());
        for (ServiceDefinition serviceDefinition : collection) {
            services.add(serviceDefinition.getServiceContract().getInterfaceClass());
        }

        // get the Groovy classloader for this deployment component
        GroovyClassLoader groovyClassLoader = (GroovyClassLoader) deploymentContext.getExtension("groovy.classloader");
        if (groovyClassLoader == null) {
            groovyClassLoader = new GroovyClassLoader(deploymentContext.getClassLoader());
            deploymentContext.putExtension("groovy.classloader", groovyClassLoader);
        }

        // create the implementation class for the script
        Class<? extends GroovyObject> groovyClass;
        try {
            String script = implementation.getScript();
            // REVIEW JFM can we cache the class?
            groovyClass = groovyClassLoader.parseClass(script);
        } catch (CompilationFailedException e) {
            BuilderConfigException bce = new BuilderConfigException(e);
            bce.setIdentifier(name);
            throw bce;
        }
        // TODO deal with init and destroy

        GroovyConfiguration configuration = new GroovyConfiguration();
        configuration.setName(name);
        configuration.setGroovyClass(groovyClass);
        configuration.setParent(parent);
        // get the scope container for this component's scope
        Scope scope = componentType.getLifecycleScope();
        if (Scope.MODULE == scope) {
            configuration.setScopeContainer(deploymentContext.getModuleScope());
        } else {
            configuration.setScopeContainer(scopeRegistry.getScopeContainer(scope));
        }


        configuration.setWireService(wireService);
        configuration.setWorkContext(workContext);
        configuration.setInitLevel(initLevel);
        configuration.setServices(services);
        GroovyAtomicComponent component = new GroovyAtomicComponent(configuration, null);

        // handle properties
        for (Property<?> property : componentType.getProperties().values()) {
            ObjectFactory<?> factory = property.getDefaultValueFactory();
            if (factory != null) {
                component.addPropertyFactory(property.getName(), factory);
            }
        }
        return component;
    }


}
TOP

Related Classes of org.apache.tuscany.container.groovy.GroovyComponentBuilder

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.