You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ad...@apache.org on 2007/05/25 11:29:05 UTC

svn commit: r541596 [1/2] - in /incubator/tuscany/java/das/rdb/src: main/java/org/apache/tuscany/das/rdb/ main/java/org/apache/tuscany/das/rdb/config/wrapper/ main/java/org/apache/tuscany/das/rdb/generator/impl/ main/java/org/apache/tuscany/das/rdb/gra...

Author: adrianocrestani
Date: Fri May 25 02:29:02 2007
New Revision: 541596

URL: http://svn.apache.org/viewvc?view=rev&rev=541596
Log:
applied JIRA TUSCANY-952

Added:
    incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/MultiSchemaTests.java
    incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/MultiSchemaData.java
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig1.xml
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig12.xml
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig13.xml
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig14.xml
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig2.xml
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig3.xml
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig5.xml
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig6.xml
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig7.xml
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig8.xml
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig9.xml
    incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaInvalidDasConfig.xml
Modified:
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/config/wrapper/QualifiedColumn.java
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/DeleteGenerator.java
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/graphbuilder/impl/ResultMetadata.java
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/DatabaseObject.java
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ReadCommandImpl.java
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ResultSetShape.java
    incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/merge/impl/GraphMerger.java
    incubator/tuscany/java/das/rdb/src/main/resources/config.xsd
    incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/ProgrammaticConfigTests.java
    incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/framework/DatabaseSetup.java
    incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/suites/AllCommonTests.java

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/ConfigHelper.java Fri May 25 02:29:02 2007
@@ -67,6 +67,9 @@
     public Table addTable(String name, String typeName) {
         return configWrapper.addTable(name, typeName);
     }
