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

io.ebeaninternal.server.core.DScriptRunner Maven / Gradle / Ivy

There is a newer version: 15.8.1
Show newest version
package io.ebeaninternal.server.core;

import io.ebean.ScriptRunner;
import io.ebean.migration.ddl.DdlRunner;
import io.ebean.migration.runner.ScriptTransform;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.util.UrlHelper;

import javax.persistence.PersistenceException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.Reader;
import java.net.URL;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;

class DScriptRunner implements ScriptRunner {

  private static final String NEWLINE = "\n";

  private final SpiEbeanServer server;
  private final String platformName;

  DScriptRunner(SpiEbeanServer server) {
    this.server = server;
    this.platformName = this.server.getDatabasePlatform().getPlatform().base().name();
  }

  @Override
  public void run(String path) {
    run(path, null);
  }

  @Override
  public void run(String path, Map placeholderMap) {
    run(this.getClass().getResource(path), path, placeholderMap);
  }

  @Override
  public void run(URL resource) {
    run(resource, null, null);
  }

  @Override
  public void run(URL resource, Map placeholderMap) {
    run(resource, null, placeholderMap);
  }

  private void run(URL resource, String scriptName, Map placeholderMap) {
    if (resource == null) {
      throw new IllegalArgumentException("resource is null?");
    }
    if (scriptName == null) {
      scriptName = resource.getFile();
    }

    String content = content(resource);
    runScript(content, scriptName, placeholderMap, false);
  }

  private String content(URL resource) {
    if (resource == null) {
      throw new IllegalArgumentException("resource is null?");
    }

    try (InputStream inputStream = UrlHelper.openNoCache(resource)) {
      return readContent(new InputStreamReader(inputStream));

    } catch (IOException e) {
      throw new PersistenceException("Failed to read script content", e);
    }
  }

  @Override
  public void runScript(String name, String content, boolean useAutoCommit) {
    runScript(content, name, null, useAutoCommit);
  }

  /**
   * Execute all the DDL statements in the script.
   */
  private void runScript(String content, String scriptName, Map placeholderMap, boolean useAutoCommit) {
    try {
      if (placeholderMap != null) {
        content = ScriptTransform.build(null, placeholderMap).transform(content);
      }

      try (Connection connection = obtainConnection()) {
        DdlRunner runner = new DdlRunner(useAutoCommit, scriptName, platformName);
        runner.runAll(content, connection);
        connection.commit();
        runner.runNonTransactional(connection);
      }

    } catch (SQLException e) {
      throw new PersistenceException("Failed to run script", e);
    }
  }

  private Connection obtainConnection() {
    try {
      return server.getPluginApi().getDataSource().getConnection();
    } catch (SQLException e) {
      throw new PersistenceException("Failed to obtain connection to run script", e);
    }
  }

  private String readContent(Reader reader) throws IOException {

    StringBuilder buf = new StringBuilder();
    try (LineNumberReader lineReader = new LineNumberReader(reader)) {
      String line;
      while ((line = lineReader.readLine()) != null) {
        buf.append(line).append(NEWLINE);
      }
      return buf.toString();
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy