All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.wisdom.maven.mojos.CreateMojo Maven / Gradle / Ivy

There is a newer version: 0.10.0
Show newest version
/*
 * #%L
 * Wisdom-Framework
 * %%
 * Copyright (C) 2013 - 2014 Wisdom Framework
 * %%
 * 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.
 * #L%
 */
package org.wisdom.maven.mojos;

import com.google.common.base.Strings;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.wisdom.maven.Constants;
import org.wisdom.maven.utils.ApplicationSecretGenerator;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * This mojo is used to generate the skeleton of Wisdom Applications.
 */
@Mojo(name = "create", threadSafe = false,
        requiresDependencyResolution = ResolutionScope.COMPILE,
        requiresDirectInvocation = true,
        requiresProject = false)
public class CreateMojo extends AbstractWisdomMojo {

    /**
     * The name of the skeleton. By default it use quickstart. 'blank' can be used to create an empty project
     * (without additional applications and the controller).
     */
    @Parameter(defaultValue = "quickstart")
    public String skel;
    /**
     * The artifact Id of the generated project.
     */
    @Parameter(required = true, defaultValue = "${artifactId}")
    public String artifactId;
    /**
     * The group Id of the generated project.
     */
    @Parameter(required = true, defaultValue = "${groupId}")
    public String groupId;
    /**
     * The version of the generated project.
     */
    @Parameter(required = true, defaultValue = "${version}")
    public String version;

    /**
     * The root package of the generated project.
     */
    @Parameter(required = false, defaultValue = "${package}")
    public String packageName;

    private File sources;
    private File test;
    private File configuration;
    private File root;
    private File packageDirectory;
    private File packageDirectoryForTest;
    private File templates;
    private File assets;

    /**
     * Generates the project structure.
     * If a directory with the 'artifactId\ name already exist, nothing is generated as we don't want to overridde
     * anything.
     *
     * @throws MojoExecutionException
     */
    @Override
    public void execute() throws MojoExecutionException {
        try {
            ensureNotExisting();
            createDirectories();

            if ("blank".equalsIgnoreCase(skel)) {
                createApplicationConfiguration();
                createBlankPomFile();
                createPackageStructure();
                copyDefaultErrorTemplates();
            } else {
                createApplicationConfiguration();
                createPomFile();
                createPackageStructure();
                createDefaultController();
                createTests();
                copyAssets();
                createWelcomeTemplate();
                copyDefaultErrorTemplates();
            }

            printStartGuide();
        } catch (IOException e) {
            throw new MojoExecutionException("Error during project generation", e);
        }
    }

    private void printStartGuide() {
        getLog().info("You application is ready !");
        getLog().info("Wanna try it right away ?");
        getLog().info("\t cd " + artifactId);
        getLog().info("\t mvn wisdom:run");
        getLog().info("That's all !");
    }

    private void createDefaultController() throws IOException {
        File ctrl = new File(packageDirectory, "WelcomeController.java");
        InputStream is = CreateMojo.class.getClassLoader().getResourceAsStream("project/controller/sample/WelcomeController.java");
        String content = IOUtils.toString(is);
        IOUtils.closeQuietly(is);
        content = content.replace("package sample;", "package " + getPackageName() + ";");

        FileUtils.writeStringToFile(ctrl, content);
    }

    private void createTests() throws IOException {
        File testCase = new File(packageDirectoryForTest, "UnitTest.java");
        InputStream is = CreateMojo.class.getClassLoader().getResourceAsStream
                ("project/tests/UnitTest.java");
        String content = IOUtils.toString(is);
        IOUtils.closeQuietly(is);
        content = content.replace("package sample;", "package " + getPackageName() + ";");
        FileUtils.writeStringToFile(testCase, content);

        testCase = new File(packageDirectoryForTest, "InContainerIT.java");
        is = CreateMojo.class.getClassLoader().getResourceAsStream
                ("project/tests/InContainerIT.java");
        content = IOUtils.toString(is);
        IOUtils.closeQuietly(is);
        content = content.replace("package sample;", "package " + getPackageName() + ";");
        FileUtils.writeStringToFile(testCase, content);

        testCase = new File(packageDirectoryForTest, "BlackBoxIT.java");
        is = CreateMojo.class.getClassLoader().getResourceAsStream
                ("project/tests/BlackBoxIT.java");
        content = IOUtils.toString(is);
        IOUtils.closeQuietly(is);
        content = content.replace("package sample;", "package " + getPackageName() + ";");
        FileUtils.writeStringToFile(testCase, content);

        testCase = new File(packageDirectoryForTest, "FluentLeniumIT.java");
        is = CreateMojo.class.getClassLoader().getResourceAsStream
                ("project/tests/FluentLeniumIT.java");
        content = IOUtils.toString(is);
        IOUtils.closeQuietly(is);
        content = content.replace("package sample;", "package " + getPackageName() + ";");
        FileUtils.writeStringToFile(testCase, content);
    }

    private void createWelcomeTemplate() throws IOException {
        File template = new File(templates, "welcome.thl.html");
        InputStream is = CreateMojo.class.getClassLoader().getResourceAsStream("project/templates/welcome.thl.html");
        String content = IOUtils.toString(is);
        IOUtils.closeQuietly(is);
        content = content.replace("@@group_id@@", "${project.groupId}")
                .replace("@@artifact_id@@", "${project.artifactId}")
                .replace("@@version@@", "${project.version}")
                .replace("@@package_name@@", getPackageName());
        FileUtils.writeStringToFile(template, content);
    }