+    public Table addTable(String name, String schemaName, String typeName) {
+        return configWrapper.addTable(name, schemaName, typeName);
+    }
     
     public Column addColumn(Table table, String columnName, String propertyName) {
         return configWrapper.addColumn(table, columnName, propertyName);

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/config/wrapper/MappingWrapper.java Fri May 25 02:29:02 2007
@@ -54,14 +54,34 @@
 
     public MappingWrapper() {
         config = FACTORY.createConfig();
+        //JIRA-952
+        this.checkSchemaNameSupport();
     }
 
+	//JIRA-952 - check if there is any entry with no schemaName when support is ON
+    public void checkSchemaNameSupport(){
+        if(config.isDatabaseSchemaNameSupported()){
+        	List tableList = config.getTable();
+        	for(int i=0; i<tableList.size(); i++){
+        		Table t = (Table)tableList.get(i);
+        		if(t.getSchemaName() == null || t.getSchemaName().equals("")){
+        			throw new RuntimeException("No schemaName provided for tableName "+t.getTableName()+" when schemaNameSupport is ON");
+        		}
+        		
+        		if(t.getTypeName()==null){
+        			t.setTypeName(t.getSchemaName()+"."+t.getTableName());
+        		}
+        	}
+        }
+    }
     public MappingWrapper(Config mapping) {
         if (mapping == null) {
             this.config = FACTORY.createConfig();
         } else {
             this.config = mapping;
         }
+        //JIRA-952
+        checkSchemaNameSupport();
     }
 
     public Config getConfig() {
@@ -77,8 +97,15 @@
         Iterator i = config.getTable().iterator();
         while (i.hasNext()) {
             Table t = (Table) i.next();
+            //JIRA-952
+            if(this.config.isDatabaseSchemaNameSupported()){
+            	if (tableName.equalsIgnoreCase(t.getSchemaName()+"."+t.getTableName())) {
+                    return t;
+                }
+            }else{
             if (tableName.equalsIgnoreCase(t.getTableName())) {
                 return t;
+                }            	
             }
         }
 
@@ -136,13 +163,31 @@
 
     public Relationship addRelationship(String parentName, String childName) {
 
-        QualifiedColumn parent = new QualifiedColumn(parentName);
-        QualifiedColumn child = new QualifiedColumn(childName);
-
+    	//JIRA-952
+        QualifiedColumn parent = null;
+        QualifiedColumn child = null;
+
+        if(this.config.isDatabaseSchemaNameSupported()){
+        	parent = new QualifiedColumn(parentName, true);
+        	child = new QualifiedColumn(childName, true);
+        }
+        else{
+        	parent = new QualifiedColumn(parentName);
+        	child = new QualifiedColumn(childName);        	
+        }
+        
         Relationship r = FACTORY.createRelationship();
+        //JIRA-952
+        if(this.config.isDatabaseSchemaNameSupported()){        	
+            r.setName(child.getSchemaName()+"."+child.getTableName());
+            r.setPrimaryKeyTable(parent.getSchemaName()+"."+parent.getTableName());
+            r.setForeignKeyTable(child.getSchemaName()+"."+child.getTableName());        	
+        }
+        else{
         r.setName(child.getTableName());
         r.setPrimaryKeyTable(parent.getTableName());
         r.setForeignKeyTable(child.getTableName());
+        }
 
         if (this.logger.isDebugEnabled()) {
             this.logger.debug("Created relationship from " + r.getPrimaryKeyTable() 
@@ -172,8 +217,17 @@
         Vector childColumns = new Vector();
         
         for(int i=0; i<parentNames.size(); i++){
-            QualifiedColumn parent = new QualifiedColumn((String)parentNames.get(i));
-            QualifiedColumn child = new QualifiedColumn((String)childNames.get(i));
+            QualifiedColumn parent = null;
+            QualifiedColumn child = null;
+            
+            if(this.config.isDatabaseSchemaNameSupported()){
+            	parent = new QualifiedColumn((String)parentNames.get(i), true);
+            	child = new QualifiedColumn((String)childNames.get(i), true);
+            }
+            else{
+            	parent = new QualifiedColumn((String)parentNames.get(i));
+            	child = new QualifiedColumn((String)childNames.get(i));
+            }
             
             parentColumns.add(parent);
             childColumns.add(child);
@@ -182,23 +236,32 @@
         //all parent columns should be from same table and schema
         //all child columns should be from same table and schema
         checkTableNames(parentColumns);
-        //checkSchemaNames(parentColumns);
+    	checkSchemaNames(parentColumns);
         
         checkTableNames(childColumns);
-        //checkSchemaNames(childColumns);
+    	checkSchemaNames(childColumns);
         
         Relationship r = FACTORY.createRelationship();
-
+        //JIRA-952
+        if(this.config.isDatabaseSchemaNameSupported()){        	
+            r.setName(((QualifiedColumn)childColumns.get(0)).getSchemaName()+"."
+            		+((QualifiedColumn)childColumns.get(0)).getTableName());
+            r.setPrimaryKeyTable(((QualifiedColumn)parentColumns.get(0)).getSchemaName()+"."
+            		+((QualifiedColumn)parentColumns.get(0)).getTableName());
+            r.setForeignKeyTable(((QualifiedColumn)childColumns.get(0)).getSchemaName()+"."
+            		+((QualifiedColumn)childColumns.get(0)).getTableName());        	
+        }
+        else{
         r.setName(((QualifiedColumn)childColumns.get(0)).getTableName());
         r.setPrimaryKeyTable(((QualifiedColumn)parentColumns.get(0)).getTableName());
         r.setForeignKeyTable(((QualifiedColumn)childColumns.get(0)).getTableName());
-
+        }
 
         if (this.logger.isDebugEnabled()) {
             this.logger.debug("Created relationship from " + r.getPrimaryKeyTable() 
                     + " to " + r.getForeignKeyTable() + " named " + r.getName());
         }
-
+        
         KeyPair pair = null;
         
         for(int i=0; i<parentColumns.size(); i++){
@@ -227,6 +290,22 @@
         }       
     }
     
+    public void checkSchemaNames(Vector columns){
+    	if(!this.config.isDatabaseSchemaNameSupported()){
+    		return;
+    	}
+    	
+    	 String	expectedSchemaName = ((QualifiedColumn)columns.get(0)).getSchemaName();
+
+    	for(int i=0; i<columns.size(); i++){
+    		QualifiedColumn currColumns = (QualifiedColumn)columns.get(i);
+    		String	currSchemaName = ((QualifiedColumn)columns.get(i)).getSchemaName();
+    		    		
+    		if(!currSchemaName.equals(expectedSchemaName)){
+    			throw new RuntimeException("Columns in one side of relationship can not be from different schema");
+    		}
+    	}
+    }
     public void addPrimaryKey(String columnName) {
         addPrimaryKey(Collections.singletonList(columnName));
     }
@@ -237,8 +316,10 @@
         while (i.hasNext()) {
             String columnName = (String) i.next();
 
-            QualifiedColumn pkColumn = new QualifiedColumn(columnName);
-            Table t = findOrCreateTable(pkColumn.getTableName());
+            QualifiedColumn pkColumn = null;
+           	pkColumn = new QualifiedColumn(columnName, this.config.isDatabaseSchemaNameSupported());
+            //Table t = findOrCreateTable(pkColumn.getTableName());
+            Table t = findOrCreateTable(pkColumn);
             Column c = findOrCreateColumn(t, pkColumn.getColumnName());
             c.setPrimaryKey(true);
         }
@@ -281,9 +362,11 @@
         if (t == null) {
             return null;
         }
+        
         Iterator i = t.getColumn().iterator();
         while (i.hasNext()) {
             Column c = (Column) i.next();
+            
             if (c.getColumnName().equals(propertyName)) {
                 return c;
             }
@@ -329,6 +412,41 @@
         return table;
     }
 
+    //JIRA-952
+    public Table addTable(String tableName, String schemaName, String typeName) {    	
+        Table table = null;
+        
+        if(this.config.isDatabaseSchemaNameSupported()){
+        	table = getTable(schemaName+"."+tableName);	
+        }
+        else{
+        	table = getTable(tableName);
+        }
+        
+        if (table != null) {
+        	if(this.config.isDatabaseSchemaNameSupported()){
+        		throw new RuntimeException("Table " + schemaName+"."+tableName + "already exists");	
+        	}
+        	else{
+        		throw new RuntimeException("Table " + tableName + "already exists");
+        	}            
+        }
+
+        table = ConfigFactory.INSTANCE.createTable();
+        table.setTableName(tableName);
+        
+        if(this.config.isDatabaseSchemaNameSupported()){
+        	table.setSchemaName(schemaName);
+        }
+        else{
+        	table.setSchemaName("");
+        }
+        
+        table.setTypeName(typeName);
+        config.getTable().add(table);
+
+        return table;
+    }
     public Column addColumn(Table table, String name, String propertyName) {
         Column column = ConfigFactory.INSTANCE.createColumn();
         column.setColumnName(name);
@@ -338,17 +456,52 @@
         return column;
     }
     
-    private Table findOrCreateTable(String tableName) {
-        Table table = getTable(tableName);
+    //JIRA-952
+    private Table findOrCreateTable(String schemaName, String tableName) {
+        Table table = null;
+        
+        if(this.config.isDatabaseSchemaNameSupported()){
+        	table = getTable(schemaName+"."+tableName);	
+        }
+        else{
+        	table = getTable(tableName);	
+        }        
         if (table == null) {
             table = ConfigFactory.INSTANCE.createTable();
             table.setTableName(tableName);
+            table.setSchemaName(schemaName);
+            
+            if(this.config.isDatabaseSchemaNameSupported()){
+            	table.setTypeName(schemaName+"."+tableName);
+            }
+            else{
+            	table.setTypeName(tableName);
+            }
             config.getTable().add(table);
         }
         return table;
 
     }
 
+    //JIRA-952
+    private Table findOrCreateTable(QualifiedColumn column) {   	
+    	Table table = null;
+    	if(this.config.isDatabaseSchemaNameSupported()){
+    		table = getTable(column.getSchemaName()+"."+column.getTableName());
+    	}
+    	else{
+    		table = getTable(column.getTableName());
+    	}
+
+        if (table == null) {
+            table = ConfigFactory.INSTANCE.createTable();
+            table.setTableName(column.getTableName());
+            table.setSchemaName(column.getSchemaName());
+            config.getTable().add(table);
+        }
+        return table;
+
+    }
     private Column findOrCreateColumn(Table t, String name) {
         Iterator i = t.getColumn().iterator();
         while (i.hasNext()) {
@@ -443,13 +596,13 @@
         return deleteOrder;
     }
 
+    //JIRA-952
     public void addConverter(String name, String converter) {
-
-        QualifiedColumn column = new QualifiedColumn(name);
-        Table t = findOrCreateTable(column.getTableName());
+        QualifiedColumn column = new QualifiedColumn(name, this.config.isDatabaseSchemaNameSupported());
+        Table t = null;
+       	t = findOrCreateTable(column);
         Column c = findOrCreateColumn(t, column.getColumnName());
         c.setConverterClassName(converter);
-
     }
 
     public String getConverter(String tableName, String columnName) {
@@ -539,6 +692,7 @@
     public void addConnectionInfo(String driverClass, String connectionURL, String user, String password, int loginTimeout) {
         ConnectionInfo info = ConfigFactory.INSTANCE.createConnectionInfo();
         
+        info.setDataSource(connectionURL);
         ConnectionProperties connectionProperties = ConfigFactory.INSTANCE.createConnectionProperties(); 
         connectionProperties.setDriverClass(driverClass);
         connectionProperties.setDatabaseURL(connectionURL);
@@ -562,8 +716,9 @@
         return cmd;
     }
 
-    public void addImpliedPrimaryKey(String tableName, String columnName) {
-        Table t = findOrCreateTable(tableName);
+    //JIRA-952
+    public void addImpliedPrimaryKey(String schemaName, String tableName, String columnName) {
+        Table t = findOrCreateTable(schemaName, tableName);//JIRA-952
 
         Iterator i = t.getColumn().iterator();
         boolean hasPK = false;

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/config/wrapper/QualifiedColumn.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/config/wrapper/QualifiedColumn.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/config/wrapper/QualifiedColumn.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/config/wrapper/QualifiedColumn.java Fri May 25 02:29:02 2007
@@ -26,10 +26,12 @@
     private final String tableName;
 
     private final String columnName;
+    private final String schemaName;//JIRA-952
 
     private final Logger logger = LoggerFactory.INSTANCE.getLogger(QualifiedColumn.class);
 
     public QualifiedColumn(String name) {
+    	this.schemaName = "";
         int index = name.indexOf('.');
         if ( index == -1 ) {
             throw new RuntimeException("Column " + name + " must be qualified with a table name");
@@ -43,11 +45,51 @@
         }
     }
 
+    //JIRA-952
+    public QualifiedColumn(String name, boolean isDatabaseSchemaNameSupported) {
+        int index = name.indexOf('.');
+        if ( index == -1 ) {
+            throw new RuntimeException("Column " + name + " must be qualified with a table name and optional schema name");
+        }
+        
+        int lastIndex = name.lastIndexOf('.');
+        		
+        if(index == lastIndex && isDatabaseSchemaNameSupported){
+        	throw new RuntimeException("Column " + name + " must be qualified with a table name and schema name");
+        }
+                
+        if(isDatabaseSchemaNameSupported){
+            schemaName = name.substring(0, index);
+            tableName = name.substring(index+1, lastIndex);
+            columnName = name.substring(lastIndex + 1);        	
+        }
+        else{
+        	schemaName = "";
+            tableName = name.substring(0, index);
+            columnName = name.substring(index + 1);
+        }
+
+        if (this.logger.isDebugEnabled()) {
+            this.logger.debug("Table name:  " + tableName);
+            this.logger.debug("Column name: " + columnName);
+        }
+    }
     public String getTableName() {
         return this.tableName;
     }
 
+    //JIRA-952
+    public String getSchemaName() {
+        return this.schemaName;
+    }
     public String getColumnName() {
         return this.columnName;
+    }
+    //JIRA-952
+    public String toString(){
+    	if(this.schemaName == null || this.schemaName.equals(""))
+    		return this.tableName+"."+this.columnName;
+    	else
+    		return this.schemaName+"."+this.tableName+"."+this.columnName;
     }
 }

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/DeleteGenerator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/DeleteGenerator.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/DeleteGenerator.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/DeleteGenerator.java Fri May 25 02:29:02 2007
@@ -22,6 +22,7 @@
 
 import org.apache.log4j.Logger;
 import org.apache.tuscany.das.rdb.config.Table;
+import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper;
 import org.apache.tuscany.das.rdb.config.wrapper.TableWrapper;
 import org.apache.tuscany.das.rdb.impl.DeleteCommandImpl;
 import org.apache.tuscany.das.rdb.impl.ParameterImpl;
@@ -38,12 +39,18 @@
         super();
     }
 
-    private String getDeleteStatement(Table t) {
+    //JIRA-952
+    private String getDeleteStatement(MappingWrapper mapping, Table t) {
         TableWrapper table = new TableWrapper(t);
 
         StringBuffer statement = new StringBuffer();
         statement.append("delete from ");
+        if(mapping.getConfig().isDatabaseSchemaNameSupported()){
+        	statement.append(t.getSchemaName()+"."+t.getTableName());
+        }
+        else{
         statement.append(t.getTableName());
+        }
         statement.append(" where ");
 
         Iterator names = table.getPrimaryKeyNames().iterator();
@@ -64,9 +71,9 @@
         return statement.toString();
     }
 
-    public DeleteCommandImpl getDeleteCommand(Table t) {
+    public DeleteCommandImpl getDeleteCommand(MappingWrapper mapping, Table t) {
         TableWrapper tw = new TableWrapper(t);
-        DeleteCommandImpl deleteCommand = new DeleteCommandImpl(getDeleteStatement(t));
+        DeleteCommandImpl deleteCommand = new DeleteCommandImpl(getDeleteStatement(mapping, t));
 
         Iterator i = tw.getPrimaryKeyProperties().iterator();
         for (int idx = 1; i.hasNext(); idx++) {

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java Fri May 25 02:29:02 2007
@@ -52,8 +52,13 @@
         List parameters = new ArrayList();
         TableWrapper table = new TableWrapper(t);
         StringBuffer statement = new StringBuffer("insert into ");
+        //JIRA-952
+        if(config.getConfig().isDatabaseSchemaNameSupported()){
+        	statement.append(t.getSchemaName()+"."+t.getTableName());
+        }
+        else{
         statement.append(t.getTableName());
-
+        }
         HashSet changedProperties = getAttributeProperties(changedObject, config, table);
         Iterator i;
         if ( changedProperties.isEmpty() ) {

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java Fri May 25 02:29:02 2007
@@ -57,7 +57,13 @@
         Type type = changedObject.getType();
         TableWrapper tableWrapper = new TableWrapper(table);
         StringBuffer statement = new StringBuffer("update ");
+        //JIRA-952
+        if(mapping.getConfig().isDatabaseSchemaNameSupported()){
+        	statement.append(table.getSchemaName()+"."+table.getTableName());
+        }
+        else{
         statement.append(table.getTableName());
+        }
         statement.append(" set ");
 
         ChangeSummary summary = changedObject.getDataGraph().getChangeSummary();

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/graphbuilder/impl/ResultMetadata.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/graphbuilder/impl/ResultMetadata.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/graphbuilder/impl/ResultMetadata.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/graphbuilder/impl/ResultMetadata.java Fri May 25 02:29:02 2007
@@ -54,13 +54,14 @@
 
     private Converter[] converters;
 
+    //JIRA-952
     public ResultMetadata(ResultSet rs, MappingWrapper cfgWrapper, ResultSetShape shape) throws SQLException {
 
         this.resultSet = rs;
         this.configWrapper = cfgWrapper;
 
         if (shape == null) {
-            this.resultSetShape = new ResultSetShape(rs.getMetaData());
+            this.resultSetShape = new ResultSetShape(rs.getMetaData(), configWrapper.getConfig());
         } else {
             this.resultSetShape = shape;
         }
@@ -68,23 +69,53 @@
         this.converters = new Converter[resultSetShape.getColumnCount()];
 
         Map impliedRelationships = new HashMap();
+        String schemaName = "";
         for (int i = 1; i <= resultSetShape.getColumnCount(); i++) {
             String tableName = resultSetShape.getTableName(i);
+             schemaName = resultSetShape.getSchemaName(i);
             if (( tableName == null ) || ( tableName.equals(""))) {
                 throw new RuntimeException("Unable to obtain table information from JDBC. DAS configuration must specify ResultDescriptors");
             }
+            String typeName = null;
             
-            String typeName = configWrapper.getTableTypeName(tableName);
+            if(this.configWrapper.getConfig().isDatabaseSchemaNameSupported()){
+            	typeName = configWrapper.getTableTypeName(schemaName+"."+tableName);
+            }
+            else{
+            	typeName = configWrapper.getTableTypeName(tableName);	
+            }
             String columnName = resultSetShape.getColumnName(i);
 
             if (columnName.contains("_ID")) {
-                impliedRelationships.put(columnName, tableName);
+            	String colName = "";
+            	if(this.configWrapper.getConfig().isDatabaseSchemaNameSupported()){
+            		colName = schemaName+"."+columnName;
+            		impliedRelationships.put(colName, schemaName+"."+tableName);
+            	}
+            	else{
+            		colName = columnName;
+            		impliedRelationships.put(colName, tableName);	
+            	}
             } else if (columnName.equalsIgnoreCase("ID")) {
-                configWrapper.addImpliedPrimaryKey(tableName, columnName);
+                configWrapper.addImpliedPrimaryKey(schemaName, tableName, columnName);
             }
 
-            String propertyName = configWrapper.getColumnPropertyName(tableName, columnName);
-            String converterName = configWrapper.getConverter(tableName, resultSetShape.getColumnName(i));
+            String propertyName = null;
+            
+            if(this.configWrapper.getConfig().isDatabaseSchemaNameSupported()){
+            	propertyName = configWrapper.getColumnPropertyName(schemaName+"."+tableName, columnName);	
+            }
+            else{
+            	propertyName = configWrapper.getColumnPropertyName(tableName, columnName);
+            }
+            String converterName = null;
+            
+            if(this.configWrapper.getConfig().isDatabaseSchemaNameSupported()){
+            	converterName = configWrapper.getConverter(schemaName+"."+tableName, resultSetShape.getColumnName(i));
+            }
+            else{
+            	converterName = configWrapper.getConverter(tableName, resultSetShape.getColumnName(i));	
+            }
 
             converters[i - 1] = loadConverter(converterName);
 

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java Fri May 25 02:29:02 2007
@@ -128,7 +128,7 @@
             Delete delete = table.getDelete();
 
             if (delete == null) {
-                deleteCommand = DeleteGenerator.INSTANCE.getDeleteCommand(table);
+                deleteCommand = DeleteGenerator.INSTANCE.getDeleteCommand(mapping, table);//JIRA-952
             } else {
                 deleteCommand = new DeleteCommandImpl(delete);
             }

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/DatabaseObject.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/DatabaseObject.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/DatabaseObject.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/DatabaseObject.java Fri May 25 02:29:02 2007
@@ -18,20 +18,26 @@
  */
 package org.apache.tuscany.das.rdb.impl;
 
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.log4j.Logger;
+import org.apache.tuscany.das.rdb.ConfigHelper;
 import org.apache.tuscany.das.rdb.config.Column;
 import org.apache.tuscany.das.rdb.config.Config;
 import org.apache.tuscany.das.rdb.config.KeyPair;
 import org.apache.tuscany.das.rdb.config.Relationship;
 import org.apache.tuscany.das.rdb.config.Table;
 import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper;
+import org.apache.tuscany.das.rdb.config.wrapper.TableWrapper;
 import org.apache.tuscany.das.rdb.util.LoggerFactory;
 
+import commonj.sdo.DataGraph;
 import commonj.sdo.DataObject;
 import commonj.sdo.Property;
 
@@ -67,13 +73,19 @@
                 Relationship r = (Relationship) i.next();
                 if (this.logger.isDebugEnabled()) {
                     this.logger.debug("Initializing relationship: " + r.getName());
+                    this.logger.debug("r.getForeignKeyTable():"+r.getForeignKeyTable());
+                    this.logger.debug("getTypeName():"+getTypeName());
                 }
+                
                 if (r.getForeignKeyTable().equals(getTypeName())) {
                     List pairs = r.getKeyPair();
                     Iterator iter = pairs.iterator();
                     while (iter.hasNext()) {
                         KeyPair pair = (KeyPair) iter.next();
                         keyMappings.put(pair.getForeignKeyColumn(), r);
+                    	if (this.logger.isDebugEnabled()) {
+                            this.logger.debug("Putting key pair: " + pair.getPrimaryKeyColumn()+","+pair.getForeignKeyColumn());
+                    	}                        
                     }
                 }
             }
@@ -81,7 +93,6 @@
     }
 
     public Object get(String parameter) {
-
         if (isPartOfPrimaryKey(parameter)) {
             return dataObject.get(parameter);
         }
@@ -91,8 +102,23 @@
             return dataObject.get(parameter);
         }
 
-        Property parentRef = getParentReference(r.getPrimaryKeyTable());
+        //JIRA-952
+        Table tbl = this.mappingWrapper.getTable(r.getPrimaryKeyTable());
+        Property parentRef = null;
+        if(tbl == null){
+        	//this is case when config file is not present and 
+        	//ConfigHelper helper = new ConfigHelper(); is used
+        	parentRef = getParentReference(r.getPrimaryKeyTable());	
+        }
+        else{
+        	//other cases, its better to use typeName as r.getPrimaryKeyTable()
+        	//gives tableName and tableName and typeName can be different
+        	//and SDO looks for typeName and not tableName.
+        	parentRef = getParentReference((new TableWrapper(tbl)).getTypeName());
+        }
+        
         DataObject parent = dataObject.getDataObject(parentRef);
+        
         if (parent == null) {
             return null;
         }
@@ -115,7 +141,6 @@
 
     public Property getParentReference(String parentName) {
         if (this.parentReference == null) {
-
             Iterator i = dataObject.getType().getProperties().iterator();
             while (i.hasNext()) {
                 Property ref = (Property) i.next();
@@ -127,14 +152,35 @@
         return this.parentReference;
     }
 
+    //JIRA-952
     public String getTableName() {
         if (mappingWrapper.getConfig() != null) {
-            return mappingWrapper.getTableByTypeName(getTypeName()).getTableName();
+        	
+        	if(mappingWrapper.getConfig().isDatabaseSchemaNameSupported()){
+	        	if (this.logger.isDebugEnabled()) {
+	                this.logger.debug("DatabaseObject.getTableName:(schemaName.tableName) " +
+	                		mappingWrapper.getTableByTypeName(getTypeName()).getSchemaName()+"."+
+	                		mappingWrapper.getTableByTypeName(getTypeName()).getTableName());
+	        	} 
+	        	
+	            return (mappingWrapper.getTableByTypeName(getTypeName()).getSchemaName()+"."+
+        		mappingWrapper.getTableByTypeName(getTypeName()).getTableName());    		
+        	}
+        	else{
+	        	if (this.logger.isDebugEnabled()) {
+	                this.logger.debug("DatabaseObject.getTableName: " + mappingWrapper.getTableByTypeName(getTypeName()).getTableName());
+	        	} 
+	        	
+	            return mappingWrapper.getTableByTypeName(getTypeName()).getTableName();
+        	}
         } 
         return null;       
     }
 
     public String getTypeName() {
+    	if (this.logger.isDebugEnabled()) {
+            this.logger.debug("DatabaseObject.getTypeName: " + dataObject.getType().getName());
+    	}    	
         return dataObject.getType().getName();
     }
 

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ReadCommandImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ReadCommandImpl.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ReadCommandImpl.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ReadCommandImpl.java Fri May 25 02:29:02 2007
@@ -41,7 +41,7 @@
         this.configWrapper = mapping;
         
         if (resultDescriptor != null && !resultDescriptor.isEmpty()) {
-            this.resultSetShape = new ResultSetShape(resultDescriptor);
+            this.resultSetShape = new ResultSetShape(resultDescriptor, configWrapper.getConfig());//JIRA-952
         }
     }
 

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ResultSetShape.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ResultSetShape.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ResultSetShape.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ResultSetShape.java Fri May 25 02:29:02 2007
@@ -22,6 +22,7 @@
 import java.sql.SQLException;
 import java.util.List;
 
+import org.apache.tuscany.das.rdb.config.Config;
 import org.apache.tuscany.das.rdb.config.ResultDescriptor;
 import org.apache.tuscany.das.rdb.graphbuilder.schema.ResultSetTypeMap;
 
@@ -47,29 +48,60 @@
 
     private final Type[] types;
 
-    public ResultSetShape(ResultSetMetaData metadata) throws SQLException {
+    private final String[] schema;//JIRA-952
+    //JIRA-952
+    public ResultSetShape(ResultSetMetaData metadata, Config model) throws SQLException {
         columns = new String[metadata.getColumnCount()];
         tables = new String[metadata.getColumnCount()];
         types = new Type[metadata.getColumnCount()];
+        schema = new String[metadata.getColumnCount()];
 
         ResultSetTypeMap typeMap = ResultSetTypeMap.INSTANCE;
         for (int i = 1; i <= metadata.getColumnCount(); i++) {
-            tables[i - 1] = metadata.getTableName(i);
+        	if(model.isDatabaseSchemaNameSupported()){
+            	if(metadata.getSchemaName(i) != null && !metadata.getSchemaName(i).equals("")){
+            		//tables[i - 1] = metadata.getSchemaName(i)+"."+metadata.getTableName(i);
+            		tables[i - 1] = metadata.getTableName(i);
+            		schema[i - 1] = metadata.getSchemaName(i);
+            	}
+            	else{
+            		tables[i - 1] = metadata.getTableName(i);
+            		schema[i - 1] = "";
+            	}        		
+        	}
+        	else{
+        		tables[i - 1] = metadata.getTableName(i);
+        		schema[i - 1] = "";
+        	}
             columns[i - 1] = metadata.getColumnName(i);
             types[i - 1] = typeMap.getType(metadata.getColumnType(i), true);
         }
     }
 
-    public ResultSetShape(List resultDescriptor) {
+    //JIRA-952
+    public ResultSetShape(List resultDescriptor, Config model) {
         TypeHelper helper = TypeHelper.INSTANCE;
         int size = resultDescriptor.size();
         columns = new String[size];
         tables = new String[size];
         types = new Type[size];
+        schema = new String[size];
 
         for (int i = 0; i < size; i++) {
             ResultDescriptor desc = (ResultDescriptor) resultDescriptor.get(i);
-            tables[i] = desc.getTableName();
+            if(model.isDatabaseSchemaNameSupported()){
+            	if(desc.getSchemaName() != null && !desc.getSchemaName().equals("")){
+            		tables[i] = desc.getTableName();
+            		schema[i] = desc.getSchemaName();
+            	}else{
+            		tables[i] = desc.getTableName();
+            		schema[i] = "";
+            	}
+            		
+            }else{
+           		tables[i] = desc.getTableName();
+           		schema[i] = "";
+            }
             columns[i] = desc.getColumnName();
 
             int idx = desc.getColumnType().lastIndexOf('.');
@@ -93,6 +125,10 @@
         return tables[i - 1];
     }
 
+    //JIRA-952
+    public String getSchemaName(int i) {
+        return schema[i - 1];
+    }
     public String getColumnName(int i) {
         return columns[i - 1];
     }
@@ -103,11 +139,13 @@
 
     public String toString() {
         StringBuffer result = new StringBuffer();
-        result.append(" column/table/type: ");
+        result.append(" column/table/schema/type: ");
         for (int i = 0; i < columns.length; i++) {
             result.append(columns[i]);
             result.append('\t');
             result.append(tables[i]);
+            result.append('\t');
+            result.append(schema[i]);
             result.append('\t');
             if (types[i] == null) {
                 result.append("null");

Modified: incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/merge/impl/GraphMerger.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/merge/impl/GraphMerger.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/merge/impl/GraphMerger.java (original)
+++ incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/merge/impl/GraphMerger.java Fri May 25 02:29:02 2007
@@ -46,12 +46,19 @@
     private Map keys = new HashMap();
 
     private TableRegistry registry = new MultiTableRegistry();
+    
+    private Config config = null;//JIRA-962 for any new tests with schema , we need this
 
     // TODO lots of cleanup/design
     public GraphMerger() {
         // Empty Constructor
     }
 
+    //JIRA-952
+    public GraphMerger(Config cfg) {
+        this.config = cfg;
+    }
+    
     // TODO Replace EMF reference with SDOUtil function when available
     // (Tuscany-583)
     public DataObject emptyGraph(Config config) {
@@ -187,8 +194,16 @@
         return (String) keys.get(object.getType().getName());
     }
 
+    //JIRA-952
     public void addPrimaryKey(String key) {
-        QualifiedColumn column = new QualifiedColumn(key);
+    	QualifiedColumn column = null;
+    	if(this.config != null && this.config.isDatabaseSchemaNameSupported()){
+    		column = new QualifiedColumn(key, this.config.isDatabaseSchemaNameSupported()); 
+    	}
+    	else{
+    		column = new QualifiedColumn(key);
+    	}
+        
         logger.finest("Adding " + column.getTableName() + " " + column.getColumnName() + " to keys");
         keys.put(column.getTableName(), column.getColumnName());
     }

Modified: incubator/tuscany/java/das/rdb/src/main/resources/config.xsd
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/resources/config.xsd?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/main/resources/config.xsd (original)
+++ incubator/tuscany/java/das/rdb/src/main/resources/config.xsd Fri May 25 02:29:02 2007
@@ -37,6 +37,7 @@
       </xsd:sequence>
       <xsd:attribute name="uri" type="xsd:string"/>
       <xsd:attribute name="dataObjectModel" type="xsd:string"/>
+      <xsd:attribute name="databaseSchemaNameSupported" type="xsd:boolean" default="false"/>      
    </xsd:complexType>
 
    <xsd:complexType name="ConnectionProperties">
@@ -93,6 +94,7 @@
       </xsd:sequence>
       <xsd:attribute name="tableName" type="xsd:string"/>
       <xsd:attribute name="typeName" type="xsd:string"/>      
+      <xsd:attribute name="schemaName" type="xsd:string" default=""/> 
    </xsd:complexType>
    <xsd:complexType name="Create">
    	  <xsd:attribute name="sql" type="xsd:string"/>
@@ -122,6 +124,7 @@
    <xsd:complexType name="ResultDescriptor">
       <xsd:attribute name="columnName" type="xsd:string"/>
       <xsd:attribute name="tableName" type="xsd:string"/>
+      <xsd:attribute name="schemaName" type="xsd:string"/>      
       <xsd:attribute name="columnType" type="xsd:string"/>
    </xsd:complexType>
 

Added: incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/MultiSchemaTests.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/MultiSchemaTests.java?view=auto&rev=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/MultiSchemaTests.java (added)
+++ incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/MultiSchemaTests.java Fri May 25 02:29:02 2007
@@ -0,0 +1,718 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.tuscany.das.rdb.test;
+
+import java.io.InputStream;
+import java.sql.Connection;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.tuscany.das.rdb.Command;
+import org.apache.tuscany.das.rdb.DAS;
+import org.apache.tuscany.das.rdb.test.data.MultiSchemaData;
+import org.apache.tuscany.das.rdb.test.framework.DasTest;
+import org.apache.tuscany.das.rdb.util.ConfigUtil;
+
+import commonj.sdo.DataObject;
+
+public class MultiSchemaTests extends DasTest{
+    protected void setUp() throws Exception {        
+        super.setUp();
+       	new MultiSchemaData(getAutoConnection()).refresh();
+    }
+    
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+    
+	/**If database is present connect to it and create necessary tables, procedures, data etc.
+	 * 
+	 * Below is test database schema required. 
+	 * Schema Layout - 
+	 * Database: DASTEST
+	 * Schema: DASTEST1
+	 * 	   Tables: CUSTOMER, EMPLOYEE, CITY, ORDERDETAILS
+	 * Schema: DASTEST2
+	 * 	   Tables: CUSTOMER, ACCOUNT, CITY 
+	 * Schema: DASTEST3
+	 * 	   Tables: CUSTOMER, CUSTORDER, ORDERDETAILSDESC
+	 */
+	
+	public void testMulitiSchemaCase1() throws Exception {
+		DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaDasConfig1.xml"), getConnection());
+		//test case 1 - CRUD when schemaName, tableName, typeName present - DASTEST1.CUSTOMER
+		//System.out.println("Result:test case 1 - CRUD when schemaName, tableName, typeName present:DASTEST1.CUSTOMER");
+		//test select
+		//System.out.println("Result:test case 1 - SELECT");
+		assertEquals(getCustomers(das).size(), 3);
+		
+		//test insert - basic
+		//System.out.println("Result:test case 1 - INSERT(execute())");
+		addCustomer(das);
+		assertEquals(getCustomers(das).size(), 4);
+		
+		//test insert - use SDO
+		//System.out.println("Result:test case 1 - INSERT(applyChanges())");
+		addSDOCustomer(das);
+		assertEquals(getCustomers(das).size(), 5);
+		
+		//test delete - basic
+		//System.out.println("Result:test case 1 - DELETE(execute())");
+		deleteCustomer(das);
+		assertEquals(getCustomers(das).size(), 4);
+		
+		//test delete - SDO
+		//System.out.println("Result:test case 1 - DELETE(applyChanges())");
+		deleteSDOCustomer(das);
+		assertEquals(getCustomers(das).size(), 3);
+		
+		//test update 
+		//System.out.println("Result:test case 1 - UPDATE");
+		changeFirstCustomerName(das);
+		assertEquals( ((DataObject)getCustomers(das).get(0)).get("LASTNAME"), "Williams");
+		//System.out.println("******************************************");
+	}
+	
+	public void testMultiSchemaCase2()throws Exception{		
+		DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaDasConfig2.xml"), getConnection());
+		//test case 1 - CRUD when schemaName, tableName present, typeName not present - DASTEST2.ACCOUNT
+		//System.out.println("Result:test case 2 - CRUD when schemaName, tableName present, typeName not present:DASTEST2.ACCOUNT");
+		//test select
+		//System.out.println("Result:test case 2 - SELECT");
+		assertEquals(getAccounts(das).size(), 4);
+		
+		//test insert - basic
+		//System.out.println("Result:test case 2 - INSERT(execute())");
+		addAccount(das);
+		assertEquals(getAccounts(das).size(), 5);
+		
+		//test insert - SDO
+		//System.out.println("Result:test case 2 - INSERT(applyChanges())");
+		addSDOAccount(das);
+		assertEquals(getAccounts(das).size(), 6);
+		
+		//test delete - basic
+		//System.out.println("Result:test case 2 - DELETE(execute())");
+		deleteAccount(das);
+		assertEquals(getAccounts(das).size(), 5);
+		
+		//test delete - SDO
+		//System.out.println("Result:test case 2 - DELETE(applyChanges())");
+		deleteSDOAccount(das);
+		assertEquals(getAccounts(das).size(), 4);
+		
+		//test update 
+		//System.out.println("Result:test case 2 - UPDATE");
+		changeFirstAccountBalance(das);
+		assertEquals( ((DataObject)getAccounts(das).get(0)).get("BALANCE"), 45000);
+		//System.out.println("******************************************");		
+	}
+	
+	public void testMultiSchemaCase3() throws Exception{
+		DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaDasConfig3.xml"), getConnection());
+		//test case 3 - CRUD when <Table> is not there in config - DASTEST1.CITY
+		//System.out.println("Result:test case 3 - CRUD when <Table> is not there in config:DASTEST1.CITY");
+		//test select
+		//System.out.println("Result:test case 3 - SELECT");
+		assertEquals(getCities(das).size(), 2);
+		
+		//test insert - basic
+		//System.out.println("Result:test case 3 - INSERT(execute())");
+		addCity(das);
+		assertEquals(getCities(das).size(), 3);
+		
+		//test insert - SDO
+		//System.out.println("Result:test case 3 - INSERT(applyChanges())");
+		assertEquals(addSDOCity(das),"Expected failure to insert");
+		assertEquals(getCities(das).size(), 3);
+		
+		//test delete - basic
+		//System.out.println("Result:test case 3 - DELETE(execute())");
+		deleteCity(das);
+		assertEquals(getCities(das).size(), 2);
+		
+		//test delete - SDO
+		//System.out.println("Result:test case 3 - DELETE(applyChanges())");
+		assertEquals(deleteSDOCity(das), "Expected failure to delete");
+		assertEquals(getCities(das).size(), 2);
+		
+		//test update 
+		//System.out.println("Result:test case 3 - UPDATE");
+		assertEquals(changeFirstCityName(das), "Expected failure to update");
+		//System.out.println("******************************************");
+	}
+	
+	public void testMultiSchemaCase4() throws Exception{		
+		//System.out.println("Result:test case 4 - with multi schema support ON, have table with no schemaName"); 
+		try{
+		//get das handle for invalid config
+			DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaInvalidDasConfig.xml"), getConnection());
+    	}catch(Exception e){
+    		//No schemaName provided for tableName CUSTORDER when schemaNameSupport is ON
+   			assertEquals("No schemaName provided for tableName CUSTORDER when schemaNameSupport is ON", 
+    					e.getMessage());
+    	}
+    	
+		//System.out.println("******************************************");
+	}
+	
+	public void testMultiSchemaCase5() throws Exception{
+		DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaDasConfig5.xml"), getConnection());
+		
+		//test case 5 - SELECT when CUSTOMER.ID is present in DASTEST1 and DASTEST2
+		//and DASTEST2.CUSTOMER <Table> not in config
+		//System.out.println("Result:test case 5 - SELECT when CUSTOMER.ID is present in DASTEST1 and DASTEST2 and"+
+			//	" DASTEST2.CUSTOMER <Table> not in config");
+		DataObject root = getCustomersFrom2SchemasWithOneSchemaNotInConfig(das);
+		assertEquals(root.getList("DASTEST1_CUSTOMER").size(), 3);
+		assertEquals(root.getList("DASTEST2.CUSTOMER").size(), 3);
+		//System.out.println("******************************************");
+	}
+
+	public void testMultiSchemaCase6()throws Exception{
+		DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaDasConfig6.xml"), getConnection());
+		//test case 6 - SELECT when CUSTOMER.ID is present in DASTEST1 and DB2ADMIN - and both <table> entries are in Config
+		//System.out.println("Result:test case 6 - SELECT when CUSTOMER.ID is present in DASTEST1 and DB2ADMIN, and both <table> in config");
+		//test select
+		//System.out.println("Result:test case 6 - SELECT");
+		DataObject root = getCustomersFrom2SchemasBothSchemaInConfig(das);
+		assertEquals(root.getList("DASTEST1_CUSTOMER").size(),3);
+		assertEquals(root.getList("DASTEST3_CUSTOMER").size(),3);
+		//System.out.println("******************************************");
+	}
+
+	public void testMultiSchemaCase7()throws Exception{
+		DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaDasConfig7.xml"), getConnection());
+		//test case 7 - SELECT when CITY.INDX is present in DASTEST1 and DASTEST2 and no enrty for
+		//any <Table> in config
+		//System.out.println("Result:test case 7 - SELECT when CITY.INDX is present in DASTEST1 and DASTEST2, and no <table> in config");
+		//test select
+		//System.out.println("Result:test case 7 - SELECT");
+		DataObject root = getCitiesFrom2SchemasNoneInConfig(das);
+		assertEquals(root.getList("DASTEST1.CITY").size(), 2);
+		assertEquals(root.getList("DASTEST2.CITY").size(), 2);
+		//System.out.println("******************************************");
+	}
+	
+	public void testMultiSchemaCase8()throws Exception{
+		DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaDasConfig8.xml"), getConnection());
+
+		//test case 8 - SELECT using ResultDescriptor - DASTEST2.ACCOUNT
+		//System.out.println("Result:test case 8 - SELECT using ResultDescriptor:DASTEST2.ACCOUNT");
+		assertEquals(getAccountRSDesc(das).size(), 4);
+		//System.out.println("******************************************");
+	}
+	
+	public void testMultiSchemaCase9()throws Exception{
+		DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaDasConfig9.xml"), getConnection());
+		//test case 9, 11 - Implied relationship , PK when both tables in same schema DASTEST2.CUSTOMER, DASTEST2.ACCOUNT
+		//System.out.println("Result:test case 9, 11 - Implied relationship when both tables in same schema DASTEST2.CUSTOMER, DASTEST2.ACCOUNT");
+		DataObject root = getSingleSchemaCustomersAccounts(das);
+		assertEquals(root.getList("DASTEST2.CUSTOMER").size(), 2);
+		assertEquals(root.getList("DASTEST2.ACCOUNT").size(), 4);
+		//System.out.println("******************************************");
+	}	
+	
+	private static Date kbday;
+    private static Date tbday;
+    private static DateFormat myformat = new SimpleDateFormat("yyyy.MM.dd");
+	static {
+        try {
+            kbday = myformat.parse("1957.09.27");
+            tbday = myformat.parse("1966.12.20");
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+    }
+	
+    public void testMultiSchemaCase12()throws Exception{
+    	DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaDasConfig12.xml"), getConnection());
+    	//test case 12 - use converter with multi-schema ON:DASTEST1.EMPLOYEE
+    	//System.out.println("Result:test case 12 - converter on DASTEST1.EMPLOYEE.LASTNAME");
+        Command read = das.getCommand("testArbitraryConverter");
+        // Read
+        DataObject root = read.executeQuery();
+
+        // Verify
+        assertEquals(kbday,root.getDate("DASTEST1.EMPLOYEE[1]/LASTNAME"));
+		
+        // Modify
+        root.setDate("DASTEST1.EMPLOYEE[1]/LASTNAME", tbday);
+        das.applyChanges(root);
+
+        // Read
+        root = read.executeQuery();
+
+        // Verify
+        assertEquals(tbday, root.getDate("DASTEST1.EMPLOYEE[1]/LASTNAME"));
+        
+        //System.out.println("******************************************");
+    }
+    
+    public void testMultiSchemaCase13()throws Exception{
+    	DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaDasConfig13.xml"), getConnection());
+
+    	//Explicit relationship between DASTEST1.CUSTOMER and DASTEST2.ACCOUNT
+    	//System.out.println("Result:test case13 - Explicit relationship when both tables in different schema DASTEST1.CUSTOMER, DASTEST2.ACCOUNT");
+        // Read some customers and related accounts
+        Command select = das
+                .createCommand("SELECT * FROM DASTEST1.CUSTOMER LEFT JOIN DASTEST2.ACCOUNT "+
+                		" ON DASTEST1.CUSTOMER.ID = DASTEST2.ACCOUNT.CUSTOMER_ID");
+
+        DataObject root = select.executeQuery();
+
+        DataObject cust1 = root.getDataObject("DASTEST1_CUSTOMER[1]");
+        DataObject cust2 = root.getDataObject("DASTEST1_CUSTOMER[2]");
+
+        // Save IDs
+        Integer cust1ID = (Integer) cust1.get("ID");
+        Integer cust2ID = (Integer) cust2.get("ID");
+        
+        //System.out.println("cust 1 ID :"+cust1ID);
+        //System.out.println("cust 2 ID :"+cust2ID);
+        // save account count
+        Integer cust1AccountCount = Integer.valueOf(cust1.getList("accounts").size());
+        Integer cust2AccountCount = Integer.valueOf(cust2.getList("accounts").size());
+
+        // Move an account to cust1 from cust2
+        DataObject account = (DataObject) cust2.getList("accounts").get(0);
+        cust1.getList("accounts").add(account);
+
+        // Flush changes
+        das.applyChanges(root);
+
+        // verify cust1 relationship updates
+        select = das
+                .createCommand("SELECT * FROM DASTEST1.CUSTOMER LEFT JOIN DASTEST2.ACCOUNT ON "
+                        + "DASTEST1.CUSTOMER.ID = DASTEST2.ACCOUNT.CUSTOMER_ID where DASTEST1.CUSTOMER.ID = ?");
+        select.setParameter(1, cust1ID);
+
+        root = select.executeQuery();
+        assertEquals((cust1AccountCount.intValue() + 1), root.getList("DASTEST1_CUSTOMER[1]/accounts").size());
+
+        // verify cust2 relationship updates
+        select.setParameter(1, cust2ID);
+        root = select.executeQuery();
+        assertEquals((cust2AccountCount.intValue() - 1),root.getList("DASTEST1_CUSTOMER[1]/accounts").size());
+        //System.out.println("******************************************");        
+    }
+    
+    //steer away from implied relationships - we dont support multi schema there!!!
+    public void testMultiSchemaCase14()throws Exception{
+    	DAS das = DAS.FACTORY.createDAS(getConfig("MultiSchemaDasConfig14.xml"), getConnection());
+
+    	//Explicit compound key relationship between DASTEST1.ORDERDETAILS and DASTEST3.ORDERDETAILSDESC
+    	//ORDERID <-> ORDERID, PRODUCTID<->PRODUCTID
+    	//System.out.println("Result:test case14 - Explicit compound key relationship when both " +
+    		//	"tables in different schema DASTEST1.ORDERDETAILS, DASTEST3.ORDERDETAILSDESC");
+
+    	// Read some order details and related order details descs
+        Command select = das
+                .createCommand("SELECT * FROM DASTEST1.ORDERDETAILS LEFT JOIN DASTEST3.ORDERDETAILSDESC " +
+                		" ON DASTEST1.ORDERDETAILS.ORDERID = DASTEST3.ORDERDETAILSDESC.ORDERID " +
+                		" AND DASTEST1.ORDERDETAILS.PRODUCTID = DASTEST3.ORDERDETAILSDESC.PRODUCTID");
+
+        DataObject root = select.executeQuery();
+
+        DataObject ordDet1 = root.getDataObject("DASTEST1.ORDERDETAILS[1]");
+        DataObject ordDet2 = root.getDataObject("DASTEST1.ORDERDETAILS[2]");
+
+        // Save IDs
+        Integer ord1ID = (Integer) ordDet1.get("ORDERID");
+        Integer prod1ID = (Integer) ordDet1.get("PRODUCTID");
+        
+        Integer ord2ID = (Integer) ordDet2.get("ORDERID");
+        Integer prod2ID = (Integer) ordDet2.get("PRODUCTID");
+        
+        // save order count
+        Integer order1DetDescCount = Integer.valueOf(ordDet1.getList("orderDetailsDesc").size());
+        Integer order2DetDescCount = Integer.valueOf(ordDet2.getList("orderDetailsDesc").size());
+
+        // Move an order detail desc to ord det1 from ord det2
+        DataObject orderDetailsDesc = (DataObject) ordDet2.getList("orderDetailsDesc").get(0);
+        ordDet1.getList("orderDetailsDesc").add(orderDetailsDesc);
+
+        // Flush changes
+        das.applyChanges(root);
+
+        // verify ord det1 relationship updates
+        select = das
+        .createCommand("SELECT * FROM DASTEST1.ORDERDETAILS LEFT JOIN DASTEST3.ORDERDETAILSDESC " +
+        		" ON DASTEST1.ORDERDETAILS.ORDERID = DASTEST3.ORDERDETAILSDESC.ORDERID " +
+        		" AND DASTEST1.ORDERDETAILS.PRODUCTID = DASTEST3.ORDERDETAILSDESC.PRODUCTID " +
+        		" where DASTEST1.ORDERDETAILS.ORDERID = ? AND DASTEST1.ORDERDETAILS.PRODUCTID = ?");
+        select.setParameter(1, ord1ID);
+        select.setParameter(2, prod1ID);
+
+        root = select.executeQuery();
+        assertEquals((order1DetDescCount.intValue() + 1),
+        		root.getList("DASTEST1.ORDERDETAILS[1]/orderDetailsDesc").size());
+
+        // verify ord det2 relationship updates
+        select.setParameter(1, ord2ID);
+        select.setParameter(2, prod2ID);
+        
+        root = select.executeQuery();
+        assertEquals((order2DetDescCount.intValue() - 1),
+        		root.getList("DASTEST1.ORDERDETAILS[1]/orderDetailsDesc").size());    	
+    }
+    
+	/**
+	 * Display result
+	 * @param list 
+	 * @param numCols - number of columns in each row
+	 */
+	public static void printList(List list, int numCols){
+		if(list != null) 
+			System.out.println("list size:"+list.size());
+		
+		for(int i=0; i<list.size(); i++){
+			for(int j=0; j<numCols; j++){
+				System.out.print("   col"+(j+1)+":"+(((DataObject)list.get(i)).getString(j)) );
+			}
+			System.out.println();
+		}
+	}
+	
+	public static void printMultiSchemaList(DataObject root, String[] lists, String[] cols){
+		if(lists != null && cols != null){
+			if(lists.length != cols.length) return;
+			
+			for(int ii=0; ii<lists.length; ii++){
+				List list = root.getList(lists[ii]);
+				printList(list, Integer.parseInt(cols[ii]));
+			}
+		}
+	}	
+	
+	/**********START TEST CASE 1***********************************************/
+	/**
+	 * select
+	 * @return
+	 */
+    public final List getCustomers(DAS das) {
+
+        Command read = das.getCommand("SelectDASTEST1CUSTOMER");
+        DataObject root = read.executeQuery();        
+        return root.getList("DASTEST1_CUSTOMER");
+    }
+    /**
+     * insert
+     *
+     */
+     public final void addCustomer(DAS das){
+    	Command insert = das.getCommand("InsertDASTEST1CUSTOMER");
+        insert.execute();
+    }
+
+     public final void addSDOCustomer(DAS das){
+        Command read = das.getCommand("SelectDASTEST1CUSTOMER");
+        DataObject root = read.executeQuery();
+
+        DataObject newCustomer = root.createDataObject("DASTEST1_CUSTOMER");
+
+        newCustomer.setInt("ID", 5);
+        newCustomer.setString("LASTNAME", "PennyDAS");
+        newCustomer.setString("ADDRESS", "HSRDAS");
+
+        das.applyChanges(root);
+        root = read.executeQuery();
+    }
+        
+    /**
+     * delete
+     *
+     */
+    public final void deleteCustomer(DAS das){
+    	Command delete = das.getCommand("DeleteDASTEST1CUSTOMER");
+        delete.execute();	
+    }
+
+    public final void deleteSDOCustomer(DAS das) {
+        Command readAll = das.getCommand("SelectDASTEST1CUSTOMER");
+        DataObject root = readAll.executeQuery();
+
+        List allCustomers = root.getList("DASTEST1_CUSTOMER");
+
+        DataObject lastCustomer = (DataObject)allCustomers.get(allCustomers.size()-1);
+        if(lastCustomer != null){
+        	//System.out.println("Deleting customer named: " + lastCustomer.getString("LASTNAME"));
+        	lastCustomer.delete();
+        }
+
+        das.applyChanges(root);
+    }
+    
+    /**
+     * update
+     *
+     */
+    public final void changeFirstCustomerName(DAS das) {
+        Command readAll = das.getCommand("SelectDASTEST1CUSTOMER");
+        DataObject root = readAll.executeQuery();
+
+        DataObject firstCustomer = root.getDataObject("DASTEST1_CUSTOMER[1]");
+        firstCustomer.set("LASTNAME", "Williams");
+        
+        das.applyChanges(root);
+    }
+    /**********END TEST CASE 1***********************************************/
+    
+	/**********START TEST CASE 2***********************************************/
+	/**
+	 * select
+	 * @return
+	 */
+    public final List  getAccounts(DAS das){
+        Command read = das.getCommand("SelectDASTEST2ACCOUNT");
+        DataObject root = read.executeQuery();        
+        return root.getList("DASTEST2.ACCOUNT");
+    }
+    /**
+     * insert
+     *
+     */
+     public final void addAccount(DAS das){
+    	Command insert = das.getCommand("InsertDASTEST2ACCOUNT");
+        insert.execute();
+    }
+     
+    public final void addSDOAccount(DAS das){
+        Command read = das.getCommand("SelectDASTEST2ACCOUNT");
+        DataObject root = read.executeQuery();
+        
+        List custList = root.getList("DASTEST1_CUSTOMER");
+        DataObject curCust = null;
+        for(int i=0; i<custList.size(); i++){
+        	curCust = (DataObject)custList.get(i);
+        	if(curCust.getInt("ID") == 2) {
+        		break;
+        	}
+        }
+        
+        List acctList = null;
+        if(curCust != null){
+        	acctList = curCust.getList("accounts");
+        	
+        	DataObject newAccount = root.createDataObject("DASTEST2.ACCOUNT");
+            newAccount.setInt("ACCOUNT_ID", 60);
+            //newAccount.setInt("CUSTOMER_ID", 2); - taken from parent, so dont set here,else will throw exception
+            newAccount.setInt("BALANCE",104);
+            
+            acctList.add(newAccount);
+            das.applyChanges(root);  
+        }        	
+    }
+        
+    /**
+     * delete
+     *
+     */
+    public final void deleteAccount(DAS das){
+    	Command delete = das.getCommand("DeleteDASTEST2ACCOUNT");
+        delete.execute();	
+    }
+
+    public final void deleteSDOAccount(DAS das) {
+        Command readAll = das.getCommand("SelectDASTEST2ACCOUNT");
+        DataObject root = readAll.executeQuery();
+
+        List custList = root.getList("DASTEST1_CUSTOMER");
+        
+        DataObject curCust = null;
+        for(int i=0; i<custList.size(); i++){
+        	curCust = (DataObject)custList.get(i);
+        	if(curCust.getInt("ID") == 2) {
+        		break;
+        	}
+        }
+        
+        List acctList = null;
+        if(curCust != null){
+        	acctList = curCust.getList("accounts");
+        	if(acctList != null){
+            	((DataObject)acctList.get(acctList.size()-1)).delete();
+            }
+        }        
+
+        das.applyChanges(root);
+    }
+    
+    /**
+     * update
+     *
+     */
+    public final void changeFirstAccountBalance(DAS das) {
+        Command readAll = das.getCommand("SelectDASTEST2ACCOUNT");
+        DataObject root = readAll.executeQuery();
+
+        DataObject firstAccount = root.getDataObject("DASTEST2.ACCOUNT[1]");
+        firstAccount.set("BALANCE", 45000);
+        
+        das.applyChanges(root);
+    }
+    /**********END TEST CASE 2***********************************************/
+    
+	/**********START TEST CASE 3***********************************************/
+	/**
+	 * select
+	 * @return
+	 */
+    public final List  getCities(DAS das){
+        Command read = das.getCommand("SelectDASTEST1CITY");
+        DataObject root = read.executeQuery();        
+        return root.getList("DASTEST1.CITY");
+    }
+    /**
+     * insert
+     *
+     */
+     public final void addCity(DAS das){
+    	Command insert = das.getCommand("InsertDASTEST1CITY");
+        insert.execute();
+    }
+     
+    public final String addSDOCity(DAS das){
+        Command read = das.getCommand("SelectDASTEST1CITY");
+        DataObject root = read.executeQuery();
+
+        DataObject newCity = root.createDataObject("DASTEST1.CITY");
+        newCity.setInt("INDX", 3);
+        newCity.setString("NAME", "San Jose");
+
+        try{
+        das.applyChanges(root);
+        }catch(Exception e){
+        	if(e.getMessage().equals("Table DASTEST1.CITY was changed in the DataGraph but is not present in the Config")){
+        		//ignore
+        		return "Expected failure to insert";
+        	}
+        	else{
+        		throw new RuntimeException(e);
+        	}
+        }
+        return null;
+    }
+        
+    /**
+     * delete
+     *
+     */
+    public final void deleteCity(DAS das){
+    	Command delete = das.getCommand("DeleteDASTEST1CITY");
+        delete.execute();	
+    }
+
+    public final String deleteSDOCity(DAS das) {
+        Command readAll = das.getCommand("SelectDASTEST1CITY");
+        DataObject root = readAll.executeQuery();
+
+        List allCities = root.getList("DASTEST1.CITY");
+
+        DataObject lastCity = (DataObject)allCities.get(allCities.size()-1);
+        if(lastCity != null){
+        	//System.out.println("Deleting city: " + lastCity.getString("NAME"));
+        	lastCity.delete();
+        }
+
+        try{
+            das.applyChanges(root);
+        }catch(Exception e){
+        	if(e.getMessage().equals("Table DASTEST1.CITY was changed in the DataGraph but is not present in the Config")){
+        		//ignore
+        		return "Expected failure to delete";
+        	}
+        	else{
+        		throw new RuntimeException(e);
+        	}
+        }
+        return null;
+    }
+    
+    /**
+     * update
+     *
+     */
+    public final String changeFirstCityName(DAS das) {
+        Command readAll = das.getCommand("SelectDASTEST1CITY");
+        DataObject root = readAll.executeQuery();
+
+        DataObject firstCity = root.getDataObject("DASTEST1.CITY[1]");
+        firstCity.set("NAME", "New York");
+        
+        try{
+        	das.applyChanges(root);
+        }catch(Exception e){
+        	if(e.getMessage().equals("Table DASTEST1.CITY was changed in the DataGraph but is not present in the Config")){
+        		//ignore
+        		return "Expected failure to update";
+        	}
+        	else{
+        		throw new RuntimeException(e);
+        	}        	
+        }
+        return null;
+    }
+    /**********END TEST CASE 3***********************************************/
+    /**********START TEST CASE 5***********************************************/    
+    public final DataObject getCustomersFrom2SchemasWithOneSchemaNotInConfig(DAS das) {
+        Command read = das.getCommand("Select2SchemasWithOneSchemaNotInConfig");
+        DataObject root = read.executeQuery();
+        return root;
+    }
+    /**********END TEST CASE 5***********************************************/    
+
+    /**********START TEST CASE 6***********************************************/    
+
+    public final DataObject getCustomersFrom2SchemasBothSchemaInConfig(DAS das) {
+
+        Command read = das.getCommand("Select2IDsBothInConfig");
+        DataObject root = read.executeQuery();
+        return root;
+    }
+    
+    /**********END TEST CASE 6***********************************************/ 
+    /**********START TEST CASE 7***********************************************/
+    public final DataObject getCitiesFrom2SchemasNoneInConfig(DAS das){
+    	Command read = das.getCommand("Select2CitiesNoneInConfig");
+        DataObject root = read.executeQuery();
+        return root;    	
+    }
+    /**********END TEST CASE 7***********************************************/
+    /**********START TEST CASE 8***********************************************/    
+    
+    public final List  getAccountRSDesc(DAS das){
+    	Command read = das.getCommand("ResultDescriptorAccountSelect");
+        DataObject root = read.executeQuery();        
+        return root.getList("DASTEST2.ACCOUNT");
+    }
+    /**********END TEST CASE 8***********************************************/
+
+    /**********START TEST CASE 9***********************************************/    
+
+    public final DataObject getSingleSchemaCustomersAccounts(DAS das){
+        Command read = das.getCommand("ImpliedRelationshipSelect");
+        DataObject root = read.executeQuery();
+        return root;
+    }
+    /**********END TEST CASE 9***********************************************/    
+}

Modified: incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/ProgrammaticConfigTests.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/ProgrammaticConfigTests.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/ProgrammaticConfigTests.java (original)
+++ incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/ProgrammaticConfigTests.java Fri May 25 02:29:02 2007
@@ -379,7 +379,7 @@
         try {
             helper.addPrimaryKey("PK");
         } catch (RuntimeException ex) {
-            assertEquals ("Column PK must be qualified with a table name", ex.getMessage());
+            this.assertEquals ("Column PK must be qualified with a table name and optional schema name", ex.getMessage());
         }
     }
 }

Added: incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/MultiSchemaData.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/MultiSchemaData.java?view=auto&rev=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/MultiSchemaData.java (added)
+++ incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/data/MultiSchemaData.java Fri May 25 02:29:02 2007
@@ -0,0 +1,80 @@
+package org.apache.tuscany.das.rdb.test.data;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+//JIRA-952
+public class MultiSchemaData {
+	Connection con;
+	
+	public MultiSchemaData(Connection connection){
+		this.con = connection;
+	}
+	
+    public void refresh() throws SQLException{
+    	//System.out.println("Inserting data in multi schema tables");
+	    	Statement s = this.con.createStatement();
+	    	
+	        String[] statements = {
+	        "DELETE FROM DASTEST1.CUSTOMER",
+	        "DELETE FROM DASTEST1.EMPLOYEE",
+	        "DELETE FROM DASTEST1.CITY",
+	        "DELETE FROM DASTEST1.ORDERDETAILS",
+	        "DELETE FROM DASTEST2.CUSTOMER",
+	        "DELETE FROM DASTEST2.CITY",
+	        "DELETE FROM DASTEST2.ACCOUNT",
+	        "DELETE FROM DASTEST3.CUSTOMER",
+	        "DELETE FROM DASTEST3.CUSTORDER",
+	        "DELETE FROM DASTEST3.ORDERDETAILSDESC",
+	        
+			"INSERT INTO DASTEST1.CUSTOMER (ID, LASTNAME, ADDRESS) VALUES (1,'Williams','USA')",
+			"INSERT INTO DASTEST1.CUSTOMER (ID, LASTNAME, ADDRESS) VALUES (2,'Amita1','INDIA')",
+			"INSERT INTO DASTEST1.CUSTOMER (ID, LASTNAME, ADDRESS) VALUES (3,'Patrick1','UK')",
+			
+			"INSERT INTO DASTEST1.EMPLOYEE (ID, LASTNAME, ADDRESS) VALUES (1,'Williams','USA')",
+			"INSERT INTO DASTEST1.EMPLOYEE (ID, LASTNAME, ADDRESS) VALUES (2,'Amita1','INDIA')",
+			"INSERT INTO DASTEST1.EMPLOYEE (ID, LASTNAME, ADDRESS) VALUES (3,'Patrick1','UK')",
+			
+			"INSERT INTO DASTEST2.CUSTOMER (ID, LASTNAME, ADDRESS) VALUES (1,'John2','USA')",
+			"INSERT INTO DASTEST2.CUSTOMER (ID, LASTNAME, ADDRESS) VALUES (2,'Amita2','INDIA')",
+			"INSERT INTO DASTEST2.CUSTOMER (ID, LASTNAME, ADDRESS) VALUES (3,'Patrick2','UK')",
+		
+			"INSERT INTO DASTEST3.CUSTOMER (ID, LASTNAME, ADDRESS) VALUES (1,'JohnAdm','USA')",
+			"INSERT INTO DASTEST3.CUSTOMER (ID, LASTNAME, ADDRESS) VALUES (2,'AmitaAdm','INDIA')",
+			"INSERT INTO DASTEST3.CUSTOMER (ID, LASTNAME, ADDRESS) VALUES (3,'PatrickAdm','UK')",
+			
+			"INSERT INTO DASTEST1.CITY (INDX, NAME) VALUES (1,'Fremont')",
+			"INSERT INTO DASTEST1.CITY (INDX, NAME) VALUES (2,'Belmont')",
+			
+			"INSERT INTO DASTEST2.CITY (INDX, NAME) VALUES (1,'Milipitas')",
+			"INSERT INTO DASTEST2.CITY (INDX, NAME) VALUES (2,'Newark')",
+			
+			"INSERT INTO DASTEST2.ACCOUNT (ACCOUNT_ID, CUSTOMER_ID, BALANCE) VALUES (10, 1, 101)",
+			"INSERT INTO DASTEST2.ACCOUNT (ACCOUNT_ID, CUSTOMER_ID, BALANCE) VALUES (20, 1, 202)",
+			"INSERT INTO DASTEST2.ACCOUNT (ACCOUNT_ID, CUSTOMER_ID, BALANCE) VALUES (30, 2, 303)",
+			"INSERT INTO DASTEST2.ACCOUNT (ACCOUNT_ID, CUSTOMER_ID, BALANCE) VALUES (40, 2, 404)",
+		
+			"INSERT INTO DASTEST3.CUSTORDER (ORDER_ID, CUSTOMER_ID, ORDER_COUNT) VALUES (100,1,150)",
+			"INSERT INTO DASTEST3.CUSTORDER (ORDER_ID, CUSTOMER_ID, ORDER_COUNT) VALUES (200,1,250)",
+			"INSERT INTO DASTEST3.CUSTORDER (ORDER_ID, CUSTOMER_ID, ORDER_COUNT) VALUES (300,2,150)",
+			"INSERT INTO DASTEST3.CUSTORDER (ORDER_ID, CUSTOMER_ID, ORDER_COUNT) VALUES (400,2,250)",
+			
+			"INSERT INTO DASTEST1.ORDERDETAILS (ORDERID, PRODUCTID, PRICE) VALUES (1,1,101)",
+			"INSERT INTO DASTEST1.ORDERDETAILS (ORDERID, PRODUCTID, PRICE) VALUES (1,2,102)",
+			"INSERT INTO DASTEST1.ORDERDETAILS (ORDERID, PRODUCTID, PRICE) VALUES (2,1,201)",
+			"INSERT INTO DASTEST1.ORDERDETAILS (ORDERID, PRODUCTID, PRICE) VALUES (2,2,202)",
+			"INSERT INTO DASTEST3.ORDERDETAILSDESC (ID, ORDERID, PRODUCTID, DESCR) VALUES (10,1,1, 'DESC 10,1,1')",
+			"INSERT INTO DASTEST3.ORDERDETAILSDESC (ID, ORDERID, PRODUCTID, DESCR) VALUES (20,1,1, 'DESC 20,1,1')",
+			"INSERT INTO DASTEST3.ORDERDETAILSDESC (ID, ORDERID, PRODUCTID, DESCR) VALUES (30,1,2, 'DESC 30,1,2')",
+			"INSERT INTO DASTEST3.ORDERDETAILSDESC (ID, ORDERID, PRODUCTID, DESCR) VALUES (40,1,2, 'DESC 40,1,2')",
+			"INSERT INTO DASTEST3.ORDERDETAILSDESC (ID, ORDERID, PRODUCTID, DESCR) VALUES (50,2,1, 'DESC 50,2,1')",
+			"INSERT INTO DASTEST3.ORDERDETAILSDESC (ID, ORDERID, PRODUCTID, DESCR) VALUES (60,2,2, 'DESC 60,2,2')"
+	        };
+	        
+	        for (int i = 0; i < statements.length; i++) {
+	                s.execute(statements[i]);
+	        }
+	        s.close();
+        //System.out.println("Multi schema database setup complete!");
+    }
+}

Modified: incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/framework/DatabaseSetup.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/framework/DatabaseSetup.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/framework/DatabaseSetup.java (original)
+++ incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/framework/DatabaseSetup.java Fri May 25 02:29:02 2007
@@ -106,7 +106,9 @@
             dropSequences();
             dropTables();
             dropProcedures();
+            dropSchema();//JIRA-952
 
+            createSchema();//JIRA-952
             createSequences();
             createTables();
             createTriggers();
@@ -125,6 +127,26 @@
 
     }
 
+    //JIRA-952
+    private void dropSchema(){
+        String[] statements = {"DROP SCHEMA DASTEST1 RESTRICT",
+        		"DROP SCHEMA DASTEST2 RESTRICT",
+        		"DROP SCHEMA DASTEST3 RESTRICT",
+        };
+        
+        for (int i = 0; i < statements.length; i++) {
+            try {
+                s.execute(statements[i]);
+            } catch (SQLException e) {
+                // If the table does not exist then ignore the exception on drop
+                if ((!e.getMessage().contains("does not exist")) && (!e.getMessage().contains("Unknown table")) 
+                        && (!e.getMessage().contains("42704"))) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }        
+    }
+    
     private void dropTables() {
 
         String[] statements = {
@@ -134,7 +156,13 @@
             "DROP TABLE PART", "DROP TABLE TYPETEST", "DROP TABLE CITIES", 
             "DROP TABLE STATES", "DROP TABLE conmgt.SERVERSTATUS", 
             "DROP TABLE DOG", "DROP TABLE OWNER", "DROP TABLE KENNEL", 
-            "DROP TABLE VISIT"
+            "DROP TABLE VISIT",
+            "DROP TABLE DASTEST1.CUSTOMER" ,"DROP TABLE DASTEST2.CUSTOMER","DROP TABLE DASTEST3.CUSTOMER",
+            "DROP TABLE DASTEST1.CITY", "DROP TABLE DASTEST2.CITY",
+            "DROP TABLE DASTEST2.ACCOUNT",
+            "DROP TABLE DASTEST3.CUSTORDER",
+            "DROP TABLE DASTEST3.ORDERDETAILSDESC", "DROP TABLE DASTEST1.ORDERDETAILS",
+            "DROP TABLE DASTEST1.EMPLOYEE"
         };
 
         for (int i = 0; i < statements.length; i++) {
@@ -190,6 +218,18 @@
         }
     }
 
+    //JIRA-952
+    private void createSchema() {
+    	// System.out.println("Creating schema");
+    	try {
+
+            s.execute("CREATE SCHEMA DASTEST1");
+            s.execute("CREATE SCHEMA DASTEST2");
+            s.execute("CREATE SCHEMA DASTEST3");
+    	}catch (SQLException e) {
+            throw new RuntimeException(e);
+        }
+    }
     private void createTables() {
 
         // System.out.println("Creating tables");
@@ -215,7 +255,19 @@
             s.execute(getCreateKennel());
             s.execute(getCreateVisit());
             s.execute(getCreateOrderDetailsDesc());//JIRA-841
-
+            
+            //JIRA-952 start
+            s.execute(getCreateDASTEST1Customer());
+            s.execute(getCreateDASTEST1Employee());
+            s.execute(getCreateDASTEST2Customer());
+            s.execute(getCreateDASTEST3Customer());
+            s.execute(getCreateDASTEST1City());
+            s.execute(getCreateDASTEST2City());
+            s.execute(getCreateDASTEST2Account());
+            s.execute(getCreateDASTEST3CustOrder());
+            s.execute(getCreateDASTEST1OrderDetails());
+            s.execute(getCreateDASTEST3OrderDetailsDesc());            
+            //JIRA-952 end
         } catch (SQLException e) {
             throw new RuntimeException(e);
         }
@@ -372,7 +424,65 @@
         return "CREATE TABLE ORDERDETAILSDESC ("+ getIntegerColumn("ID") + " NOT NULL, " + getIntegerColumn("ORDERID") + " NOT NULL, " 
             + getIntegerColumn("PRODUCTID")
                 + " NOT NULL,"+ getStringColumn("DESCR", 20)+", PRIMARY KEY (ID))";
+    } 
+    
+    //JIRA-952 start
+    protected String getCreateDASTEST1Customer() {
+        return "CREATE TABLE DASTEST1.CUSTOMER (" + getIntegerColumn("ID") + " PRIMARY KEY NOT NULL, " 
+            + getStringColumn("LASTNAME", 30)
+                + " DEFAULT 'Garfugengheist', " + getStringColumn("ADDRESS", 30) + ")";
+    }
+
+    protected String getCreateDASTEST1Employee() {
+        return "CREATE TABLE DASTEST1.EMPLOYEE (" + getIntegerColumn("ID") + " PRIMARY KEY NOT NULL, " 
+            + getStringColumn("LASTNAME", 30)
+                + " DEFAULT 'Garfugengheist', " + getStringColumn("ADDRESS", 30) + ")";
+    }
+    
+    protected String getCreateDASTEST2Customer() {
+        return "CREATE TABLE DASTEST2.CUSTOMER (" + getIntegerColumn("ID") + " PRIMARY KEY NOT NULL, " 
+            + getStringColumn("LASTNAME", 30)
+                + " DEFAULT 'Garfugengheist', " + getStringColumn("ADDRESS", 30) + ")";
+    }
+    
+    protected String getCreateDASTEST3Customer() {
+        return "CREATE TABLE DASTEST3.CUSTOMER (" + getIntegerColumn("ID") + " PRIMARY KEY NOT NULL, " 
+            + getStringColumn("LASTNAME", 30)
+                + " DEFAULT 'Garfugengheist', " + getStringColumn("ADDRESS", 30) + ")";
+    }
+    
+    protected String getCreateDASTEST1City() {
+        return "CREATE TABLE DASTEST1.CITY (" + getIntegerColumn("INDX") + " PRIMARY KEY NOT NULL," 
+                + getStringColumn("NAME", 50)  + ")";
+    }
+
+    protected String getCreateDASTEST2City() {
+        return "CREATE TABLE DASTEST2.CITY (" + getIntegerColumn("INDX") + " PRIMARY KEY NOT NULL," 
+                + getStringColumn("NAME", 50)  + ")";
+    }    
+    
+    protected String getCreateDASTEST2Account() {
+    	return "CREATE TABLE DASTEST2.ACCOUNT ("+ getIntegerColumn("ACCOUNT_ID") + " PRIMARY KEY NOT NULL," +
+    	getIntegerColumn("CUSTOMER_ID") +", "+ getIntegerColumn("BALANCE") + ")";
+    }
+    
+    protected String getCreateDASTEST3CustOrder() {
+    	return "CREATE TABLE DASTEST3.CUSTORDER ("+ getIntegerColumn("ORDER_ID") + " PRIMARY KEY NOT NULL," +
+    	getIntegerColumn("CUSTOMER_ID") +", "+getIntegerColumn("ORDER_COUNT")+ ")";
     }    
+
+    protected String getCreateDASTEST1OrderDetails() {
+        return "CREATE TABLE DASTEST1.ORDERDETAILS (" + getIntegerColumn("ORDERID") + " NOT NULL, " 
+            + getIntegerColumn("PRODUCTID")
+                + " NOT NULL, PRICE FLOAT, PRIMARY KEY (ORDERID, PRODUCTID))";
+    }
+    
+    protected String getCreateDASTEST3OrderDetailsDesc() {
+        return "CREATE TABLE DASTEST3.ORDERDETAILSDESC ("+ getIntegerColumn("ID") + " NOT NULL, " + getIntegerColumn("ORDERID") + " NOT NULL, " 
+            + getIntegerColumn("PRODUCTID")
+                + " NOT NULL,"+ getStringColumn("DESCR", 20)+", PRIMARY KEY (ID))";
+    }
+    //JIRA-952 end
     // /////////////////
 
     protected String getForeignKeyConstraint(String pkTable, String pkColumn, String foreignKey) {

Modified: incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/suites/AllCommonTests.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/suites/AllCommonTests.java?view=diff&rev=541596&r1=541595&r2=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/suites/AllCommonTests.java (original)
+++ incubator/tuscany/java/das/rdb/src/test/java/org/apache/tuscany/das/rdb/test/suites/AllCommonTests.java Fri May 25 02:29:02 2007
@@ -37,6 +37,7 @@
 import org.apache.tuscany.das.rdb.test.GraphMergeTests;
 import org.apache.tuscany.das.rdb.test.ImpliedRelationshipTests;
 import org.apache.tuscany.das.rdb.test.KennelTests;
+import org.apache.tuscany.das.rdb.test.MultiSchemaTests;
 import org.apache.tuscany.das.rdb.test.OCCTests;
 import org.apache.tuscany.das.rdb.test.OneToOneRelationshipTests;
 import org.apache.tuscany.das.rdb.test.OperationOrderingTests;
@@ -106,6 +107,7 @@
         suite.addTest(new TestSuite(KennelTests.class));
         
         suite.addTest(new TestSuite(TransactionTests.class));
+        suite.addTest(new TestSuite(MultiSchemaTests.class));
     
         //$JUnit-END$
         return suite;

Added: incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig1.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig1.xml?view=auto&rev=541596
==============================================================================
--- incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig1.xml (added)
+++ incubator/tuscany/java/das/rdb/src/test/resources/MultiSchemaDasConfig1.xml Fri May 25 02:29:02 2007
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ -->
+ <Config xmlns="http:///org.apache.tuscany.das.rdb/config.xsd"  databaseSchemaNameSupported="true"> 
+    
+    <Command name="SelectDASTEST1CUSTOMER" SQL="select * from DASTEST1.CUSTOMER" kind="Select"/>
+            
+	<Command name="InsertDASTEST1CUSTOMER" 
+	SQL="INSERT INTO DASTEST1.CUSTOMER VALUES (4, 'JENNYDAS', 'UKDAS')"
+	kind="Insert" />
+		
+	<Command name="DeleteDASTEST1CUSTOMER" 
+	SQL="DELETE FROM DASTEST1.CUSTOMER WHERE ID=4"
+	kind="Delete" />
+                            
+    <Table tableName="CUSTOMER" schemaName="DASTEST1" typeName="DASTEST1_CUSTOMER">
+        <Column columnName="ID" primaryKey="true"/>
+    </Table>
+  
+</Config>



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org