This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch version3
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/version3 by this push:
     new 86bd841  EMPIREDB-362 Improved DBModelChecker
86bd841 is described below

commit 86bd841cd0a26f140c061979a711d66f5125c4d7
Author: Rainer Döbele <[email protected]>
AuthorDate: Mon Jan 24 22:33:37 2022 +0100

    EMPIREDB-362 Improved DBModelChecker
---
 .../empire-db-example-advanced/config.xml          |   2 +-
 .../empire/samples/db/advanced/SampleAdvApp.java   |   8 +-
 .../src/main/java/org/apache/empire/db/DBView.java |   2 +-
 .../empire/db/validation/DBModelChecker.java       | 289 +++++++++++++++------
 .../empire/db/validation/DBModelErrorHandler.java  |  10 +-
 .../empire/db/validation/DBModelErrorLogger.java   |  12 +
 .../java/org/apache/empire/dbms/DBMSHandler.java   |   2 +-
 .../org/apache/empire/dbms/DBMSHandlerBase.java    |   5 +-
 .../apache/empire/dbms/hsql/DBMSHandlerHSql.java   |  12 +
 .../empire/dbms/oracle/DBMSHandlerOracle.java      |  23 +-
 .../empire/dbms/oracle/OracleDBModelChecker.java   |  24 +-
 .../empire/dbms/sqlserver/DBMSHandlerMSSQL.java    |  17 +-
 .../empire/dbms/sqlserver/MSSqlDBModelChecker.java |  23 +-
 13 files changed, 302 insertions(+), 127 deletions(-)

diff --git a/empire-db-examples/empire-db-example-advanced/config.xml 
b/empire-db-examples/empire-db-example-advanced/config.xml
index 75a4dd9..13b8688 100644
--- a/empire-db-examples/empire-db-example-advanced/config.xml
+++ b/empire-db-examples/empire-db-example-advanced/config.xml
@@ -104,7 +104,7 @@
                <!-- Empire-db driver configuration -->
                
<dbmsHandlerClass>org.apache.empire.dbms.oracle.DBMSHandlerOracle</dbmsHandlerClass>
                <dbmsHandlerProperites>
-                       <!-- no properties -->
+                       <schemaName>DBSAMPLEADV</schemaName>
                </dbmsHandlerProperites>
        </properties-oracle>
 
diff --git 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
index 5efd6c3..3d7c85f 100644
--- 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
+++ 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
@@ -20,7 +20,6 @@ package org.apache.empire.samples.db.advanced;
 
 import java.sql.Connection;
 import java.sql.DriverManager;
-import java.text.MessageFormat;
 import java.util.Date;
 import java.util.HashMap;
 