    private void copyAssets() throws IOException {
        File css = new File(assets, "main.less");
        InputStream is = CreateMojo.class.getClassLoader().getResourceAsStream("project/assets/main.less");
        FileUtils.copyInputStreamToFile(is, css);
        IOUtils.closeQuietly(is);

        File favico = new File(assets, "owl-small.png");
        is = CreateMojo.class.getClassLoader().getResourceAsStream("project/assets/owl-small.png");
        FileUtils.copyInputStreamToFile(is, favico);
        IOUtils.closeQuietly(is);
    }

    private void copyDefaultErrorTemplates() throws IOException {
        File templateDirectory = new File(root, Constants.TEMPLATES_SRC_DIR);
        File error = new File(templateDirectory, "error");
        if (error.mkdirs()) {
            getLog().debug(error.getAbsolutePath() + " directory created");
        }

        // Copy 404
        InputStream is = CreateMojo.class.getClassLoader().getResourceAsStream("templates/error/404.thl.html");
        FileUtils.copyInputStreamToFile(is, new File(error, "404.thl.html"));
        IOUtils.closeQuietly(is);

        // Copy 500
        is = CreateMojo.class.getClassLoader().getResourceAsStream("templates/error/500.thl.html");
        FileUtils.copyInputStreamToFile(is, new File(error, "500.thl.html"));
        IOUtils.closeQuietly(is);

        // Copy pipeline
        is = CreateMojo.class.getClassLoader().getResourceAsStream("templates/error/pipeline.thl.html");
        FileUtils.copyInputStreamToFile(is, new File(error, "pipeline.thl.html"));
        IOUtils.closeQuietly(is);
    }

    private void createPackageStructure() {
        String name = getPackageName();
        name = name.replace(".", "/");
        packageDirectory = new File(sources, name);
        packageDirectoryForTest = new File(test, name);
        if (packageDirectory.mkdirs()) {
            getLog().debug(packageDirectory.getAbsolutePath() + " directory created");
        }
        if (packageDirectoryForTest.mkdirs()) {
            getLog().debug(packageDirectoryForTest.getAbsolutePath() + " directory created");
        }
    }


    private void createPomFile() throws IOException {
        File pom = new File(root, "pom.xml");
        InputStream is = CreateMojo.class.getClassLoader().getResourceAsStream("project/pom/quickstart-pom.xml");
        String content = IOUtils.toString(is);
        IOUtils.closeQuietly(is);
        content = content.replace("@@group_id@@", groupId)
                .replace("@@artifact_id@@", artifactId)
                .replace("@@version@@", version)
                .replace("@@package_name@@", getPackageName());

        FileUtils.writeStringToFile(pom, content);
    }

    private void createBlankPomFile() throws IOException {
        File pom = new File(root, "pom.xml");
        InputStream is = CreateMojo.class.getClassLoader().getResourceAsStream("project/pom/blank-pom.xml");
        String content = IOUtils.toString(is);
        IOUtils.closeQuietly(is);
        content = content.replace("@@group_id@@", groupId)
                .replace("@@artifact_id@@", artifactId)
                .replace("@@version@@", version)
                .replace("@@package_name@@", getPackageName());

        FileUtils.writeStringToFile(pom, content);
    }

    private String getPackageName() {
        if (Strings.isNullOrEmpty(packageName)) {
            return "sample";
        } else {
            return packageName;
        }
    }

    private void createApplicationConfiguration() throws IOException {
        File application = new File(configuration, "application.conf");
        InputStream is = CreateMojo.class.getClassLoader().getResourceAsStream("configuration/application.conf");
        String content = IOUtils.toString(is);
        IOUtils.closeQuietly(is);
        content = content.replace("@@application.secret@@", ApplicationSecretGenerator.generate());
        FileUtils.writeStringToFile(application, content);
    }

    private void createDirectories() {
        root = new File(basedir, artifactId);
        if (root.mkdirs()) {
            getLog().debug(root.getAbsolutePath() + " directory created.");
        }
        sources = new File(root, Constants.MAIN_SRC_DIR);
        if (sources.mkdirs()) {
            getLog().debug(sources.getAbsolutePath() + " directory created");
        }
        test = new File(root, Constants.TEST_SRC_DIR);
        if (test.mkdirs()) {
            getLog().debug(test.getAbsolutePath() + " directory created");
        }
        File resources = new File(root, Constants.MAIN_RESOURCES_DIR);
        if (resources.mkdirs()) {
            getLog().debug(resources.getAbsolutePath() + " directory created");
        }

        assets = new File(resources, "assets");
        if (assets.mkdirs()) {
            getLog().debug(assets.getAbsolutePath() + " directory created");
        }

        templates = new File(resources, "templates");
        if (templates.mkdirs()) {
            getLog().debug(templates.getAbsolutePath() + " directory created");
        }

        File file = new File(root, Constants.TEST_SRC_DIR);
        if (file.mkdirs()) {
            getLog().debug(file.getAbsolutePath() + " directory created");
        }
        file = new File(root, Constants.TEST_RESOURCES_DIR);
        if (file.mkdirs()) {
            getLog().debug(file.getAbsolutePath() + " directory created");
        }

        file = new File(root, Constants.ASSETS_SRC_DIR);
        if (file.mkdirs()) {
            getLog().debug(file.getAbsolutePath() + " directory created");
        }
        file = new File(root, Constants.TEMPLATES_SRC_DIR);
        if (file.mkdirs()) {
            getLog().debug(file.getAbsolutePath() + " directory created");
        }
        configuration = new File(root, Constants.CONFIGURATION_SRC_DIR);
        if (configuration.mkdirs()) {
            getLog().debug(configuration.getAbsolutePath() + " directory created");
        }

    }

    private void ensureNotExisting() throws MojoExecutionException {
        File file = new File(basedir, artifactId);
        if (file.exists()) {
            throw new MojoExecutionException("Cannot create the Wisdom application - " + artifactId + " already " +
                    "exist");
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy