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