diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGeneratorStrategy.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGeneratorStrategy.java index 87a53cce37..3546bcfdcb 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGeneratorStrategy.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGeneratorStrategy.java @@ -68,8 +68,8 @@ public abstract class AbstractGeneratorStrategy implements GeneratorStrategy { // ------------------------------------------------------------------------- @Override - public final String getGlobalReferencesFileName(SchemaDefinition containingSchema, Class objectType) { - return getGlobalReferencesJavaClassName(containingSchema, objectType) + ".java"; + public final String getGlobalReferencesFileName(Definition container, Class objectType) { + return getGlobalReferencesJavaClassName(container, objectType) + ".java"; } @Override @@ -90,10 +90,10 @@ public abstract class AbstractGeneratorStrategy implements GeneratorStrategy { } @Override - public final File getGlobalReferencesFile(SchemaDefinition containingSchema, Class objectType) { + public final File getGlobalReferencesFile(Definition container, Class objectType) { String dir = getTargetDirectory(); - String pkg = getGlobalReferencesJavaPackageName(containingSchema, objectType).replaceAll("\\.", "/"); - return new File(dir + "/" + pkg, getGlobalReferencesFileName(containingSchema, objectType)); + String pkg = getGlobalReferencesJavaPackageName(container, objectType).replaceAll("\\.", "/"); + return new File(dir + "/" + pkg, getGlobalReferencesFileName(container, objectType)); } @Override @@ -204,8 +204,8 @@ public abstract class AbstractGeneratorStrategy implements GeneratorStrategy { } @Override - public final String getGlobalReferencesFullJavaClassName(SchemaDefinition containingSchema, Class objectType) { - return getGlobalReferencesJavaPackageName(containingSchema, objectType) + "." + getGlobalReferencesJavaClassName(containingSchema, objectType); + public final String getGlobalReferencesFullJavaClassName(Definition container, Class objectType) { + return getGlobalReferencesJavaPackageName(container, objectType) + "." + getGlobalReferencesJavaClassName(container, objectType); } @Override diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java index 1c44858ea2..a3552c2bdc 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java @@ -48,6 +48,7 @@ import static org.jooq.SQLDialect.MYSQL; import static org.jooq.SQLDialect.POSTGRES; // ... // ... +import static org.jooq.codegen.AbstractGenerator.Language.KOTLIN; import java.util.ArrayList; import java.util.List; @@ -160,7 +161,7 @@ public class DefaultGeneratorStrategy extends AbstractGeneratorStrategy { // ------------------------------------------------------------------------- @Override - public String getGlobalReferencesFileHeader(SchemaDefinition containingSchema, Class objectType) { + public String getGlobalReferencesFileHeader(Definition container, Class objectType) { return "This file is generated by jOOQ."; } @@ -268,7 +269,7 @@ public class DefaultGeneratorStrategy extends AbstractGeneratorStrategy { } @Override - public String getGlobalReferencesJavaClassExtends(SchemaDefinition containingSchema, Class objectType) { + public String getGlobalReferencesJavaClassExtends(Definition container, Class objectType) { return null; } @@ -278,7 +279,7 @@ public class DefaultGeneratorStrategy extends AbstractGeneratorStrategy { } @Override - public List getGlobalReferencesJavaClassImplements(SchemaDefinition containingSchema, Class objectType) { + public List getGlobalReferencesJavaClassImplements(Definition container, Class objectType) { return new ArrayList<>(); } @@ -288,7 +289,7 @@ public class DefaultGeneratorStrategy extends AbstractGeneratorStrategy { } @Override - public String getGlobalReferencesJavaClassName(SchemaDefinition containingSchema, Class objectType) { + public String getGlobalReferencesJavaClassName(Definition container, Class objectType) { if (ArrayDefinition.class.isAssignableFrom(objectType)) return "Arrays"; else if (ConstraintDefinition.class.isAssignableFrom(objectType)) @@ -336,27 +337,25 @@ public class DefaultGeneratorStrategy extends AbstractGeneratorStrategy { } @Override - public String getGlobalReferencesJavaPackageName(SchemaDefinition containingSchema, Class objectType) { - String packageName = getJavaPackageName(containingSchema); + public String getGlobalReferencesJavaPackageName(Definition container, Class objectType) { + String packageName = getJavaPackageName(container); - switch (targetLanguage) { - case KOTLIN: { - String className = getGlobalReferencesJavaClassName(containingSchema, objectType).toLowerCase(targetLocale); + if (container instanceof PackageDefinition) + packageName = packageName + "." + getJavaIdentifier(container).toLowerCase(targetLocale); - // Repeat the package name for global references to prevent collisions - if (TableDefinition.class.isAssignableFrom(objectType)) - return packageName + "." + className + ".references"; - else if (RoutineDefinition.class.isAssignableFrom(objectType)) - return packageName + "." + className + ".references"; - else - return packageName + "." + className; - } + if (targetLanguage == KOTLIN) { + String className = getGlobalReferencesJavaClassName(container, objectType).toLowerCase(targetLocale); - case JAVA: - case SCALA: - default: - return packageName; + // Repeat the package name for global references to prevent collisions + if (TableDefinition.class.isAssignableFrom(objectType)) + packageName = packageName + "." + className + ".references"; + else if (RoutineDefinition.class.isAssignableFrom(objectType)) + packageName = packageName + "." + className + ".references"; + else + packageName = packageName + "." + className; } + + return packageName; } @Override @@ -382,9 +381,10 @@ public class DefaultGeneratorStrategy extends AbstractGeneratorStrategy { if (!(definition instanceof SchemaDefinition)) { // Some definitions have their dedicated subpackages, e.g. "tables", "routines" - if (!StringUtils.isBlank(getSubPackage(definition))) { + String subPackage = getSubPackage(definition); + if (!StringUtils.isBlank(subPackage)) { sb.append("."); - sb.append(getSubPackage(definition)); + sb.append(subPackage); } // Record are yet in another subpackage diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategy.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategy.java index a6f9df6cea..65f01eb55a 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategy.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategy.java @@ -50,7 +50,6 @@ import org.jooq.meta.DomainDefinition; import org.jooq.meta.EnumDefinition; import org.jooq.meta.ParameterDefinition; import org.jooq.meta.RoutineDefinition; -import org.jooq.meta.SchemaDefinition; import org.jooq.meta.TableDefinition; import org.jooq.meta.UDTDefinition; @@ -246,7 +245,7 @@ public interface GeneratorStrategy { * null or an empty string, then no super class is * extended. */ - String getGlobalReferencesJavaClassExtends(SchemaDefinition containingSchema, Class objectType); + String getGlobalReferencesJavaClassExtends(Definition container, Class objectType); /** * This is the same as calling @@ -273,7 +272,7 @@ public interface GeneratorStrategy { * returns null or an empty list, then no interfaces * are implemented. */ - List getGlobalReferencesJavaClassImplements(SchemaDefinition containingSchema, Class objectType); + List getGlobalReferencesJavaClassImplements(Definition container, Class objectType); /** * This is the same as calling @@ -298,7 +297,7 @@ public interface GeneratorStrategy { * @return The Java class name of the global references class for a given * definition type, e.g. [MyTableSuffix] */ - String getGlobalReferencesJavaClassName(SchemaDefinition containingSchema, Class objectType); + String getGlobalReferencesJavaClassName(Definition container, Class objectType); /** * This is the same as calling @@ -318,7 +317,7 @@ public interface GeneratorStrategy { * @return The Java package name of the global references class for a given * definition type, e.g. [org.jooq.generated] */ - String getGlobalReferencesJavaPackageName(SchemaDefinition containingSchema, Class objectType); + String getGlobalReferencesJavaPackageName(Definition container, Class objectType); /** * This is the same as calling @@ -369,7 +368,7 @@ public interface GeneratorStrategy { * @return The full Java class name of the global references class for a * given definition type, e.g. [org.jooq.generated.MyTable] */ - String getGlobalReferencesFullJavaClassName(SchemaDefinition containingSchema, Class objectType); + String getGlobalReferencesFullJavaClassName(Definition container, Class objectType); /** * @return The full Java class name representing this object, e.g. @@ -390,7 +389,7 @@ public interface GeneratorStrategy { * @return The Java class file name of the global references class for a * given definition type, e.g. [MyTable.java] */ - String getGlobalReferencesFileName(SchemaDefinition containingSchema, Class objectType); + String getGlobalReferencesFileName(Definition container, Class objectType); /** * @return The Java class file name representing this object, e.g. @@ -414,7 +413,7 @@ public interface GeneratorStrategy { * @return The Java class file name of the global references class for a * given definition type, e.g. [C:\org\jooq\generated\MyTable.java] */ - File getGlobalReferencesFile(SchemaDefinition containingSchema, Class objectType); + File getGlobalReferencesFile(Definition container, Class objectType); /** * @return The Java class file name representing this object, e.g. @@ -440,7 +439,7 @@ public interface GeneratorStrategy { * This file is generated by jOOQ. * */ - String getGlobalReferencesFileHeader(SchemaDefinition containingSchema, Class objectType); + String getGlobalReferencesFileHeader(Definition container, Class objectType); /** * @return The Java class file header, e.g.
diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategyWrapper.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategyWrapper.java
index 05ad5719af..be3d8e6103 100644
--- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategyWrapper.java
+++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorStrategyWrapper.java
@@ -150,8 +150,8 @@ class GeneratorStrategyWrapper extends AbstractGeneratorStrategy {
     }
 
     @Override
-    public String getGlobalReferencesFileHeader(SchemaDefinition containingSchema, Class objectType) {
-        return delegate.getGlobalReferencesFileHeader(containingSchema, objectType);
+    public String getGlobalReferencesFileHeader(Definition container, Class objectType) {
+        return delegate.getGlobalReferencesFileHeader(container, objectType);
     }
 
     @Override
@@ -325,8 +325,8 @@ class GeneratorStrategyWrapper extends AbstractGeneratorStrategy {
     }
 
     @Override
-    public String getGlobalReferencesJavaClassExtends(SchemaDefinition containingSchema, Class objectType) {
-        return delegate.getGlobalReferencesJavaClassExtends(containingSchema, objectType);
+    public String getGlobalReferencesJavaClassExtends(Definition container, Class objectType) {
+        return delegate.getGlobalReferencesJavaClassExtends(container, objectType);
     }
 
     @Override
@@ -337,8 +337,8 @@ class GeneratorStrategyWrapper extends AbstractGeneratorStrategy {
     }
 
     @Override
-    public List getGlobalReferencesJavaClassImplements(SchemaDefinition containingSchema, Class objectType) {
-        return delegate.getGlobalReferencesJavaClassImplements(containingSchema, objectType);
+    public List getGlobalReferencesJavaClassImplements(Definition container, Class objectType) {
+        return delegate.getGlobalReferencesJavaClassImplements(container, objectType);
     }
 
     @Override
@@ -364,8 +364,8 @@ class GeneratorStrategyWrapper extends AbstractGeneratorStrategy {
     }
 
     @Override
-    public String getGlobalReferencesJavaClassName(SchemaDefinition containingSchema, Class objectType) {
-        return fixJavaClassName(delegate.getGlobalReferencesJavaClassName(containingSchema, objectType));
+    public String getGlobalReferencesJavaClassName(Definition container, Class objectType) {
+        return fixJavaClassName(delegate.getGlobalReferencesJavaClassName(container, objectType));
     }
 
     @Override
@@ -394,8 +394,8 @@ class GeneratorStrategyWrapper extends AbstractGeneratorStrategy {
     }
 
     @Override
-    public String getGlobalReferencesJavaPackageName(SchemaDefinition containingSchema, Class objectType) {
-        return fixJavaPackageName(delegate.getGlobalReferencesJavaPackageName(containingSchema, objectType));
+    public String getGlobalReferencesJavaPackageName(Definition container, Class objectType) {
+        return fixJavaPackageName(delegate.getGlobalReferencesJavaPackageName(container, objectType));
     }
 
     @Override
diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java
index a770508122..f659532fa1 100644
--- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java
+++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java
@@ -775,8 +775,6 @@ public class JavaGenerator extends AbstractGenerator {
 
 
 
-
-
 
 
 
@@ -2609,7 +2607,8 @@ public class JavaGenerator extends AbstractGenerator {
         for (UDTDefinition udt : database.getUDTs(schema)) {
             try {
                 generateUDT(schema, udt);
-            } catch (Exception e) {
+            }
+            catch (Exception e) {
                 log.error("Error while generating udt " + udt, e);
             }
         }
@@ -2798,7 +2797,8 @@ public class JavaGenerator extends AbstractGenerator {
         for (UDTDefinition udt : database.getUDTs(schema)) {
             try {
                 generateUDTInterface(udt);
-            } catch (Exception e) {
+            }
+            catch (Exception e) {
                 log.error("Error while generating UDT interface " + udt, e);
             }
         }
@@ -2831,7 +2831,8 @@ public class JavaGenerator extends AbstractGenerator {
         for (UDTDefinition udt : database.getUDTs(schema)) {
             try {
                 generateUDTRecord(udt);
-            } catch (Exception e) {
+            }
+            catch (Exception e) {
                 log.error("Error while generating UDT record " + udt, e);
             }
         }
@@ -2864,7 +2865,8 @@ public class JavaGenerator extends AbstractGenerator {
                     for (RoutineDefinition routine : udt.getRoutines()) {
                         try {
                             generateRoutine(schema, routine);
-                        } catch (Exception e) {
+                        }
+                        catch (Exception e) {
                             log.error("Error while generating member routines " + routine, e);
                         }
                     }
@@ -2880,17 +2882,18 @@ public class JavaGenerator extends AbstractGenerator {
     /**
      * Generating central static udt access
      */
-    protected void generateUDTReferences(SchemaDefinition schema) {
-        log.info("Generating UDT references");
-        JavaWriter out = newJavaWriter(getStrategy().getGlobalReferencesFile(schema, UDTDefinition.class));
-        printGlobalReferencesPackage(out, schema, UDTDefinition.class);
+    protected void generateUDTReferences(Definition schemaOrPackage) {
+        String logSuffix = schemaOrPackage instanceof SchemaDefinition ? "" : (" for package " + schemaOrPackage.getOutputName());
+        log.info("Generating UDT references" + logSuffix);
+        JavaWriter out = newJavaWriter(getStrategy().getGlobalReferencesFile(schemaOrPackage, UDTDefinition.class));
+        printGlobalReferencesPackage(out, schemaOrPackage, UDTDefinition.class);
 
         if (!kotlin) {
-            printClassJavadoc(out, "Convenience access to all UDTs in " + schemaNameOrDefault(schema) + ".");
-            printClassAnnotations(out, schema, Mode.DEFAULT);
+            printClassJavadoc(out, "Convenience access to all UDTs in " + schemaNameOrDefault(schemaOrPackage) + ".");
+            printClassAnnotations(out, schemaOrPackage, Mode.DEFAULT);
         }
 
-        final String referencesClassName = getStrategy().getGlobalReferencesJavaClassName(schema, UDTDefinition.class);
+        final String referencesClassName = getStrategy().getGlobalReferencesJavaClassName(schemaOrPackage, UDTDefinition.class);
 
         if (scala)
             out.println("object %s {", referencesClassName);
@@ -2898,33 +2901,54 @@ public class JavaGenerator extends AbstractGenerator {
         else
             out.println("public class %s {", referencesClassName);
 
-        for (UDTDefinition udt : database.getUDTs(schema)) {
+        List udts = new ArrayList<>();
+
+        if (schemaOrPackage instanceof SchemaDefinition) {
+            for (UDTDefinition udt : database.getUDTs((SchemaDefinition) schemaOrPackage))
+                if (udt.getPackage() == null)
+                    udts.add(udt);
+        }
+        else
+            udts.addAll(database.getUDTs((PackageDefinition) schemaOrPackage));
+
+        for (UDTDefinition udt : udts) {
             final String className = out.ref(getStrategy().getFullJavaClassName(udt));
             final String id = getStrategy().getJavaIdentifier(udt);
             final String fullId = getStrategy().getFullJavaIdentifier(udt);
 
             out.javadoc("The type %s", udt.getQualifiedOutputName());
 
-            if (scala)
+            if (scala || kotlin)
                 out.println("val %s = %s", id, fullId);
             else
                 out.println("public static final %s %s = %s;", className, id, fullId);
         }
 
-        generateUDTReferencesClassFooter(schema, out);
+        generateUDTReferencesClassFooter(schemaOrPackage, out);
 
         if (!kotlin)
             out.println("}");
         closeJavaWriter(out);
 
-        watch.splitInfo("UDT references generated");
+        watch.splitInfo("UDT references generated" + logSuffix);
+
+        if (schemaOrPackage instanceof SchemaDefinition)
+            for (PackageDefinition pkg : database.getPackages((SchemaDefinition) schemaOrPackage))
+                if (!pkg.getUDTs().isEmpty())
+                    generateUDTReferences(pkg);
     }
 
     /**
      * Subclasses may override this method to provide UDT references class footer code.
      */
     @SuppressWarnings("unused")
-    protected void generateUDTReferencesClassFooter(SchemaDefinition schema, JavaWriter out) {}
+    protected void generateUDTReferencesClassFooter(Definition schemaOrPackage, JavaWriter out) {}
+
+    /**
+     * Subclasses may override this method to provide UDT references class footer code.
+     */
+    @SuppressWarnings("unused")
+    protected void generateUDTReferencesClassFooter(PackageDefinition pkg, JavaWriter out) {}
 
     /**
      * Generating central static domain access
@@ -3655,7 +3679,7 @@ public class JavaGenerator extends AbstractGenerator {
     @SuppressWarnings("unused")
     protected void generateTableReferencesClassFooter(SchemaDefinition schema, JavaWriter out) {}
 
-    private String schemaNameOrDefault(SchemaDefinition schema) {
+    private String schemaNameOrDefault(Definition schema) {
         return StringUtils.isEmpty(schema.getOutputName()) ? "the default schema" : schema.getOutputName();
     }
 
@@ -7697,10 +7721,10 @@ public class JavaGenerator extends AbstractGenerator {
         out.println();
     }
 
-    protected void printGlobalReferencesPackage(JavaWriter out, SchemaDefinition containingSchema, Class objectType) {
-        printGlobalReferencesPackageComment(out, containingSchema, objectType);
+    protected void printGlobalReferencesPackage(JavaWriter out, Definition container, Class objectType) {
+        printGlobalReferencesPackageComment(out, container, objectType);
 
-        out.printPackageSpecification(getStrategy().getGlobalReferencesJavaPackageName(containingSchema, objectType));
+        out.printPackageSpecification(getStrategy().getGlobalReferencesJavaPackageName(container, objectType));
         out.println();
         out.printImports();
         out.println();
@@ -7716,8 +7740,8 @@ public class JavaGenerator extends AbstractGenerator {
         }
     }
 
-    protected void printGlobalReferencesPackageComment(JavaWriter out, SchemaDefinition containingSchema, Class objectType) {
-        String header = getStrategy().getGlobalReferencesFileHeader(containingSchema, objectType);
+    protected void printGlobalReferencesPackageComment(JavaWriter out, Definition container, Class objectType) {
+        String header = getStrategy().getGlobalReferencesFileHeader(container, objectType);
 
         if (!StringUtils.isBlank(header)) {
             out.println("/*");
diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java
index e0fd7e2178..ab8620b93b 100644
--- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java
+++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java
@@ -222,6 +222,7 @@ public abstract class AbstractDatabase implements Database {
     private transient Map>            enumsBySchema;
     private transient Map>          domainsBySchema;
     private transient Map>             udtsBySchema;
+    private transient Map>            udtsByPackage;
     private transient Map>           arraysBySchema;
     private transient Map>         routinesBySchema;
     private transient Map>         packagesBySchema;
@@ -2224,7 +2225,8 @@ public abstract class AbstractDatabase implements Database {
         return getDefinition(getArrays(schema), name, ignoreCase);
     }
 
-    private final List getAllUDTs(SchemaDefinition schema) {
+    @Override
+    public final List getUDTs() {
         if (udts == null) {
             udts = new ArrayList<>();
 
@@ -2243,25 +2245,15 @@ public abstract class AbstractDatabase implements Database {
                 log.info("UDTs excluded");
         }
 
-        if (udtsBySchema == null)
-            udtsBySchema = new LinkedHashMap<>();
-
-        return filterSchema(udts, schema, udtsBySchema);
-    }
-
-    private final List ifInPackage(List allUDTs, boolean expected) {
-        List result = new ArrayList<>();
-
-        for (UDTDefinition u : allUDTs)
-            if ((u.getPackage() != null) == expected)
-                result.add(u);
-
-        return result;
+        return udts;
     }
 
     @Override
     public final List getUDTs(SchemaDefinition schema) {
-        return getAllUDTs(schema);
+        if (udtsBySchema == null)
+            udtsBySchema = new LinkedHashMap<>();
+
+        return filterSchema(getUDTs(), schema, udtsBySchema);
     }
 
     @Override
@@ -2286,7 +2278,10 @@ public abstract class AbstractDatabase implements Database {
 
     @Override
     public final List getUDTs(PackageDefinition pkg) {
-        return ifInPackage(getAllUDTs(pkg.getSchema()), true);
+        if (udtsByPackage == null)
+            udtsByPackage = new LinkedHashMap<>();
+
+        return filterPackage(getUDTs(), pkg, udtsByPackage);
     }
 
     @Override
@@ -2465,7 +2460,29 @@ public abstract class AbstractDatabase implements Database {
         List result = new ArrayList<>();
 
         for (T definition : definitions)
-            if (definition.getSchema().equals(schema))
+            if (definition.getSchema() != null && definition.getSchema().equals(schema))
+                result.add(definition);
+
+        return result;
+    }
+
+    protected final  List filterPackage(List definitions, PackageDefinition pkg, Map> cache) {
+        List result = cache.get(pkg);
+
+        if (result == null)
+            cache.put(pkg, result = filterPackage(definitions, pkg));
+
+        return result;
+    }
+
+    protected final  List filterPackage(List definitions, PackageDefinition pkg) {
+        if (pkg == null)
+            return definitions;
+
+        List result = new ArrayList<>();
+
+        for (T definition : definitions)
+            if (definition.getPackage() != null && definition.getPackage().equals(pkg))
                 result.add(definition);
 
         return result;
diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java
index acf6117921..7ec1d0a03a 100644
--- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java
+++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDefinition.java
@@ -113,6 +113,7 @@ public abstract class AbstractDefinition implements Definition {
         return result;
     }
 
+    @Override
     public final PackageDefinition getPackage() {
         return pkg;
     }
diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/Database.java b/jOOQ-meta/src/main/java/org/jooq/meta/Database.java
index 96d655a60c..f4b8c52032 100644
--- a/jOOQ-meta/src/main/java/org/jooq/meta/Database.java
+++ b/jOOQ-meta/src/main/java/org/jooq/meta/Database.java
@@ -249,6 +249,11 @@ public interface Database extends AutoCloseable {
      */
     DomainDefinition getDomain(SchemaDefinition schema, Name name, boolean ignoreCase);
 
+    /**
+     * The UDTs defined in this database.
+     */
+    List getUDTs();
+
     /**
      * The UDTs defined in this database.
      */
diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/Definition.java b/jOOQ-meta/src/main/java/org/jooq/meta/Definition.java
index f1d00343be..dbe33c882c 100644
--- a/jOOQ-meta/src/main/java/org/jooq/meta/Definition.java
+++ b/jOOQ-meta/src/main/java/org/jooq/meta/Definition.java
@@ -66,6 +66,12 @@ public interface Definition {
      */
     SchemaDefinition getSchema();
 
+    /**
+     * @return The package of this object or null if this object is
+     *         not contained in a package.
+     */
+    PackageDefinition getPackage();
+
     /**
      * @return The name of this object, e.g. [my_table]. This corresponds to
      *         {@link #getInputName()}