/** * */ package edu.washington.escience.myria.accessmethod; import java.io.IOException; import java.nio.file.Paths; import java.util.Objects; import javax.annotation.Nonnull; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.MoreObjects; import edu.washington.escience.myria.MyriaConstants; import edu.washington.escience.myria.api.MyriaJsonMapperProvider; /** * @author valmeida * */ public abstract class ConnectionInfo { /** * Creates a connection info. * * @param dbms the DBMS * @param jsonConnInfo the connection info packed into a JSON string * @return the connection info */ public static ConnectionInfo of(final String dbms, final String jsonConnInfo) { ObjectMapper mapper = MyriaJsonMapperProvider.getMapper(); try { switch (dbms) { case MyriaConstants.STORAGE_SYSTEM_SQLITE: return mapper.readValue(jsonConnInfo, SQLiteInfo.class); case MyriaConstants.STORAGE_SYSTEM_MONETDB: case MyriaConstants.STORAGE_SYSTEM_MYSQL: case MyriaConstants.STORAGE_SYSTEM_POSTGRESQL: return mapper.readValue(jsonConnInfo, JdbcInfo.class); default: throw new IllegalArgumentException("Invalid storage system " + dbms); } } catch (IOException e) { throw new RuntimeException(e); } } /** * Returns a JSON string representation of the connection info. * * @return the JSON representation */ public String toJson() { ObjectMapper mapper = MyriaJsonMapperProvider.getMapper(); try { return mapper.writeValueAsString(this); } catch (JsonProcessingException e) { throw new RuntimeException(e); } } /** * Constructs a database connection information from the input and returns its JSON string * representation. * * @param dbms the database system. * @param hostName the host name. * @param dirName the working directory. * @param workerId the worker identification. * @param databaseName the database name for JDBC databases; ignored for non-JDBC * @param databasePassword the database password for JDBC databases; ignored for non-JDBC * @param databasePort the port the database is using; pass null to use default port * @return the JSON string representation of the connection information. */ public static String toJson( @Nonnull final String dbms, final String hostName, final String dirName, final int workerId, final String databaseName, final String databasePassword, final Integer databasePort) { String result = ""; String host; String user; String jdbcDriverName; JdbcInfo jdbcInfo; int port; switch (dbms) { case MyriaConstants.STORAGE_SYSTEM_SQLITE: Objects.requireNonNull(workerId); SQLiteInfo sqliteInfo = SQLiteInfo.of(Paths.get(dirName, "workers", workerId + "", "data.db").toString()); result = sqliteInfo.toJson(); break; case MyriaConstants.STORAGE_SYSTEM_MONETDB: // TODO: Allow using the parameters to create the connection info. // Now it is hardcoded to use a specific connection info, which allows only one // myria instance per machine in the cluster host = hostName; port = MoreObjects.firstNonNull(databasePort, MyriaConstants.STORAGE_MONETDB_PORT); user = MyriaConstants.STORAGE_JDBC_USERNAME; jdbcDriverName = "nl.cwi.monetdb.jdbc.MonetDriver"; jdbcInfo = JdbcInfo.of(jdbcDriverName, dbms, host, port, databaseName, user, databasePassword); result = jdbcInfo.toJson(); break; case MyriaConstants.STORAGE_SYSTEM_POSTGRESQL: // TODO: Allow using the parameters to create the connection info. // Now it is hardcoded to use a specific connection info, which allows only one // myria instance per machine in the cluster host = hostName; port = MoreObjects.firstNonNull(databasePort, MyriaConstants.STORAGE_POSTGRESQL_PORT); user = MyriaConstants.STORAGE_JDBC_USERNAME; jdbcDriverName = "org.postgresql.Driver"; jdbcInfo = JdbcInfo.of(jdbcDriverName, dbms, host, port, databaseName, user, databasePassword); result = jdbcInfo.toJson(); break; case MyriaConstants.STORAGE_SYSTEM_MYSQL: // TODO: Allow using the parameters to craete the connection info. // Now it is hardcoded to use a specific connection info, which allows only one // myria instance per machine in the cluster host = hostName; port = MoreObjects.firstNonNull(databasePort, MyriaConstants.STORAGE_MYSQL_PORT); user = MyriaConstants.STORAGE_JDBC_USERNAME; jdbcDriverName = "com.mysql.jdbc.Driver"; jdbcInfo = JdbcInfo.of(jdbcDriverName, dbms, host, port, databaseName, user, databasePassword); result = jdbcInfo.toJson(); break; } return result; } /** * @return the DBMS, e.g., MyriaConstants.STORAGE_SYSTEM_MYSQL or * MyriaConstants.STORAGE_SYSTEM_MONETDB. */ public abstract String getDbms(); }