You are viewing a plain text version of this content. The canonical link for it is here.
Posted to torque-dev@db.apache.org by tf...@apache.org on 2006/10/25 20:46:45 UTC
svn commit: r467727 - in /db/torque: generator/trunk/
generator/trunk/src/dtd/
generator/trunk/src/java/org/apache/torque/engine/database/model/
generator/trunk/src/java/org/apache/torque/engine/database/transform/
generator/trunk/xdocs/ site/trunk/xdocs/
Author: tfischer
Date: Wed Oct 25 11:46:43 2006
New Revision: 467727
URL: http://svn.apache.org/viewvc?view=rev&rev=467727
Log:
Added support for option tag in database.dtd for usage in custom templates.
Thanks to Greg Monroe for submitting the patch.
Added:
db/torque/generator/trunk/src/dtd/database_3_2.dtd
Modified:
db/torque/generator/trunk/pom.xml
db/torque/generator/trunk/project.xml
db/torque/generator/trunk/src/dtd/database.dtd
db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Column.java
db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Database.java
db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/ForeignKey.java
db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Index.java
db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Table.java
db/torque/generator/trunk/src/java/org/apache/torque/engine/database/transform/DTDResolver.java
db/torque/generator/trunk/src/java/org/apache/torque/engine/database/transform/XmlToAppData.java
db/torque/generator/trunk/xdocs/custom-templates.xml
db/torque/generator/trunk/xdocs/how-templates-work.xml
db/torque/site/trunk/xdocs/changes.xml
Modified: db/torque/generator/trunk/pom.xml
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/pom.xml?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/pom.xml (original)
+++ db/torque/generator/trunk/pom.xml Wed Oct 25 11:46:43 2006
@@ -104,7 +104,7 @@
<filtering>false</filtering>
<directory>src/dtd</directory>
<includes>
- <include>database.dtd</include>
+ <include>database*.dtd</include>
</includes>
</resource>
<resource>
Modified: db/torque/generator/trunk/project.xml
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/project.xml?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/project.xml (original)
+++ db/torque/generator/trunk/project.xml Wed Oct 25 11:46:43 2006
@@ -159,7 +159,7 @@
<filtering>false</filtering>
<directory>${basedir}/src/dtd</directory>
<includes>
- <include>database.dtd</include>
+ <include>database*.dtd</include>
</includes>
</resource>
<resource>
Modified: db/torque/generator/trunk/src/dtd/database.dtd
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/src/dtd/database.dtd?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/src/dtd/database.dtd (original)
+++ db/torque/generator/trunk/src/dtd/database.dtd Wed Oct 25 11:46:43 2006
@@ -51,7 +51,7 @@
to lowercase.
-->
-<!ELEMENT database (external-schema*, domain*, table+)>
+<!ELEMENT database (option*, external-schema*, domain*, table+)>
<!ATTLIST database
name CDATA #REQUIRED
defaultIdMethod (idbroker|native|none) "none"
@@ -63,6 +63,12 @@
heavyIndexing (true|false) "false"
>
+<!ELEMENT option EMPTY>
+<!ATTLIST option
+ key CDATA #REQUIRED
+ value CDATA #REQUIRED
+>
+
<!ELEMENT external-schema EMPTY>
<!ATTLIST external-schema
filename CDATA #REQUIRED
@@ -91,7 +97,7 @@
note: the interface="true", requires that useManagers=true in the
properties file.
-->
-<!ELEMENT table (column+,(foreign-key|index|unique|id-method-parameter)*)>
+<!ELEMENT table (option*,column+,(foreign-key|index|unique|id-method-parameter)*)>
<!ATTLIST table
name CDATA #REQUIRED
javaName CDATA #IMPLIED
@@ -113,7 +119,7 @@
value CDATA #REQUIRED
>
-<!ELEMENT column (inheritance*)>
+<!ELEMENT column (option*, inheritance*)>
<!ATTLIST column
name CDATA #REQUIRED
javaName CDATA #IMPLIED
@@ -148,7 +154,7 @@
extends CDATA #IMPLIED
>
-<!ELEMENT foreign-key (reference+)>
+<!ELEMENT foreign-key (option*,reference+)>
<!ATTLIST foreign-key
foreignTable CDATA #REQUIRED
name CDATA #IMPLIED
@@ -162,7 +168,7 @@
foreign CDATA #REQUIRED
>
-<!ELEMENT index (index-column+)>
+<!ELEMENT index (option*,index-column+)>
<!ATTLIST index
name CDATA #IMPLIED
>
@@ -173,7 +179,7 @@
size CDATA #IMPLIED
>
-<!ELEMENT unique (unique-column+)>
+<!ELEMENT unique (option*,unique-column+)>
<!ATTLIST unique
name CDATA #IMPLIED
>
Added: db/torque/generator/trunk/src/dtd/database_3_2.dtd
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/src/dtd/database_3_2.dtd?view=auto&rev=467727
==============================================================================
--- db/torque/generator/trunk/src/dtd/database_3_2.dtd (added)
+++ db/torque/generator/trunk/src/dtd/database_3_2.dtd Wed Oct 25 11:46:43 2006
@@ -0,0 +1,184 @@
+<!--
+ Copyright 2001-2005 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.
+-->
+<!--
+ Torque XML database schema DTD
+ $Id$
+-->
+
+<!--
+For: database.defaultIdMethod and table.idMethod
+
+Do not use autoincrement or sequence. They are deprecated in favor of
+using native which will use the Connection pool to determine
+which database it is talking to (yes, it knows that) and then use
+whatever native database methodology for insert increments that it can.
+Otherwise, you should use idbroker or none. none is good if you have a
+table that is just a join table. idbroker is good if you want a
+centralized repository for brokering out clumps of id's in a database
+agnostic way.
+-->
+
+<!--
+
+defaultJavaNamingMethod determines how a table or column name,
+from the name attribute in the xml database file, is converted to a
+Java class or method name.
+
+ nochange - indicates not change is performed.
+ underscore - Underscores and dots are removed, first letter is
+ capitalized, first letter after an underscore
+ is capitalized, first letter after a dot is capitalized,
+ the rest of the letters are converted to lowercase.
+ underscoreOmitSchema - The section of the name before and including
+ the last dot in the name is removed. For the remaining part,
+ underscores are removed, first letter is capitalized,
+ first letter after an underscore is capitalized,
+ the rest of the letters are converted to lowercase.
+ javaname - same as underscore, but no letters are converted
+ to lowercase.
+-->
+
+<!ELEMENT database (external-schema*, domain*, table+)>
+<!ATTLIST database
+ name CDATA #REQUIRED
+ defaultIdMethod (idbroker|native|none) "none"
+ defaultJavaType (object|primitive) "primitive"
+ package CDATA #IMPLIED
+ baseClass CDATA #IMPLIED
+ basePeer CDATA #IMPLIED
+ defaultJavaNamingMethod (nochange|underscore|underscoreOmitSchema|javaname) "underscore"
+ heavyIndexing (true|false) "false"
+>
+
+<!ELEMENT external-schema EMPTY>
+<!ATTLIST external-schema
+ filename CDATA #REQUIRED
+>
+
+<!ELEMENT domain EMPTY>
+<!ATTLIST domain
+ name CDATA #REQUIRED
+ type
+ (
+ BIT | TINYINT | SMALLINT | INTEGER | BIGINT | FLOAT
+ | REAL | NUMERIC | DECIMAL | CHAR | VARCHAR | LONGVARCHAR
+ | DATE | TIME | TIMESTAMP | BINARY | VARBINARY | LONGVARBINARY
+ | NULL | OTHER | JAVA_OBJECT | DISTINCT | STRUCT | ARRAY
+ | BLOB | CLOB | REF | BOOLEANINT | BOOLEANCHAR
+ | DOUBLE
+ ) "VARCHAR"
+ size CDATA #IMPLIED
+ scale CDATA #IMPLIED
+ default CDATA #IMPLIED
+ description CDATA #IMPLIED
+>
+
+
+<!--
+ note: the interface="true", requires that useManagers=true in the
+ properties file.
+-->
+<!ELEMENT table (column+,(foreign-key|index|unique|id-method-parameter)*)>
+<!ATTLIST table
+ name CDATA #REQUIRED
+ javaName CDATA #IMPLIED
+ idMethod (idbroker|native|none|null) "null"
+ skipSql (true|false) "false"
+ abstract (true|false) "false"
+ baseClass CDATA #IMPLIED
+ basePeer CDATA #IMPLIED
+ alias CDATA #IMPLIED
+ interface CDATA #IMPLIED
+ javaNamingMethod (nochange|underscore|underscoreOmitSchema|javaname) #IMPLIED
+ heavyIndexing (true|false) #IMPLIED
+ description CDATA #IMPLIED
+>
+
+<!ELEMENT id-method-parameter EMPTY>
+<!ATTLIST id-method-parameter
+ name CDATA "default"
+ value CDATA #REQUIRED
+>
+
+<!ELEMENT column (inheritance*)>
+<!ATTLIST column
+ name CDATA #REQUIRED
+ javaName CDATA #IMPLIED
+ primaryKey (true|false) "false"
+ required (true|false) "false"
+ protected (true|false) "false"
+ domain CDATA #IMPLIED
+ type
+ (
+ BIT | TINYINT | SMALLINT | INTEGER | BIGINT | FLOAT
+ | REAL | NUMERIC | DECIMAL | CHAR | VARCHAR | LONGVARCHAR
+ | DATE | TIME | TIMESTAMP | BINARY | VARBINARY | LONGVARBINARY
+ | NULL | OTHER | JAVA_OBJECT | DISTINCT | STRUCT | ARRAY
+ | BLOB | CLOB | REF | BOOLEANINT | BOOLEANCHAR
+ | DOUBLE
+ ) #IMPLIED
+ javaType (object|primitive) #IMPLIED
+ size CDATA #IMPLIED
+ scale CDATA #IMPLIED
+ default CDATA #IMPLIED
+ autoIncrement (true|false) #IMPLIED
+ inheritance (single|false) "false"
+ inputValidator CDATA #IMPLIED
+ javaNamingMethod (nochange|underscore|javaname) #IMPLIED
+ description CDATA #IMPLIED
+>
+
+<!ELEMENT inheritance EMPTY>
+<!ATTLIST inheritance
+ key CDATA #REQUIRED
+ class CDATA #REQUIRED
+ extends CDATA #IMPLIED
+>
+
+<!ELEMENT foreign-key (reference+)>
+<!ATTLIST foreign-key
+ foreignTable CDATA #REQUIRED
+ name CDATA #IMPLIED
+ onUpdate (cascade|setnull|restrict|none) "none"
+ onDelete (cascade|setnull|restrict|none) "none"
+>
+
+<!ELEMENT reference EMPTY>
+<!ATTLIST reference
+ local CDATA #REQUIRED
+ foreign CDATA #REQUIRED
+>
+
+<!ELEMENT index (index-column+)>
+<!ATTLIST index
+ name CDATA #IMPLIED
+>
+
+<!ELEMENT index-column EMPTY>
+<!ATTLIST index-column
+ name CDATA #REQUIRED
+ size CDATA #IMPLIED
+>
+
+<!ELEMENT unique (unique-column+)>
+<!ATTLIST unique
+ name CDATA #IMPLIED
+>
+
+<!ELEMENT unique-column EMPTY>
+<!ATTLIST unique-column
+ name CDATA #REQUIRED
+>
Modified: db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Column.java
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Column.java?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Column.java (original)
+++ db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Column.java Wed Oct 25 11:46:43 2006
@@ -17,9 +17,12 @@
*/
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections.map.ListOrderedMap;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -37,6 +40,7 @@
* @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a>
* @author <a href="mailto:byron_foster@byron_foster@yahoo.com>Byron Foster</a>
* @author <a href="mailto:mpoeschl@marmot.at>Martin Poeschl</a>
+ * @author <a href="mailto:monroe@dukece.com>Greg Monroe</a>
* @version $Id$
*/
public class Column
@@ -73,6 +77,7 @@
/** class name to do input validation on this column */
private String inputValidator = null;
+ private Map options;
/**
* Creates a new instance with a <code>null</code> name.
@@ -90,6 +95,7 @@
public Column(String name)
{
this.name = name;
+ options = Collections.synchronizedMap(new ListOrderedMap());
}
/**
@@ -744,30 +750,30 @@
* If size attribute is an integer number, it will be returned.
* If size attribute is of the format "Precision,Scale", then Precision
* will be returned.
- * If size is null or the size value is not an valid integer,
+ * If size is null or the size value is not an valid integer,
* null is returned.
* <p>
* Note: Unparseable values will be logged as a warning.
- *
- * @return The precision portion of the size attribute.
+ *
+ * @return The precision portion of the size attribute.
*/
public String getPrecision()
{
String size = getSize();
- if (size == null)
+ if ( size == null )
{
return size;
}
int cLoc = size.indexOf(',');
- if (cLoc > 0)
+ if ( cLoc > 0 )
{
size = size.substring(0, cLoc);
}
- try
+ try
{
Integer.parseInt(size);
- }
- catch (NumberFormatException e)
+ }
+ catch ( NumberFormatException e )
{
log.warn("getPrecision(): Size attribute found ("
+ getSize()
@@ -778,43 +784,43 @@
}
/**
- * Try to determine the scale of the field from the scale and size
+ * Try to determine the scale of the field from the scale and size
* attribute.
* If scale attribute is an integer number, it will be returned.
* If size attribute is of the format "Precision,Scale", then Scale
* will be returned.
- * If scale and size attributes are null or the scale value found
+ * If scale and size attributes are null or the scale value found
* is not an valid integer, a null value is returned.
* <p>
* Note: Unparseable values will be logged as a warning.
- *
- * @return The precision portion of the size attribute.
+ *
+ * @return The precision portion of the size attribute.
*/
public String getScale()
{
String scale = domain.getScale();
// Check for scale on size attribute if no scale attribute
- if (scale == null)
+ if ( scale == null )
{
scale = getSize();
- if (scale == null) // No scale or size attribute set.
+ if ( scale == null ) // No scale or size attribute set.
{
return scale;
}
int cLoc = scale.indexOf(',');
- if (cLoc < 0) // Size did not have "P,S" format
+ if ( cLoc < 0 ) // Size did not have "P,S" format
{
return null;
}
- scale = scale.substring(cLoc + 1);
+ scale = scale.substring(cLoc + 1 );
}
// Validate that scale string found is integer.
- try
+ try
{
Integer.parseInt(scale);
}
- catch (NumberFormatException e)
+ catch ( NumberFormatException e )
{
log.warn("getScale(): Scale (or size=\"p,s\") attribute found ("
+ scale
@@ -1173,11 +1179,49 @@
/**
* Get the value of the inheritance attribute defined in the schema XML.
- *
+ *
* @return Returns the inheritanceType.
*/
public String getInheritanceType()
{
return inheritanceType;
+ }
+
+ /**
+ * Add an XML Specified option key/value pair to this element's option set.
+ *
+ * @param key the key of the option.
+ * @param value the value of the option.
+ */
+ public void addOption(String key, String value)
+ {
+ options.put( key, value );
+ }
+
+ /**
+ * Get the value that was associated with this key in an XML option
+ * element.
+ *
+ * @param key the key of the option.
+ * @return The value for the key or a null.
+ */
+ public String getOption(String key)
+ {
+ return (String) options.get(key);
+ }
+
+ /**
+ * Gets the full ordered hashtable array of items specified by XML option
+ * statements under this element.<p>
+ *
+ * Note, this is not thread save but since it's only used for
+ * generation which is single threaded, there should be minimum
+ * danger using this in Velocity.
+ *
+ * @return An Map of all options. Will not be null but may be empty.
+ */
+ public Map getOptions()
+ {
+ return options;
}
}
Modified: db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Database.java
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Database.java?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Database.java (original)
+++ db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Database.java Wed Oct 25 11:46:43 2006
@@ -17,12 +17,14 @@
*/
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import org.apache.commons.collections.map.ListOrderedMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.torque.engine.EngineException;
@@ -40,6 +42,7 @@
* @author <a href="mailto:mpoeschl@marmot.at>Martin Poeschl</a>
* @author <a href="mailto:dlr@collab.net>Daniel Rall</a>
* @author <a href="mailto:byron_foster@byron_foster@yahoo.com>Byron Foster</a>
+ * @author <a href="mailto:monroe@dukece.com>Greg Monroe</a>
* @version $Id$
*/
public class Database
@@ -63,6 +66,8 @@
private boolean heavyIndexing;
/** the name of the definition file */
private String fileName;
+ private Map options = Collections.synchronizedMap(new ListOrderedMap());
+
/**
* Creates a new instance for the specified database type.
@@ -560,5 +565,43 @@
result.append("</database>");
return result.toString();
+ }
+
+ /**
+ * Add an XML Specified option key/value pair to this element's option set.
+ *
+ * @param key the key of the option.
+ * @param value the value of the option.
+ */
+ public void addOption(String key, String value)
+ {
+ options.put( key, value );
+ }
+
+ /**
+ * Get the value that was associated with this key in an XML option
+ * element.
+ *
+ * @param key the key of the option.
+ * @return The value for the key or a null.
+ */
+ public String getOption( String key )
+ {
+ return (String) options.get(key);
+ }
+
+ /**
+ * Gets the full ordered hashtable array of items specified by XML option
+ * statements under this element.<p>
+ *
+ * Note, this is not thread save but since it's only used for
+ * generation which is single threaded, there should be minimum
+ * danger using this in Velocity.
+ *
+ * @return An Map of all options. Will not be null but may be empty.
+ */
+ public Map getOptions()
+ {
+ return options;
}
}
Modified: db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/ForeignKey.java
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/ForeignKey.java?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/ForeignKey.java (original)
+++ db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/ForeignKey.java Wed Oct 25 11:46:43 2006
@@ -17,8 +17,12 @@
*/
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections.map.ListOrderedMap;
import org.xml.sax.Attributes;
/**
@@ -26,6 +30,7 @@
*
* @author <a href="mailto:fedor.karpelevitch@home.com">Fedor</a>
* @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a>
+ * @author <a href="mailto:monroe@dukece.com>Greg Monroe</a>
* @version $Id$
*/
public class ForeignKey
@@ -37,6 +42,8 @@
private Table parentTable;
private List localColumns = new ArrayList(3);
private List foreignColumns = new ArrayList(3);
+ private Map options = Collections.synchronizedMap(new ListOrderedMap());
+
// the uppercase equivalent of the onDelete/onUpdate values in the dtd
private static final String NONE = "NONE";
@@ -331,4 +338,43 @@
result.append(" </foreign-key>\n");
return result.toString();
}
+
+ /**
+ * Add an XML Specified option key/value pair to this element's option set.
+ *
+ * @param key the key of the option.
+ * @param value the value of the option.
+ */
+ public void addOption(String key, String value)
+ {
+ options.put( key, value );
+ }
+
+ /**
+ * Get the value that was associated with this key in an XML option
+ * element.
+ *
+ * @param key the key of the option.
+ * @return The value for the key or a null.
+ */
+ public String getOption( String key )
+ {
+ return (String) options.get(key);
+ }
+
+ /**
+ * Gets the full ordered hashtable array of items specified by XML option
+ * statements under this element.<p>
+ *
+ * Note, this is not thread save but since it's only used for
+ * generation which is single threaded, there should be minimum
+ * danger using this in Velocity.
+ *
+ * @return An Map of all options. Will not be null but may be empty.
+ */
+ public Map getOptions()
+ {
+ return options;
+ }
+
}
Modified: db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Index.java
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Index.java?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Index.java (original)
+++ db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Index.java Wed Oct 25 11:46:43 2006
@@ -17,9 +17,12 @@
*/
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections.map.ListOrderedMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -32,6 +35,7 @@
*
* @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
* @author <a href="mailto:dlr@finemaltcoding.com>Daniel Rall</a>
+ * @author <a href="mailto:monroe@dukece.com>Greg Monroe</a>
* @version $Id$
*/
public class Index
@@ -44,6 +48,9 @@
private Table parentTable;
/** columns */
private List indexColumns;
+ /** The XML Options specified for this index */
+ private Map options;
+
/**
* Creates a new instance with default characteristics (no name or
@@ -52,6 +59,7 @@
public Index()
{
indexColumns = new ArrayList(3);
+ options = Collections.synchronizedMap(new ListOrderedMap());
}
/**
@@ -230,4 +238,43 @@
result.append(" </index>\n");
return result.toString();
}
+
+ /**
+ * Add an XML Specified option key/value pair to this element's option set.
+ *
+ * @param key the key of the option.
+ * @param value the value of the option.
+ */
+ public void addOption(String key, String value)
+ {
+ options.put( key, value );
+ }
+
+ /**
+ * Get the value that was associated with this key in an XML option
+ * element.
+ *
+ * @param key the key of the option.
+ * @return The value for the key or a null.
+ */
+ public String getOption( String key )
+ {
+ return (String) options.get(key);
+ }
+
+ /**
+ * Gets the full ordered hashtable array of items specified by XML option
+ * statements under this element.<p>
+ *
+ * Note, this is not thread save but since it's only used for
+ * generation which is single threaded, there should be minimum
+ * danger using this in Velocity.
+ *
+ * @return An Map of all options. Will not be null but may be empty.
+ */
+ public Map getOptions()
+ {
+ return options;
+ }
+
}
Modified: db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Table.java
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Table.java?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Table.java (original)
+++ db/torque/generator/trunk/src/java/org/apache/torque/engine/database/model/Table.java Wed Oct 25 11:46:43 2006
@@ -17,10 +17,12 @@
*/
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
-
+import java.util.Map;
+import org.apache.commons.collections.map.ListOrderedMap;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
@@ -39,6 +41,7 @@
* @author <a href="mailto:jmcnally@collab.net>John McNally</a>
* @author <a href="mailto:dlr@collab.net>Daniel Rall</a>
* @author <a href="mailto:byron_foster@byron_foster@yahoo.com>Byron Foster</a>
+ * @author <a href="mailto:monroe@dukece.com>Greg Monroe</a>
* @version $Id$
*/
public class Table implements IDMethod
@@ -74,7 +77,7 @@
private boolean needsTransactionInPostgres;
private boolean heavyIndexing;
private boolean forReferenceOnly;
-
+ private Map options;
/**
* Default Constructor
@@ -98,6 +101,7 @@
unices = new ArrayList(5);
columnsByName = new Hashtable();
columnsByJavaName = new Hashtable();
+ options = Collections.synchronizedMap(new ListOrderedMap());
}
/**
@@ -262,7 +266,7 @@
* @return unique name for constraint
* @throws EngineException
*/
- private String acquireConstraintName(String nameType, int nbr)
+ private final String acquireConstraintName(String nameType, int nbr)
throws EngineException
{
List inputs = new ArrayList(4);
@@ -1145,10 +1149,48 @@
public void setCorrectGetters(Boolean value)
{
boolean correctGetters = value != null && value.booleanValue();
- for (Iterator it = columnList.iterator(); it.hasNext();)
+ for (Iterator it = columnList.iterator(); it.hasNext(); )
{
Column col = (Column) it.next();
col.setCorrectGetters(correctGetters);
}
+ }
+
+ /**
+ * Add an XML Specified option key/value pair to this element's option set.
+ *
+ * @param key the key of the option.
+ * @param value the value of the option.
+ */
+ public void addOption(String key, String value)
+ {
+ options.put( key, value );
+ }
+
+ /**
+ * Get the value that was associated with this key in an XML option
+ * element.
+ *
+ * @param key the key of the option.
+ * @return The value for the key or a null.
+ */
+ public String getOption( String key )
+ {
+ return (String) options.get(key);
+ }
+
+ /**
+ * Gets the full ordered hashtable array of items specified by XML option
+ * statements under this element.<p>
+ *
+ * Note, this is not thread save but since it's only used for
+ * generation which is single threaded, there should be minimum
+ * danger using this in Velocity.
+ *
+ * @return An Map of all options. Will not be null but may be empty.
+ */
+ public Map getOptions()
+ {
+ return options;
}
}
Modified: db/torque/generator/trunk/src/java/org/apache/torque/engine/database/transform/DTDResolver.java
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/src/java/org/apache/torque/engine/database/transform/DTDResolver.java?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/src/java/org/apache/torque/engine/database/transform/DTDResolver.java (original)
+++ db/torque/generator/trunk/src/java/org/apache/torque/engine/database/transform/DTDResolver.java Wed Oct 25 11:46:43 2006
@@ -37,10 +37,11 @@
{
/** Where the DTD is located on the web. */
public static final String WEB_SITE_DTD
- = "http://db.apache.org/torque/dtd/database_3_2.dtd";
+ = "http://db.apache.org/torque/dtd/database_3_2_1.dtd";
- /** InputSource for <code>database.dtd</code>. */
- private InputSource databaseDTD = null;
+ /** Where the 3.2 DTD is located on the web. */
+ public static final String WEB_SITE_DTD_3_2
+ = "http://db.apache.org/torque/dtd/database_3_2.dtd";
/** Logging class from commons.logging */
private static Log log = LogFactory.getLog(DTDResolver.class);
@@ -51,27 +52,6 @@
public DTDResolver()
throws SAXException
{
- try
- {
- InputStream dtdStream
- = getClass().getResourceAsStream("database.dtd");
-
- // getResource was buggy on many systems including Linux,
- // OSX, and some versions of windows in jdk1.3.
- // getResourceAsStream works on linux, maybe others?
- if (dtdStream != null)
- {
- databaseDTD = new InputSource(dtdStream);
- }
- else
- {
- log.warn("Could not locate database.dtd");
- }
- }
- catch (Exception ex)
- {
- throw new SAXException("Could not get stream for database.dtd", ex);
- }
}
/**
@@ -87,20 +67,61 @@
* <code>database.dtd</code> file in the generator jar, or null.
*/
public InputSource resolveEntity(String publicId, String systemId)
- throws IOException
+ throws IOException, SAXException
{
- if (databaseDTD != null && WEB_SITE_DTD.equals(systemId))
+ if (WEB_SITE_DTD.equals(systemId))
{
- String pkg = getClass().getName().substring(0,
- getClass().getName().lastIndexOf('.'));
- log.info("Resolver: used database.dtd from '"
- + pkg + "' package");
- return databaseDTD;
+ return readFromClasspath("database.dtd");
+ }
+ else if (WEB_SITE_DTD_3_2.equals(systemId))
+ {
+ return readFromClasspath("database_3_2.dtd");
}
else
{
log.info("Resolver: used default behaviour");
return null;
+ }
+ }
+
+ /**
+ * reads the resource with the given name from the classpath.
+ *
+ * @param resourceName the name of the resource to read
+ * @return an Inputsource witht the content of the resource.
+ *
+ * @throws SAXException if the resource cannot be read.
+ */
+ private InputSource readFromClasspath(String resourceName)
+ throws SAXException
+ {
+ try
+ {
+ InputStream dtdStream
+ = getClass().getResourceAsStream(resourceName);
+
+ // getResource was buggy on many systems including Linux,
+ // OSX, and some versions of windows in jdk1.3.
+ // getResourceAsStream works on linux, maybe others?
+ if (dtdStream != null)
+ {
+ String pkg = getClass().getName().substring(0,
+ getClass().getName().lastIndexOf('.'));
+ log.info("Resolver: used " + resourceName + " from '"
+ + pkg + "' package");
+ return new InputSource(dtdStream);
+ }
+ else
+ {
+ log.warn("Could not locate database.dtd");
+ return null;
+ }
+ }
+ catch (Exception ex)
+ {
+ throw new SAXException(
+ "Could not get stream for " + resourceName,
+ ex);
}
}
}
Modified: db/torque/generator/trunk/src/java/org/apache/torque/engine/database/transform/XmlToAppData.java
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/src/java/org/apache/torque/engine/database/transform/XmlToAppData.java?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/src/java/org/apache/torque/engine/database/transform/XmlToAppData.java (original)
+++ db/torque/generator/trunk/src/java/org/apache/torque/engine/database/transform/XmlToAppData.java Wed Oct 25 11:46:43 2006
@@ -51,6 +51,7 @@
* @author <a href="mailto:mpoeschl@marmot.at">Martin Poeschl</a>
* @author <a href="mailto:dlr@collab.net">Daniel Rall</a>
* @author <a href="mailto:fischer@seitenbau.de">Thomas Fischer</a>
+ * @author <a href="mailto:monroe@dukece.com>Greg Monroe</a>
* @version $Id$
*/
public class XmlToAppData extends DefaultHandler
@@ -315,6 +316,10 @@
{
currTable.addIdMethodParameter(attributes);
}
+ else if ( rawName.equals("option"))
+ {
+ setOption(attributes);
+ }
}
catch (Exception e)
{
@@ -332,11 +337,74 @@
* qualified names are not available.
*/
public void endElement(String uri, String localName, String rawName)
+ throws SAXException
{
if (log.isDebugEnabled())
{
log.debug("endElement(" + uri + ", " + localName + ", "
+ rawName + ") called");
+ }
+ try
+ {
+ // Reset working objects to null to allow option to know
+ // which element it is associated with.
+ if (rawName.equals("table"))
+ {
+ currTable = null;
+ }
+ else if (rawName.equals("column"))
+ {
+ currColumn = null;
+ }
+ else if (rawName.equals("foreign-key"))
+ {
+ currFK = null;
+ }
+ else if (rawName.equals("index"))
+ {
+ currIndex = null;
+ }
+ else if (rawName.equals("unique"))
+ {
+ currUnique = null;
+ }
+ }
+ catch (Exception e)
+ {
+ throw new SAXException(e);
+ }
+ }
+
+ public void setOption( Attributes attributes )
+ {
+ // Look thru supported model elements in reverse order to
+ // find one that this option statement applies to.
+
+ String key = attributes.getValue("key");
+ String value = attributes.getValue("value");
+ if ( currUnique != null )
+ {
+ currUnique.addOption(key, value);
+ }
+ else if ( currIndex != null )
+ {
+ currIndex.addOption(key, value);
+ }
+ else if ( currFK != null )
+ {
+ currFK.addOption(key, value);
+ }
+ else if ( currColumn != null )
+ {
+ currColumn.addOption(key, value);
+ }
+ else if ( currTable != null )
+ {
+ currTable.addOption(key, value);
+ }
+ else
+ { // Must be a db level option.
+ database.addOption(key, value);
}
}
Modified: db/torque/generator/trunk/xdocs/custom-templates.xml
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/xdocs/custom-templates.xml?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/xdocs/custom-templates.xml (original)
+++ db/torque/generator/trunk/xdocs/custom-templates.xml Wed Oct 25 11:46:43 2006
@@ -93,8 +93,9 @@
that is packaged as an add-on.
</p>
<p>
- This page shows how to set up and use add-ons, and how to
- create own custom templates.
+ This document shows how to set up your Torque project to use overrides,
+ general information on how to install packaged add-ons, and how to get
+ started in creating custom templates.
<!--
Provide guidelines on how to package a general add-on for submission to
the Torque site. -->
@@ -172,7 +173,7 @@
<p>
If you want to modify the generated sql files or java classes,
first look at the overview
- <a href="how-templates-work.html">"how templates work"</a> if you are not
+ <a href="how-templates-work.html">"How Templates Work"</a> if you are not
familiar with the way Torque uses velocity templates.
After doing that, proceed as follows:
</p>
Modified: db/torque/generator/trunk/xdocs/how-templates-work.xml
URL: http://svn.apache.org/viewvc/db/torque/generator/trunk/xdocs/how-templates-work.xml?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/generator/trunk/xdocs/how-templates-work.xml (original)
+++ db/torque/generator/trunk/xdocs/how-templates-work.xml Wed Oct 25 11:46:43 2006
@@ -22,46 +22,121 @@
</properties>
<body>
+
+ <section name="How Templates Work">
+ <p>
+ <b>Table of Contents</b>
+ </p>
+ <p>
+ <ol>
+ <li>
+ <a href="#Introduction">Introduction</a>
+ </li>
+ <li>
+ <a href="#Process Overview">
+ Process Overview
+ </a>
+ </li>
+ <li>
+ <a href="#Template Files">
+ Template Files
+ </a>
+ </li>
+ <li>
+ <a href="#Template Variables">
+ Template Variables
+ </a>
+ </li>
+ <li>
+ <a href="#The XML Custom Option Element">
+ The XML Custom Option Element
+ </a>
+ </li>
+ </ol>
+ </p>
+ </section>
- <section name="How Templates work">
+ <section name="Introduction">
<p>
This section explains how the generator works internally. If you
- are happy with the generator as it is, you need not read this section.
- </p>
+ are happy with the generator as it is, you need not read this section.
+ It is not intended to be a tutorial, but rather a overview framework
+ that points people interested in enhancing or creating custom
+ templates to the resources needed to work with Torque templates.
+ </p>
+ <p>
+ Once you understand the Template internals, see the
+ <a href="custom-templates.html">Custom Templates</a> document for
+ information on how to use it.
+ </p>
+
</section>
- <section name="Location of Templates">
+
+ <section name="Process Overview">
+ <p>
+ The Torque Generator is designed to do many different tasks. (see
+ the <a href="tasks-reference.html">Tasks Reference</a> documentation).
+ These tasks generate text based output like: Java code; SQL
+ scripts; etc. Many of these outputs specific to the database type
+ specified in the generation setting.
+ </p>
<p>
- Before starting to do any modifications, you should understand the main
- "driver" for the Torque generator tasks is the
- <a href="http://jakarta.apache.org/velocity">Velocity</a> Java-based
- template engine. All the tasks make use of Velocity template files. You
- should become familiar with the Velocity template syntax by reviewing the
+ The Generator tasks are based on a Java based template engine
+ called <a href="http://jakarta.apache.org/velocity">Velocity</a> (in
+ particular, the Texen component). The Velocity engine uses
+ a set of task specific template files written in the
+ Velocity Template Language (VTL), the XML schema info, and
+ project build properties to produce the required output.
+ </p>
+ <p>
+ To understand how the Torque template files work, you should become
+ familiar with the VTL syntax by reviewing the
<a href="http://jakarta.apache.org/velocity/docs/user-guide.html">Velocity
- user guide</a>.
+ user guide</a>.
</p>
+ </section>
+
+ <section name="Template Files">
<p>
- The Torque template files are packaged in the
- torque-gen-templates<version>.jar in the lib directory of the binary
- distribution. This contains serveral different directories with templates
- under them. Each of these directories is related to a Torque Task.
- </p>
- <p>
- To learn which directories apply to which generator task, you need to
- identify the Control.vm template associated with that task.
- The Control.vm is the main Velocity controller that calls all of the
- task related template files as required. Matching Control.vm file to
- a task can be done in various ways. You can look at the settings of the
- torque.template.* properties in the default.properties file
- (in the root of the binary distribution). Alternatively, you can look
- at the Torque task definitions in the build-torque.xml Ant build file.
+ The Torque template files are plain text VTL files with the extention of
+ ".vm". These files are packaged in the
+ torque-gen-templates<version>.jar in the lib directory of the
+ binary distribution. This jar file can be unpacked to access this files.
+ Or alternatively, you can find them under the torque/templates/src
+ directory in the source distribution or SVN repository.
+ </p>
+ <p>
+ The template files are organized under a main directory called
+ templates which has five or so different directory branches under it.
+ Each of these branches is roughly related to a Torque Task.
+ To learn which directories and templates apply to which Generator task,
+ you need to identify the Control.vm template associated
+ with that task. The Control.vm files are the main entry points for
+ all tasks.
+ </p>
+ <p>
+ The easiest way to find a task's Control.vm file is to use the
+ default.properties file (located in the root directory of the binary
+ distribution). Search thru this file for properties
+ that start with "torque.templates." The ending part of the property
+ key is generally the task name and the value is the associated Control.vm
+ file. E.g. the property, "torque.template.sql = sql/base/Control.vm",
+ means the sql task Control file is the templates/sql/base/Control.vm file
+ in the template jar.
+ </p>
+ <p>
+ These Control.vm files can be examined to understand the overall flow
+ of a task's process and to find the main template files that will
+ be parsed to produce various parts of the output. Note that in some
+ cases, the parsed template files may call other templates.
</p>
</section>
- <section name="Template variables">
+ <section name="Template Variables">
<p>
- Once you start looking at the code in the templates, you'll wonder where
- all the Velocity variables are getting set. Well, there are two places
- these come from.
+ Once you start looking at the VTL code in the templates, you'll wonder
+ where all the Velocity variables are getting set. Well, there are two
+ places these come from.
</p>
<p>
First, all the torque.* build properties defined in the
@@ -77,6 +152,36 @@
In Velocity, any object property (e.g. getProp), can be referred to by
$objectVar.prop. In addition, any methods in this object can also be
called by referring to them as $objectVar.getSomething( parm, parm ).
+ </p>
+ </section>
+
+ <section name="The XML Custom Option Element">
+ <p>
+ With the release of Version 3.2.1, the XML DTD supports an
+ <option key="key" value="value"> element
+ intended for use by custom templates. Zero or more of these elements
+ can be nested (as the first item) inside the dataset, table, column,
+ foreign-key, index, and unique schema elements. For example:
+ </p>
+ <p>
+ <ul>
+ <table ....>
+ <option key="mysql-table-type" value="INNOB"/>
+ ....
+ </table>
+ </ul>
+ </p>
+ <p>
+ These key/value attributes will then populate the options map in the
+ associated database model class. Custom templates can access these
+ values with code like:
+ </p>
+ <p>
+ <ul>
+ #if ( {table.getOption("mysql-table-type")})
+ ${table.getOption("mysql-table-type")}
+ #end
+ </ul>
</p>
</section>
</body>
Modified: db/torque/site/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/db/torque/site/trunk/xdocs/changes.xml?view=diff&rev=467727&r1=467726&r2=467727
==============================================================================
--- db/torque/site/trunk/xdocs/changes.xml (original)
+++ db/torque/site/trunk/xdocs/changes.xml Wed Oct 25 11:46:43 2006
@@ -29,6 +29,10 @@
<release version="3.2.1-dev" date="in SVN">
+ <action type="add" dev="tfischer" issue="TORQUE-27" due-to="Greg Monroe">
+ Added support for option tags for most elements in the database.xml
+ for usage with custom templates.
+ </action>
<action type="fix" dev="tfischer" issue="TORQUE-10">
Limit and Offset work now correctly if applied to joined
tables which contain the same column name in oracle.
---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org