Package net.flexmojos.oss.generator.granitedsv1d1d0

Source Code of net.flexmojos.oss.generator.granitedsv1d1d0.GraniteDsGenerator

/**
* Flexmojos is a set of maven goals to allow maven users to compile, optimize and test Flex SWF, Flex SWC, Air SWF and Air SWC.
* Copyright (C) 2008-2012  Marvin Froeder <marvin@flexmojos.net>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package net.flexmojos.oss.generator.granitedsv1d1d0;

import static org.granite.generator.template.StandardTemplateUris.BEAN;
import static org.granite.generator.template.StandardTemplateUris.BEAN_BASE;
import static org.granite.generator.template.StandardTemplateUris.ENTITY;
import static org.granite.generator.template.StandardTemplateUris.ENTITY_BASE;
import static org.granite.generator.template.StandardTemplateUris.ENUM;
import static org.granite.generator.template.StandardTemplateUris.INTERFACE;
import static org.granite.generator.template.StandardTemplateUris.INTERFACE_BASE;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.granite.generator.Generator;
import org.granite.generator.Output;
import org.granite.generator.TemplateUri;
import org.granite.generator.as3.As3TypeFactory;
import org.granite.generator.as3.DefaultAs3TypeFactory;
import org.granite.generator.as3.JavaAs3GroovyConfiguration;
import org.granite.generator.as3.JavaAs3GroovyTransformer;
import org.granite.generator.as3.JavaAs3Input;
import org.granite.generator.as3.PackageTranslator;
import org.granite.generator.as3.reflect.JavaEntityBean;
import org.granite.generator.as3.reflect.JavaEnum;
import org.granite.generator.as3.reflect.JavaInterface;
import org.granite.generator.as3.reflect.JavaType;
import org.granite.generator.gsp.GroovyTemplateFactory;
import net.flexmojos.oss.generator.GenerationRequest;

/**
* @author edward.yakop@gmail.com
* @since 3.2
*/
@Component( role = net.flexmojos.oss.generator.Generator.class, hint = "graniteds1" )
public final class GraniteDsGenerator
    extends AbstractLogEnabled
    implements net.flexmojos.oss.generator.Generator
{
    private static final String PREFIX_TO_REPLACE = "class:";

    private static final String SHADED_PREFIX = "class:shaded110/";

    private As3TypeFactory as3TypeFactoryImpl;

    private List<PackageTranslator> translators = new ArrayList<PackageTranslator>();

    private Map<String, File> classes;

    private String uid;

    private TemplateUri[] enumTemplateUris;

    private TemplateUri[] interfaceTemplateUris;

    private TemplateUri[] entityTemplateUris;

    private TemplateUri[] beanTemplateUris;

    private File outputDirectory;

    private File baseOutputDirectory;

    private boolean outputEnumToBaseOutputDirectory;

    private TemplateUri[] initializeEnumTemplateURIs( String[] enumTemplate )
    {
        String templateUri = get0( enumTemplate );
        if ( templateUri == null )
        {
            templateUri = ENUM.replaceFirst( PREFIX_TO_REPLACE, SHADED_PREFIX );
        }
        return createTemplateUris( null, templateUri );
    }

    private TemplateUri[] initializeInterfaceTemplateURIs( String[] interfaceTemplate )
    {
        String baseTemplateUri = INTERFACE_BASE.replaceFirst( PREFIX_TO_REPLACE, SHADED_PREFIX );
        String templateUri = INTERFACE.replaceFirst( PREFIX_TO_REPLACE, SHADED_PREFIX );
        if ( get1( interfaceTemplate ) != null )
        {
            templateUri = get1( interfaceTemplate );
        }

        if ( get0( interfaceTemplate ) != null )
        {
            baseTemplateUri = get0( interfaceTemplate );
        }
        return createTemplateUris( baseTemplateUri, templateUri );
    }

    private TemplateUri[] initializeEntityTemplateURIs( String[] entityTemplate )
    {
        String baseTemplateUri = ENTITY_BASE.replaceFirst( PREFIX_TO_REPLACE, SHADED_PREFIX );
        String templateUri = ENTITY.replaceFirst( PREFIX_TO_REPLACE, SHADED_PREFIX );
        if ( get1( entityTemplate ) != null )
        {
            templateUri = get1( entityTemplate );
        }
        if ( get0( entityTemplate ) != null )
        {
            baseTemplateUri = get0( entityTemplate );
        }
        return createTemplateUris( baseTemplateUri, templateUri );
    }

    private TemplateUri[] initializeBeanTemplateURIs( String[] beanTemplate )
    {
        String baseTemplateUri = BEAN_BASE.replaceFirst( PREFIX_TO_REPLACE, SHADED_PREFIX );
        String templateUri = BEAN.replaceFirst( PREFIX_TO_REPLACE, SHADED_PREFIX );
        if ( get1( beanTemplate ) != null )
        {
            templateUri = get1( beanTemplate );
        }
        if ( get0( beanTemplate ) != null )
        {
            baseTemplateUri = get0( beanTemplate );
        }
        return createTemplateUris( baseTemplateUri, templateUri );
    }

    private String get0( String[] a )
    {
        return get0Or1( a, 0 );
    }

    private String get1( String[] a )
    {
        return get0Or1( a, 1 );
    }

    private String get0Or1( String[] a, int index )
    {
        String s = a == null ? null : ( a.length < index + 1 ? null : a[index] );
        return s == null ? null : new File( s ).toURI().toString();
    }

    private TemplateUri[] createTemplateUris( String baseUri, String uri )
    {
        TemplateUri[] templateUris = new TemplateUri[baseUri == null ? 1 : 2];
        int i = 0;
        if ( baseUri != null )
        {
            templateUris[i++] = new TemplateUri( baseUri, true );
        }
        templateUris[i] = new TemplateUri( uri, false );
        return templateUris;
    }

    private String[] getTemplate( GenerationRequest configuration, String name )
    {
        String baseTemplate = configuration.getTemplates().get( "base-" + name );
        String template = configuration.getTemplates().get( name );
        return new String[] { baseTemplate, template };
    }

    public final void generate( GenerationRequest request )
    {
        String[] enumTemplate = new String[] { request.getTemplates().get( "enum-template" ) };
        enumTemplateUris = initializeEnumTemplateURIs( enumTemplate );

        String[] interfaceTemplate = getTemplate( request, "interface-template" );
        interfaceTemplateUris = initializeInterfaceTemplateURIs( interfaceTemplate );

        String[] entityTemplate = getTemplate( request, "entity-template" );
        entityTemplateUris = initializeEntityTemplateURIs( entityTemplate );

        String[] beanTemplate = getTemplate( request, "bean-template" );
        beanTemplateUris = initializeBeanTemplateURIs( beanTemplate );

        uid = request.getExtraOptions().get( "uidFieldName" );
        outputEnumToBaseOutputDirectory =
            Boolean.parseBoolean( request.getExtraOptions().get( "outputEnumToBaseOutputDirectory" ) );

        outputDirectory = request.getPersistentOutputFolder();
        baseOutputDirectory = request.getTransientOutputFolder();

        classes = request.getClasses();
        ClassLoader classLoader = request.getClassLoader();

        Generator generator = createGenerator( classLoader );

        as3TypeFactoryImpl = new DefaultAs3TypeFactory();

        int count = 0;
        for ( Map.Entry<String, File> classEntry : classes.entrySet() )
        {
            Class<?> clazz = null;
            try
            {
                clazz = classLoader.loadClass( classEntry.getKey() );
                JavaAs3Input input = new JavaAs3Input( clazz, classEntry.getValue() );
                for ( Output<?> output : generator.generate( input ) )
                {
                    if ( output.isOutdated() )
                    {
                        count++;
                    }
                }
            }
            catch ( Exception e )
            {
                getLogger().warn( "Could not generate AS3 beans for: '" + clazz + "'", e );
            }
        }

        getLogger().info( count + " files generated." );
    }

    private Generator createGenerator( ClassLoader loader )
    {
        Gas3Listener listener = new Gas3Listener( getLogger() );
        GraniteDSConfiguration configuration = new GraniteDSConfiguration( loader );
        Generator generator = new Generator( configuration );
        JavaAs3GroovyTransformer trans = new JavaAs3GroovyTransformer();
        trans.setListener( listener );
        generator.add( trans );
        return generator;
    }

    private class GraniteDSConfiguration
        implements JavaAs3GroovyConfiguration
    {
        private final GroovyTemplateFactory groovyTemplateFactory;

        private final ClassLoader classLoader;

        public GraniteDSConfiguration( ClassLoader classLoader )
        {
            this.classLoader = classLoader;
            groovyTemplateFactory = new GroovyTemplateFactory();
        }

        public String getUid()
        {
            return uid;
        }

        public boolean isGenerated( Class<?> clazz )
        {
            return classes.containsKey( clazz.getName() );
        }

        public As3TypeFactory getAs3TypeFactory()
        {
            return as3TypeFactoryImpl;
        }

        public List<PackageTranslator> getTranslators()
        {
            return translators;
        }

        public TemplateUri[] getTemplateUris( JavaType javaType )
        {
            if ( javaType instanceof JavaEnum )
            {
                return enumTemplateUris;
            }
            if ( javaType instanceof JavaInterface )
            {
                return interfaceTemplateUris;
            }
            if ( javaType instanceof JavaEntityBean )
            {
                return entityTemplateUris;
            }
            return beanTemplateUris;
        }

        public File getOutputDir( JavaAs3Input javaAs3Input )
        {
            if ( outputEnumToBaseOutputDirectory && javaAs3Input.getType().isEnum() )
            {
                return baseOutputDirectory;
            }

            return outputDirectory;
        }

        public File getBaseOutputDir( JavaAs3Input javaas3input )
        {
            return baseOutputDirectory;
        }

        public GroovyTemplateFactory getGroovyTemplateFactory()
        {
            return groovyTemplateFactory;
        }

        public ClassLoader getClassLoader()
        {
            return classLoader;
        }
    }
}
TOP

Related Classes of net.flexmojos.oss.generator.granitedsv1d1d0.GraniteDsGenerator

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.