@@ -334,15 +333,14 @@ public class SampleAdvApp
     
     private static void checkDataModel()
     {
-        DBModelChecker modelChecker = context.getDbms().createModelChecker();
+        DBModelChecker modelChecker = context.getDbms().createModelChecker(db);
         // Check data model   
         log.info("Checking DataModel for {} using {}", 
db.getClass().getSimpleName(), modelChecker.getClass().getSimpleName());
         // dbo schema
         DBModelErrorLogger logger = new DBModelErrorLogger();
-        modelChecker.checkModel(db, context.getConnection(), "DBSAMPLEADV", 
logger);
+        modelChecker.checkModel(context.getConnection(), logger);
         // show result
-        String msg = MessageFormat.format("Data model check done. Found {0} 
errors and {1} warnings.", logger.getErrorCount(), logger.getWarnCount());
-        System.out.println(msg);
+        log.info("Data model check done. Found {} errors and {} warnings.", 
logger.getErrorCount(), logger.getWarnCount());
     }
 
     /**
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBView.java 
b/empire-db/src/main/java/org/apache/empire/db/DBView.java
index dd73d5b..fa9ec5b 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBView.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBView.java
@@ -297,7 +297,7 @@ public abstract class DBView extends DBRowSet
      * 
      * @param col a view column object
      */
-    void addColumn(DBViewColumn col)
+    protected void addColumn(DBViewColumn col)
     { // find column by name
         if (col == null || col.getRowSet() != this)
             throw new InvalidArgumentException("col", col);
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java 
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java
index c696396..2b27dae 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelChecker.java
@@ -30,28 +30,99 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBCommandExpr;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBRelation;
 import org.apache.empire.db.DBRelation.DBReference;
+import org.apache.empire.db.DBRowSet;
 import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBTableColumn;
 import org.apache.empire.db.DBView;
+import org.apache.empire.exceptions.InternalException;
+import org.apache.empire.exceptions.InvalidArgumentException;
+import org.apache.empire.exceptions.NotSupportedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class DBModelChecker
 {
-    private static final Logger        log      = 
LoggerFactory.getLogger(DBModelChecker.class);
+    private static final Logger log = 
LoggerFactory.getLogger(DBModelChecker.class);
 
+    /**
+     * The remote Database
+     * This will be populated by the ModelChecker
+     */
     private static class RemoteDatabase extends DBDatabase
     {
-        // *Deprecated* private static final long serialVersionUID = 1L;
+        /*
+         * Will be dynamically populated
+         */
+    }
+    
+    private static class RemoteView extends DBView
+    {
+        public RemoteView(String name, DBDatabase db)
+        {
+            super(name, db);
+        }
+
+        public DBColumn addColumn(String columnName, DataType dataType, double 
size, boolean dummy)
+        {
+            return super.addColumn(columnName, dataType, size);
+        }
+        
+        @Override
+        public DBCommandExpr createCommand()
+        {
+            throw new NotSupportedException(this, "createCommand");
+        }
     }
 
-    private final Map<String, DBTable> tableMap = new HashMap<String, 
DBTable>();
-    private final DBDatabase           remoteDb = new RemoteDatabase();
+    protected final DBDatabase db; // the database to check
+    protected final String catalog;
+    protected final String schemaPattern;
+
+    protected final String remoteName;
+    protected DBDatabase remoteDb = null;  /* will be recreated on every call 
to checkModel */
+
+    protected final Map<String, DBRowSet> tableMap = new HashMap<String, 
DBRowSet>();
+    
+    /**
+     * Creates a new Model Checker
+     * @param catalog
+     * @param schemaPattern
+     */
+    public DBModelChecker(DBDatabase db, String catalog, String schemaPattern)
+    {
+        this.db = db;
+        this.catalog = catalog;
+        this.schemaPattern = schemaPattern;
+        // set origin
+        StringBuilder b = new StringBuilder();
+        if (StringUtils.isNotEmpty(catalog))
+            b.append(catalog);
+        if (StringUtils.isNotEmpty(schemaPattern))
+        {   if (b.length()>0)
+                b.append(".");
+            b.append(schemaPattern);
+        }
+        if (b.length()==0)
+            b.append("[Unknown]");
+        this.remoteName = b.toString();
+    }
+
+    /**
+     * Returns the RemoteDatabase
+     * Only available after checkModel() is called 
+     * @return the remote Database
+     */
+    public DBDatabase getRemoteDatabase()
+    {
+        return remoteDb;
+    }
     
     /**
      * This method is used to check the database model
@@ -66,59 +137,59 @@ public class DBModelChecker
      *            The {@link DBModelErrorHandler} implementation that is 
called whenever an error
      *            occurs
      */
-    public synchronized void checkModel(DBDatabase db, Connection conn, String 
dbSchema, DBModelErrorHandler handler)
+    public synchronized void checkModel(Connection conn, DBModelErrorHandler 
handler)
     {
         try
-        {
+        {   // the chandler
+            if (handler==null && db!=null)
+                throw new InvalidArgumentException("handler", handler);
+            
+            // create remote db instance
+            remoteDb = new RemoteDatabase();
+            
             DatabaseMetaData dbMeta = conn.getMetaData();
-
-            // collect tables & views
-            int count = collectTables(dbMeta, dbSchema);
-            log.info("{} tables and views added for schema {}", count, 
dbSchema);
-
-            // Collect all columns
-            count = collectColumns(dbMeta, dbSchema);
-            log.info("{} columns added for schema {}", count, dbSchema);
-
-            // Collect PKs
-            count = collectPrimaryKeys(dbMeta, dbSchema);
-            log.info("{} primary keys added for schema {}", count, dbSchema);
-
-            // Collect FKs
-            count = collectForeignKeys(dbMeta, dbSchema);
-            log.info("{} foreign keys added for schema {}", count, dbSchema);
-
-            // check Tables
-            for (DBTable table : db.getTables())
-            {
-                checkTable(table, handler);
-            }
-
-            // check Views
-            for (DBView view : db.getViews())
-            {
-                checkView(view, conn, handler);
-            }
+            populateRemoteDatabase(dbMeta);
+
+            // if db is null then populate only
+            if (db==null)
+                return;
+            
+            // now check the database
+            checkDatabase(handler);
         }
         catch (SQLException e)
         {
-            e.printStackTrace();
+            log.error("checkModel failed for {}", remoteName);
+            throw new InternalException(e);
         } 
     }
 
-    /*
-     * overridables
-     */
-    protected String getMetaCatalog(String dbSchema)
-    {
-        return null;
-    }
-    
-    protected String getMetaSchemaPattern(String dbSchema)
+    protected void populateRemoteDatabase(DatabaseMetaData dbMeta)
+        throws SQLException
     {
-        return dbSchema;
+        // collect tables & views
+        int count = collectTablesAndViews(dbMeta, null);
+        log.info("{} tables and views added for schema \"{}\"", count, 
remoteName);
+
+        // Collect all columns
+        count = collectColumns(dbMeta);
+        log.info("{} columns added for schema \"{}\"", count, remoteName);
+
+        // Collect PKs
+        count = collectPrimaryKeys(dbMeta);
+        log.info("{} primary keys added for schema \"{}\"", count, remoteName);
+
+        // Collect FKs
+        count = collectForeignKeys(dbMeta);
+        log.info("{} foreign keys added for schema \"{}\"", count, remoteName);
     }
-    
+
+    /**
+     * Checks if the tableName belongs to a system or hidden table
+     * @param tableName the table name
+     * @param tableMeta the table meta
+     * @return true if the table is hidden or false otherwise
+     */
     protected boolean isSystemTable(String tableName, ResultSet tableMeta)
     {   // system tables containing a '$' symbol (required for Oracle!)
         return (tableName.indexOf('$') >= 0);
@@ -130,22 +201,27 @@ public class DBModelChecker
      * @param dbSchema
      * @throws SQLException
      */
-    protected int collectTables(DatabaseMetaData dbMeta, String dbSchema)
+    protected int collectTablesAndViews(DatabaseMetaData dbMeta, String 
tablePattern)
         throws SQLException
     {
-        ResultSet dbTables = dbMeta.getTables(getMetaCatalog(dbSchema), 
getMetaSchemaPattern(dbSchema), null, new String[] { "TABLE", "VIEW" });
+        tableMap.clear();
+        ResultSet dbTables = dbMeta.getTables(catalog, schemaPattern, 
tablePattern, new String[] { "TABLE", "VIEW" });
         try {
             // ResultSet dbTables = dbMeta.getTables("PATOOL", "DBO", null, 
new String[] { "TABLE", "VIEW" });
             int count = 0;
             while (dbTables.next())
             {
                 String tableName = dbTables.getString("TABLE_NAME");
+                String tableType = dbTables.getString("TABLE_TYPE");
                 if (isSystemTable(tableName, dbTables))
                 {   // ignore system table
                     DBModelChecker.log.info("Ignoring system table " + 
tableName);
                     continue;
                 }
-                addTable(tableName);
+                if ("VIEW".equalsIgnoreCase(tableType))
+                    addView(tableName);
+                else
+                    addTable(tableName);
                 count++;
             }
             return count;
@@ -157,13 +233,13 @@ public class DBModelChecker
     /**
      * collects column information from database meta data for each table
      */
-    protected int collectColumns(DatabaseMetaData dbMeta, String dbSchema)
+    protected int collectColumns(DatabaseMetaData dbMeta)
             throws SQLException
     {
         int count = 0;
-        for (DBTable t : getTables())
+        for (DBRowSet t : getTables())
         {
-            ResultSet dbColumns = dbMeta.getColumns(getMetaCatalog(dbSchema), 
getMetaSchemaPattern(dbSchema), t.getName(), null);
+            ResultSet dbColumns = dbMeta.getColumns(catalog, schemaPattern, 
t.getName(), null);
             try {
                 while (dbColumns.next())
                 {   // add the column
@@ -180,16 +256,16 @@ public class DBModelChecker
     /**
      * collects column information from database meta data for whole schema
      */
-    protected int collectColumns(DatabaseMetaData dbMeta, String dbSchema, 
String tablePattern)
+    protected int collectColumns(DatabaseMetaData dbMeta, String tablePattern)
         throws SQLException
     {
-        ResultSet dbColumns = dbMeta.getColumns(getMetaCatalog(dbSchema), 
getMetaSchemaPattern(dbSchema), tablePattern, null);
+        ResultSet dbColumns = dbMeta.getColumns(catalog, schemaPattern, 
tablePattern, null);
         try {
             int count = 0;
             while (dbColumns.next())
             {
                 String tableName = dbColumns.getString("TABLE_NAME");
-                DBTable t = getTable(tableName);
+                DBRowSet t = getTable(tableName);
                 if (t == null)
                 {   log.error("Table not found: {}", tableName);
                     continue;
@@ -209,14 +285,18 @@ public class DBModelChecker
      * @param dbSchema
      * @throws SQLException
      */
-    protected int collectPrimaryKeys(DatabaseMetaData dbMeta, String dbSchema)
+    protected int collectPrimaryKeys(DatabaseMetaData dbMeta)
         throws SQLException
     {
         int count = 0;
-        for (DBTable t : getTables())
+        for (DBRowSet rs : getTables())
         {
+            if (!(rs instanceof DBTable))
+                continue; // not a table
+            // read pk
+            DBTable t = (DBTable)rs;
             List<String> pkCols = new ArrayList<String>();
-            ResultSet primaryKeys = 
dbMeta.getPrimaryKeys(getMetaCatalog(dbSchema), getMetaSchemaPattern(dbSchema), 
t.getName());
+            ResultSet primaryKeys = dbMeta.getPrimaryKeys(catalog, 
schemaPattern, t.getName());
             try {
                 while (primaryKeys.next())
                 {
@@ -243,13 +323,14 @@ public class DBModelChecker
      * collects foreign key information from database meta data
      * @throws SQLException
      */
-    protected int collectForeignKeys(DatabaseMetaData dbMeta, String dbSchema)
+    protected int collectForeignKeys(DatabaseMetaData dbMeta)
             throws SQLException
     {
         int count = 0;
-        for (DBTable t : getTables())
+        for (DBRowSet t : getTables())
         {
-            count += collectForeignKeys(dbMeta, dbSchema, t.getName());
+            if (t instanceof DBTable)
+                count += collectForeignKeys(dbMeta, t.getName());
         }
         return count;
     }
@@ -258,10 +339,10 @@ public class DBModelChecker
      * collects foreign key information from database meta data
      * @throws SQLException
      */
-    protected int collectForeignKeys(DatabaseMetaData dbMeta, String dbSchema, 
String tablePattern)
+    protected int collectForeignKeys(DatabaseMetaData dbMeta, String 
tablePattern)
         throws SQLException
     {
-        ResultSet foreignKeys = 
dbMeta.getImportedKeys(getMetaCatalog(dbSchema), 
getMetaSchemaPattern(dbSchema), tablePattern);
+        ResultSet foreignKeys = dbMeta.getImportedKeys(catalog, schemaPattern, 
tablePattern);
         try {
             int count = 0;
             while (foreignKeys.next())
@@ -305,22 +386,38 @@ public class DBModelChecker
         }
     }
 
-    protected void checkTable(DBTable table, DBModelErrorHandler handler)
+    protected void checkDatabase(DBModelErrorHandler handler)
     {
-        DBTable remoteTable = getTable(table.getName());
+        // check Tables
+        for (DBTable table : db.getTables())
+        {
+            checkTable(table, handler);
+        }
 
-        if (remoteTable == null)
+        // check Views
+        for (DBView view : db.getViews())
         {
+            checkView(view, handler);
+        }
+    }
+
+    protected void checkTable(DBTable table, DBModelErrorHandler handler)
+    {
+        DBRowSet remoteTable = getTable(table.getName());
+        if (remoteTable == null)
+        {   // Not found
             handler.itemNotFound(table);
             return;
         }
-
+        if (!(remoteTable instanceof DBTable))
+        {   // Not a DBTable
+            handler.objectTypeMismatch(remoteTable, table.getName(), 
DBTable.class);
+            return;
+        }
         // Check primary Key
-        checkPrimaryKey(table, remoteTable, handler);
-
+        checkPrimaryKey(table, (DBTable)remoteTable, handler);
         // check foreign keys
-        checkForeignKeys(table, remoteTable, handler);
-
+        checkForeignKeys(table, (DBTable)remoteTable, handler);
         // Check Columns
         for (DBColumn column : table.getColumns())
         {
@@ -418,16 +515,18 @@ public class DBModelChecker
 
     }
 
-    protected void checkView(DBView view, Connection conn, DBModelErrorHandler 
handler)
+    protected void checkView(DBView view, DBModelErrorHandler handler)
     {
-        DBTable remoteView = getTable(view.getName());
-
+        DBRowSet remoteView = getTable(view.getName());
         if (remoteView == null)
         {
             handler.itemNotFound(view);
             return;
         }
-
+        if (!(remoteView instanceof DBView))
+        {
+            handler.objectTypeMismatch(remoteView, view.getName(), 
DBView.class);
+        }
         for (DBColumn column : view.getColumns())
         {
             DBColumn remoteColumn = remoteView.getColumn(column.getName());
@@ -616,12 +715,12 @@ public class DBModelChecker
     /*
      * internal methods
      */
-    protected final Collection<DBTable> getTables()
+    protected final Collection<DBRowSet> getTables()
     {
         return this.tableMap.values();
     }
     
-    protected final DBTable getTable(String tableName)
+    protected final DBRowSet getTable(String tableName)
     {
         return this.tableMap.get(tableName.toUpperCase());
     }
@@ -631,12 +730,17 @@ public class DBModelChecker
         this.tableMap.put(tableName.toUpperCase(), new DBTable(tableName, 
this.remoteDb));
     }
     
+    protected void addView(String viewName)
+    {
+        this.tableMap.put(viewName.toUpperCase(), new RemoteView(viewName, 
this.remoteDb));
+    }
+    
     protected void addRelation(String relName, DBReference... references)
     {
         this.remoteDb.addRelation(relName, references);
     }
     
-    protected DBTableColumn addColumn(DBTable t, ResultSet rs)
+    protected DBColumn addColumn(DBRowSet t, ResultSet rs)
         throws SQLException
     {
         String name = rs.getString("COLUMN_NAME");
@@ -709,16 +813,29 @@ public class DBModelChecker
         // some AUTOINC meta data to the column to be used by
         // the ParserUtil and ultimately the template.
         //        DBModelChecker.log.info("\tCOLUMN:\t" + name + " (" + 
empireType + ")");
-        DBTableColumn col = t.addColumn(name, empireType, colSize, required, 
defaultValue);
-
-        // We still need to know the base data type for this AUTOINC
-        // because the Record g/setters need to know this, right?
-        // So, let's add it as meta data every time the column is AUTOINC
-        // and reference it in the template.
-        if (empireType.equals(DataType.AUTOINC))
+        DBColumn col;
+        if (t instanceof DBTable)
         {
-            col.setAttribute("AutoIncDataType", originalType);
+            col = ((DBTable)t).addColumn(name, empireType, colSize, required, 
defaultValue);
+            // We still need to know the base data type for this AUTOINC
+            // because the Record g/setters need to know this, right?
+            // So, let's add it as meta data every time the column is AUTOINC
+            // and reference it in the template.
+            if (empireType.equals(DataType.AUTOINC))
+            {
+                col.setAttribute("AutoIncDataType", originalType);
+            }
+        }
+        else if (t instanceof RemoteView)
+        {
+           col = ((RemoteView)t).addColumn(name, empireType, colSize, false);
+        }
+        else
+        {   // Unknown type
+            log.error("Unknown Object Type {}", t.getClass().getName());
+            col = null;
         }
+        // done
         return col;
 
     }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorHandler.java
 
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorHandler.java
index 722526f..e7942a0 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorHandler.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorHandler.java
@@ -25,7 +25,6 @@ import org.apache.empire.db.DBObject;
 
 public interface DBModelErrorHandler
 {
-
     /**
      * This method is called when an object (e. g. table or column) is missing 
in
      * the database.
@@ -36,6 +35,15 @@ public interface DBModelErrorHandler
     void itemNotFound(DBObject dbo);
 
     /**
+     * This method is called when an object (e. g. table or column) is missing 
in
+     * the database.
+     * 
+     * @param dbo
+     *            The missing object
+     */
+    void objectTypeMismatch(DBObject object, String name, Class<?> 
expectedType);
+
+    /**
      * This method is called when a column in a primary key of the Empire-db 
definition
      * is missing in the database
      * 
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorLogger.java
 
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorLogger.java
index 8331ce9..e6a889b 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorLogger.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/validation/DBModelErrorLogger.java
@@ -90,6 +90,18 @@ public class DBModelErrorLogger implements 
DBModelErrorHandler
     }
 
     /**
+     * handle objectTypeMismatch errors
+     */
+    @Override
+    public void objectTypeMismatch(DBObject object, String name, Class<?> 
expectedType)
+    {
+        // log
+        DBModelErrorLogger.log.error("The oboject \"{}\" type of {} does not 
match the expected type of {}.", name, object.getClass().getSimpleName(), 
expectedType.getSimpleName());
+        // increase count
+        errorCount++;
+    }
+
+    /**
      * handle columnTypeMismatch errors
      */
     @Override
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandler.java 
b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandler.java
index 3afa9a7..14f015c 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandler.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandler.java
@@ -241,7 +241,7 @@ public interface DBMSHandler
      * Creates a DataModelChecker instance of this DBMSHandler
      * @return
      */
-    DBModelChecker createModelChecker();
+    DBModelChecker createModelChecker(DBDatabase db);
     
     /**
      * Extracts native error message of an sqlExeption.
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java 
b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
index 9e3cfbc..70f1ff5 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
@@ -705,10 +705,11 @@ public abstract class DBMSHandlerBase implements 
DBMSHandler
      * @return
      */
     @Override
-    public DBModelChecker createModelChecker()
+    public DBModelChecker createModelChecker(DBDatabase db)
     {
+        log.warn("A general and possibly untested DBModelChecker is used for 
DBMSHandler {}. Please override to inklude DBMS specific features.", 
getClass().getSimpleName());
         // the default model checker
-        return new DBModelChecker();
+        return new DBModelChecker(db, null, null);
     }
     
     /**
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java 
b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
index 6a40833..c2b1b87 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
@@ -32,6 +32,7 @@ import org.apache.empire.db.DBObject;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTableColumn;
 import org.apache.empire.db.exceptions.QueryNoResultException;
+import org.apache.empire.db.validation.DBModelChecker;
 import org.apache.empire.dbms.DBMSHandler;
 import org.apache.empire.dbms.DBMSHandlerBase;
 import org.apache.empire.dbms.DBMSFeature;
@@ -292,6 +293,17 @@ public class DBMSHandlerHSql extends DBMSHandlerBase
         // forward request
         ddlGenerator.getDDLScript(type, dbo, script); 
     }
+
+    /**
+     * Creates a DataModelChecker instance of this DBMSHandler
+     * @return
+     */
+    @Override
+    public DBModelChecker createModelChecker(DBDatabase db)
+    {
+        // the default model checker
+        return new DBModelChecker(db, "PUBLIC", "PUBLIC");
+    }
     
 }
 
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java 
b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java
index 06d9b6b..44a3ccc 100644
--- 
a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java
+++ 
b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java
@@ -46,11 +46,12 @@ import org.apache.empire.db.exceptions.EmpireSQLException;
 import org.apache.empire.db.exceptions.QueryNoResultException;
 import org.apache.empire.db.expr.column.DBValueExpr;
 import org.apache.empire.db.validation.DBModelChecker;
+import org.apache.empire.dbms.DBMSFeature;
 import org.apache.empire.dbms.DBMSHandler;
 import org.apache.empire.dbms.DBMSHandlerBase;
-import org.apache.empire.dbms.DBMSFeature;
 import org.apache.empire.dbms.DBSqlPhrase;
 import org.apache.empire.exceptions.InvalidArgumentException;
+import org.apache.empire.exceptions.InvalidPropertyException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -76,6 +77,8 @@ public class DBMSHandlerOracle extends DBMSHandlerBase
     private BooleanType booleanType = BooleanType.NUMBER;
     
     private DBDDLGenerator<?> ddlGenerator = null; // lazy creation
+    
+    private String schemaName;
 
     /**
      * Constructor for the Oracle database dbms.<br>
@@ -111,6 +114,16 @@ public class DBMSHandlerOracle extends DBMSHandlerBase
         log.info("DBDatabaseDriverOracle Boolean Type set to " + booleanType);
     }
 
+    public String getSchemaName()
+    {
+        return schemaName;
+    }
+
+    public void setSchemaName(String schemaName)
+    {
+        this.schemaName = schemaName;
+    }
+
     /**
      * Returns whether or not a particular feature is supported by this dbms
      * @param type type of requested feature. @see DBMSFeature
@@ -518,10 +531,14 @@ public class DBMSHandlerOracle extends DBMSHandlerBase
      * @return
      */
     @Override
-    public DBModelChecker createModelChecker()
+    public DBModelChecker createModelChecker(DBDatabase db)
     {
+        // detect schemaPattern
+        String schemaPattern = (db!=null ? 
StringUtils.coalesce(db.getSchema(), this.schemaName) : this.schemaName);
+        if (StringUtils.isEmpty(schemaPattern))
+            throw new InvalidPropertyException("schemaName", null);
         // the default model checker
-        return new OracleDBModelChecker();
+        return new OracleDBModelChecker(db, schemaPattern);
     }
 
 }
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDBModelChecker.java
 
b/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDBModelChecker.java
index 2e1f2b0..902fd81 100644
--- 
a/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDBModelChecker.java
+++ 
b/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDBModelChecker.java
@@ -18,7 +18,6 @@
  */
 package org.apache.empire.dbms.oracle;
 
-import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.SQLException;
 
@@ -29,6 +28,7 @@ import org.apache.empire.db.validation.DBModelChecker;
 import org.apache.empire.db.validation.DBModelErrorHandler;
 import org.apache.empire.dbms.DBMSHandler;
 import org.apache.empire.dbms.oracle.DBMSHandlerOracle.BooleanType;
+import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.InvalidPropertyException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,11 +41,11 @@ public class OracleDBModelChecker extends DBModelChecker
     private static final Logger log = 
LoggerFactory.getLogger(OracleDBModelChecker.class);
     
     private BooleanType booleanType = BooleanType.NUMBER;
-
-    @Override
-    public void checkModel(DBDatabase db, Connection conn, String dbSchema, 
DBModelErrorHandler handler)
+    
+    public OracleDBModelChecker(DBDatabase db, String schemaName)
     {
-        // Get boolean type from dbms
+        super(db, null, schemaName);
+        // Detect boolean type
         DBMSHandler dbms = db.getDbms();
         if (dbms instanceof DBMSHandlerOracle)
         {
@@ -53,31 +53,29 @@ public class OracleDBModelChecker extends DBModelChecker
         }
         else
         {   // Illegal DBMSHandler
-            log.warn("The database is not attached to a DBMSHandlerOracle");
+            log.error("The database is not attached to a DBMSHandlerOracle");
+            throw new InvalidArgumentException("db", db);
         }
-        // check now
-        super.checkModel(db, conn, dbSchema, handler);
-        
     }
 
     /**
      * collects all column information at once
      */
     @Override
-    protected int collectColumns(DatabaseMetaData dbMeta, String dbSchema)
+    protected int collectColumns(DatabaseMetaData dbMeta)
             throws SQLException
     {
-        return super.collectColumns(dbMeta, dbSchema, null);
+        return super.collectColumns(dbMeta, null);
     }
 
     /**
      * collects all foreign keys at once
      */
     @Override
-    protected int collectForeignKeys(DatabaseMetaData dbMeta, String dbSchema)
+    protected int collectForeignKeys(DatabaseMetaData dbMeta)
             throws SQLException
     {
-        return super.collectForeignKeys(dbMeta, dbSchema, null);
+        return super.collectForeignKeys(dbMeta, null);
     }
     
     @Override
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java
 
b/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java
index bea87ff..fd59293 100644
--- 
a/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java
+++ 
b/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java
@@ -43,6 +43,7 @@ import org.apache.empire.dbms.DBMSFeature;
 import org.apache.empire.dbms.DBMSHandler;
 import org.apache.empire.dbms.DBMSHandlerBase;
 import org.apache.empire.dbms.DBSqlPhrase;
+import org.apache.empire.exceptions.InvalidPropertyException;
 import org.apache.empire.exceptions.NotSupportedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -541,10 +542,22 @@ public class DBMSHandlerMSSQL extends DBMSHandlerBase
      * @return
      */
     @Override
-    public DBModelChecker createModelChecker()
+    public DBModelChecker createModelChecker(DBDatabase db)
     {
+        // detect catalog
+        String catalog = (db!=null ? StringUtils.coalesce(db.getSchema(), 
this.databaseName) : this.databaseName);
+        if (StringUtils.isEmpty(catalog))
+            throw new InvalidPropertyException("databaseName", null);
+        // dtect schema
+        String schema = "DBO";
+        int schemaSep = catalog.indexOf('.');
+        if (schemaSep>0)
+        {   // split catalog and schema
+            catalog = catalog.substring(schemaSep);
+            schema  = catalog.substring(schemaSep+1);
+        }
         // the default model checker
-        return new MSSqlDBModelChecker();
+        return new MSSqlDBModelChecker(db, catalog, schema);
     }
 
 }
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/MSSqlDBModelChecker.java
 
b/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/MSSqlDBModelChecker.java
index 5935ccf..916cb1e 100644
--- 
a/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/MSSqlDBModelChecker.java
+++ 
b/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/MSSqlDBModelChecker.java
@@ -21,6 +21,8 @@ package org.apache.empire.dbms.sqlserver;
 import java.sql.DatabaseMetaData;
 import java.sql.SQLException;
 
+import org.apache.empire.commons.StringUtils;
+import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.validation.DBModelChecker;
 
 /**
@@ -30,27 +32,24 @@ import org.apache.empire.db.validation.DBModelChecker;
  */
 public class MSSqlDBModelChecker extends DBModelChecker
 {
-    
-    @Override
-    protected String getMetaCatalog(String dbSchema)
-    {
-        return dbSchema;
-    }
-    
-    @Override
-    protected String getMetaSchemaPattern(String dbSchema)
+    /**
+     * create a MSSqlDBModelChecker
+     * @param db the database 
+     * @param catalog the catalog
+     */
+    public MSSqlDBModelChecker(DBDatabase db, String catalog, String schema)
     {
-        return "DBO";
+        super(db, catalog, StringUtils.coalesce(schema, "DBO"));
     }
 
     /**
      * collects all column information at once
      */
     @Override
-    protected int collectColumns(DatabaseMetaData dbMeta, String dbSchema)
+    protected int collectColumns(DatabaseMetaData dbMeta)
             throws SQLException
     {
-        return super.collectColumns(dbMeta, dbSchema, null);
+        return super.collectColumns(dbMeta, null);
     }
     
 }

Reply via email to