AbstractCommandMojo.java

/*
 *    Copyright 2010-2022 the original author or authors.
 *
 *    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
 *
 *       https://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 org.mybatis.maven.mvnmigrate;

import java.io.File;
import java.io.PrintStream;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

import org.apache.ibatis.migration.commands.BaseCommand;
import org.apache.ibatis.migration.options.SelectedOptions;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Parameter;
import org.mybatis.maven.mvnmigrate.util.MavenOutputStream;

/**
 * Provides to an abstract class that extends {@link AbstractMojo}.
 */
abstract class AbstractCommandMojo<T extends BaseCommand> extends AbstractMojo {

  private final Locale locale = Locale.ENGLISH;

  /**
   * Location of migrate repository.
   */
  @Parameter(property = "migration.path", defaultValue = ".")
  private File repository;

  /**
   * Environment to configure. Default environment is 'development'.
   */
  @Parameter(property = "migration.env", defaultValue = "development")
  private String environment;

  /**
   * Forces script to continue even if SQL errors are encountered.
   */
  @Parameter(property = "migration.force", defaultValue = "false")
  private boolean force;

  /**
   * Skip migration actions.
   */
  @Parameter(property = "migration.skip", defaultValue = "false")
  private boolean skip;

  /**
   * The command to execute.
   */
  private T command;

  /**
   * execute the command.
   */
  @Override
  public void execute() throws MojoExecutionException, MojoFailureException {
    if (this.isSkip()) {
      return;
    }
    this.init();
    this.command.execute();
  }

  /**
   * Initialize the MyBatis Migration command.
   */
  protected void init() throws MojoFailureException {
    try {
      final SelectedOptions options = new SelectedOptions();
      options.getPaths().setBasePath(this.getRepository());
      options.setEnvironment(this.getEnvironment());
      options.setForce(this.isForce());

      this.command = this.createCommandClass(options);
      final PrintStream out = new PrintStream(new MavenOutputStream(this.getLog()));
      this.command.setPrintStream(out);
      this.command.setDriverClassLoader(this.getClass().getClassLoader());

      if (this.getLog().isInfoEnabled()) {
        final String[] args = { this.command.getClass().getSimpleName(),
            this.getBundle(this.locale).getString("migration.plugin.name") };
        final MessageFormat format = new MessageFormat(
            this.getBundle(this.locale).getString("migration.plugin.execution.command"));
        this.getLog().info(format.format(args));
      }
    } catch (final RuntimeException e) {
      throw e;
    } catch (final Exception e) {
      throw new MojoFailureException(this, e.getMessage(), e.getLocalizedMessage());
    }
  }

  protected Locale getLocale() {
    return this.locale;
  }

  protected File getRepository() {
    return this.repository;
  }

  protected String getEnvironment() {
    return this.environment;
  }

  protected boolean isForce() {
    return this.force;
  }

  /**
   * Return the command.
   *
   * @return {@link BaseCommand} the command created.
   */
  protected T getCommand() {
    return this.command;
  }

  /**
   * Test if the skip flag is setted.
   *
   * @return the skip flag.
   */
  protected boolean isSkip() {
    if (this.skip && this.getLog().isInfoEnabled()) {
      final String[] args = { this.getBundle(this.locale).getString("migration.plugin.name") };
      final MessageFormat format = new MessageFormat(
          this.getBundle(this.locale).getString("migration.plugin.execution.command.skipped"));
      this.getLog().info(format.format(args));
    }
    return this.skip;
  }

  /**
   * The current locale.
   *
   * @param locale
   *          the locale
   *
   * @return the bundle
   */
  protected ResourceBundle getBundle(final Locale locale) {
    return ResourceBundle.getBundle("migration-plugin", locale, this.getClass().getClassLoader());
  }

  /**
   * Creates the specific mojo command.
   *
   * @param options
   *          the options
   *
   * @return The command created.
   */
  protected abstract T createCommandClass(final SelectedOptions options);

}