You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2008/08/08 22:13:28 UTC

svn commit: r684074 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src: main/java/org/apache/ibatis/metadata/ test/java/org/apache/ibatis/metadata/

Author: cbegin
Date: Fri Aug  8 13:13:28 2008
New Revision: 684074

URL: http://svn.apache.org/viewvc?rev=684074&view=rev
Log:
Added DB Metadata classes

Added:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java   (with props)
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java   (with props)
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java   (with props)
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java   (with props)
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java   (with props)

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java?rev=684074&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java Fri Aug  8 13:13:28 2008
@@ -0,0 +1,40 @@
+package org.apache.ibatis.metadata;
+
+public class Column {
+
+  private String name;
+  private int type;
+
+  public Column(String name, int type) {
+    this.name = name;
+    this.type = type;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public int getType() {
+    return type;
+  }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+
+    final Column column = (Column) o;
+
+    if (type != column.type) return false;
+    if (name != null ? !name.equals(column.name) : column.name != null) return false;
+
+    return true;
+  }
+
+  public int hashCode() {
+    int result;
+    result = (name != null ? name.hashCode() : 0);
+    result = 29 * result + type;
+    return result;
+  }
+
+}

Propchange: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java
------------------------------------------------------------------------------
    svn:executable = *

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java?rev=684074&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java Fri Aug  8 13:13:28 2008
@@ -0,0 +1,57 @@
+package org.apache.ibatis.metadata;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Database {
+
+  private String catalog;
+  private String schema;
+
+  private Map tables = new HashMap();
+
+  public Database(String catalog, String schema) {
+    this.catalog = catalog;
+    this.schema = schema;
+  }
+
+  public String getCatalog() {
+    return catalog;
+  }
+
+  public String getSchema() {
+    return schema;
+  }
+
+  public void addTable(Table table) {
+    tables.put(table.getName().toUpperCase(), table);
+  }
+
+  public Table getTable(String name) {
+    return (Table)tables.get(name.toUpperCase());
+  }
+
+  public String[] getTableNames() {
+    return (String[])tables.keySet().toArray(new String[tables.size()]);
+  }
+  
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+
+    final Database database = (Database) o;
+
+    if (catalog != null ? !catalog.equals(database.catalog) : database.catalog != null) return false;
+    if (schema != null ? !schema.equals(database.schema) : database.schema != null) return false;
+
+    return true;
+  }
+
+  public int hashCode() {
+    int result;
+    result = (catalog != null ? catalog.hashCode() : 0);
+    result = 29 * result + (schema != null ? schema.hashCode() : 0);
+    return result;
+  }
+
+}

Propchange: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java
------------------------------------------------------------------------------
    svn:executable = *

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java?rev=684074&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java Fri Aug  8 13:13:28 2008
@@ -0,0 +1,58 @@
+package org.apache.ibatis.metadata;
+
+import javax.sql.DataSource;
+import java.sql.*;
+
+public class DatabaseFactory {
+  private DatabaseFactory() {
+  }
+
+  public static Database newDatabase(DataSource dataSource, String catalogFilter, String schemaFilter) throws SQLException {
+    Database database = new Database(catalogFilter, schemaFilter);
+    Connection conn = dataSource.getConnection();
+    ResultSet rs = null;
+    try {
+      DatabaseMetaData dbmd = conn.getMetaData();
+
+      try {
+        rs = dbmd.getColumns(catalogFilter, schemaFilter, null, null);
+        while (rs.next()) {
+          String catalogName = rs.getString("TABLE_CAT");
+          String schemaName = rs.getString("TABLE_SCHEM");
+          String tableName = rs.getString("TABLE_NAME");
+          String columnName = rs.getString("COLUMN_NAME");
+          int dataType = Integer.parseInt(rs.getString("DATA_TYPE"));
+          Table table = database.getTable(tableName);
+          if (table == null) {
+            table = new Table(tableName);
+            table.setCatalog(catalogName);
+            table.setSchema(schemaName);
+            database.addTable(table);
+          }
+          table.addColumn(new Column(columnName, dataType));
+        }
+      } finally {
+        if (rs != null) rs.close();
+      }
+
+      try {
+        String[] tableNames = database.getTableNames();
+        for (int i=0; i < tableNames.length; i++) {
+          Table table = database.getTable(tableNames[i]);
+          rs = dbmd.getPrimaryKeys(catalogFilter, schemaFilter, table.getName());
+          if (rs.next()) {
+            String columnName = rs.getString("COLUMN_NAME");
+            table.setPrimaryKey (table.getColumn(columnName));
+          }
+        }
+      } finally {
+        if (rs != null) rs.close();
+      }
+
+    } finally {
+      conn.close();
+    }
+    return database;
+  }
+
+}

