com.spoledge.audao.maven.GeneratorMojo.java Source code

Java tutorial

Introduction

Here is the source code for com.spoledge.audao.maven.GeneratorMojo.java

Source

/*
 * Copyright 2013 Spolecne s.r.o. (www.spoledge.com)
 *
 * Licensed 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 com.spoledge.audao.maven;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;

import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;

import org.apache.maven.project.MavenProject;

import java.io.File;
import java.io.InputStreamReader;
import java.io.FileInputStream;

import java.util.List;

import com.spoledge.audao.generator.*;

/**
 * Goal which generates Java source files.
 */
@Mojo(name = "generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES)
public class GeneratorMojo extends AbstractMojo {

    @Component
    private MavenProject project;

    @Parameter(required = true)
    private String dbType;

    @Parameter(defaultValue = "${project.groupId}", required = true)
    private String pkg;

    @Parameter(defaultValue = "${basedir}/src/main/audao/${project.artifactId}.xml", required = true)
    private File src;

    @Parameter(defaultValue = "${project.build.directory}/generated-sources/audao", required = true)
    private File dest;

    @Parameter(property = "debug")
    private boolean debug;

    @Parameter
    private boolean generateDtoGwtSerializer;

    @Parameter(property = "generateTypes")
    private String[] generateTypes;

    private ResourceType[] enableResources;

    ////////////////////////////////////////////////////////////////////////////
    // Public
    ////////////////////////////////////////////////////////////////////////////

    public void setGenerateTypes(String[] vals) {
        this.generateTypes = vals;

        if (vals == null || vals.length == 0)
            return;

        enableResources = new ResourceType[vals.length];
        for (int i = 0; i < vals.length; i++) {
            enableResources[i] = ResourceType.valueOf(vals[i].toUpperCase());
        }
    }

    @Override
    public void execute() throws MojoExecutionException {
        Log log = getLog();

        // Check if something was changed:
        File touch = new File(dest, "audao.txt");

        if (!touch.exists() || touch.lastModified() < src.lastModified())
            generate();
        else
            log.info("Skipping AuDAO generator task - sources are up-to-date.");

        try {
            touch.delete();
            touch.createNewFile();
        } catch (Exception e) {
        }

        project.addCompileSourceRoot(dest.getAbsolutePath());
        log.info("Added source directory: " + dest);
    }

    ////////////////////////////////////////////////////////////////////////////
    // Private
    ////////////////////////////////////////////////////////////////////////////

    private void generate() throws MojoExecutionException {
        Log log = getLog();

        String targetName = dbType.toUpperCase();

        log.info("AuDAO Generating from '" + src + "', to '" + dest + "', target '" + targetName + "'");

        try {
            Target target = Target.valueOf(targetName);
            InputStreamReader xmlReader = new InputStreamReader(new FileInputStream(src), "UTF-8");

            Output output = dest.getName().endsWith(".zip") ? new ZipFileOutput(dest) : new FileOutput(dest);

            Generator g = new Generator(target);
            g.setIsDebugEnabled(debug);
            g.validate(xmlReader);

            xmlReader = new InputStreamReader(new FileInputStream(src), "UTF-8");

            if (enableResources != null) {
                for (ResourceType res : enableResources) {
                    g.setResourceEnabled(res, true);
                }

                if (generateDtoGwtSerializer) {
                    g.setResourceEnabled(ResourceType.DTO_GWT_SERIALIZER, generateDtoGwtSerializer);
                }
            } else {
                g.setAllResourcesEnabled(true);
                g.setResourceEnabled(ResourceType.DTO_GWT_SERIALIZER, generateDtoGwtSerializer);
            }

            g.generate(pkg, xmlReader, output);

            output.finish();
        } catch (GeneratorException e) {
            if (e.isWarningOnly()) {
                log.warn(e.toString());
            } else {
                List<? extends Exception> exceptions = e.getExceptions();
                List<GeneratorException.Type> types = e.getTypes();

                for (int i = 0; i < exceptions.size(); i++) {
                    switch (types.get(i)) {
                    case WARNING:
                        log.warn(exceptions.get(i).toString());
                        break;

                    case ERROR:
                        log.error("Error: ", exceptions.get(i));
                        break;

                    default:
                        log.error("Fatal error:", exceptions.get(i));
                        break;

                    }
                }

                throw new MojoExecutionException("Error (" + exceptions.size() + " nested errors)", e);
            }
        } catch (Exception e) {
            throw new MojoExecutionException("Error", e);
        }
    }

}