Package cn.shenyanchao.ut

Source Code of cn.shenyanchao.ut.AstGenerator

package cn.shenyanchao.ut;

import cn.shenyanchao.builder.ClassTypeBuilder;
import cn.shenyanchao.builder.CompilationUnitBuilder;
import cn.shenyanchao.common.Consts;
import cn.shenyanchao.common.FileComments;
import cn.shenyanchao.filter.JavaFileFilter;
import cn.shenyanchao.generator.TestGenerator;
import cn.shenyanchao.utils.JavaParserFactory;
import cn.shenyanchao.utils.MembersFilter;
import cn.shenyanchao.utils.PackageUtils;
import japa.parser.ast.CompilationUnit;
import japa.parser.ast.PackageDeclaration;
import japa.parser.ast.body.MethodDeclaration;
import japa.parser.ast.body.TypeDeclaration;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

import java.io.File;
import java.util.Iterator;
import java.util.List;

/**
* Created with IntelliJ IDEA.
*
* @author shenyanchao
*         Date:  6/13/13
*         Time:  5:13 PM
*/
@Mojo(name = "source2test", defaultPhase = LifecyclePhase.GENERATE_SOURCES)
public class AstGenerator extends AbstractMojo {

    @Parameter(defaultValue = Consts.DEFAULT_ENCODE, property = "sourceEncode", required = false)
    private String sourceEncode;

    @Parameter(defaultValue = "${project.build.sourceDirectory}", property = "sourceDir", required = false)
    private String sourceDir;

    @Parameter(defaultValue = "${project.build.testSourceDirectory}", property = "testDir", required = false)
    private String testDir;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {

        getLog().info("############################################################");
        getLog().info(sourceDir);
        getLog().info(testDir);
        getLog().info("############################################################");

        File sourceDirectory = new File(sourceDir);
        File testDirectory = new File(testDir);
        makeDirIfNotExist(sourceDirectory);
        makeDirIfNotExist(testDirectory);

        Iterator<File> fileItr = FileUtils.iterateFiles(sourceDirectory, new JavaFileFilter(), TrueFileFilter.INSTANCE);
        while (fileItr.hasNext()) {
            File javaFile = fileItr.next();
            getLog().info("start process file:" + javaFile.getAbsolutePath());
            //todo
            //process java file
            convertJavaFile2Test(javaFile);
        }
    }


    private void makeDirIfNotExist(File dir) {
        if (!dir.isDirectory()) {
            getLog().error(dir.getAbsolutePath() + "is not a directory!");
        }
        if (!dir.exists()) {
            boolean success = false;
            while (!success) {
                success = dir.mkdirs();
            }
        }
    }


    private void convertJavaFile2Test(File javaFile) {

        CompilationUnit compilationUnit = JavaParserFactory.getCompilationUnit(javaFile, sourceEncode);

        CompilationUnitBuilder compilationUnitBuilder = new CompilationUnitBuilder();
        compilationUnitBuilder.buildComment(FileComments.GENERATOR_COMMENT);
        //process package
        PackageDeclaration packageDeclaration = compilationUnit.getPackage();
        String testPackageName = PackageUtils.getTestPackageNameFrom(packageDeclaration);
        compilationUnitBuilder.buildPackage(testPackageName);
        //process import

        //process type
        List typeList = compilationUnit.getTypes();
        for (Object type : typeList) {
            TypeDeclaration typeDeclaration = (TypeDeclaration) type;
            String className = typeDeclaration.getName();
            getLog().info("className:" + className);
            ClassTypeBuilder classTypeBuilder = new ClassTypeBuilder(className + Consts.TEST_SUFFIX);
            //process methods
            List<MethodDeclaration> methodDeclarations = MembersFilter.findMethodsFrom(typeDeclaration);
            for (MethodDeclaration methodDeclaration : methodDeclarations) {
                //has method and add import
                compilationUnitBuilder.buildImports(null);

                String methodName = methodDeclaration.getName();
                getLog().info("methodName:" + methodDeclaration.getName());
                classTypeBuilder.buildMethod(methodName + Consts.TEST_SUFFIX, methodDeclaration);
            }

            compilationUnitBuilder.buildClass(classTypeBuilder.build());
        }

        CompilationUnit testCompilationUnit = compilationUnitBuilder.build();

        //写入测试代码文件
        TestGenerator.writeJavaTest(testDir, testCompilationUnit);
    }

}
TOP

Related Classes of cn.shenyanchao.ut.AstGenerator

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.