Propchange: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java
------------------------------------------------------------------------------
    svn:executable = *

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java?rev=684074&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java Fri Aug  8 13:13:28 2008
@@ -0,0 +1,69 @@
+package org.apache.ibatis.metadata;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Table {
+  private String name;
+  private String catalog;
+  private String schema;
+  private Map columns = new HashMap();
+  private Column primaryKey;
+
+  public Table(String name) {
+    this.name = name;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public String getCatalog() {
+    return catalog;
+  }
+
+  public void setCatalog(String catalog) {
+    this.catalog = catalog;
+  }
+
+  public String getSchema() {
+    return schema;
+  }
+
+  public void setSchema(String schema) {
+    this.schema = schema;
+  }
+
+  public void addColumn(Column col) {
+    columns.put(col.getName().toUpperCase(), col);
+  }
+
+  public Column getColumn(String name) {
+    return (Column) columns.get(name.toUpperCase());
+  }
+
+  public String[] getColumnNames() {
+    return (String[]) columns.keySet().toArray(new String[columns.size()]);
+  }
+
+  public void setPrimaryKey(Column column) {
+    primaryKey = column;
+  }
+
+  public Column getPrimaryKey() {
+    return primaryKey;
+  }
+
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    final Table table = (Table) o;
+    if (name != null ? !name.equals(table.name) : table.name != null) return false;
+    return true;
+  }
+
+  public int hashCode() {
+    return (name != null ? name.hashCode() : 0);
+  }
+
+}

Propchange: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java
------------------------------------------------------------------------------
    svn:executable = *

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java?rev=684074&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java Fri Aug  8 13:13:28 2008
@@ -0,0 +1,59 @@
+package org.apache.ibatis.metadata;
+
+import org.apache.ibatis.BaseDataTest;
+import org.junit.Test;
+import org.junit.Before;
+
+import javax.sql.DataSource;
+
+import junit.framework.Assert;
+
+import java.sql.Types;
+
+public class MetadataTest extends BaseDataTest {
+
+  private DataSource dataSource;
+
+  @Before
+  public void setup() throws Exception {
+    dataSource = createSimpleDataSource(BaseDataTest.BLOG_PROPERTIES);
+  }
+
+  @Test
+  public void testShouldGetAllTableNames() throws Exception {
+    Database db = DatabaseFactory.newDatabase(dataSource,null,"APP");
+    Assert.assertNotNull(db.getTable("blog"));
+    Assert.assertNotNull(db.getTable("Author"));
+    Assert.assertNotNull(db.getTable("tAg"));
+    Assert.assertNotNull(db.getTable("PosT"));
+  }
+
+  @Test
+  public void testShouldEnsureDatabasesTablesAndColumnsEqualityWorks() throws Exception {
+    Database db = DatabaseFactory.newDatabase(dataSource, null, null);
+    Database db2 = DatabaseFactory.newDatabase(dataSource, null, null);
+    Assert.assertNotNull(db);
+    Assert.assertTrue(db.equals(db2));
+    Assert.assertTrue(db.hashCode() == db.hashCode());
+    Table t = db.getTable("blog");
+    Table t2 = db.getTable("author");
+    Assert.assertNotNull(t);
+    Assert.assertNotNull(t2);
+    Assert.assertFalse(t.equals(t2));
+    Assert.assertTrue(t.getCatalog().equals(t.getCatalog()));
+    Assert.assertTrue(t.getSchema().equals(t.getSchema()));
+    Assert.assertTrue(t.equals(t));
+    Assert.assertTrue(t.hashCode() == t.hashCode());
+    Assert.assertEquals("BLOG",t.getName());
+    Assert.assertEquals(3, t.getColumnNames().length);
+    Column c = t.getColumn("author_id");
+    Column c2 = t.getColumn("id");
+    Assert.assertNotNull(c);
+    Assert.assertNotNull(c2);
+    Assert.assertEquals(Types.INTEGER, c.getType());
+    Assert.assertFalse(c.equals(c2));
+    Assert.assertTrue(c.equals(c));
+    Assert.assertTrue(c.hashCode() == c.hashCode());
+  }
+
+}

Propchange: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java
------------------------------------------------------------------------------
    svn:executable = *