com.amazonaws.scala.ProjectGenerator.java Source code

Java tutorial

Introduction

Here is the source code for com.amazonaws.scala.ProjectGenerator.java

Source

/*
 * Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file 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.amazonaws.scala;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;

import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * Main point of entry for the project generator.
 */
public final class ProjectGenerator {

    private final File baseDir;
    private final Freemarker freemarker;
    private final ObjectMapper mapper;

    /**
     * @param baseDir the base directory of the project
     */
    public ProjectGenerator(File baseDir) {
        this(baseDir, new Freemarker(), new ObjectMapper(new YAMLFactory()));
    }

    /**
     * @param baseDir the base directory of the project
     * @param freemarker a utility for working with freemarker
     * @param mapper a Jackson ObjectMapper for loading the YAML configuration
     */
    public ProjectGenerator(File baseDir, Freemarker freemarker, ObjectMapper mapper) {

        this.baseDir = baseDir;
        this.freemarker = freemarker;
        this.mapper = mapper;
    }

    /**
     * Generates a multi-module maven project structure under
     * {@code $baseDir/project} from the configuration in
     * {@code $baseDir/config.yaml}.
     */
    public void generate() throws IOException, TemplateException {
        File configFile = new File(baseDir, "config.yaml");
        AggregatorModel aggregator = mapper.readValue(configFile, AggregatorModel.class);

        File project = new File(baseDir, "project");
        mkdir(project);

        // Generate the individual client modules.
        Template pom = freemarker.getPomTemplate();
        for (ModuleModel module : aggregator.getModules()) {
            File dir = new File(project, "aws-scala-sdk-" + module.getName());
            mkdir(dir);

            Writer writer = new FileWriter(new File(dir, "pom.xml"));
            try {
                pom.process(module, writer);
            } finally {
                writer.close();
            }
        }

        // Generate the aggregator module.
        Template agg = freemarker.getAggregatorTemplate();

        Writer writer = new FileWriter(new File(project, "pom.xml"));
        try {
            agg.process(aggregator, writer);
        } finally {
            writer.close();
        }
    }

    private void mkdir(File dir) throws IOException {
        if (dir.exists()) {
            for (String file : dir.list()) {
                delete(new File(dir, file));
            }
        } else {
            if (!dir.mkdirs()) {
                throw new IOException("Error creating directory " + dir);
            }
        }
    }

    private void delete(File file) throws IOException {
        if (file.isDirectory()) {
            for (String f : file.list()) {
                delete(new File(file, f));
            }
        }
        if (!file.delete()) {
            throw new IOException("Could not delete " + file);
        }
    }

    /**
     * Main point of entry from the command line. Pass the base directory for
     * generation as the only argument.
     */
    public static void main(String[] args) throws Exception {
        if (args.length != 1) {
            System.err.println("usage: generator <basedir>");
            System.exit(-1);
        }

        File baseDir = new File(args[0]);
        System.out.println("Using baseDir: " + baseDir.getAbsolutePath());

        new ProjectGenerator(baseDir).generate();
    }
}