From 0d0fef9b115689b299158a2e8856a975a8a6c72a Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 17 Dec 2014 16:29:23 +0100 Subject: [PATCH] [#3860] Allow to specify defaults for all regular expression flags in the code generation configuration. Add CASE_INSENSITIVE to defaults --- .../java/org/jooq/util/GenerationTool.java | 3 + jOOQ-meta/pom.xml | 2 +- .../java/org/jooq/util/AbstractDatabase.java | 64 +- .../AbstractElementContainerDefinition.java | 3 +- .../src/main/java/org/jooq/util/Database.java | 16 + .../main/resources/xjb/codegen/binding.xjb | 4 +- .../main/resources/xsd/jooq-codegen-3.6.0.xsd | 741 ++++++++++++++++++ 7 files changed, 814 insertions(+), 19 deletions(-) create mode 100644 jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.6.0.xsd diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java index 00107187e2..172e4a034b 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java @@ -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())) { diff --git a/jOOQ-meta/pom.xml b/jOOQ-meta/pom.xml index a7ec6584d9..d0721ff972 100644 --- a/jOOQ-meta/pom.xml +++ b/jOOQ-meta/pom.xml @@ -48,7 +48,7 @@ src/main/resources/xsd src/main/resources/xjb/codegen - jooq-codegen-3.5.0.xsd + jooq-codegen-3.6.0.xsd org.jooq.util.jaxb diff --git a/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java index 00fe658a5f..cfa3f42a36 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java @@ -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 regexFlags; private List filters; private String[] excludes; private String[] includes; @@ -149,13 +151,13 @@ public abstract class AbstractDatabase implements Database { private transient Map> routinesBySchema; private transient Map> packagesBySchema; - private static Map patterns; - // Other caches private final Map, Boolean> exists; + private final Map patterns; protected AbstractDatabase() { exists = new HashMap, Boolean>(); + patterns = new HashMap(); filters = new ArrayList(); } @@ -227,13 +229,36 @@ public abstract class AbstractDatabase implements Database { return result; } - final static Pattern pattern(String regex) { - if (patterns == null) - patterns = new HashMap(); - + final Pattern pattern(String regex) { Pattern pattern = patterns.get(regex); + if (pattern == null) { - pattern = Pattern.compile(regex, Pattern.COMMENTS); + int flags = 0; + + List list = new ArrayList(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 regexFlags) { + this.regexFlags = regexFlags; + } + + @Override + public final List getRegexFlags() { + return regexFlags; + } + @Override public void setRecordVersionFields(String[] recordVersionFields) { this.recordVersionFields = recordVersionFields; @@ -930,16 +965,17 @@ public abstract class AbstractDatabase implements Database { } } - protected final List filterExcludeInclude(List definitions) { + @Override + public final List filterExcludeInclude(List definitions) { return filterExcludeInclude(definitions, excludes, includes, filters); } - protected static final List filterExcludeInclude(List definitions, String[] excludes, String[] includes, List filters) { + protected final List filterExcludeInclude(List definitions, String[] e, String[] i, List f) { List result = new ArrayList(); 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 and - for (Filter filter : filters) { + for (Filter filter : f) { if (filter.exclude(definition)) { if (log.isDebugEnabled()) diff --git a/jOOQ-meta/src/main/java/org/jooq/util/AbstractElementContainerDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/AbstractElementContainerDefinition.java index 862996ddc0..4dadf84cf0 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/AbstractElementContainerDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/AbstractElementContainerDefinition.java @@ -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 { diff --git a/jOOQ-meta/src/main/java/org/jooq/util/Database.java b/jOOQ-meta/src/main/java/org/jooq/util/Database.java index 8fb563f9fe..4aea847e1e 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/Database.java @@ -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 getFilters(); + /** + * Filter a list of definitions according to the exclude / include / and filter settings of this database. + */ + List filterExcludeInclude(List definitions); + + /** + * The regular expression flags that should be applied when using regular expressions. + */ + void setRegexFlags(List regexFlags); + + /** + * The regular expression flags that should be applied when using regular expressions. + */ + List getRegexFlags(); + /** * Table columns matching these regular expressions will be considered as * record version fields in generated code. diff --git a/jOOQ-meta/src/main/resources/xjb/codegen/binding.xjb b/jOOQ-meta/src/main/resources/xjb/codegen/binding.xjb index 25be9e704b..8ff43e6953 100644 --- a/jOOQ-meta/src/main/resources/xjb/codegen/binding.xjb +++ b/jOOQ-meta/src/main/resources/xjb/codegen/binding.xjb @@ -11,7 +11,7 @@ - + @@ -19,7 +19,7 @@ - + diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.6.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.6.0.xsd new file mode 100644 index 0000000000..0d5ce2f294 --- /dev/null +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.6.0.xsd @@ -0,0 +1,741 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file