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 <table> or <columnOverride> configuration.</p>
+ <p><i>The default value is double quotes (").</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 <table> or <columnOverride> configuration.</p>
+ <p><i>The default value is double quotes (").</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>
- <table schema="HR" tableName="EMPLOYEES" alias="A">
+ <table schema="HR" tableName="EMPLOYEES">
<property name="ignoreQualifiersAtRuntime" value="true" />
<property name="runtimeTableName" value="FRED" />
</table>
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"><table></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"><table></a>,
+ <a href="configreference/abatorContext.html"><abatorContext></a>,
+ and <a href="configreference/columnOverride.html"><columnOverride></a>
+ reference pages for more information.</li>
+ <li>Added SYBASE dialect for generated keys..
+ See the <a href="configreference/generatedKey.html"><generatedKey></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"><table></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;
}
}