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

com.github.museadmin.infinite_state_machine.common.dal.Postgres Maven / Gradle / Ivy

package com.github.museadmin.infinite_state_machine.common.dal;

import com.github.museadmin.infinite_state_machine.lib.PropertyCache;
import org.json.JSONArray;
import org.json.JSONObject;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Data Access Object for when using Postgres
 */
public class Postgres implements IDataAccessLayer {

  private Map dbData = new HashMap();
  private List comments = new ArrayList<>();

  public Postgres(PropertyCache propertyCache, String epochSeconds) {

      dbData.put("dbHost", propertyCache.getProperty("dbHost"));
      dbData.put("dbName", propertyCache.getProperty("dbName") + epochSeconds);
      dbData.put("dbPassword", propertyCache.getProperty("dbPassword"));
      dbData.put("dbPort", propertyCache.getProperty("dbPort"));
      dbData.put("dbUser", propertyCache.getProperty("dbUser"));

      createDatabase(dbData.get("dbName").toString());
  }

  /**
   * Create a unique database instance for the run
   * @param database Name of the DB
   */
  public void createDatabase(String database) {

      try {
          Connection connection = getConnection("postgres");
          Statement statement = connection.createStatement();
          statement.executeUpdate("CREATE DATABASE " + database);
      } catch (SQLException e) {
          e.printStackTrace();
          System.err.println(e.getClass().getName() + ": " + e.getMessage());
          System.exit(1);
      }
  }

  /**
   * Create a database table using a JSON definition
   * @param table JSONObject
   */
  public void createTable(JSONObject table){
      executeSqlStatement(createTableStatement(table));
      comments.forEach(comment -> executeSqlStatement(comment));
      comments.clear();
  }

  /**
   * Insert the states read in from an action pack
   * @param state JSONArray populated with state entries
   */
  public void insertState(JSONArray state) {

  }

  /**
   * Insert the actions read in from an action pack into the state_machine table
   * @param action JSONArray populated with action entries
   */
  public void insertAction(JSONArray action) {

  }

  /**
   * Executes a SQL statement
   * @param sql The statement to execute
   * @return True or False for success or failure
   */
  public Boolean executeSqlStatement(String sql)  {
      Boolean rc = false;
      try {
          Connection connection = getConnection(getDbData("dbName"));
          Statement statement = connection.createStatement();
          rc = statement.execute(sql);
      } catch (SQLException e) {
          e.printStackTrace();
          System.err.println(e.getClass().getName() + ": " + e.getMessage());
          System.exit(1);
      }
      return rc;
  }

  /**
   * Return a connection to the postgres database
   * @param database Database Name
   * @return Connection
   */
  private Connection getConnection(String database) {
      Connection connection = null;
      try {
          connection = DriverManager.getConnection("jdbc:postgresql://" +
              getDbData("dbHost") + ":" + getDbData("dbPort") + "/" + database,
              getDbData("dbUser"), getDbData("dbPassword"));
      } catch (SQLException e) {
          e.printStackTrace();
          System.err.println(e.getClass().getName() + ": " + e.getMessage());
          System.exit(1);
      }
      return connection;
  }

  /**
   * Return a member of the dbData hash
   * @param key Hash ke
   * @return String Value
   */
  private String getDbData(String key) {
      return dbData.get(key).toString();
  }

  /**
   * SQLite3 context aware CREATE TABLE statement builder
   * @param table JSONObject created from JSON defintion file
   * @return The SQL as a string
   */
  private String createTableStatement(JSONObject table) {

      StringBuilder sbSql = new StringBuilder(100);
      sbSql.append("CREATE TABLE ");
      sbSql.append(table.get("name"));
      sbSql.append(" (");

      JSONArray columns = table.getJSONArray("columns");

      columns.forEach(column -> {
          JSONObject col = (JSONObject) column;

          sbSql.append(col.getString("name"));
          sbSql.append(" " + col.getString("type"));

          if (col.getBoolean("not_null")) {
              sbSql.append(" NOT NULL");
          }

          String def = col.getString("default");
          if (! def.isEmpty()) {
              sbSql.append(" DEFAULT '" + def + "'");
          }

          if (col.getBoolean("primary_key")) {
              sbSql.append(" PRIMARY KEY");
          }

          sbSql.append(", ");

          String comment = col.getString("comment");
          if (! comment.isEmpty()) { comments.add("COMMENT ON COLUMN " +
                  table.get("table_name") + "." +
                  col.getString("name") + " is '" +
                  comment + "';"
              );
          }
      });

      sbSql.append(");");

      String sql = sbSql.toString();
      int index = sql.lastIndexOf(',');
      sbSql.deleteCharAt(index);

      return sbSql.toString();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy