You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by jg...@apache.org on 2007/02/16 00:43:30 UTC

svn commit: r508237 [1/2] - in /ibatis/trunk/java/mapper/mapper2/tools/abator/core: build/ htmldoc/ htmldoc/configreference/ htmldoc/usage/ src/org/apache/ibatis/abator/ant/ src/org/apache/ibatis/abator/api/ src/org/apache/ibatis/abator/api/dom/java/ s...

Author: jgbutler
Date: Thu Feb 15 15:43:28 2007
New Revision: 508237

URL: http://svn.apache.org/viewvc?view=rev&rev=508237
Log:
Abator: Lots of changes to deal with the cases where column names need to be delimited.  More to come.

Added:
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/IgnoredColumn.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ActualTableName.java
Modified:
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/build/build.xml
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/build/version.properties
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/configreference/abatorContext.html
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/intro.html
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/usage/oracle.html
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/whatsNew.html
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/ant/AbatorAntTask.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/DAOGenerator.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/FullyQualifiedTable.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/JavaModelGenerator.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/JavaTypeResolver.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/SqlMapGenerator.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/Field.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/InnerClass.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/InnerEnum.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/Method.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/AbatorContext.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/ColumnOverride.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/GeneratedKey.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/TableConfiguration.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/xml/AbatorConfigurationParser.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/xml/abator-config_1_0.dtd
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/AbatorObjectFactory.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ColumnDefinition.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ColumnDefinitions.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/DatabaseIntrospector.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/java/dao/BaseDAOGenerator.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/java/dao/BaseLegacyDAOGenerator.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/java/model/JavaModelGeneratorJava2Impl.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/sqlmap/SqlMapGeneratorIterateImpl.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/types/JavaTypeResolverDefaultImpl.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/util/StringUtility.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/test/org/apache/ibatis/abator/internal/util/JavaBeansUtilTests.java
    ibatis/trunk/java/mapper/mapper2/tools/abator/core/testJava5/abatortest/abatorConfig.xml

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/build/build.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/build/build.xml?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/build/build.xml (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/build/build.xml Thu Feb 15 15:43:28 2007
@@ -333,5 +333,4 @@
 	      <report format="frames" todir="${reports.junit}"/>
     </junitreport>
   </target>
-
 </project>

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/build/version.properties
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/build/version.properties?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/build/version.properties (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/build/version.properties Thu Feb 15 15:43:28 2007
@@ -1,4 +1,4 @@
 #Abator build version info
-#Tue Feb 06 11:14:55 CST 2007
+#Thu Feb 15 17:37:34 CST 2007
 version=1.0.1
-buildNum=306
+buildNum=323

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/configreference/abatorContext.html
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/configreference/abatorContext.html?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/configreference/abatorContext.html (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/configreference/abatorContext.html Thu Feb 15 15:43:28 2007
@@ -140,6 +140,22 @@
       no effect when using the Java5 generator set.</p>
       <p><i>The default value is false.</i></p></td>
   </tr>
+  <tr>
+    <td valign="top">beginningDelimiter</td>
+    <td>The value to use as the beginning identifier delimiter for SQL identifiers that
+        require delimiters.  Abator will automatically delimit SQL identifiers if the
+        identifier contains a space.  Abator will also delimit SQL identifiers if
+        specifically requested in a &lt;table&gt; or  &lt;columnOverride&gt; configuration.</p>
+      <p><i>The default value is double quotes (&quot;).</i></p></td>
+  </tr>
+  <tr>
+    <td valign="top">endingDelimiter</td>
+    <td>The value to use as the ending identifier delimiter for SQL identifiers that
+        require delimiters.  Abator will automatically delimit SQL identifiers if the
+        identifier contains a space.  Abator will also delimit SQL identifiers if
+        specifically requested in a &lt;table&gt; or  &lt;columnOverride&gt; configuration.</p>
+      <p><i>The default value is double quotes (&quot;).</i></p></td>
+  </tr>
 </table>
 
 </body>

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/intro.html
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/intro.html?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/intro.html (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/intro.html Thu Feb 15 15:43:28 2007
@@ -31,7 +31,8 @@
       <li>a class to enable "Query By Example" functionality</li>
     </ul>
     <p>There is an inheritance relationship between these classes as appropriate.
-       Note that the types of POJOs generated is configurable - you may choose to tell
+       Abator may be configured to generate different types of POJO hierarchies -
+       you may choose to tell
        Abator to only generate a single domain object for each table if you so
        desire.</p>
   </li>
@@ -54,11 +55,14 @@
     above objects.  The generation of DAO classes is optional.  Abator will
     generate DAOs of the following types:
     <ul>
-      <li>DAOs that conform to the iBATIS DAO Framework (an optional part of iBATIS)</li>
-      <li>DAOs that conform to the SpringFramework</li>
+      <li>DAOs that conform to the
+          <a target="_blank" href="http://www.springframework.org">Spring</a> framework</li>
       <li>DAOs that only use the iBATIS SQL mapping API.  These DAOs can be
           generated in two varieties: supplying the <code>SqlMapClient</code> through
           either constructor or setter injection.</li>
+      <li>DAOs that conform to the iBATIS DAO Framework (an optional part of iBATIS, this
+          framework is now deprecated and we suggest that you use the Spring framework
+          instead)</li>
     </ul>
   </li>
 </ul>

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/usage/oracle.html
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/usage/oracle.html?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/usage/oracle.html (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/usage/oracle.html Thu Feb 15 15:43:28 2007
@@ -17,7 +17,7 @@
 table "HR.EMPLOYEES".  The following table configuration will generate the objects
 based on HR.EMPLOYEES, but the runtime SQL will only refer to FRED:</p>
 <pre>
-  &lt;table schema="HR" tableName="EMPLOYEES" alias="A"&gt;
+  &lt;table schema="HR" tableName="EMPLOYEES"&gt;
     &lt;property name="ignoreQualifiersAtRuntime" value="true" /&gt;
     &lt;property name="runtimeTableName" value="FRED" /&gt;
   &lt;/table&gt;

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/whatsNew.html
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/whatsNew.html?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/whatsNew.html (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/htmldoc/whatsNew.html Thu Feb 15 15:43:28 2007
@@ -9,7 +9,8 @@
 </head>
 <body>
 <h1>What's New in Abator</h1>
-<h2>Version 1.0.1 Miscellaneous Changes</h2>
+<h2>Version 1.0.1</h2>
+<h3>Miscellaneous Changes</h3>
 <ul>
   <li>Added the ability to specify properties to ignore qualifiers and change runtime
       table names in the generated SQL for a table.  Primary use cases for this
@@ -20,10 +21,25 @@
             schema will be selected at runtime</li>
       </ul>
     See the <a href="configreference/table.html">&lt;table&gt;</a>
-    reference page for more information.</li>
+    reference page for more information, or the
+    <a href="usage/oracle.html">Oracle</a> reference page for an example.</li>
+  <li>Added support for delimiting SQL identifiers for the use cases where identifiers
+      contain spaces or SQL reserved words.
+      See the <a href="configreference/table.html">&lt;table&gt;</a>,
+      <a href="configreference/abatorContext.html">&lt;abatorContext&gt;</a>,
+      and <a href="configreference/columnOverride.html">&lt;columnOverride&gt;</a>
+      reference pages for more information.</li>
+  <li>Added SYBASE dialect for generated keys..
+      See the <a href="configreference/generatedKey.html">&lt;generatedKey&gt;</a>
+      reference page for more information.</li>
+  <li>Abator will now automatically escape identifiers that contain the $ or # characters
+      as these characters have special meaning in iBATIS configuration files.</li>
+  <li>Added a <code>clear</code> method to the generated example classes.  This allows reuse
+      classes.</li>
 </ul>
 
-<h2>Generator Sets (Version 1.0.0)</h2>
+<h2>Version 1.0.0</h2>
+<h3>Generator Sets</h3>
 <p>A generator set is a set of
 code generators (SQL Map Generator, Java Model Generator, DAO Generator, and Java Type Resolver).
 Abator now ships three different generator sets.  The generated code from these three
@@ -67,7 +83,7 @@
 <a href="generatedobjects/exampleClassUsage.html">Example Class Usage</a> page for more
 information.</p>
 
-<h2>Model Types (Version 1.0.0)</h2>
+<h3>Model Types</h3>
 <p>A model type is used to give you more control over the types of domain objects
 generated by Abator.  Abator now supports three different types of domain models
 as follows:</p>
@@ -100,7 +116,7 @@
 <p><b>Important:</b> the default value is conditional - this is a non-backward compatible
 change from previous versions of Abator.</p>
 
-<h2>updateByPrimaryKeySelective (Version 1.0.0)</h2>
+<h3>updateByPrimaryKeySelective</h3>
 <p>This is a new mapped SQL statement, and new DAO method, that will only
 update columns whose corresponding properties in the parameter class are non-null.
 This can be used to update certain
@@ -109,7 +125,7 @@
 <p><b>Important:</b> any column that is mapped to a primitive type
 will always be updated.</p>
 
-<h2>Version 1.0.0 Miscellaneous Changes</h2>
+<h3>Miscellaneous Changes</h3>
 <ul>
   <li>Added the ability to specify a table alias.  This aids in reuse of generated
     SQL map elements.  See the <a href="configreference/table.html">&lt;table&gt;</a>

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/ant/AbatorAntTask.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/ant/AbatorAntTask.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/ant/AbatorAntTask.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/ant/AbatorAntTask.java Thu Feb 15 15:43:28 2007
@@ -117,6 +117,9 @@
         } catch (InterruptedException e) {
             // ignore (will never happen with the DefaultShellCallback)
             ;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new BuildException(e.getMessage());
         }
         
         Iterator iter = warnings.iterator();

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/DAOGenerator.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/DAOGenerator.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/DAOGenerator.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/DAOGenerator.java Thu Feb 15 15:43:28 2007
@@ -18,6 +18,8 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.ibatis.abator.config.AbatorContext;
+
 /**
  * The DAOGenerator interface describes the methods needed to generate DAO
  * objects for a table.
@@ -37,15 +39,15 @@
     void addConfigurationProperties(Map properties);
     
     /**
-     * Adds properties for this instance from any properties configured
-     * in the current context.
+     * Sets the instance of the AbatorConfiguration object associated with 
+     * this instance.
      * 
      * This method will be called before any of the get methods.
      * 
-     * @param properties
-     *            All properties from the configuration
+     * @param abatorContext
+     *            The current AbatorContext
      */
-    void addContextProperties(Map properties);
+    void setAbatorContext(AbatorContext abatorContext);
 
 	/**
 	 * Abator will supply a list to this method.  The implementation class may

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/FullyQualifiedTable.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/FullyQualifiedTable.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/FullyQualifiedTable.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/FullyQualifiedTable.java Thu Feb 15 15:43:28 2007
@@ -15,6 +15,7 @@
  */
 package org.apache.ibatis.abator.api;
 
+import org.apache.ibatis.abator.config.AbatorContext;
 import org.apache.ibatis.abator.internal.util.EqualsUtil;
 import org.apache.ibatis.abator.internal.util.HashCodeUtil;
 import org.apache.ibatis.abator.internal.util.JavaBeansUtil;
@@ -31,14 +32,19 @@
 
 	private String tableName;
 
+    private String runtimeTableName;
+    
 	private String domainObjectName;
     
     private String alias;
     
     private boolean ignoreQualifiersAtRuntime;
     
-    private String runtimeTableName;
-
+    private String beginningDelimiter;
+    
+    private String endingDelimiter;
+    
+    
     /**
      * This object is used to hold information related to the table itself,
      * not the columns in the table.
@@ -73,10 +79,14 @@
      *  to run with an Oracle synonym.  The user would have to specify
      *  the actual table name and schema for generation, but would want to 
      *  use the synonym name in the generated SQL
+     *  
+     *  @param delimitIdentifiers if true, then the table identifiers will be
+     *   delimited at runtime.  The delimiter characters are obtained
+     *   from the AbatorContext.
      */
 	public FullyQualifiedTable(String catalog, String schema, String tableName,
             String domainObjectName, String alias, boolean ignoreQualifiersAtRuntime,
-            String runtimeTableName) {
+            String runtimeTableName, boolean delimitIdentifiers, AbatorContext abatorContext) {
 		super();
         this.catalog = catalog;
         this.schema = schema;
@@ -90,7 +100,10 @@
         } else {
             this.alias = alias.trim();
         }
-	}
+
+        beginningDelimiter = delimitIdentifiers ? abatorContext.getBeginningDelimiter() : ""; //$NON-NLS-1$
+        endingDelimiter = delimitIdentifiers ? abatorContext.getEndingDelimiter() : ""; //$NON-NLS-1$
+    }
 
 	public String getCatalog() {
 		return catalog;
@@ -104,16 +117,33 @@
 		return tableName;
 	}
 
-	public String getFullyQualifiedTableNameAsConfigured() {
-        return StringUtility.composeFullyQualifiedTableName(
-                catalog, schema, tableName, '.');
-	}
-
     public String getFullyQualifiedTableNameAtRuntime() {
+        String localCatalog;
+        String localSchema;
+        String localTableName;
+        
+        if (StringUtility.stringHasValue(catalog)  && !ignoreQualifiersAtRuntime) {
+            localCatalog = beginningDelimiter + catalog + endingDelimiter;
+        } else {
+            localCatalog = null;
+        }
+        
+        if (StringUtility.stringHasValue(schema)  && !ignoreQualifiersAtRuntime) {
+            localSchema = beginningDelimiter + schema + endingDelimiter;
+        } else {
+            localSchema = null;
+        }
+        
+        if (StringUtility.stringHasValue(runtimeTableName)) {
+            localTableName = beginningDelimiter + runtimeTableName + endingDelimiter;
+        } else {
+            localTableName = beginningDelimiter + tableName + endingDelimiter;
+        }
+        
         return StringUtility.composeFullyQualifiedTableName(
-                ignoreQualifiersAtRuntime ? null : catalog,
-                ignoreQualifiersAtRuntime ? null : schema,
-                StringUtility.stringHasValue(runtimeTableName) ? runtimeTableName : tableName,
+                localCatalog,
+                localSchema,
+                localTableName,
                 '.');
     }
 
@@ -130,7 +160,12 @@
         return sb.toString();
     }
 
-    public String getFullyQualifiedTableNameWithUnderscoresAtRuntime() {
+    /**
+     * This method returns a string that is the fully qualified table name, with
+     * underscores as the seperator.  This String should be 
+     * @return
+     */
+    public String getSqlMapNamespace() {
         return StringUtility.composeFullyQualifiedTableName(
                 ignoreQualifiersAtRuntime ? null : catalog,
                 ignoreQualifiersAtRuntime ? null : schema,
@@ -174,7 +209,8 @@
     }
     
     public String toString() {
-        return getFullyQualifiedTableNameAsConfigured();
+        return StringUtility.composeFullyQualifiedTableName(
+                catalog, schema, tableName, '.');
     }
 
     public String getAlias() {

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/JavaModelGenerator.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/JavaModelGenerator.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/JavaModelGenerator.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/JavaModelGenerator.java Thu Feb 15 15:43:28 2007
@@ -19,6 +19,7 @@
 import java.util.Map;
 
 import org.apache.ibatis.abator.api.dom.java.FullyQualifiedJavaType;
+import org.apache.ibatis.abator.config.AbatorContext;
 
 /**
  * This interface describes methods needed in any Java model generator.
@@ -48,15 +49,15 @@
     void addConfigurationProperties(Map properties);
     
     /**
-     * Adds properties for this instance from any properties configured
-     * in the current context.
+     * Sets the instance of the AbatorConfiguration object associated with 
+     * this instance.
      * 
      * This method will be called before any of the get methods.
      * 
-     * @param properties
-     *            All properties from the configuration
+     * @param abatorContext
+     *            The current AbatorContext
      */
-    void addContextProperties(Map properties);
+    void setAbatorContext(AbatorContext abatorContext);
 
 	/**
 	 * Abator will supply a list to this method.  The implementation class may

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/JavaTypeResolver.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/JavaTypeResolver.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/JavaTypeResolver.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/JavaTypeResolver.java Thu Feb 15 15:43:28 2007
@@ -18,6 +18,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.ibatis.abator.config.AbatorContext;
 import org.apache.ibatis.abator.exception.UnsupportedDataTypeException;
 import org.apache.ibatis.abator.internal.db.ColumnDefinition;
 
@@ -42,15 +43,15 @@
     void addConfigurationProperties(Map properties);
     
     /**
-     * Adds properties for this instance from any properties configured
-     * in the current context.
+     * Sets the instance of the AbatorConfiguration object associated with 
+     * this instance.
      * 
      * This method will be called before any of the get methods.
      * 
-     * @param properties
-     *            All properties from the configuration
+     * @param abatorContext
+     *            The current AbatorContext
      */
-    void addContextProperties(Map properties);
+    void setAbatorContext(AbatorContext abatorContext);
 	
 	/**
 	 * Abator will supply a list to this method.  The implementation class may

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/SqlMapGenerator.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/SqlMapGenerator.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/SqlMapGenerator.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/SqlMapGenerator.java Thu Feb 15 15:43:28 2007
@@ -18,6 +18,8 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.ibatis.abator.config.AbatorContext;
+
 /**
  * This interface describes the operations that are required of an 
  * Sql Map Generator.  An Sql Map Generator is a class that generates
@@ -50,15 +52,15 @@
     void addConfigurationProperties(Map properties);
     
     /**
-     * Adds properties for this instance from any properties configured
-     * in the current context.
+     * Sets the instance of the AbatorConfiguration object associated with 
+     * this instance.
      * 
      * This method will be called before any of the get methods.
      * 
-     * @param properties
-     *            All properties from the configuration
+     * @param abatorContext
+     *            The current AbatorContext
      */
-    void addContextProperties(Map properties);
+    void setAbatorContext(AbatorContext abatorContext);
 
     void setTargetPackage(String targetPackage);
 

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/Field.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/Field.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/Field.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/Field.java Thu Feb 15 15:43:28 2007
@@ -135,7 +135,7 @@
         addJavaDocLine(" * This field was generated by Abator for iBATIS."); //$NON-NLS-1$
 		
 		sb.append(" * This field corresponds to the database column "); //$NON-NLS-1$
-		sb.append(table.getFullyQualifiedTableNameAsConfigured());
+		sb.append(table);
 		sb.append('.');
 		sb.append(columnName);
         addJavaDocLine(sb.toString());
@@ -157,7 +157,7 @@
         addJavaDocLine(" * This field was generated by Abator for iBATIS."); //$NON-NLS-1$
 		
 		sb.append(" * This field corresponds to the database table "); //$NON-NLS-1$
-		sb.append(table.getFullyQualifiedTableNameAsConfigured());
+		sb.append(table);
         addJavaDocLine(sb.toString());
 		
         addJavaDocLine(" *"); //$NON-NLS-1$

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/InnerClass.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/InnerClass.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/InnerClass.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/InnerClass.java Thu Feb 15 15:43:28 2007
@@ -258,7 +258,7 @@
         addJavaDocLine(" * This class was generated by Abator for iBATIS."); //$NON-NLS-1$
         
         sb.append(" * This class corresponds to the database table "); //$NON-NLS-1$
-        sb.append(table.getFullyQualifiedTableNameAsConfigured());
+        sb.append(table);
         addJavaDocLine(sb.toString());
         
         addJavaDocLine(" *"); //$NON-NLS-1$

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/InnerEnum.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/InnerEnum.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/InnerEnum.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/InnerEnum.java Thu Feb 15 15:43:28 2007
@@ -255,7 +255,7 @@
         addJavaDocLine(" * This enum was generated by Abator for iBATIS."); //$NON-NLS-1$
         
         sb.append(" * This enum corresponds to the database table "); //$NON-NLS-1$
-        sb.append(table.getFullyQualifiedTableNameAsConfigured());
+        sb.append(table);
         addJavaDocLine(sb.toString());
         
         addJavaDocLine(" *"); //$NON-NLS-1$

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/Method.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/Method.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/Method.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/api/dom/java/Method.java Thu Feb 15 15:43:28 2007
@@ -268,7 +268,7 @@
         addJavaDocLine(" * This method was generated by Abator for iBATIS."); //$NON-NLS-1$
     
     	sb.append(" * This method returns the value of the database column "); //$NON-NLS-1$
-    	sb.append(table.getFullyQualifiedTableNameAsConfigured());
+    	sb.append(table);
     	sb.append('.');
     	sb.append(columnDefinition.getActualColumnName());
         addJavaDocLine(sb.toString());
@@ -277,7 +277,7 @@
     	
     	sb.setLength(0);
     	sb.append(" * @return the value of "); //$NON-NLS-1$
-    	sb.append(table.getFullyQualifiedTableNameAsConfigured());
+    	sb.append(table);
     	sb.append('.');
     	sb.append(columnDefinition.getActualColumnName());
         addJavaDocLine(sb.toString());
@@ -299,7 +299,7 @@
         addJavaDocLine(" * This method was generated by Abator for iBATIS."); //$NON-NLS-1$
     
     	sb.append(" * This method sets the value of the database column "); //$NON-NLS-1$
-    	sb.append(table.getFullyQualifiedTableNameAsConfigured());
+    	sb.append(table);
     	sb.append('.');
     	sb.append(columnDefinition.getActualColumnName());
         addJavaDocLine(sb.toString());
@@ -310,7 +310,7 @@
     	sb.append(" * @param "); //$NON-NLS-1$
     	sb.append(columnDefinition.getJavaProperty());
     	sb.append(" the value for "); //$NON-NLS-1$
-    	sb.append(table.getFullyQualifiedTableNameAsConfigured());
+    	sb.append(table);
     	sb.append('.');
     	sb.append(columnDefinition.getActualColumnName());
         addJavaDocLine(sb.toString());
@@ -332,7 +332,7 @@
         addJavaDocLine(" * This method was generated by Abator for iBATIS."); //$NON-NLS-1$
     	
     	sb.append(" * This method corresponds to the database table "); //$NON-NLS-1$
-    	sb.append(table.getFullyQualifiedTableNameAsConfigured());
+    	sb.append(table);
         addJavaDocLine(sb.toString());
     	
         addJavaDocLine(" *"); //$NON-NLS-1$

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/AbatorContext.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/AbatorContext.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/AbatorContext.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/AbatorContext.java Thu Feb 15 15:43:28 2007
@@ -62,9 +62,11 @@
     
     private String configuredGeneratorSet;
     
-    private char beginingDelimiter = '\"';
+    private String beginningDelimiter = "\""; //$NON-NLS-1$
 	
-    private char endingDelimiter = '\"';
+    private String endingDelimiter = "\""; //$NON-NLS-1$
+    
+    private boolean suppressTypeWarnings;
     
     /**
      * Constructs an AbatorContext object.
@@ -273,16 +275,18 @@
                 introspectedTables  = databaseIntrospector.introspectTables(tc);
 				callback.checkCancel();
                 
-                Iterator iter2 = introspectedTables.iterator();
-                while (iter2.hasNext()) {
-                    callback.checkCancel();
-                    IntrospectedTable introspectedTable = (IntrospectedTable) iter2.next();
-
-                    if (daoGenerator != null) {
-                        generatedJavaFiles.addAll(daoGenerator.getGeneratedJavaFiles(introspectedTable, callback));
+                if (introspectedTables != null) {
+                    Iterator iter2 = introspectedTables.iterator();
+                    while (iter2.hasNext()) {
+                        callback.checkCancel();
+                        IntrospectedTable introspectedTable = (IntrospectedTable) iter2.next();
+
+                        if (daoGenerator != null) {
+                            generatedJavaFiles.addAll(daoGenerator.getGeneratedJavaFiles(introspectedTable, callback));
+                        }
+                        generatedJavaFiles.addAll(javaModelGenerator.getGeneratedJavaFiles(introspectedTable, callback));
+                        generatedXmlFiles.addAll(sqlMapGenerator.getGeneratedXMLFiles(introspectedTable, callback));
                     }
-                    generatedJavaFiles.addAll(javaModelGenerator.getGeneratedJavaFiles(introspectedTable, callback));
-                    generatedXmlFiles.addAll(sqlMapGenerator.getGeneratedXMLFiles(introspectedTable, callback));
                 }
 			}
 		} finally {
@@ -410,5 +414,29 @@
 
     public List getTableConfigurations() {
         return tableConfigurations;
+    }
+
+    public String getBeginningDelimiter() {
+        return beginningDelimiter;
+    }
+
+    public String getEndingDelimiter() {
+        return endingDelimiter;
+    }
+
+    public void addProperty(String name, String value) {
+        super.addProperty(name, value);
+        
+        if ("suppressTypeWarnings".equals(name)) { //$NON-NLS-1$
+            suppressTypeWarnings = "true".equalsIgnoreCase(value); //$NON-NLS-1$
+        } else if ("beginningDelimiter".equals(name)) { //$NON-NLS-1$
+            beginningDelimiter = value;
+        } else if ("endingDelimiter".equals(name)) { //$NON-NLS-1$
+            endingDelimiter = value;
+        }
+    }
+
+    public boolean getSuppressTypeWarnings() {
+        return suppressTypeWarnings;
     }
 }

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/ColumnOverride.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/ColumnOverride.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/ColumnOverride.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/ColumnOverride.java Thu Feb 15 15:43:28 2007
@@ -33,22 +33,25 @@
 	private String javaType;
     
     private String typeHandler;
+    
+    private boolean isColumnNameDelimited;
 
+    private String configuredDelimitedColumnName;
+    
 	/**
 	 *  
 	 */
-	public ColumnOverride() {
+	public ColumnOverride(String columnName) {
 		super();
-	}
+        
+        this.columnName = columnName;
+        isColumnNameDelimited = StringUtility.stringContainsSpace(columnName);
+}
 
 	public String getColumnName() {
 		return columnName;
 	}
 
-	public void setColumnName(String columnName) {
-		this.columnName = columnName;
-	}
-
 	public String getJavaProperty() {
 		return javaProperty;
 	}
@@ -101,6 +104,20 @@
             xmlElement.addAttribute(new Attribute("typeHandler", typeHandler)); //$NON-NLS-1$
         }
         
+        if (StringUtility.stringHasValue(configuredDelimitedColumnName)) {
+            xmlElement.addAttribute(new Attribute("delimitedColumnName", configuredDelimitedColumnName));
+        }
+        
         return xmlElement;
+    }
+
+    public boolean isColumnNameDelimited() {
+        return isColumnNameDelimited;
+    }
+
+    public void setColumnNameDelimited(boolean isColumnNameDelimited) {
+        this.isColumnNameDelimited = isColumnNameDelimited;
+        
+        configuredDelimitedColumnName = isColumnNameDelimited ? "true" : "false";
     }
 }

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/GeneratedKey.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/GeneratedKey.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/GeneratedKey.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/GeneratedKey.java Thu Feb 15 15:43:28 2007
@@ -42,7 +42,7 @@
         this.column = column;
         this.isIdentity = isIdentity;
         this.configuredSqlStatement = configuredSqlStatement;
-
+        
         DatabaseDialects dialect = DatabaseDialects.getDatabaseDialect(configuredSqlStatement);
         if (dialect == null) {
             this.runtimeSqlStatement = configuredSqlStatement;

Added: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/IgnoredColumn.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/IgnoredColumn.java?view=auto&rev=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/IgnoredColumn.java (added)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/IgnoredColumn.java Thu Feb 15 15:43:28 2007
@@ -0,0 +1,80 @@
+/*
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.ibatis.abator.config;
+
+import org.apache.ibatis.abator.api.dom.xml.Attribute;
+import org.apache.ibatis.abator.api.dom.xml.XmlElement;
+import org.apache.ibatis.abator.internal.util.StringUtility;
+
+/**
+ * @author Jeff Butler
+ *
+ */
+public class IgnoredColumn {
+
+    private String columnName;
+
+    private boolean isColumnNameDelimited;
+
+    private String configuredDelimitedColumnName;
+    
+    /**
+     * 
+     */
+    public IgnoredColumn(String columnName) {
+        super();
+        this.columnName = columnName;
+        isColumnNameDelimited = StringUtility.stringContainsSpace(columnName);
+    }
+
+    public String getColumnName() {
+        return columnName;
+    }
+
+    public boolean isColumnNameDelimited() {
+        return isColumnNameDelimited;
+    }
+
+    public void setColumnNameDelimited(boolean isColumnNameDelimited) {
+        this.isColumnNameDelimited = isColumnNameDelimited;
+        configuredDelimitedColumnName = isColumnNameDelimited ? "true" : "false";
+    }
+
+    public boolean equals(Object obj) {
+        if (obj == null || !(obj instanceof IgnoredColumn)) {
+            return false;
+        }
+        
+        return columnName.equals(((IgnoredColumn)obj).getColumnName());
+    }
+
+    public int hashCode() {
+        return columnName.hashCode();
+    }
+
+    public XmlElement toXmlElement() {
+        XmlElement xmlElement = new XmlElement("ignoreColumn"); //$NON-NLS-1$
+        xmlElement.addAttribute(new Attribute("column", columnName)); //$NON-NLS-1$
+        
+        if (StringUtility.stringHasValue(configuredDelimitedColumnName)) {
+            xmlElement.addAttribute(new Attribute("delimitedColumnName", configuredDelimitedColumnName));
+        }
+        
+        return xmlElement;
+    }
+
+}

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/TableConfiguration.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/TableConfiguration.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/TableConfiguration.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/TableConfiguration.java Thu Feb 15 15:43:28 2007
@@ -44,7 +44,7 @@
 
 	private boolean deleteByExampleStatementEnabled;
 
-	private Map columnOverrides;
+	private List columnOverrides;
 
 	private Map ignoredColumns;
 
@@ -62,13 +62,14 @@
     private ModelType modelType;
     private boolean wildcardEscapingEnabled;
     private String configuredModelType;
+    private boolean delimitIdentifiers;
     
 	public TableConfiguration(AbatorContext abatorContext) {
 		super();
         
         this.modelType = abatorContext.getDefaultModelType();
 		
-		columnOverrides = new HashMap();
+		columnOverrides = new ArrayList();
 		ignoredColumns = new HashMap();
 
 		insertStatementEnabled = true;
@@ -114,25 +115,35 @@
 		this.updateByPrimaryKeyStatementEnabled = updateByPrimaryKeyStatementEnabled;
 	}
 
-	public boolean isColumnIgnored(String column) {
-	    String key = column.toUpperCase();
+	public boolean isColumnIgnored(String columnName) {
         
-        boolean rc = ignoredColumns.containsKey(key);
-        
-        if (rc) {
-            ignoredColumns.put(key, Boolean.TRUE);
+        Iterator iter = ignoredColumns.entrySet().iterator();
+        while (iter.hasNext()) {
+            Map.Entry entry = (Map.Entry) iter.next();
+
+            IgnoredColumn ic = (IgnoredColumn) entry.getKey();
+            if (ic.isColumnNameDelimited()) {
+                if (columnName.equals(ic.getColumnName())) {
+                    entry.setValue(Boolean.TRUE);
+                    return true;
+                }
+            } else {
+                if (columnName.equalsIgnoreCase(ic.getColumnName())) {
+                    entry.setValue(Boolean.TRUE);
+                    return true;
+                }
+            }
         }
-	    
-	    return rc;
+        
+        return false;
 	}
 
-	public void addIgnoredColumn(String column) {
-		ignoredColumns.put(column.toUpperCase(), Boolean.FALSE);
+	public void addIgnoredColumn(IgnoredColumn ignoredColumn) {
+		ignoredColumns.put(ignoredColumn, Boolean.FALSE);
 	}
 
 	public void addColumnOverride(ColumnOverride columnOverride) {
-		columnOverrides.put(columnOverride.getColumnName().toUpperCase(),
-				columnOverride);
+		columnOverrides.add(columnOverride);
 	}
 
 	public boolean equals(Object obj) {
@@ -176,7 +187,21 @@
 	 * @return the column override (if any) related to this column
 	 */
 	public ColumnOverride getColumnOverride(String columnName) {
-		return (ColumnOverride) columnOverrides.get(columnName.toUpperCase());
+        Iterator iter = columnOverrides.iterator();
+        while (iter.hasNext()) {
+            ColumnOverride co = (ColumnOverride) iter.next();
+            if (co.isColumnNameDelimited()) {
+                if (columnName.equals(co.getColumnName())) {
+                    return co;
+                }
+            } else {
+                if (columnName.equalsIgnoreCase(co.getColumnName())) {
+                    return co;
+                }
+            }
+        }
+        
+        return null;
 	}
 
 	public GeneratedKey getGeneratedKey() {
@@ -262,7 +287,7 @@
     }
 
     public Iterator getColumnOverrides() {
-        return columnOverrides.values().iterator();
+        return columnOverrides.iterator();
     }
 
     /**
@@ -374,15 +399,13 @@
         if (ignoredColumns.size() > 0) {
             Iterator iter = ignoredColumns.keySet().iterator();
             while (iter.hasNext()) {
-                String column = (String) iter.next();
-                XmlElement ignoreColumn = new XmlElement("ignoreColumn"); //$NON-NLS-1$
-                ignoreColumn.addAttribute(new Attribute("column", column)); //$NON-NLS-1$
-                xmlElement.addElement(ignoreColumn);
+                IgnoredColumn ignoredColumn = (IgnoredColumn) iter.next();
+                xmlElement.addElement(ignoredColumn.toXmlElement());
             }
         }
         
         if (columnOverrides.size() > 0) {
-            Iterator iter = columnOverrides.values().iterator();
+            Iterator iter = columnOverrides.iterator();
             while (iter.hasNext()) {
                 ColumnOverride columnOverride = (ColumnOverride) iter.next();
                 xmlElement.addElement(columnOverride.toXmlElement());
@@ -390,5 +413,17 @@
         }
         
         return xmlElement;
+    }
+
+    public String toString() {
+        return StringUtility.composeFullyQualifiedTableName(catalog, schema, tableName, '.');
+    }
+
+    public boolean isDelimitIdentifiers() {
+        return delimitIdentifiers;
+    }
+
+    public void setDelimitIdentifiers(boolean delimitIdentifiers) {
+        this.delimitIdentifiers = delimitIdentifiers;
     }
 }

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/xml/AbatorConfigurationParser.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/xml/AbatorConfigurationParser.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/xml/AbatorConfigurationParser.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/xml/AbatorConfigurationParser.java Thu Feb 15 15:43:28 2007
@@ -34,6 +34,7 @@
 import org.apache.ibatis.abator.config.ColumnOverride;
 import org.apache.ibatis.abator.config.DAOGeneratorConfiguration;
 import org.apache.ibatis.abator.config.GeneratedKey;
+import org.apache.ibatis.abator.config.IgnoredColumn;
 import org.apache.ibatis.abator.config.JDBCConnectionConfiguration;
 import org.apache.ibatis.abator.config.JavaModelGeneratorConfiguration;
 import org.apache.ibatis.abator.config.JavaTypeResolverConfiguration;
@@ -330,6 +331,7 @@
                 .getProperty("selectByExampleQueryId"); //$NON-NLS-1$
         String modelType = attributes.getProperty("modelType"); //$NON-NLS-1$
         String escapeWildcards = attributes.getProperty("escapeWildcards"); //$NON-NLS-1$
+        String delmitIdentifiers = attributes.getProperty("delimitIdentifiers"); //$NON-NLS-1$
 
         if (StringUtility.stringHasValue(catalog)) {
             tc.setCatalog(catalog);
@@ -398,6 +400,11 @@
                     .equals(escapeWildcards));
         }
 
+        if (StringUtility.stringHasValue(delmitIdentifiers)) {
+            tc.setDelimitIdentifiers("true" //$NON-NLS-1$
+                    .equals(delmitIdentifiers));
+        }
+        
         NodeList nodeList = node.getChildNodes();
         for (int i = 0; i < nodeList.getLength(); i++) {
             Node childNode = nodeList.item(i);
@@ -425,10 +432,9 @@
         String javaType = attributes.getProperty("javaType"); //$NON-NLS-1$
         String jdbcType = attributes.getProperty("jdbcType"); //$NON-NLS-1$
         String typeHandler = attributes.getProperty("typeHandler"); //$NON-NLS-1$
+        String delimitedColumnName = attributes.getProperty("delimitedColumnName"); //$NON-NLS-1$
 
-        ColumnOverride co = new ColumnOverride();
-
-        co.setColumnName(column);
+        ColumnOverride co = new ColumnOverride(column);
 
         if (StringUtility.stringHasValue(property)) {
             co.setJavaProperty(property);
@@ -446,6 +452,10 @@
             co.setTypeHandler(typeHandler);
         }
 
+        if (StringUtility.stringHasValue(delimitedColumnName)) {
+            co.setColumnNameDelimited("true".equalsIgnoreCase(delimitedColumnName));
+        }
+        
         tc.addColumnOverride(co);
     }
 
@@ -457,14 +467,22 @@
         String sqlStatement = attributes.getProperty("sqlStatement"); //$NON-NLS-1$
 
         GeneratedKey gk = new GeneratedKey(column, sqlStatement, identity);
+
         tc.setGeneratedKey(gk);
     }
 
     private void parseIgnoreColumn(TableConfiguration tc, Node node) {
         Properties attributes = parseAttributes(node);
         String column = attributes.getProperty("column"); //$NON-NLS-1$
+        String delimitedColumnName = attributes.getProperty("delimitedColumnName"); //$NON-NLS-1$
+        
+        IgnoredColumn ic = new IgnoredColumn(column);
+        
+        if (StringUtility.stringHasValue(delimitedColumnName)) {
+            ic.setColumnNameDelimited("true".equalsIgnoreCase(delimitedColumnName));
+        }
 
-        tc.addIgnoredColumn(column);
+        tc.addIgnoredColumn(ic);
     }
 
     private void parseJavaTypeResolver(AbatorContext abatorContext, Node node) {

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/xml/abator-config_1_0.dtd
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/xml/abator-config_1_0.dtd?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/xml/abator-config_1_0.dtd (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/config/xml/abator-config_1_0.dtd Thu Feb 15 15:43:28 2007
@@ -149,7 +149,8 @@
   selectByPrimaryKeyQueryId CDATA #IMPLIED
   selectByExampleQueryId CDATA #IMPLIED
   modelType CDATA #IMPLIED
-  escapeWildcards CDATA #IMPLIED>
+  escapeWildcards CDATA #IMPLIED
+  delimitIdentifiers CDATA #IMPLIED>
 
 <!--
   The columnOverride element is used to change certain attributes of the column
@@ -161,7 +162,8 @@
   property CDATA #IMPLIED
   javaType CDATA #IMPLIED
   jdbcType CDATA #IMPLIED
-  typeHandler CDATA #IMPLIED>
+  typeHandler CDATA #IMPLIED
+  delimitedColumnName CDATA #IMPLIED>
 
 <!--
   The ignoreColumn element is used to identify a column that should be ignored.
@@ -170,7 +172,8 @@
 -->
 <!ELEMENT ignoreColumn EMPTY>
 <!ATTLIST ignoreColumn
-  column CDATA #REQUIRED>
+  column CDATA #REQUIRED
+  delimitedColumnName CDATA #IMPLIED>
 
 <!--
   The generatedKey element is used to identify a column in the table whose value

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/AbatorObjectFactory.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/AbatorObjectFactory.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/AbatorObjectFactory.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/AbatorObjectFactory.java Thu Feb 15 15:43:28 2007
@@ -87,7 +87,7 @@
             answer.addConfigurationProperties(config.getProperties());
         }
         
-        answer.addContextProperties(context.getProperties());
+        answer.setAbatorContext(context);
 	    
 	    return answer;
 	}
@@ -109,7 +109,7 @@
 
 	    answer.setJavaModelGenerator(javaModelGenerator);
 	    answer.addConfigurationProperties(config.getProperties());
-        answer.addContextProperties(context.getProperties());
+        answer.setAbatorContext(context);
 	    answer.setTargetPackage(config.getTargetPackage());
 	    answer.setTargetProject(config.getTargetProject());
 	    
@@ -132,7 +132,7 @@
 	    answer.setWarnings(warnings);
 	    
 	    answer.addConfigurationProperties(config.getProperties());
-        answer.addContextProperties(context.getProperties());
+        answer.setAbatorContext(context);
 	    answer.setTargetPackage(config.getTargetPackage());
 	    answer.setTargetProject(config.getTargetProject());
 	    
@@ -155,7 +155,7 @@
 
 	    answer.setJavaModelGenerator(javaModelGenerator);
 	    answer.addConfigurationProperties(config.getProperties());
-        answer.addContextProperties(context.getProperties());
+        answer.setAbatorContext(context);
 	    answer.setSqlMapGenerator(sqlMapGenerator);
 	    answer.setTargetPackage(config.getTargetPackage());
 	    answer.setTargetProject(config.getTargetProject());

Added: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ActualTableName.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ActualTableName.java?view=auto&rev=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ActualTableName.java (added)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ActualTableName.java Thu Feb 15 15:43:28 2007
@@ -0,0 +1,67 @@
+/*
+ *  Copyright 2007 The Apache Software Foundation
+ *
+ *  Licensed 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.ibatis.abator.internal.db;
+
+import org.apache.ibatis.abator.internal.util.StringUtility;
+
+/**
+ * This class holds the actual catalog, schema, and table name returned from
+ * the database introspection.
+ * 
+ * @author Jeff Butler
+ *
+ */
+public class ActualTableName {
+
+    private String tableName;
+    private String catalog;
+    private String schema;
+    
+    public ActualTableName (String catalog, String schema, String tableName) {
+        this.catalog = catalog;
+        this.schema = schema;
+        this.tableName = tableName;
+    }
+
+    public String getCatalog() {
+        return catalog;
+    }
+
+    public String getSchema() {
+        return schema;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public boolean equals(Object obj) {
+        if (obj == null || !(obj instanceof ActualTableName)) {
+            return false;
+        }
+        
+        return obj.toString().equals(this.toString());
+    }
+
+    public int hashCode() {
+        return toString().hashCode();
+    }
+
+    public String toString() {
+        return StringUtility.composeFullyQualifiedTableName(catalog, schema, tableName, '.');
+    }
+}

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ColumnDefinition.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ColumnDefinition.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ColumnDefinition.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ColumnDefinition.java Thu Feb 15 15:43:28 2007
@@ -19,6 +19,7 @@
 import java.util.StringTokenizer;
 
 import org.apache.ibatis.abator.api.dom.java.FullyQualifiedJavaType;
+import org.apache.ibatis.abator.config.AbatorContext;
 import org.apache.ibatis.abator.internal.types.ResolvedJavaType;
 import org.apache.ibatis.abator.internal.util.StringUtility;
 
@@ -52,6 +53,10 @@
     private String tableAlias;
     
     private String typeHandler;
+    
+    private AbatorContext abatorContext;
+    
+    private boolean isColumnNameDelimited;
 
     /**
      * The aliased column name for a select statement.  If there
@@ -82,9 +87,10 @@
      * @param tableAlias The specified table alias, or null.  This
      *   value is used to rename and alias column names for select statements
      */
-    public ColumnDefinition(String tableAlias) {
+    public ColumnDefinition(String tableAlias, AbatorContext abatorContext) {
         super();
         this.tableAlias = tableAlias;
+        this.abatorContext = abatorContext;
     }
 
     public int getJdbcType() {
@@ -154,6 +160,7 @@
     public void setActualColumnName(String actualColumnName) {
         this.actualColumnName = actualColumnName;
         this.escapedColumnName = escapeStringForIbatis(actualColumnName);
+        isColumnNameDelimited = StringUtility.stringContainsSpace(actualColumnName);
         
         if (StringUtility.stringHasValue(tableAlias)) {
             StringBuffer sb = new StringBuffer();
@@ -322,5 +329,13 @@
 
     public String getAliasedEscapedColumnName() {
         return aliasedEscapedColumnName;
+    }
+
+    public void setColumnNameDelimited(boolean isColumnNameDelimited) {
+        this.isColumnNameDelimited = isColumnNameDelimited;
+    }
+
+    public boolean isColumnNameDelimited() {
+        return isColumnNameDelimited;
     }
 }

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ColumnDefinitions.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ColumnDefinitions.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ColumnDefinitions.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/ColumnDefinitions.java Thu Feb 15 15:43:28 2007
@@ -15,8 +15,9 @@
  */
 package org.apache.ibatis.abator.internal.db;
 
-import java.util.Collection;
-import java.util.LinkedHashMap;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
 
 /**
  * This class holds the results of introspecting the database table.
@@ -25,36 +26,36 @@
  */
 public class ColumnDefinitions {
 	
-    private LinkedHashMap primaryKeyColumns;
-	private LinkedHashMap baseColumns;
-    private LinkedHashMap blobColumns;
+    private List primaryKeyColumns;
+	private List baseColumns;
+    private List blobColumns;
     private boolean hasJDBCDateColumns;
     private boolean hasJDBCTimeColumns;
 
 	public ColumnDefinitions() {
 		super();
-		primaryKeyColumns = new LinkedHashMap();
-        baseColumns = new LinkedHashMap();
-        blobColumns = new LinkedHashMap();
+		primaryKeyColumns = new ArrayList();
+        baseColumns = new ArrayList();
+        blobColumns = new ArrayList();
 	}
 
-	public Collection getBLOBColumns() {
-        return blobColumns.values();
+	public List getBLOBColumns() {
+        return blobColumns;
 	}
 
-	public Collection getBaseColumns() {
-        return baseColumns.values();
+	public List getBaseColumns() {
+        return baseColumns;
 	}
 	
-	public Collection getPrimaryKeyColumns() {
-		return primaryKeyColumns.values();
+	public List getPrimaryKeyColumns() {
+		return primaryKeyColumns;
 	}
 
 	public void addColumn(ColumnDefinition cd) {
         if (cd.isBLOBColumn()) {
-            blobColumns.put(cd.getActualColumnName().toUpperCase(), cd);
+            blobColumns.add(cd);
         } else {
-            baseColumns.put(cd.getActualColumnName().toUpperCase(), cd);
+            baseColumns.add(cd);
         }
         
         if (cd.isJDBCDateColumn()) {
@@ -67,12 +68,31 @@
 	}
 
 	public void addPrimaryKeyColumn(String columnName) {
-		String key = columnName.toUpperCase();
-		if (baseColumns.containsKey(key)) {
-			primaryKeyColumns.put(key, baseColumns.remove(key));
-		} else if (blobColumns.containsKey(key)) {
-            // in the wierd event that a BLOB is a key column
-            primaryKeyColumns.put(key, blobColumns.remove(key));
+        boolean found = false;
+        // first search base columns
+        Iterator iter = baseColumns.iterator();
+        while (iter.hasNext()) {
+            ColumnDefinition cd = (ColumnDefinition) iter.next();
+            if (cd.getActualColumnName().equals(columnName)) {
+                primaryKeyColumns.add(cd);
+                iter.remove();
+                found = true;
+                break;
+            }
+        }
+        
+        // search blob columns in the wierd event that a blob is the primary key
+        if (!found) {
+            iter = blobColumns.iterator();
+            while (iter.hasNext()) {
+                ColumnDefinition cd = (ColumnDefinition) iter.next();
+                if (cd.getActualColumnName().equals(columnName)) {
+                    primaryKeyColumns.add(cd);
+                    iter.remove();
+                    found = true;
+                    break;
+                }
+            }
         }
     }
 
@@ -92,18 +112,52 @@
         if (columnName == null) {
             return null;
         } else {
-            String key = columnName.toUpperCase();
-            ColumnDefinition cd = (ColumnDefinition) primaryKeyColumns.get(key);
-
-            if (cd == null) {
-                cd = (ColumnDefinition) baseColumns.get(key);
+            // search primary key columns
+            Iterator iter = primaryKeyColumns.iterator();
+            while (iter.hasNext()) {
+                ColumnDefinition cd = (ColumnDefinition) iter.next();
+                if (cd.isColumnNameDelimited()) {
+                    if (cd.getActualColumnName().equals(columnName)) {
+                        return cd;
+                    }
+                } else {
+                    if (cd.getActualColumnName().equalsIgnoreCase(columnName)) {
+                        return cd;
+                    }
+                }
+            }
+            
+            // search base columns
+            iter = baseColumns.iterator();
+            while (iter.hasNext()) {
+                ColumnDefinition cd = (ColumnDefinition) iter.next();
+                if (cd.isColumnNameDelimited()) {
+                    if (cd.getActualColumnName().equals(columnName)) {
+                        return cd;
+                    }
+                } else {
+                    if (cd.getActualColumnName().equalsIgnoreCase(columnName)) {
+                        return cd;
+                    }
+                }
             }
 
-            if (cd == null) {
-                cd = (ColumnDefinition) blobColumns.get(key);
+            // search bblob columns
+            iter = blobColumns.iterator();
+            while (iter.hasNext()) {
+                ColumnDefinition cd = (ColumnDefinition) iter.next();
+                if (cd.isColumnNameDelimited()) {
+                    if (cd.getActualColumnName().equals(columnName)) {
+                        return cd;
+                    }
+                } else {
+                    if (cd.getActualColumnName().equalsIgnoreCase(columnName)) {
+                        return cd;
+                    }
+                }
             }
             
-            return cd;
+            return null;
         }
 	}
     

Modified: ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/DatabaseIntrospector.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/DatabaseIntrospector.java?view=diff&rev=508237&r1=508236&r2=508237
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/DatabaseIntrospector.java (original)
+++ ibatis/trunk/java/mapper/mapper2/tools/abator/core/src/org/apache/ibatis/abator/internal/db/DatabaseIntrospector.java Thu Feb 15 15:43:28 2007
@@ -18,6 +18,7 @@
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -31,6 +32,7 @@
 import org.apache.ibatis.abator.config.AbatorContext;
 import org.apache.ibatis.abator.config.ColumnOverride;
 import org.apache.ibatis.abator.config.GeneratedKey;
+import org.apache.ibatis.abator.config.IgnoredColumn;
 import org.apache.ibatis.abator.config.TableConfiguration;
 import org.apache.ibatis.abator.exception.UnsupportedDataTypeException;
 import org.apache.ibatis.abator.internal.util.JavaBeansUtil;
@@ -57,15 +59,24 @@
         this.warnings = warnings;
     }
 
-    public Collection introspectTables(TableConfiguration tc) throws SQLException {
+    public Collection introspectTables_old(TableConfiguration tc) throws SQLException {
 
         Map introspectedTables = new HashMap();
         
+        boolean delimitIdentifiers = tc.isDelimitIdentifiers()
+            || StringUtility.stringContainsSpace(tc.getCatalog())
+            || StringUtility.stringContainsSpace(tc.getSchema())
+            || StringUtility.stringContainsSpace(tc.getTableName());
+
         String localCatalog;
         String localSchema;
         String localTableName;
-
-        if (databaseMetaData.storesLowerCaseIdentifiers()) {
+        
+        if (delimitIdentifiers) {
+            localCatalog = tc.getCatalog();
+            localSchema = tc.getSchema();
+            localTableName = tc.getTableName();
+        } else if (databaseMetaData.storesLowerCaseIdentifiers()) {
             localCatalog = tc.getCatalog() == null ? null : tc.getCatalog()
                     .toLowerCase();
             localSchema = tc.getSchema() == null ? null : tc.getSchema()
@@ -123,7 +134,7 @@
         while (rs.next()) {
             returnedColumns++;
             
-            ColumnDefinition cd = new ColumnDefinition(tc.getAlias());
+            ColumnDefinition cd = new ColumnDefinition(tc.getAlias(), abatorContext);
 
             cd.setJdbcType(rs.getInt("DATA_TYPE")); //$NON-NLS-1$
             cd.setLength(rs.getInt("COLUMN_SIZE")); //$NON-NLS-1$
@@ -135,7 +146,7 @@
             String tableName = rs.getString("TABLE_NAME"); //$NON-NLS-1$
             String catalog = rs.getString("TABLE_CAT"); //$NON-NLS-1$
             String schema = rs.getString("TABLE_SCHEM"); //$NON-NLS-1$
-
+            
             // we only use the returned catalog and schema if something was actually
             // specified on the table configuration.  If something was returned
             // from the DB for these fields, but nothing was specified on the table
@@ -148,7 +159,9 @@
                     tc.getDomainObjectName(),
                     tc.getAlias(),
                     "true".equalsIgnoreCase((String) tc.getProperties().get("ignoreQualifiersAtRuntime")), //$NON-NLS-1$ //$NON-NLS-2$
-                    (String) tc.getProperties().get("runtimeTableName"));//$NON-NLS-1$
+                    (String) tc.getProperties().get("runtimeTableName"), //$NON-NLS-1$
+                    delimitIdentifiers,
+                    abatorContext);
             
             ColumnOverride columnOverride = tc.getColumnOverride(cd
                     .getActualColumnName());
@@ -173,7 +186,7 @@
                 // if the type is not supported, then we'll report a warning and
                 // ignore the column
                 warnings.add(Messages.getString("Warning.14", //$NON-NLS-1$
-                        table.getFullyQualifiedTableNameAsConfigured(),
+                        table.toString(),
                         cd.getActualColumnName()));
                 continue;
             }
@@ -211,10 +224,10 @@
 
             if (!tc.isColumnIgnored(cd.getActualColumnName())) {
                 IntrospectedTableImpl introspectedTable =
-                    (IntrospectedTableImpl) introspectedTables.get(table.getFullyQualifiedTableNameAsConfigured());
+                    (IntrospectedTableImpl) introspectedTables.get(table);
                 if (introspectedTable == null) {
                     introspectedTable = new IntrospectedTableImpl(tc, new ColumnDefinitions(), table);
-                    introspectedTables.put(table.getFullyQualifiedTableNameAsConfigured(), introspectedTable);
+                    introspectedTables.put(table, introspectedTable);
                 }
                 
                 introspectedTable.getColumnDefinitions().addColumn(cd);
@@ -248,12 +261,12 @@
             
             if (!cds.hasAnyColumns()) {
                 // add warning that the table has no columns, remove from the list
-                warnings.add(Messages.getString("Warning.1", introspectedTable.getTable().getFullyQualifiedTableNameAsConfigured())); //$NON-NLS-1$
+                warnings.add(Messages.getString("Warning.1", introspectedTable.getTable().toString())); //$NON-NLS-1$
                 iter.remove();
             } else if (!cds.hasPrimaryKeyColumns()
                     && !cds.hasBaseColumns()) {
                 // add warning that the table has only BLOB columns, remove from the list
-                warnings.add(Messages.getString("Warning.18", introspectedTable.getTable().getFullyQualifiedTableNameAsConfigured())); //$NON-NLS-1$
+                warnings.add(Messages.getString("Warning.18", introspectedTable.getTable().toString())); //$NON-NLS-1$
                 iter.remove();
             } else {
                 // now make sure that all columns called out in the configuration
@@ -264,7 +277,7 @@
 
         return introspectedTables.values();
     }
-
+    
     private void calculatePrimaryKey(IntrospectedTableImpl introspectedTable) {
         ResultSet rs = null;
 
@@ -321,16 +334,15 @@
         // actually exists in the table
         iter = tableConfiguration.getIgnoredColumnsInError();
         while (iter.hasNext()) {
-            String ignoredColumn = (String) iter.next();
+            IgnoredColumn ignoredColumn = (IgnoredColumn) iter.next();
 
             warnings.add(Messages.getString("Warning.4", //$NON-NLS-1$
-                    ignoredColumn, table.toString()));
+                    ignoredColumn.getColumnName(), table.toString()));
         }
 
         GeneratedKey generatedKey = tableConfiguration.getGeneratedKey();
         if (generatedKey != null
-                && columnDefinitions.getColumn(generatedKey.getColumn()
-                        .toUpperCase()) == null) {
+                && columnDefinitions.getColumn(generatedKey.getColumn()) == null) {
             if (generatedKey.isIdentity()) {
                 warnings.add(Messages.getString("Warning.5", //$NON-NLS-1$
                         generatedKey.getColumn(), table.toString()));
@@ -339,5 +351,329 @@
                         generatedKey.getColumn(), table.toString()));
             }
         }
+    }
+
+
+    /**
+     * Returns a List<IntrospectedTable> that matches the specified table
+     * configuration. 
+     * 
+     * @param tc
+     * @return
+     * @throws SQLException
+     */
+    public List introspectTables(TableConfiguration tc) throws SQLException {
+
+        // get the raw columns from the DB
+        Map columns = getColumns(tc);
+        
+        if (columns.isEmpty()) {
+            warnings.add(Messages.getString("Warning.19", tc.getCatalog(), //$NON-NLS-1$
+                    tc.getSchema(), tc.getTableName()));
+            return null;
+        }
+        
+        removeIgnoredColumns(tc, columns);
+        calculateExtraColumnInformation(tc, columns);
+        applyColumnOverrides(tc, columns);
+        calculateIdentityColumns(tc, columns);
+        
+        List introspectedTables = calculateIntrospectedTables(tc, columns);
+        
+        Iterator iter = introspectedTables.iterator();
+        while (iter.hasNext()) {
+            IntrospectedTableImpl it = (IntrospectedTableImpl) iter.next();
+            calculatePrimaryKey(it);
+        }
+        
+        // now introspectedTables has all the columns from all the 
+        // tables in the configuration.  Do some validation...
+
+        iter = introspectedTables.iterator();
+        while (iter.hasNext()) {
+            IntrospectedTableImpl introspectedTable = (IntrospectedTableImpl) iter.next();
+            
+            ColumnDefinitions cds = introspectedTable.getColumnDefinitions();
+            
+            if (!cds.hasAnyColumns()) {
+                // add warning that the table has no columns, remove from the list
+                warnings.add(Messages.getString("Warning.1", introspectedTable.getTable().toString())); //$NON-NLS-1$
+                iter.remove();
+            } else if (!cds.hasPrimaryKeyColumns()
+                    && !cds.hasBaseColumns()) {
+                // add warning that the table has only BLOB columns, remove from the list
+                warnings.add(Messages.getString("Warning.18", introspectedTable.getTable().toString())); //$NON-NLS-1$
+                iter.remove();
+            } else {
+                // now make sure that all columns called out in the configuration
+                // actually exist
+                reportIntrospectionWarnings(cds, tc, introspectedTable.getTable());
+            }
+        }
+
+        return introspectedTables;
+    }
+
+    /**
+     * @param tc
+     * @param columns
+     */
+    private void removeIgnoredColumns(TableConfiguration tc, Map columns) {
+        Iterator entries = columns.entrySet().iterator();
+        while (entries.hasNext()) {
+            Map.Entry entry = (Map.Entry) entries.next();
+            Iterator tableColumns = ((List) entry.getValue()).iterator();
+            while (tableColumns.hasNext()) {
+                ColumnDefinition cd = (ColumnDefinition) tableColumns.next();
+                if (tc.isColumnIgnored(cd.getActualColumnName())) {
+                    tableColumns.remove();
+                }
+            }
+        }
+    }
+    
+    private void calculateExtraColumnInformation(TableConfiguration tc, Map columns) {
+        Iterator entries = columns.entrySet().iterator();
+        while (entries.hasNext()) {
+            Map.Entry entry = (Map.Entry) entries.next();
+            Iterator tableColumns = ((List) entry.getValue()).iterator();
+            while (tableColumns.hasNext()) {
+                ColumnDefinition cd = (ColumnDefinition) tableColumns.next();
+                
+                if ("true".equalsIgnoreCase((String) tc.getProperties().get("useActualColumnNames"))) { //$NON-NLS-1$ //$NON-NLS-2$
+                    cd.setJavaProperty(JavaBeansUtil.getValidPropertyName(cd
+                            .getActualColumnName()));
+                } else {
+                    cd.setJavaProperty(JavaBeansUtil.getCamelCaseString(cd
+                            .getActualColumnName(), false));
+                }
+                
+                try {
+                    javaTypeResolver.initializeResolvedJavaType(cd);
+                } catch (UnsupportedDataTypeException e) {
+                    // if the type is not supported, then we'll report a warning and
+                    // ignore the column
+                    warnings.add(Messages.getString("Warning.14", //$NON-NLS-1$
+                            entry.getKey().toString(),
+                            cd.getActualColumnName()));
+                    tableColumns.remove();
+                }
+            }
+        }
+    }
+    
+    private void calculateIdentityColumns(TableConfiguration tc, Map columns) {
+        Iterator entries = columns.entrySet().iterator();
+        while (entries.hasNext()) {
+            Map.Entry entry = (Map.Entry) entries.next();
+            Iterator tableColumns = ((List) entry.getValue()).iterator();
+            while (tableColumns.hasNext()) {
+                ColumnDefinition cd = (ColumnDefinition) tableColumns.next();
+                
+                if (tc.getGeneratedKey() != null
+                        && tc.getGeneratedKey().isIdentity()) {
+                    if (cd.isColumnNameDelimited()) {
+                        if (cd.getActualColumnName().equals(tc.getGeneratedKey().getColumn())) {
+                            cd.setIdentity(true);
+                        }
+                    } else {
+                        if (cd.getActualColumnName().equalsIgnoreCase(tc.getGeneratedKey().getColumn())) {
+                            cd.setIdentity(true);
+                        }
+                    }
+                } else {
+                    cd.setIdentity(false);
+                }
+            }
+        }
+    }
+    
+    private void applyColumnOverrides(TableConfiguration tc, Map columns) {
+        Iterator entries = columns.entrySet().iterator();
+        while (entries.hasNext()) {
+            Map.Entry entry = (Map.Entry) entries.next();
+            Iterator tableColumns = ((List) entry.getValue()).iterator();
+            while (tableColumns.hasNext()) {
+                ColumnDefinition cd = (ColumnDefinition) tableColumns.next();
+                
+                ColumnOverride columnOverride = tc.getColumnOverride(cd
+                        .getActualColumnName());
+
+                if (columnOverride != null) {
+                    if (StringUtility.stringHasValue(columnOverride.getJavaProperty())) {
+                        cd.setJavaProperty(columnOverride.getJavaProperty());
+                    }
+
+                    if (StringUtility.stringHasValue(columnOverride.getJavaType())) {
+                        cd.getResolvedJavaType()
+                                .setFullyQualifiedJavaType(
+                                        new FullyQualifiedJavaType(columnOverride
+                                                .getJavaType()));
+                    }
+
+                    if (StringUtility.stringHasValue(columnOverride.getJdbcType())) {
+                        cd.getResolvedJavaType().setJdbcTypeName(
+                                columnOverride.getJdbcType());
+                    }
+
+                    if (StringUtility.stringHasValue(columnOverride.getTypeHandler())) {
+                        cd.setTypeHandler(columnOverride.getTypeHandler());
+                    }
+                    
+                    if (columnOverride.isColumnNameDelimited()) {
+                        cd.setColumnNameDelimited(true);
+                    }
+                }
+            }
+        }
+    }
+    
+    /**
+     * This method returns a Map<ActualTableName, List<ColumnDefinitions>> of columns
+     * returned from the database introspection.
+     * 
+     * @param tc
+     * @return introspected columns
+     * @throws SQLException
+     */
+    private Map getColumns(TableConfiguration tc) throws SQLException {
+        String localCatalog;
+        String localSchema;
+        String localTableName;
+        
+        boolean delimitIdentifiers = tc.isDelimitIdentifiers()
+            || StringUtility.stringContainsSpace(tc.getCatalog())
+            || StringUtility.stringContainsSpace(tc.getSchema())
+            || StringUtility.stringContainsSpace(tc.getTableName());
+
+        if (delimitIdentifiers) {
+            localCatalog = tc.getCatalog();
+            localSchema = tc.getSchema();
+            localTableName = tc.getTableName();
+        } else if (databaseMetaData.storesLowerCaseIdentifiers()) {
+            localCatalog = tc.getCatalog() == null ? null : tc.getCatalog()
+                    .toLowerCase();
+            localSchema = tc.getSchema() == null ? null : tc.getSchema()
+                    .toLowerCase();
+            localTableName = tc.getTableName() == null ? null : tc
+                    .getTableName().toLowerCase();
+        } else if (databaseMetaData.storesUpperCaseIdentifiers()) {
+            localCatalog = tc.getCatalog() == null ? null : tc.getCatalog()
+                    .toUpperCase();
+            localSchema = tc.getSchema() == null ? null : tc.getSchema()
+                    .toUpperCase();
+            localTableName = tc.getTableName() == null ? null : tc
+                    .getTableName().toUpperCase();
+        } else {
+            localCatalog = tc.getCatalog();
+            localSchema = tc.getSchema();
+            localTableName = tc.getTableName();
+        }
+
+        if (tc.isWildcardEscapingEnabled()) {
+            String escapeString = databaseMetaData.getSearchStringEscape();
+            
+            StringBuffer sb = new StringBuffer();
+            StringTokenizer st;
+            if (localSchema != null) {
+                st = new StringTokenizer(localSchema, "_%", true); //$NON-NLS-1$
+                while (st.hasMoreTokens()) {
+                    String token = st.nextToken();
+                    if (token.equals("_") //$NON-NLS-1$
+                            || token.equals("%")) { //$NON-NLS-1$
+                        sb.append(escapeString);
+                    }
+                    sb.append(token);
+                }
+                localSchema = sb.toString();
+            }
+            
+            sb.setLength(0);
+            st = new StringTokenizer(localTableName, "_%", true); //$NON-NLS-1$
+            while (st.hasMoreTokens()) {
+                String token = st.nextToken();
+                if (token.equals("_") //$NON-NLS-1$
+                        || token.equals("%")) { //$NON-NLS-1$
+                    sb.append(escapeString);
+                }
+                sb.append(token);
+            }
+            localTableName = sb.toString();
+        }
+
+        Map answer = new HashMap();
+        
+        ResultSet rs = databaseMetaData.getColumns(localCatalog, localSchema,
+                localTableName, null);
+
+        while (rs.next()) {
+            ColumnDefinition cd = new ColumnDefinition(tc.getAlias(), abatorContext);
+
+            cd.setJdbcType(rs.getInt("DATA_TYPE")); //$NON-NLS-1$
+            cd.setLength(rs.getInt("COLUMN_SIZE")); //$NON-NLS-1$
+            cd.setActualColumnName(rs.getString("COLUMN_NAME")); //$NON-NLS-1$
+            cd.setNullable(rs.getInt("NULLABLE") == DatabaseMetaData.columnNullable); //$NON-NLS-1$
+            cd.setScale(rs.getInt("DECIMAL_DIGITS")); //$NON-NLS-1$
+            cd.setTypeName(rs.getString("TYPE_NAME")); //$NON-NLS-1$
+            
+            ActualTableName atn = new ActualTableName(rs.getString("TABLE_CAT"), //$NON-NLS-1$
+                    rs.getString("TABLE_SCHEM"), //$NON-NLS-1$
+                    rs.getString("TABLE_NAME")); //$NON-NLS-1$
+            
+            List columns = (List) answer.get(atn);
+            if (columns == null) {
+                columns = new ArrayList();
+                answer.put(atn, columns);
+            }
+            
+            columns.add(cd);
+        }
+        
+        closeResultSet(rs);
+        
+        return answer;
+    }
+    
+    private List calculateIntrospectedTables(TableConfiguration tc, Map columns) {
+        boolean delimitIdentifiers = tc.isDelimitIdentifiers()
+            || StringUtility.stringContainsSpace(tc.getCatalog())
+            || StringUtility.stringContainsSpace(tc.getSchema())
+            || StringUtility.stringContainsSpace(tc.getTableName());
+        
+        List answer = new ArrayList();
+        
+        Iterator entries = columns.entrySet().iterator();
+        while (entries.hasNext()) {
+            Map.Entry entry = (Map.Entry) entries.next();
+            
+            ActualTableName atn = (ActualTableName) entry.getKey();
+            
+            // we only use the returned catalog and schema if something was actually
+            // specified on the table configuration.  If something was returned
+            // from the DB for these fields, but nothing was specified on the table
+            // configuration, then some sort of DB default is being returned
+            // and we don't want that in our SQL
+            FullyQualifiedTable table = new FullyQualifiedTable(
+                    StringUtility.stringHasValue(tc.getCatalog()) ? atn.getCatalog() : null,
+                    StringUtility.stringHasValue(tc.getSchema()) ? atn.getSchema() : null,
+                    atn.getTableName(),
+                    tc.getDomainObjectName(),
+                    tc.getAlias(),
+                    "true".equalsIgnoreCase((String) tc.getProperties().get("ignoreQualifiersAtRuntime")), //$NON-NLS-1$ //$NON-NLS-2$
+                    (String) tc.getProperties().get("runtimeTableName"), //$NON-NLS-1$
+                    delimitIdentifiers,
+                    abatorContext);
+
+            ColumnDefinitions cds = new ColumnDefinitions();
+            IntrospectedTableImpl introspectedTable = new IntrospectedTableImpl(tc, cds, table);
+            answer.add(introspectedTable);
+            
+            Iterator tableColumns = ((List) entry.getValue()).iterator();
+            while (tableColumns.hasNext()) {
+                cds.addColumn((ColumnDefinition) tableColumns.next());
+            }
+        }
+        
+        return answer;
     }
 }