[#3860] Allow to specify defaults for all regular expression flags in the code generation configuration. Add CASE_INSENSITIVE to defaults

This commit is contained in:
Lukas Eder 2014-12-17 16:29:23 +01:00
parent 7aa41ef8bf
commit 0d0fef9b11
7 changed files with 814 additions and 19 deletions

View File

@ -319,6 +319,9 @@ public class GenerationTool {
database.setConfiguredEnumTypes(d.getEnumTypes());
database.setConfiguredForcedTypes(d.getForcedTypes());
if (d.getRegexFlags() != null)
database.setRegexFlags(d.getRegexFlags());
SchemaVersionProvider svp = null;
if (!StringUtils.isBlank(d.getSchemaVersionProvider())) {

View File

@ -48,7 +48,7 @@
<schemaDirectory>src/main/resources/xsd</schemaDirectory>
<bindingDirectory>src/main/resources/xjb/codegen</bindingDirectory>
<schemaIncludes>
<include>jooq-codegen-3.5.0.xsd</include>
<include>jooq-codegen-3.6.0.xsd</include>
</schemaIncludes>
<generatePackage>org.jooq.util.jaxb</generatePackage>
<args>

View File

@ -80,6 +80,7 @@ import org.jooq.tools.csv.CSVReader;
import org.jooq.util.jaxb.CustomType;
import org.jooq.util.jaxb.EnumType;
import org.jooq.util.jaxb.ForcedType;
import org.jooq.util.jaxb.RegexFlag;
import org.jooq.util.jaxb.Schema;
// ...
@ -100,6 +101,7 @@ public abstract class AbstractDatabase implements Database {
private SQLDialect dialect;
private Connection connection;
private DSLContext create;
private List<RegexFlag> regexFlags;
private List<Filter> filters;
private String[] excludes;
private String[] includes;
@ -149,13 +151,13 @@ public abstract class AbstractDatabase implements Database {
private transient Map<SchemaDefinition, List<RoutineDefinition>> routinesBySchema;
private transient Map<SchemaDefinition, List<PackageDefinition>> packagesBySchema;
private static Map<String, Pattern> patterns;
// Other caches
private final Map<Table<?>, Boolean> exists;
private final Map<String, Pattern> patterns;
protected AbstractDatabase() {
exists = new HashMap<Table<?>, Boolean>();
patterns = new HashMap<String, Pattern>();
filters = new ArrayList<Database.Filter>();
}
@ -227,13 +229,36 @@ public abstract class AbstractDatabase implements Database {
return result;
}
final static Pattern pattern(String regex) {
if (patterns == null)
patterns = new HashMap<String, Pattern>();
final Pattern pattern(String regex) {
Pattern pattern = patterns.get(regex);
if (pattern == null) {
pattern = Pattern.compile(regex, Pattern.COMMENTS);
int flags = 0;
List<RegexFlag> list = new ArrayList<RegexFlag>(getRegexFlags());
// [#3860] This should really be handled by JAXB, but apparently, @XmlList and @XmlElement(defaultValue=...)
// cannot be combined: http://stackoverflow.com/q/27528698/521799
if (list.isEmpty()) {
list.add(RegexFlag.COMMENTS);
list.add(RegexFlag.CASE_INSENSITIVE);
}
for (RegexFlag flag : list) {
switch (flag) {
case CANON_EQ: flags |= Pattern.CANON_EQ; break;
case CASE_INSENSITIVE: flags |= Pattern.CASE_INSENSITIVE; break;
case COMMENTS: flags |= Pattern.COMMENTS; break;
case DOTALL: flags |= Pattern.DOTALL; break;
case LITERAL: flags |= Pattern.LITERAL; break;
case MULTILINE: flags |= Pattern.MULTILINE; break;
case UNICODE_CASE: flags |= Pattern.UNICODE_CASE; break;
case UNICODE_CHARACTER_CLASS: flags |= 0x100; break; // Pattern.UNICODE_CHARACTER_CLASS: Java 1.7 only
case UNIX_LINES: flags |= Pattern.UNIX_LINES; break;
}
}
pattern = Pattern.compile(regex, flags);
patterns.put(regex, pattern);
}
@ -383,6 +408,16 @@ public abstract class AbstractDatabase implements Database {
return includeExcludeColumns;
}
@Override
public final void setRegexFlags(List<RegexFlag> regexFlags) {
this.regexFlags = regexFlags;
}
@Override
public final List<RegexFlag> getRegexFlags() {
return regexFlags;
}
@Override
public void setRecordVersionFields(String[] recordVersionFields) {
this.recordVersionFields = recordVersionFields;
@ -930,16 +965,17 @@ public abstract class AbstractDatabase implements Database {
}
}
protected final <T extends Definition> List<T> filterExcludeInclude(List<T> definitions) {
@Override
public final <T extends Definition> List<T> filterExcludeInclude(List<T> definitions) {
return filterExcludeInclude(definitions, excludes, includes, filters);
}
protected static final <T extends Definition> List<T> filterExcludeInclude(List<T> definitions, String[] excludes, String[] includes, List<Filter> filters) {
protected final <T extends Definition> List<T> filterExcludeInclude(List<T> definitions, String[] e, String[] i, List<Filter> f) {
List<T> result = new ArrayList<T>();
definitionsLoop: for (T definition : definitions) {
if (excludes != null) {
for (String exclude : excludes) {
if (e != null) {
for (String exclude : e) {
Pattern p = pattern(exclude);
if (exclude != null &&
@ -954,8 +990,8 @@ public abstract class AbstractDatabase implements Database {
}
}
if (includes != null) {
for (String include : includes) {
if (i != null) {
for (String include : i) {
Pattern p = pattern(include);
if (include != null &&
@ -965,7 +1001,7 @@ public abstract class AbstractDatabase implements Database {
// [#3488] This allows for filtering out additional objects, in case the applicable
// code generation configuration might cause conflicts in resulting code
// [#3526] Filters should be applied last, after <exclude/> and <include/>
for (Filter filter : filters) {
for (Filter filter : f) {
if (filter.exclude(definition)) {
if (log.isDebugEnabled())

View File

@ -42,7 +42,6 @@
package org.jooq.util;
import static org.jooq.util.AbstractDatabase.fetchedSize;
import static org.jooq.util.AbstractDatabase.filterExcludeInclude;
import static org.jooq.util.AbstractDatabase.getDefinition;
import java.sql.SQLException;
@ -91,7 +90,7 @@ extends AbstractDefinition {
// [#2603] Filter exclude / include also for table columns
if (this instanceof TableDefinition && db.getIncludeExcludeColumns()) {
elements = filterExcludeInclude(e, db.getExcludes(), db.getIncludes(), db.getFilters());
elements = db.filterExcludeInclude(e);
log.info("Columns fetched", fetchedSize(e, elements));
}
else {

View File

@ -51,6 +51,7 @@ import org.jooq.Table;
import org.jooq.util.jaxb.CustomType;
import org.jooq.util.jaxb.EnumType;
import org.jooq.util.jaxb.ForcedType;
import org.jooq.util.jaxb.RegexFlag;
import org.jooq.util.jaxb.Schema;
/**
@ -247,6 +248,21 @@ public interface Database {
*/
List<Filter> getFilters();
/**
* Filter a list of definitions according to the exclude / include / and filter settings of this database.
*/
<D extends Definition> List<D> filterExcludeInclude(List<D> definitions);
/**
* The regular expression flags that should be applied when using regular expressions.
*/
void setRegexFlags(List<RegexFlag> regexFlags);
/**
* The regular expression flags that should be applied when using regular expressions.
*/
List<RegexFlag> getRegexFlags();
/**
* Table columns matching these regular expressions will be considered as
* record version fields in generated code.

View File

@ -11,7 +11,7 @@
<jaxb:globalBindings>
<!-- Force all classes implements Serializable -->
<xjc:serializable uid="350" />
<xjc:serializable uid="360" />
<!-- [#2401] Trim unnecessary whitespace from configuration -->
<xjc:javaType name="java.lang.String" xmlType="xs:string" adapter="org.jooq.util.jaxb.tools.TrimAdapter"/>
@ -19,7 +19,7 @@
<!-- Annotate the following classes with @SuppressWarnings -->
<jaxb:bindings schemaLocation="../../xsd/jooq-codegen-3.5.0.xsd" multiple="true" node="//xs:complexType">
<jaxb:bindings schemaLocation="../../xsd/jooq-codegen-3.6.0.xsd" multiple="true" node="//xs:complexType">
<annox:annotate>
<annox:annotate annox:class="java.lang.SuppressWarnings" value="all" />
</annox:annotate>

View File

@ -0,0 +1,741 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.jooq.org/xsd/jooq-codegen-3.6.0.xsd"
targetNamespace="http://www.jooq.org/xsd/jooq-codegen-3.6.0.xsd"
elementFormDefault="qualified">
<element name="configuration">
<complexType>
<all>
<!--
The JDBC configuration element contains information about how
to set up the database connection used for source code generation
-->
<element name="jdbc" type="tns:Jdbc" minOccurs="0" maxOccurs="1" />
<!--
The GENERATOR configuration element contains information about
source code generation itself
-->
<element name="generator" type="tns:Generator" minOccurs="1" maxOccurs="1" />
</all>
</complexType>
</element>
<complexType name="Jdbc">
<all>
<!-- The JDBC driver -->
<element name="driver" type="string" minOccurs="1" maxOccurs="1" />
<!-- The JDBC connection URL -->
<element name="url" type="string" minOccurs="1" maxOccurs="1" />
<!-- Deprecated. Use database schema configuration elements instead -->
<element name="schema" type="string" minOccurs="0" maxOccurs="1" />
<!--
The JDBC connection user. Be sure this user has all required
GRANTs to the dictionary views/tables to generate the desired artefacts
-->
<element name="user" type="string" minOccurs="0" maxOccurs="1" />
<!-- The JDBC connection password -->
<element name="password" type="string" minOccurs="0" maxOccurs="1" />
<!--
Enlist custom JDBC driver properties that are provided to the
java.sql.DriverManager when fetching a connection
-->
<element name="properties" type="tns:Properties" minOccurs="0" maxOccurs="1" />
</all>
</complexType>
<complexType name="Properties">
<sequence>
<element name="property" type="tns:Property" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="Property">
<all>
<element name="key" type="string" minOccurs="1" maxOccurs="1"/>
<element name="value" type="string" minOccurs="1" maxOccurs="1"/>
</all>
</complexType>
<complexType name="Generator">
<all>
<!--
The class used to generate source code. You may override this with
your custom source code generator
-->
<element name="name" type="string" default="org.jooq.util.DefaultGenerator"
minOccurs="0" maxOccurs="1" />
<!-- The naming strategy used for class and field names -->
<element name="strategy" type="tns:Strategy" minOccurs="0" maxOccurs="1" />
<!-- The jooq-meta configuration -->
<element name="database" type="tns:Database" minOccurs="1" maxOccurs="1" />
<!-- The jooq-codegen configuration -->
<element name="generate" type="tns:Generate" minOccurs="0" maxOccurs="1" />
<!-- Some information about generation output -->
<element name="target" type="tns:Target" minOccurs="0" maxOccurs="1" />
</all>
</complexType>
<complexType name="Strategy">
<choice>
<!--
The class used to provide a naming strategy for generated source
code. You may override this with your custom naming strategy
-->
<element name="name" type="string" minOccurs="0" maxOccurs="1"
default="org.jooq.util.DefaultGeneratorStrategy" />
<!--
The matcher strategy configuration used when applying an
XML-based strategy
-->
<element name="matchers" type="tns:Matchers" minOccurs="0" maxOccurs="1"/>
</choice>
</complexType>
<!--
Matchers can be used to provide a naming strategy by regular expression configuration.
-->
<complexType name="Matchers">
<sequence>
<!--
Specify 0..n schema matchers in order to provide a naming strategy for objects
created from schemas.
-->
<element name="schemas" type="tns:MatchersSchemasType" minOccurs="0" maxOccurs="1"/>
<!--
Specify 0..n table matchers in order to provide a naming strategy for objects
created from database tables.
-->
<element name="tables" type="tns:MatchersTablesType" minOccurs="0" maxOccurs="1"/>
<!--
Specify 0..n field matchers in order to provide a naming strategy for objects
created from table fields.
-->
<element name="fields" type="tns:MatchersFieldsType" minOccurs="0" maxOccurs="1"/>
<!--
Specify 0..n routine matchers in order to provide a naming strategy for objects
created from routines.
-->
<element name="routines" type="tns:MatchersRoutinesType" minOccurs="0" maxOccurs="1"/>
<!--
Specify 0..n sequence matchers in order to provide a naming strategy for objects
created from sequences.
-->
<element name="sequences" type="tns:MatchersSequencesType" minOccurs="0" maxOccurs="1"/>
</sequence>
</complexType>
<complexType name="MatchersSchemasType">
<sequence>
<element name="schema" type="tns:MatchersSchemaType" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="MatchersSchemaType">
<all>
<!--
This schema matcher applies to all unqualified or qualified schema names
matched by this expression. If left empty, this matcher applies to all schemas.
-->
<element name="expression" type="string" minOccurs="0" maxOccurs="1"/>
<!--
These elements influence the naming of a generated org.jooq.Schema object.
-->
<element name="schemaClass" type="tns:MatcherRule" minOccurs="0" maxOccurs="1" />
<element name="schemaIdentifier" type="tns:MatcherRule" minOccurs="0" maxOccurs="1" />
<element name="schemaImplements" type="string" minOccurs="0" maxOccurs="1" />
</all>
</complexType>
<complexType name="MatchersTablesType">
<sequence>
<element name="table" type="tns:MatchersTableType" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="MatchersTableType">
<all>
<!--
This table matcher applies to all unqualified or qualified table names
matched by this expression. If left empty, this matcher applies to all tables.
-->
<element name="expression" type="string" minOccurs="0" maxOccurs="1"/>
<!--
These elements influence the naming of a generated org.jooq.Table object.
-->
<element name="tableClass" type="tns:MatcherRule" minOccurs="0" maxOccurs="1"/>
<element name="tableIdentifier" type="tns:MatcherRule" minOccurs="0" maxOccurs="1"/>
<element name="tableImplements" type="string" minOccurs="0" maxOccurs="1"/>
<!--
These elements influence the naming of a generated org.jooq.Record object.
-->
<element name="recordClass" type="tns:MatcherRule" minOccurs="0" maxOccurs="1"/>
<element name="recordImplements" type="string" minOccurs="0" maxOccurs="1"/>
<!--
These elements influence the naming of a generated interface, implemented by
generated org.jooq.Record objects and by generated POJOs.
-->
<element name="interfaceClass" type="tns:MatcherRule" minOccurs="0" maxOccurs="1"/>
<element name="interfaceImplements" type="string" minOccurs="0" maxOccurs="1"/>
<!--
These elements influence the naming of a generated org.jooq.DAO object.
-->
<element name="daoClass" type="tns:MatcherRule" minOccurs="0" maxOccurs="1"/>
<element name="daoImplements" type="string" minOccurs="0" maxOccurs="1"/>
<!--
These elements influence the naming of a generated POJO object.
-->
<element name="pojoClass" type="tns:MatcherRule" minOccurs="0" maxOccurs="1"/>
<element name="pojoExtends" type="string" minOccurs="0" maxOccurs="1"/>
<element name="pojoImplements" type="string" minOccurs="0" maxOccurs="1"/>
</all>
</complexType>
<complexType name="MatchersFieldsType">
<sequence>
<element name="field" type="tns:MatchersFieldType" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="MatchersFieldType">
<all>
<!--
This field matcher applies to all unqualified or qualified field names
matched by this expression. If left empty, this matcher applies to all fields.
-->
<element name="expression" type="string" minOccurs="0" maxOccurs="1"/>
<!--
These elements influence the naming of a generated org.jooq.Field object.
-->
<element name="fieldIdentifier" type="tns:MatcherRule" minOccurs="0" maxOccurs="1"/>
<element name="fieldMember" type="tns:MatcherRule" minOccurs="0" maxOccurs="1"/>
<element name="fieldSetter" type="tns:MatcherRule" minOccurs="0" maxOccurs="1"/>
<element name="fieldGetter" type="tns:MatcherRule" minOccurs="0" maxOccurs="1"/>
</all>
</complexType>
<complexType name="MatchersRoutinesType">
<sequence>
<element name="routine" type="tns:MatchersRoutineType" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="MatchersRoutineType">
<all>
<!--
This routine matcher applies to all unqualified or qualified routine names
matched by this expression. If left empty, this matcher applies to all routines.
-->
<element name="expression" type="string" minOccurs="0" maxOccurs="1"/>
<!--
These elements influence the naming of a generated org.jooq.Routine object.
-->
<element name="routineClass" type="tns:MatcherRule" minOccurs="0" maxOccurs="1" />
<element name="routineMethod" type="tns:MatcherRule" minOccurs="0" maxOccurs="1" />
<element name="routineImplements" type="string" minOccurs="0" maxOccurs="1"/>
</all>
</complexType>
<complexType name="MatchersSequencesType">
<sequence>
<element name="sequence" type="tns:MatchersSequenceType" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="MatchersSequenceType">
<all>
<!--
This sequence matcher applies to all unqualified or qualified sequence names
matched by this expression. If left empty, this matcher applies to all sequences.
-->
<element name="expression" type="string" minOccurs="0" maxOccurs="1"/>
<!--
These elements influence the naming of the generated Sequences class.
-->
<element name="sequenceIdentifier" type="tns:MatcherRule" minOccurs="0" maxOccurs="1" />
</all>
</complexType>
<complexType name="MatcherRule">
<all>
<element name="transform" type="tns:MatcherTransformType" minOccurs="0" maxOccurs="1"/>
<element name="expression" type="string" minOccurs="1" maxOccurs="1"/>
</all>
</complexType>
<simpleType name="MatcherTransformType">
<restriction base="string">
<enumeration value="AS_IS"/>
<enumeration value="LOWER"/>
<enumeration value="UPPER"/>
<enumeration value="CAMEL"/>
<enumeration value="PASCAL"/>
</restriction>
</simpleType>
<complexType name="Database">
<all>
<!--
The database dialect from jooq-meta. Available dialects are
named org.util.[database].[database]Database.
Natively supported values are:
org.jooq.util.ase.ASEDatabase
org.jooq.util.cubrid.CUBRIDDatabase
org.jooq.util.db2.DB2Database
org.jooq.util.derby.DerbyDatabase
org.jooq.util.firebird.FirebirdDatabase
org.jooq.util.h2.H2Database
org.jooq.util.hsqldb.HSQLDBDatabase
org.jooq.util.informix.InformixDatabase
org.jooq.util.ingres.IngresDatabase
org.jooq.util.mariadb.MariaDBDatabase
org.jooq.util.mysql.MySQLDatabase
org.jooq.util.oracle.OracleDatabase
org.jooq.util.postgres.PostgresDatabase
org.jooq.util.sqlite.SQLiteDatabaes
org.jooq.util.sqlserver.SQLServerDatabase
org.jooq.util.sybase.SybaseDatabase
This value can be used to reverse-engineer generic JDBC DatabaseMetaData (e.g. for MS Access)
org.jooq.util.jdbc.JDBCDatabase
This value can be used to reverse-engineer standard jOOQ-meta XML formats
org.jooq.util.xml.XMLDatabase
You can also provide your own org.jooq.util.Database implementation
here, if your database is currently not supported
-->
<element name="name" type="string" minOccurs="1" maxOccurs="1" />
<!--
The properties that will be passed to the Database instance as configured above.
Known supported properties include:
org.jooq.util.xml.XMLDatabase
dialect=ORACLE
xml-file=C:\path\to\database.xml
xsl-files=C:\path\to\1.xsl,C:\path\to\2.xsl
-->
<element name="properties" type="tns:Properties" minOccurs="0" maxOccurs="1" />
<!--
The flags that will be applied to all regular expressions from this configuration by default.
The default value is "COMMENTS CASE_INSENSITIVE"
-->
<element name="regexFlags" type="tns:RegexFlags" minOccurs="0" maxOccurs="1" default="COMMENTS CASE_INSENSITIVE"/>
<!--
All elements that are generated from your schema (A Java regular expression.
Use the pipe to separate several expressions) Watch out for
case-sensitivity. Depending on your database, this might be
important!
You can create case-insensitive regular expressions
using this syntax: (?i:expr)
Whitespace is ignored and comments are possible.
-->
<element name="includes" type="string" default=".*" minOccurs="0" maxOccurs="1" />
<!--
All elements that are excluded from your schema (A Java regular expression.
Use the pipe to separate several expressions). Excludes match before
includes
-->
<element name="excludes" type="string" default="" minOccurs="0" maxOccurs="1" />
<!--
This flag indicates whether include / exclude patterns should also match
columns within tables.
-->
<element name="includeExcludeColumns" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
All table and view columns that are used as "version" fields for
optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
See UpdatableRecord.store() and UpdatableRecord.delete() for details
-->
<element name="recordVersionFields" type="string" default="" minOccurs="0" maxOccurs="1" />
<!--
All table and view columns that are used as "timestamp" fields for
optimistic locking (A Java regular expression. Use the pipe to separate several expressions).
See UpdatableRecord.store() and UpdatableRecord.delete() for details
-->
<element name="recordTimestampFields" type="string" default="" minOccurs="0" maxOccurs="1" />
<!--
A regular expression matching all columns that participate in "synthetic" primary keys,
which should be placed on generated UpdatableRecords, to be used with
- UpdatableRecord.store()
- UpdatableRecord.update()
- UpdatableRecord.delete()
- UpdatableRecord.refresh()
Synthetic primary keys will override existing primary keys.
-->
<element name="syntheticPrimaryKeys" type="string" default="" minOccurs="0" maxOccurs="1" />
<!--
All (UNIQUE) key names that should be used instead of primary keys on
generated UpdatableRecords, to be used with
- UpdatableRecord.store()
- UpdatableRecord.update()
- UpdatableRecord.delete()
- UpdatableRecord.refresh()
If several keys match, a warning is emitted and the first one encountered will be used.
This flag will also replace synthetic primary keys, if it matches.
-->
<element name="overridePrimaryKeys" type="string" default="" minOccurs="0" maxOccurs="1" />
<!--
Generate java.sql.Timestamp fields for DATE columns. This is
particularly useful for Oracle databases
-->
<element name="dateAsTimestamp" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
Generate jOOU data types for your unsigned data types, which are
not natively supported in Java
-->
<element name="unsignedTypes" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
<!--
The schema that is used locally as a source for meta information.
This could be your development schema or the production schema, etc
This cannot be combined with the schemata element.
If left empty (and without any schemata element), jOOQ will generate all available schemata.
For backwards compatibility, this defaults to jdbc/schema
-->
<element name="inputSchema" type="string" default="" minOccurs="0" maxOccurs="1" />
<!--
A custom version number that, if available, will be used to assess whether the above
<inputSchema/> will need to be regenerated.
There are three operation modes for this element:
- The value is a class that can be found on the classpath and that implements
org.jooq.util.SchemaVersionProvider. Such classes must provide a default constructor
- The value is a SELECT statement that returns one record with one column. The
SELECT statement may contain a named variable called :schema_name
- The value is a constant, such as a Maven property
Schema versions will be generated into the javax.annotation.Generated annotation on
generated artefacts.
-->
<element name="schemaVersionProvider" type="string" default="" minOccurs="0" maxOccurs="1"/>
<!--
The schema that is used in generated source code. This will be the
production schema. Use this to override your local development
schema name for source code generation. If not specified, this
will be the same as the input-schema.
This will be ignored if outputSchemaToDefault is set to true
-->
<element name="outputSchema" type="string" minOccurs="0" maxOccurs="1" />
<!--
A flag to indicate that the outputSchema should be the "default" schema,
which generates schema-less, unqualified tables, procedures, etc.
-->
<element name="outputSchemaToDefault" type="boolean" minOccurs="0" maxOccurs="1" default="false" />
<!--
A configuration element to configure several input and/or output
schemata for jooq-meta, in case you're using jooq-meta in a multi-
schema environment
-->
<element name="schemata" type="tns:Schemata" minOccurs="0" maxOccurs="1"/>
<!--
A configuration element to configure custom types introduced to jOOQ
using converters
-->
<element name="customTypes" type="tns:CustomTypes" minOccurs="0" maxOccurs="1"/>
<!--
A configuration element to configure synthetic enum types
This is EXPERIMENTAL / DEPRECATED functionality. Do not re-use
-->
<element name="enumTypes" type="tns:EnumTypes" minOccurs="0" maxOccurs="1"/>
<!--
A configuration element to configure type overrides for generated
artefacts (e.g. in combination with enumTypes)
-->
<element name="forcedTypes" type="tns:ForcedTypes" minOccurs="0" maxOccurs="1"/>
</all>
</complexType>
<complexType name="Schemata">
<sequence>
<!--
A configuration element for a single schema in multi-schema
environments
-->
<element name="schema" type="tns:Schema" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="Schema">
<all>
<!-- See also database/inputSchema -->
<element name="inputSchema" type="string" default="" minOccurs="1" maxOccurs="1" />
<!-- See also database/outputSchema -->
<element name="outputSchema" type="string" minOccurs="0" maxOccurs="1" />
<!-- See also database/outputSchemaDefault -->
<element name="outputSchemaToDefault" type="boolean" minOccurs="0" maxOccurs="1" default="false" />
</all>
</complexType>
<complexType name="CustomTypes">
<sequence>
<!-- A configuration element for a custom type -->
<element name="customType" type="tns:CustomType" minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="EnumTypes">
<sequence>
<!-- A configuration element for a synthetic enum type -->
<element name="enumType" type="tns:EnumType" minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="ForcedTypes">
<sequence>
<!-- A configuration element for a forced type override -->
<element name="forcedType" type="tns:ForcedType" minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="CustomType">
<all>
<!-- The name of the custom type -->
<element name="name" type="string" minOccurs="1" maxOccurs="1" />
<!-- The type of the custom type - e.g. java.time.LocalDateTime.
For backwards-compatibility reasons, this information is optional. If left undefined,
the "type" value will default to the "name" value. -->
<element name="type" type="string" minOccurs="0" maxOccurs="1" />
<!-- A converter implementation for the custom type -->
<element name="converter" type="string" minOccurs="0" maxOccurs="1" />
<!-- A binding implementation for the custom type -->
<element name="binding" type="string" minOccurs="0" maxOccurs="1" />
</all>
</complexType>
<complexType name="EnumType">
<all>
<!-- The name of the synthetic enum type -->
<element name="name" type="string" minOccurs="1" maxOccurs="1" />
<!-- A comma separated (CSV format) list of enum literals -->
<element name="literals" type="string" minOccurs="1" maxOccurs="1" />
</all>
</complexType>
<complexType name="ForcedType">
<all>
<!-- The name of the type to be forced upon various artefacts -->
<element name="name" type="string" minOccurs="1" maxOccurs="1" />
<!--
A Java regular expression matching columns, parameters, attributes,
etc to be forced to have this type. If provided, both "expressions" and
"types" must match.
-->
<element name="expression" type="string" minOccurs="0" maxOccurs="1" />
<!--
The same as expression. This is kept for backwards compatibility reasons.
-->
<element name="expressions" type="string" minOccurs="0" maxOccurs="1" />
<!--
A Java regular expression matching data types to be forced to have this
type. If provided, both "expressions" and "types" must match.
-->
<element name="types" type="string" minOccurs="0" maxOccurs="1" />
</all>
</complexType>
<complexType name="Generate">
<all>
<!--
Primary key / foreign key relations should be generated and used.
This is a prerequisite for various advanced features
-->
<element name="relations" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
<!-- Generate deprecated code for backwards compatibility -->
<element name="deprecated" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
<!--
Do not reuse this property. It is deprecated as of jOOQ 3.3.0
-->
<element name="instanceFields" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
<!--
Generate the javax.annotation.Generated annotation to indicate
jOOQ version used for source code
-->
<element name="generatedAnnotation" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
<!--
Generate TableRecord classes. Disable this when you don't
need the additional type-safety
-->
<element name="records" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
<!--
Generate POJOs for usage of the ResultQuery.fetchInto(Class) API
-->
<element name="pojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
Generate basic equals() and hashCode() methods in POJOs
-->
<element name="pojosEqualsAndHashCode" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
Generate immutable POJOs for usage of the ResultQuery.fetchInto(Class) API
This overrides any value set in <pojos/>
-->
<element name="immutablePojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
Generate interfaces that will be implemented by records and/or pojos.
You can also use these interfaces in Record.into(Class<?>) and similar
methods, to let jOOQ return proxy objects for them.
-->
<element name="interfaces" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
Generate DAOs in addition to POJO classes
-->
<element name="daos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
Annotate POJOs and Records with JPA annotations for increased
compatibility and better integration with JPA/Hibernate, etc
-->
<element name="jpaAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
Annotate POJOs and Records with JSR-303 validation annotations
-->
<element name="validationAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
Allow to turn off the generation of global object references, which include
- Tables.java
- Sequences.java
- UDTs.java
Turning off the generation of the above files may be necessary for very
large schemas, which exceed the amount of allowed constants in a class's
constant pool (64k) or, whose static initialiser would exceed 64k of
byte code
-->
<element name="globalObjectReferences" type="boolean" default="true" minOccurs="0" maxOccurs="1" />
<!--
Generate fluent setters in
- records
- pojos
- interfaces
Fluent setters are against the JavaBeans specification, but can be quite
useful to those users who do not depend on EL, JSP, JSF, etc.
-->
<element name="fluentSetters" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
</all>
</complexType>
<complexType name="Target">
<all>
<!--
The destination package of your generated classes (within the
destination directory)
jOOQ may append the schema name to this package if generating multiple schemas,
e.g. org.jooq.generated.schema1
org.jooq.generated.schema2
-->
<element name="packageName" type="string" default="org.jooq.generated" minOccurs="0" maxOccurs="1" />
<!-- The destination directory of your generated classes -->
<element name="directory" type="string" default="target/generated-sources/jooq" />
</all>
</complexType>
<simpleType name="RegexFlags">
<list itemType="tns:RegexFlag"/>
</simpleType>
<simpleType name="RegexFlag">
<restriction base="string">
<enumeration value="UNIX_LINES"/>
<enumeration value="CASE_INSENSITIVE"/>
<enumeration value="COMMENTS"/>
<enumeration value="MULTILINE"/>
<enumeration value="LITERAL"/>
<enumeration value="DOTALL"/>
<enumeration value="UNICODE_CASE"/>
<enumeration value="CANON_EQ"/>
<enumeration value="UNICODE_CHARACTER_CLASS"/>
</restriction>
</simpleType>
</schema>