diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGenerator.java index 5dd26fcd43..9deaea7f14 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/DefaultGenerator.java @@ -41,8 +41,6 @@ import static java.util.Arrays.asList; import static org.jooq.util.GenerationUtil.convertToJavaIdentifier; import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; import java.lang.reflect.TypeVariable; import java.sql.Connection; import java.util.ArrayList; @@ -116,8 +114,12 @@ public class DefaultGenerator extends AbstractGenerator { StopWatch watch = new StopWatch(); + Database database; + @Override - public void generate(Database database) throws IOException { + public void generate(Database db) { + + this.database = db; log.info("Database parameters"); log.info("----------------------------------------------------------"); @@ -150,7 +152,7 @@ public class DefaultGenerator extends AbstractGenerator { // ---------------------------------------------------------------------- // XXX Initialising // ---------------------------------------------------------------------- - log.info("Emptying", targetPackageDir.getCanonicalPath()); + log.info("Emptying", targetPackageDir.getAbsolutePath()); empty(targetPackageDir); // ---------------------------------------------------------------------- @@ -158,1626 +160,940 @@ public class DefaultGenerator extends AbstractGenerator { // ---------------------------------------------------------------------- log.info("Generating schemata", "Total: " + database.getSchemata().size()); for (SchemaDefinition schema : database.getSchemata()) { - generate(database, schema); + try { + generate(schema); + } + catch (Exception e) { + throw new GeneratorException("Error generating code for schema " + schema, e); + } } } - private void generate( - Database database, - SchemaDefinition schema) throws IOException { + GenerationWriter outS = null; + GenerationWriter outF = null; + + protected void generate(SchemaDefinition schema) { File targetSchemaDir = strategy.getFile(schema).getParentFile(); - GenerationWriter outS = null; - GenerationWriter outF = null; - if (!schema.isDefaultSchema()) { - - // Generating the schema - // ----------------------------------------------------------------- - log.info("Generating schema", strategy.getFileName(schema)); - log.info("----------------------------------------------------------"); - - outS = new GenerationWriter(strategy.getFile(schema)); - printHeader(outS, schema); - printClassJavadoc(outS, schema); - - outS.print("public class "); - outS.print(strategy.getJavaClassName(schema)); - outS.print(" extends "); - outS.print(SchemaImpl.class); - printImplements(outS, schema, Mode.DEFAULT); - outS.println(" {"); - outS.printSerial(); - outS.println(); - outS.println("\t/**"); - outS.println("\t * The singleton instance of " + schema.getQualifiedOutputName()); - outS.println("\t */"); - outS.println("\tpublic static final " + strategy.getJavaClassName(schema) + " " + strategy.getJavaIdentifier(schema) + " = new " + strategy.getJavaClassName(schema) + "();"); - - outS.println(); - printNoFurtherInstancesAllowedJavadoc(outS); - outS.println("\tprivate " + strategy.getJavaClassName(schema) + "() {"); - outS.println("\t\tsuper(\"" + schema.getOutputName() + "\");"); - outS.println("\t}"); - - outS.printInitialisationStatementsPlaceholder(); - - // Generating the factory - // ----------------------------------------------------------------- - log.info("Generating factory", strategy.getFileName(schema, Mode.FACTORY)); - - outF = new GenerationWriter(strategy.getFile(schema, Mode.FACTORY)); - printHeader(outF, schema); - printClassJavadoc(outF, - "A Factory for specific use with the " + schema.getOutputName() + - " schema.\n

\nThis Factory will not render the " + schema.getOutputName() + - " schema's schema name in rendered SQL (assuming that you use it as the default schema on your connection!). Use the more generic {@link " + - database.getDialect().getFactory().getName() + - "} or the {@link " + Factory.class.getName() + "} instead, if you want to fully qualify tables, routines, etc."); - - outF.print("public class "); - outF.print(strategy.getJavaClassName(schema, Mode.FACTORY)); - outF.print(" extends "); - outF.print(database.getDialect().getFactory()); - printImplements(outF, schema, Mode.FACTORY); - outF.println(" {"); - outF.printSerial(); - - outF.println(); - outF.println("\t/**"); - outF.println("\t * Create a factory with a connection"); - outF.println("\t *"); - outF.println("\t * @param connection The connection to use with objects created from this factory"); - outF.println("\t */"); - outF.print("\tpublic "); - outF.print(strategy.getJavaClassName(schema, Mode.FACTORY)); - outF.print("("); - outF.print(Connection.class); - outF.println(" connection) {"); - outF.println("\t\tsuper(connection);"); - outF.println(); - outF.println("\t\tinitDefaultSchema();"); - outF.println("\t}"); - - if (generateDeprecated()) { - outF.println(); - outF.println("\t/**"); - outF.println("\t * Create a factory with a connection and a schema mapping"); - outF.println("\t * "); - outF.print("\t * @deprecated - 2.0.5 - Use {@link #"); - outF.print(strategy.getJavaClassName(schema, Mode.FACTORY)); - outF.print("("); - outF.print(Connection.class); - outF.print(", "); - outF.print(Settings.class); - outF.println(")} instead"); - outF.println("\t */"); - outF.println("\t@Deprecated"); - outF.print("\tpublic "); - outF.print(strategy.getJavaClassName(schema, Mode.FACTORY)); - outF.print("("); - outF.print(Connection.class); - outF.println(" connection, org.jooq.SchemaMapping mapping) {"); - outF.println("\t\tsuper(connection, mapping);"); - outF.println(); - outF.println("\t\tinitDefaultSchema();"); - outF.println("\t}"); - } - - outF.println(); - outF.println("\t/**"); - outF.println("\t * Create a factory with a connection and some settings"); - outF.println("\t *"); - outF.println("\t * @param connection The connection to use with objects created from this factory"); - outF.println("\t * @param settings The settings to apply to objects created from this factory"); - outF.println("\t */"); - outF.print("\tpublic "); - outF.print(strategy.getJavaClassName(schema, Mode.FACTORY)); - outF.print("("); - outF.print(Connection.class); - outF.print(" connection, "); - outF.print(Settings.class); - outF.println(" settings) {"); - outF.println("\t\tsuper(connection, settings);"); - outF.println(); - outF.println("\t\tinitDefaultSchema();"); - outF.println("\t}"); - - // [#1315] schema-specific factories override the default schema - outF.println(); - outF.println("\t/**"); - outF.println("\t * Initialise the render mapping's default schema."); - outF.println("\t *

"); - outF.println("\t * For convenience, this schema-specific factory should override any pre-existing setting"); - outF.println("\t */"); - outF.println("\tprivate final void initDefaultSchema() {"); - outF.print("\t\t"); - outF.print(SettingsTools.class); - outF.print(".getRenderMapping(getSettings()).setDefaultSchema("); - outF.print(strategy.getFullJavaIdentifier(schema)); - outF.println(".getName());"); - outF.println("\t}"); - - watch.splitInfo("Schema generated"); + generateSchema(schema); } - // ---------------------------------------------------------------------- - // XXX Generating sequences - // ---------------------------------------------------------------------- if (database.getSequences(schema).size() > 0) { - log.info("Generating sequences"); - - GenerationWriter out = new GenerationWriter(new File(targetSchemaDir, "Sequences.java")); - printHeader(out, schema); - printClassJavadoc(out, "Convenience access to all sequences in " + schema.getOutputName()); - out.println("public final class Sequences {"); - - for (SequenceDefinition sequence : database.getSequences(schema)) { - out.println(); - out.println("\t/**"); - out.println("\t * The sequence " + sequence.getQualifiedOutputName()); - out.println("\t */"); - - out.print("\tpublic static final "); - out.print(Sequence.class); - out.print("<"); - out.print(getJavaType(sequence.getType())); - out.print(">"); - out.print(" "); - out.print(strategy.getJavaIdentifier(sequence)); - out.print(" = new "); - out.print(SequenceImpl.class); - out.print("<"); - out.print(getJavaType(sequence.getType())); - out.print(">"); - out.print("(\""); - out.print(sequence.getOutputName()); - out.print("\""); - - if (!schema.isDefaultSchema()) { - out.print(", "); - out.print(strategy.getFullJavaIdentifier(schema)); - } else { - out.print(", null"); - } - - out.print(", "); - out.print(getJavaTypeReference(sequence.getDatabase(), sequence.getType())); - - out.println(");"); - } - - printPrivateConstructor(out, "Sequences"); - out.println("}"); - out.close(); - - registerInSchema(outS, database.getSequences(schema), Sequence.class, true); - watch.splitInfo("Sequences generated"); + generateSequences(schema, targetSchemaDir); } - // --------------------------------------------------------------------- - // XXX Generating master data tables - // --------------------------------------------------------------------- if (database.getMasterDataTables(schema).size() > 0) { - log.info("Generating master data"); - - for (MasterDataTableDefinition table : database.getMasterDataTables(schema)) { - try { - log.info("Generating table", strategy.getFileName(table)); - - GenerationWriter out = new GenerationWriter(strategy.getFile(table)); - printHeader(out, table); - printClassJavadoc(out, table); - - ColumnDefinition pk = table.getPrimaryKeyColumn(); - ColumnDefinition l = table.getLiteralColumn(); - ColumnDefinition d = table.getDescriptionColumn(); - - Result data = table.getData(); - - out.print("public enum "); - out.print(strategy.getJavaClassName(table)); - printImplements(out, table, Mode.ENUM, - MasterDataType.class.getName() + "<" + getJavaType(pk.getType()) + ">"); - out.println(" {"); - - Set columns = - new LinkedHashSet(Arrays.asList(pk, l, d)); - - - for (Record record : data) { - String literal = record.getValueAsString(l.getName()); - String description = record.getValueAsString(d.getName()); - - if (!StringUtils.isEmpty(description)) { - out.println(); - out.println("\t/**"); - out.println("\t * " + description); - out.println("\t */"); - } - - out.print("\t"); - out.print(GenerationUtil.convertToJavaIdentifier(literal)); - out.print("("); - - String separator = ""; - for (ColumnDefinition column : columns) { - out.print(separator); - out.printNewJavaObject(getJavaType(column.getType()), record.getValue(column.getName())); - - separator = ", "; - } - - out.println("),"); - } - - out.println("\t;"); - out.println(); - - // Fields - for (ColumnDefinition column : columns) { - out.print("\tprivate final "); - out.print(getJavaType(column.getType())); - out.print(" "); - out.println(strategy.getJavaMemberName(column) + ";"); - } - - // Constructor - out.println(); - out.print("\tprivate " + strategy.getJavaClassName(table) + "("); - - String separator = ""; - for (ColumnDefinition column : columns) { - out.print(separator); - out.print(getJavaType(column.getType())); - out.print(" "); - out.print(strategy.getJavaMemberName(column)); - - separator = ", "; - } - - out.println(") {"); - for (ColumnDefinition column : columns) { - out.print("\t\tthis."); - out.print(strategy.getJavaMemberName(column)); - out.print(" = "); - out.print(strategy.getJavaMemberName(column)); - out.println(";"); - } - out.println("\t}"); - - // Implementation methods - out.println(); - printOverride(out); - out.print("\tpublic "); - out.print(getJavaType(pk.getType())); - out.println(" getPrimaryKey() {"); - out.println("\t\treturn " + strategy.getJavaMemberName(pk) + ";"); - out.println("\t}"); - - // Getters - for (ColumnDefinition column : columns) { - printFieldJavaDoc(out, column); - out.print("\tpublic final "); - out.print(getJavaType(column.getType())); - out.print(" "); - out.print(strategy.getJavaGetterName(column, Mode.DEFAULT)); - out.println("() {"); - out.print("\t\treturn "); - out.print(strategy.getJavaMemberName(column)); - out.println(";"); - out.println("\t}"); - } - - out.println("}"); - out.close(); - } catch (Exception e) { - log.error("Exception while generating master data table " + table, e); - } - } - - watch.splitInfo("Master data generated"); + generateMasterTables(schema); } - // ---------------------------------------------------------------------- - // XXX Generating tables - // ---------------------------------------------------------------------- - if (database.getTables(schema).size() > 0) { - log.info("Generating tables"); - - for (TableDefinition table : database.getTables(schema)) { - try { - log.info("Generating table", strategy.getFileName(table)); - - GenerationWriter out = new GenerationWriter(strategy.getFile(table)); - printHeader(out, table); - printClassJavadoc(out, table); - - Class baseClass; - if (generateRelations() && table.getMainUniqueKey() != null) { - baseClass = UpdatableTableImpl.class; - } else { - baseClass = TableImpl.class; - } - - out.print("public class "); - out.print(strategy.getJavaClassName(table)); - out.print(" extends "); - out.print(baseClass); - out.print("<"); - out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); - out.print(">"); - printImplements(out, table, Mode.DEFAULT); - out.println(" {"); - out.printSerial(); - printSingletonInstance(table, out); - printRecordTypeMethod(table, out); - - for (ColumnDefinition column : table.getColumns()) { - printTableColumn(out, column, table); - } - - // [#1255] With instance fields, the table constructor may - // be public, as tables are no longer singletons - out.println(); - if (generateInstanceFields()) { - out.print("\tpublic "); - } - else { - printNoFurtherInstancesAllowedJavadoc(out); - out.print("\tprivate "); - } - out.println(strategy.getJavaClassName(table) + "() {"); - - if (!schema.isDefaultSchema()) { - out.println("\t\tsuper(\"" + table.getOutputName() + "\", " + strategy.getFullJavaIdentifier(schema) + ");"); - } else { - out.println("\t\tsuper(\"" + table.getOutputName() + "\");"); - } - - out.println("\t}"); - - // [#117] With instance fields, it makes sense to create a - // type-safe table alias - // [#1255] With instance fields, the table constructor may - // be public, as tables are no longer singletons - if (generateInstanceFields()) { - out.println(); - out.print("\tpublic "); - out.print(strategy.getJavaClassName(table)); - out.print("("); - out.print(String.class); - out.println(" alias) {"); - - out.print("\t\tsuper(alias, "); - out.print(strategy.getFullJavaIdentifier(schema)); - out.print(", "); - out.print(strategy.getFullJavaIdentifier(table)); - out.println(");"); - out.println("\t}"); - } - - // Add primary / unique / foreign key information - if (generateRelations()) { - IdentityDefinition identity = table.getIdentity(); - - // The identity column - if (identity != null) { - out.println(); - - out.println("\t@Override"); - out.print("\tpublic "); - out.print(Identity.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); - out.print(", "); - out.print(getJavaType(identity.getColumn().getType())); - out.println("> getIdentity() {"); - - out.print("\t\treturn "); - out.print(strategy.getFullJavaIdentifier(identity)); - out.println(";"); - - out.println("\t}"); - } - - UniqueKeyDefinition mainKey = table.getMainUniqueKey(); - - // The primary / main unique key - if (mainKey != null) { - out.println(); - - out.println("\t@Override"); - out.print("\tpublic "); - out.print(UniqueKey.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); - out.println("> getMainKey() {"); - - out.print("\t\treturn "); - out.print(strategy.getFullJavaIdentifier(mainKey)); - out.println(";"); - - out.println("\t}"); - } - - // The remaining unique keys - List uniqueKeys = table.getUniqueKeys(); - if (uniqueKeys.size() > 0) { - out.println(); - out.println("\t@Override"); - out.println("\t@SuppressWarnings(\"unchecked\")"); - - out.print("\tpublic "); - out.print(List.class); - out.print("<"); - out.print(UniqueKey.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); - out.println(">> getKeys() {"); - - out.print("\t\treturn "); - out.print(Arrays.class); - out.print(".<"); - out.print(UniqueKey.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); - out.print(">>asList("); - - String separator = ""; - for (UniqueKeyDefinition uniqueKey : uniqueKeys) { - out.print(separator); - out.print(strategy.getFullJavaIdentifier(uniqueKey)); - - separator = ", "; - } - - out.println(");"); - out.println("\t}"); - } - - // Foreign keys - List foreignKeys = table.getForeignKeys(); - if (foreignKeys.size() > 0) { - out.println(); - out.println("\t@Override"); - out.println("\t@SuppressWarnings(\"unchecked\")"); - - out.print("\tpublic "); - out.print(List.class); - out.print("<"); - out.print(ForeignKey.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); - out.println(", ?>> getReferences() {"); - - out.print("\t\treturn "); - out.print(Arrays.class); - out.print(".<"); - out.print(ForeignKey.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); - out.print(", ?>>asList("); - - String separator = ""; - for (ForeignKeyDefinition foreignKey : foreignKeys) { - TableDefinition referencedTable = foreignKey.getReferencedTable(); - - // Skip master data foreign keys - if (referencedTable instanceof MasterDataTableDefinition) { - continue; - } - - out.print(separator); - out.print(strategy.getFullJavaIdentifier(foreignKey)); - - separator = ", "; - } - - out.println(");"); - out.println("\t}"); - } - } - - // [#117] With instance fields, it makes sense to create a - // type-safe table alias - if (generateInstanceFields()) { - out.println(); - out.println("\t@Override"); - out.print("\tpublic "); - out.print(strategy.getFullJavaClassName(table)); - out.print(" as("); - out.print(String.class); - out.println(" alias) {"); - - out.print("\t\treturn new "); - out.print(strategy.getFullJavaClassName(table)); - out.println("(alias);"); - out.println("\t}"); - } - - out.printStaticInitialisationStatementsPlaceholder(); - out.println("}"); - out.close(); - } - catch (Exception e) { - log.error("Error while generating table " + table, e); - } - } - - registerInSchema(outS, database.getTables(schema), Table.class, true); - watch.splitInfo("Tables generated"); + generateTables(schema); } - // ---------------------------------------------------------------------- - // XXX Generating table POJOs (courtesy of Marcel Bichon) - // ---------------------------------------------------------------------- - if (generatePojos() && database.getTables(schema).size() > 0) { - log.info("Generating table POJOs"); - - for (TableDefinition table : database.getTables(schema)) { - try { - log.info("Generating table POJO", strategy.getFileName(table, Mode.POJO)); - - GenerationWriter out = new GenerationWriter(strategy.getFile(table, Mode.POJO)); - printHeader(out, table, Mode.POJO); - printClassJavadoc(out, table); - printTableJPAAnnotation(out, table); - - out.print("public class "); - out.print(strategy.getJavaClassName(table, Mode.POJO)); - printExtends(out, table, Mode.POJO); - printImplements(out, table, Mode.POJO); - out.print(" {"); - out.println(); - out.printSerial(); - - out.println(); - - int maxLength = 0; - for (ColumnDefinition column : table.getColumns()) { - maxLength = Math.max(maxLength, getJavaType(column.getType()).length()); - } - - for (ColumnDefinition column : table.getColumns()) { - printColumnValidationAnnotation(out, column); - - out.print("\tprivate "); - out.print(StringUtils.rightPad(getJavaType(column.getType()), maxLength)); - out.print(" "); - out.print(convertToJavaIdentifier(strategy.getJavaMemberName(column, Mode.POJO))); - out.println(";"); - } - - for (ColumnDefinition column : table.getColumns()) { - - // Getter - out.println(); - printColumnJPAAnnotation(out, column); - - if (generateInterfaces()) { - printOverride(out); - } - - out.print("\tpublic "); - out.print(getJavaType(column.getType())); - out.print(" "); - out.print(strategy.getJavaGetterName(column, Mode.POJO)); - out.println("() {"); - - out.print("\t\treturn this."); - out.print(convertToJavaIdentifier(strategy.getJavaMemberName(column, Mode.POJO))); - out.println(";"); - out.println("\t}"); - - // Setter - out.println(); - - if (generateInterfaces()) { - printOverride(out); - } - - out.print("\tpublic void "); - out.print(strategy.getJavaSetterName(column, Mode.POJO)); - out.print("("); - out.print(getJavaType(column.getType())); - out.print(" "); - out.print(convertToJavaIdentifier(strategy.getJavaMemberName(column, Mode.POJO))); - out.println(") {"); - - out.print("\t\tthis."); - out.print(convertToJavaIdentifier(strategy.getJavaMemberName(column, Mode.POJO))); - out.print(" = "); - out.print(convertToJavaIdentifier(strategy.getJavaMemberName(column, Mode.POJO))); - out.println(";"); - out.println("\t}"); - } - - out.println("}"); - out.close(); - } - catch (Exception e) { - log.error("Error while generating table POJO " + table, e); - } - } - - watch.splitInfo("Table POJOs generated"); + generatePojos(schema); } - // ---------------------------------------------------------------------- - // XXX Generating table DAOs - // ---------------------------------------------------------------------- - if (generateDaos() && database.getTables(schema).size() > 0) { - log.info("Generating DAOs"); - - for (TableDefinition table : database.getTables(schema)) { - try { - String tType = "Void"; - String pType = strategy.getFullJavaClassName(table, Mode.POJO); - - UniqueKeyDefinition key = table.getMainUniqueKey(); - ColumnDefinition keyColumn = null; - - if (key != null) { - List columns = key.getKeyColumns(); - - if (columns.size() == 1) { - keyColumn = columns.get(0); - tType = getJavaType(keyColumn.getType()); - } - } - - // Skip DAOs for tables that don't have 1-column-PKs (for now) - if (keyColumn == null) { - log.info("Skipping DAO generation", strategy.getFileName(table, Mode.DAO)); - continue; - } - else { - log.info("Generating DAO", strategy.getFileName(table, Mode.DAO)); - } - - GenerationWriter out = new GenerationWriter(strategy.getFile(table, Mode.DAO)); - printHeader(out, table, Mode.DAO); - printClassJavadoc(out, table); - - out.print("public class "); - out.print(strategy.getJavaClassName(table, Mode.DAO)); - // printExtends(out, table, Mode.DAO); - // printImplements(out, table, Mode.DAO); - out.print(" extends "); - out.print(DAOImpl.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); - out.print(", "); - out.print(pType); - out.print(", "); - out.print(tType); - out.println("> {"); - out.println(); - - // Default constructor - // ------------------- - printJavadoc(out, "Create a new " - + strategy.getJavaClassName(table, Mode.DAO) - + " without any factory"); - out.print("\tpublic "); - out.print(strategy.getJavaClassName(table, Mode.DAO)); - out.println("() {"); - out.print("\t\tsuper("); - out.print(strategy.getFullJavaIdentifier(table)); - out.print(", "); - out.print(strategy.getFullJavaClassName(table, Mode.POJO)); - out.println(".class);"); - out.println("\t}"); - out.println(); - - // Initialising constructor - // ------------------------ - printJavadoc(out, "Create a new " - + strategy.getJavaClassName(table, Mode.DAO) - + " with an attached factory"); - out.print("\tpublic "); - out.print(strategy.getJavaClassName(table, Mode.DAO)); - out.print("("); - out.print(Factory.class); - out.println(" factory) {"); - out.print("\t\tsuper("); - out.print(strategy.getFullJavaIdentifier(table)); - out.print(", "); - out.print(strategy.getFullJavaClassName(table, Mode.POJO)); - out.println(".class, factory);"); - out.println("\t}"); - out.println(); - - // Template method implementations - // ------------------------------- - printOverride(out); - out.print("\tprotected "); - out.print(tType); - out.print(" getId("); - out.print(strategy.getFullJavaClassName(table, Mode.POJO)); - out.println(" object) {"); - out.print("\t\treturn object."); - out.print(strategy.getJavaGetterName(keyColumn, Mode.POJO)); - out.println("();"); - out.println("\t}"); - - out.println("}"); - out.close(); - } - catch (Exception e) { - log.error("Error while generating table DAO " + table, e); - } - } - - watch.splitInfo("Table DAOs generated"); + generateDaos(schema); } - // ---------------------------------------------------------------------- - // XXX Generating central static table access - // ---------------------------------------------------------------------- - if (database.getTables(schema).size() > 0) { - log.info("Generating table references"); - - GenerationWriter out = new GenerationWriter(new File(targetSchemaDir, "Tables.java")); - printHeader(out, schema); - printClassJavadoc(out, "Convenience access to all tables in " + schema.getOutputName()); - out.println("public final class Tables {"); - - for (TableDefinition table : database.getTables(schema)) { - out.println(); - out.println("\t/**"); - - if (!StringUtils.isBlank(table.getComment())) { - out.println("\t * " + table.getComment()); - } - else { - out.println("\t * The table " + table.getQualifiedOutputName()); - } - - out.println("\t */"); - - out.print("\tpublic static "); - out.print(strategy.getFullJavaClassName(table)); - out.print(" "); - out.print(strategy.getJavaIdentifier(table)); - out.print(" = "); - out.print(strategy.getFullJavaIdentifier(table)); - out.println(";"); - } - - printPrivateConstructor(out, "Tables"); - out.println("}"); - out.close(); - - watch.splitInfo("Table references generated"); + generateTableReferences(schema, targetSchemaDir); } - // ---------------------------------------------------------------------- - // XXX Generating relations - // ---------------------------------------------------------------------- if (generateRelations() && database.getTables(schema).size() > 0) { - log.info("Generating Keys"); + generateRelations(schema, targetSchemaDir); + } - GenerationWriter out = new GenerationWriter(new File(targetSchemaDir, "Keys.java")); - printHeader(out, schema); - printClassJavadoc(out, - "A class modelling foreign key relationships between tables of the " + schema.getOutputName() + " schema"); + if (generateRecords() && database.getTables(schema).size() > 0) { + generateRecords(schema); + } - out.println("public class Keys {"); - out.println(); - out.println("\t// IDENTITY definitions"); + if (generateInterfaces() && database.getTables(schema).size() > 0) { + generateInterfaces(schema); + } - // [#1459] Prevent large static initialisers by splitting nested classes - final int INITIALISER_SIZE = 500; - List allIdentities = new ArrayList(); - List allUniqueKeys = new ArrayList(); - List allForeignKeys = new ArrayList(); + if (database.getUDTs(schema).size() > 0) { + generateUDTs(schema); + } - for (TableDefinition table : database.getTables(schema)) { - try { - IdentityDefinition identity = table.getIdentity(); + if (database.getUDTs(schema).size() > 0) { + generateUDTDefinitions(schema); + } - if (identity != null) { - out.print("\tpublic static final "); - out.print(Identity.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(identity.getColumn().getContainer(), Mode.RECORD)); - out.print(", "); - out.print(getJavaType(identity.getColumn().getType())); - out.print("> IDENTITY_"); - out.print(strategy.getJavaIdentifier(identity.getColumn().getContainer())); - out.print(" = Identities"); - out.print(allIdentities.size() / INITIALISER_SIZE); - out.print(".IDENTITY_"); - out.print(strategy.getJavaIdentifier(identity.getColumn().getContainer())); - out.println(";"); + if (database.getUDTs(schema).size() > 0) { + generateUDTRoutines(schema); + } - allIdentities.add(identity); - } - } - catch (Exception e) { - log.error("Error while generating table " + table, e); + if (database.getUDTs(schema).size() > 0) { + generateUDTReferences(schema, targetSchemaDir); + } + + if (database.getArrays(schema).size() > 0) { + generateArrays(schema); + } + + if (database.getEnums(schema).size() > 0) { + generateEnums(schema); + } + + if (database.getRoutines(schema).size() > 0) { + generateRoutines(schema, targetSchemaDir); + } + + if (database.getPackages(schema).size() > 0) { + generatePackages(schema); + } + + close(); + + // XXX [#651] Refactoring-cursor + watch.splitInfo("GENERATION FINISHED!"); + } + + protected void generateRelations(SchemaDefinition schema, File targetSchemaDir) { + log.info("Generating Keys"); + + GenerationWriter out = new GenerationWriter(new File(targetSchemaDir, "Keys.java")); + printHeader(out, schema); + printClassJavadoc(out, + "A class modelling foreign key relationships between tables of the " + schema.getOutputName() + " schema"); + + out.println("public class Keys {"); + out.println(); + out.println("\t// IDENTITY definitions"); + + // [#1459] Prevent large static initialisers by splitting nested classes + final int INITIALISER_SIZE = 500; + List allIdentities = new ArrayList(); + List allUniqueKeys = new ArrayList(); + List allForeignKeys = new ArrayList(); + + for (TableDefinition table : database.getTables(schema)) { + try { + IdentityDefinition identity = table.getIdentity(); + + if (identity != null) { + out.print("\tpublic static final "); + out.print(Identity.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(identity.getColumn().getContainer(), Mode.RECORD)); + out.print(", "); + out.print(getJavaType(identity.getColumn().getType())); + out.print("> IDENTITY_"); + out.print(strategy.getJavaIdentifier(identity.getColumn().getContainer())); + out.print(" = Identities"); + out.print(allIdentities.size() / INITIALISER_SIZE); + out.print(".IDENTITY_"); + out.print(strategy.getJavaIdentifier(identity.getColumn().getContainer())); + out.println(";"); + + allIdentities.add(identity); } } + catch (Exception e) { + log.error("Error while generating table " + table, e); + } + } - // Unique keys - out.println(); - out.println("\t// UNIQUE and PRIMARY KEY definitions"); + // Unique keys + out.println(); + out.println("\t// UNIQUE and PRIMARY KEY definitions"); - for (TableDefinition table : database.getTables(schema)) { - try { - List uniqueKeys = table.getUniqueKeys(); + for (TableDefinition table : database.getTables(schema)) { + try { + List uniqueKeys = table.getUniqueKeys(); - for (UniqueKeyDefinition uniqueKey : uniqueKeys) { - out.print("\tpublic static final "); - out.print(UniqueKey.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(uniqueKey.getTable(), Mode.RECORD)); - out.print("> "); - out.print(strategy.getJavaIdentifier(uniqueKey)); - out.print(" = UniqueKeys"); - out.print(allUniqueKeys.size() / INITIALISER_SIZE); - out.print("."); - out.print(strategy.getJavaIdentifier(uniqueKey)); - out.println(";"); + for (UniqueKeyDefinition uniqueKey : uniqueKeys) { + out.print("\tpublic static final "); + out.print(UniqueKey.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(uniqueKey.getTable(), Mode.RECORD)); + out.print("> "); + out.print(strategy.getJavaIdentifier(uniqueKey)); + out.print(" = UniqueKeys"); + out.print(allUniqueKeys.size() / INITIALISER_SIZE); + out.print("."); + out.print(strategy.getJavaIdentifier(uniqueKey)); + out.println(";"); - allUniqueKeys.add(uniqueKey); - } - } - catch (Exception e) { - log.error("Error while generating table " + table, e); + allUniqueKeys.add(uniqueKey); } } - - // Foreign keys - out.println(); - out.println("\t// FOREIGN KEY definitions"); - - for (TableDefinition table : database.getTables(schema)) { - try { - List foreignKeys = table.getForeignKeys(); - - for (ForeignKeyDefinition foreignKey : foreignKeys) { - - // Skip master data foreign keys - if (foreignKey.getReferencedTable() instanceof MasterDataTableDefinition) { - continue; - } - - out.print("\tpublic static final "); - out.print(ForeignKey.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(foreignKey.getKeyTable(), Mode.RECORD)); - out.print(", "); - out.print(strategy.getFullJavaClassName(foreignKey.getReferencedTable(), Mode.RECORD)); - out.print("> "); - out.print(strategy.getJavaIdentifier(foreignKey)); - out.print(" = ForeignKeys"); - out.print(allForeignKeys.size() / INITIALISER_SIZE); - out.print("."); - out.print(strategy.getJavaIdentifier(foreignKey)); - out.println(";"); - - allForeignKeys.add(foreignKey); - } - } - catch (Exception e) { - log.error("Error while generating reference " + table, e); - } + catch (Exception e) { + log.error("Error while generating table " + table, e); } + } - printPrivateConstructor(out, "Keys"); + // Foreign keys + out.println(); + out.println("\t// FOREIGN KEY definitions"); - // [#1459] Print nested classes for actual static field initialisations - // keeping top-level initialiser small - int identityCounter = 0; - int uniqueKeyCounter = 0; - int foreignKeyCounter = 0; + for (TableDefinition table : database.getTables(schema)) { + try { + List foreignKeys = table.getForeignKeys(); - // Identities - // ---------- + for (ForeignKeyDefinition foreignKey : foreignKeys) { - for (IdentityDefinition identity : allIdentities) { - - // Print new nested class - if (identityCounter % INITIALISER_SIZE == 0) { - if (identityCounter > 0) { - out.println("\t}"); + // Skip master data foreign keys + if (foreignKey.getReferencedTable() instanceof MasterDataTableDefinition) { + continue; } - out.println(); - out.println("\t@SuppressWarnings(\"hiding\")"); - out.print("\tprivate static class Identities"); - out.print(identityCounter / INITIALISER_SIZE); - out.print(" extends "); - out.print(AbstractKeys.class); - out.println(" {"); + out.print("\tpublic static final "); + out.print(ForeignKey.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(foreignKey.getKeyTable(), Mode.RECORD)); + out.print(", "); + out.print(strategy.getFullJavaClassName(foreignKey.getReferencedTable(), Mode.RECORD)); + out.print("> "); + out.print(strategy.getJavaIdentifier(foreignKey)); + out.print(" = ForeignKeys"); + out.print(allForeignKeys.size() / INITIALISER_SIZE); + out.print("."); + out.print(strategy.getJavaIdentifier(foreignKey)); + out.println(";"); + + allForeignKeys.add(foreignKey); } - - out.print("\t\tpublic static "); - out.print(Identity.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(identity.getTable(), Mode.RECORD)); - out.print(", "); - out.print(getJavaType(identity.getColumn().getType())); - out.print("> "); - out.print(strategy.getJavaIdentifier(identity)); - out.print(" = createIdentity("); - out.print(strategy.getFullJavaIdentifier(identity.getColumn().getContainer())); - out.print(", "); - out.print(strategy.getFullJavaIdentifier(identity.getColumn())); - out.println(");"); - - identityCounter++; } + catch (Exception e) { + log.error("Error while generating reference " + table, e); + } + } + printPrivateConstructor(out, "Keys"); + + // [#1459] Print nested classes for actual static field initialisations + // keeping top-level initialiser small + int identityCounter = 0; + int uniqueKeyCounter = 0; + int foreignKeyCounter = 0; + + // Identities + // ---------- + + for (IdentityDefinition identity : allIdentities) { + generateIdentity(out, INITIALISER_SIZE, identityCounter, identity); + identityCounter++; + } + + if (identityCounter > 0) { + out.println("\t}"); + } + + // UniqueKeys + // ---------- + + for (UniqueKeyDefinition uniqueKey : allUniqueKeys) { + generateUniqueKey(out, INITIALISER_SIZE, uniqueKeyCounter, uniqueKey); + uniqueKeyCounter++; + } + + if (uniqueKeyCounter > 0) { + out.println("\t}"); + } + + // ForeignKeys + // ----------- + + for (ForeignKeyDefinition foreignKey : allForeignKeys) { + generateForeignKey(out, INITIALISER_SIZE, foreignKeyCounter, foreignKey); + foreignKeyCounter++; + } + + if (foreignKeyCounter > 0) { + out.println("\t}"); + } + + out.println("}"); + out.close(); + + watch.splitInfo("Keys generated"); + } + + protected void generateIdentity(GenerationWriter out, final int INITIALISER_SIZE, int identityCounter, + IdentityDefinition identity) { + // Print new nested class + if (identityCounter % INITIALISER_SIZE == 0) { if (identityCounter > 0) { out.println("\t}"); } - // UniqueKeys - // ---------- + out.println(); + out.println("\t@SuppressWarnings(\"hiding\")"); + out.print("\tprivate static class Identities"); + out.print(identityCounter / INITIALISER_SIZE); + out.print(" extends "); + out.print(AbstractKeys.class); + out.println(" {"); + } - for (UniqueKeyDefinition uniqueKey : allUniqueKeys) { - - // Print new nested class - if (uniqueKeyCounter % INITIALISER_SIZE == 0) { - if (uniqueKeyCounter > 0) { - out.println("\t}"); - } - - out.println(); - out.println("\t@SuppressWarnings({\"hiding\", \"unchecked\"})"); - out.print("\tprivate static class UniqueKeys"); - out.print(uniqueKeyCounter / INITIALISER_SIZE); - out.print(" extends "); - out.print(AbstractKeys.class); - out.println(" {"); - } - - out.print("\t\tpublic static final "); - out.print(UniqueKey.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(uniqueKey.getTable(), Mode.RECORD)); - out.print("> "); - out.print(strategy.getJavaIdentifier(uniqueKey)); - out.print(" = createUniqueKey("); - out.print(strategy.getFullJavaIdentifier(uniqueKey.getTable())); - out.print(", "); - - String separator = ""; - for (ColumnDefinition column : uniqueKey.getKeyColumns()) { - out.print(separator); - out.print(strategy.getFullJavaIdentifier(column)); - separator = ", "; - } - - out.println(");"); - - uniqueKeyCounter++; - } + out.print("\t\tpublic static "); + out.print(Identity.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(identity.getTable(), Mode.RECORD)); + out.print(", "); + out.print(getJavaType(identity.getColumn().getType())); + out.print("> "); + out.print(strategy.getJavaIdentifier(identity)); + out.print(" = createIdentity("); + out.print(strategy.getFullJavaIdentifier(identity.getColumn().getContainer())); + out.print(", "); + out.print(strategy.getFullJavaIdentifier(identity.getColumn())); + out.println(");"); + } + protected void generateUniqueKey(GenerationWriter out, final int INITIALISER_SIZE, int uniqueKeyCounter, + UniqueKeyDefinition uniqueKey) { + // Print new nested class + if (uniqueKeyCounter % INITIALISER_SIZE == 0) { if (uniqueKeyCounter > 0) { out.println("\t}"); } - // ForeignKeys - // ----------- + out.println(); + out.println("\t@SuppressWarnings({\"hiding\", \"unchecked\"})"); + out.print("\tprivate static class UniqueKeys"); + out.print(uniqueKeyCounter / INITIALISER_SIZE); + out.print(" extends "); + out.print(AbstractKeys.class); + out.println(" {"); + } - for (ForeignKeyDefinition foreignKey : allForeignKeys) { + out.print("\t\tpublic static final "); + out.print(UniqueKey.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(uniqueKey.getTable(), Mode.RECORD)); + out.print("> "); + out.print(strategy.getJavaIdentifier(uniqueKey)); + out.print(" = createUniqueKey("); + out.print(strategy.getFullJavaIdentifier(uniqueKey.getTable())); + out.print(", "); - // Print new nested class - if (foreignKeyCounter % INITIALISER_SIZE == 0) { - if (foreignKeyCounter > 0) { - out.println("\t}"); - } + String separator = ""; + for (ColumnDefinition column : uniqueKey.getKeyColumns()) { + out.print(separator); + out.print(strategy.getFullJavaIdentifier(column)); + separator = ", "; + } - out.println(); - out.println("\t@SuppressWarnings({\"hiding\", \"unchecked\"})"); - out.print("\tprivate static class ForeignKeys"); - out.print(foreignKeyCounter / INITIALISER_SIZE); - out.print(" extends "); - out.print(AbstractKeys.class); - out.println(" {"); - } - - out.print("\t\tpublic static final "); - out.print(ForeignKey.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(foreignKey.getKeyTable(), Mode.RECORD)); - out.print(", "); - out.print(strategy.getFullJavaClassName(foreignKey.getReferencedTable(), Mode.RECORD)); - out.print("> "); - out.print(strategy.getJavaIdentifier(foreignKey)); - out.print(" = createForeignKey("); - out.print(strategy.getFullJavaIdentifier(foreignKey.getReferencedKey())); - out.print(", "); - out.print(strategy.getFullJavaIdentifier(foreignKey.getKeyTable())); - out.print(", "); - - String separator = ""; - for (ColumnDefinition column : foreignKey.getKeyColumns()) { - out.print(separator); - out.print(strategy.getFullJavaIdentifier(column)); - separator = ", "; - } - - out.println(");"); - - foreignKeyCounter++; - } + out.println(");"); + } + protected void generateForeignKey(GenerationWriter out, final int INITIALISER_SIZE, int foreignKeyCounter, + ForeignKeyDefinition foreignKey) { + // Print new nested class + if (foreignKeyCounter % INITIALISER_SIZE == 0) { if (foreignKeyCounter > 0) { out.println("\t}"); } - out.println("}"); - out.close(); - - watch.splitInfo("Keys generated"); + out.println(); + out.println("\t@SuppressWarnings({\"hiding\", \"unchecked\"})"); + out.print("\tprivate static class ForeignKeys"); + out.print(foreignKeyCounter / INITIALISER_SIZE); + out.print(" extends "); + out.print(AbstractKeys.class); + out.println(" {"); } - // ---------------------------------------------------------------------- - // XXX Generating table records - // ---------------------------------------------------------------------- - if (generateRecords() && database.getTables(schema).size() > 0) { - log.info("Generating records"); + out.print("\t\tpublic static final "); + out.print(ForeignKey.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(foreignKey.getKeyTable(), Mode.RECORD)); + out.print(", "); + out.print(strategy.getFullJavaClassName(foreignKey.getReferencedTable(), Mode.RECORD)); + out.print("> "); + out.print(strategy.getJavaIdentifier(foreignKey)); + out.print(" = createForeignKey("); + out.print(strategy.getFullJavaIdentifier(foreignKey.getReferencedKey())); + out.print(", "); + out.print(strategy.getFullJavaIdentifier(foreignKey.getKeyTable())); + out.print(", "); - for (TableDefinition table : database.getTables(schema)) { - try { - log.info("Generating record", strategy.getFileName(table, Mode.RECORD)); + String separator = ""; + for (ColumnDefinition column : foreignKey.getKeyColumns()) { + out.print(separator); + out.print(strategy.getFullJavaIdentifier(column)); + separator = ", "; + } - GenerationWriter out = new GenerationWriter(strategy.getFile(table, Mode.RECORD)); - printHeader(out, table, Mode.RECORD); - printClassJavadoc(out, table); - printTableJPAAnnotation(out, table); + out.println(");"); + } - Class baseClass; + protected void generateRecords(SchemaDefinition schema) { + log.info("Generating records"); - if (generateRelations() && table.getMainUniqueKey() != null) { - baseClass = UpdatableRecordImpl.class; - } else { - baseClass = TableRecordImpl.class; - } - - out.print("public class "); - out.print(strategy.getJavaClassName(table, Mode.RECORD)); - out.print(" extends "); - out.print(baseClass); - out.print("<"); - out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); - out.print(">"); - printImplements(out, table, Mode.RECORD); - out.println(" {"); - out.printSerial(); - - for (ColumnDefinition column : table.getColumns()) { - printGetterAndSetter(out, column); - } - - out.println(); - out.println("\t/**"); - out.println("\t * Create a detached " + strategy.getJavaClassName(table, Mode.RECORD)); - out.println("\t */"); - out.println("\tpublic " + strategy.getJavaClassName(table, Mode.RECORD) + "() {"); - out.print("\t\tsuper("); - out.print(strategy.getFullJavaIdentifier(table)); - out.println(");"); - out.println("\t}"); - out.println("}"); - out.close(); - } catch (Exception e) { - log.error("Error while generating table record " + table, e); - } + for (TableDefinition table : database.getTables(schema)) { + try { + generateRecord(table); + } catch (Exception e) { + log.error("Error while generating table record " + table, e); } - - watch.splitInfo("Table records generated"); } - // ---------------------------------------------------------------------- - // XXX Generating table interfaces - // ---------------------------------------------------------------------- - if (generateInterfaces() && database.getTables(schema).size() > 0) { - log.info("Generating interfaces"); + watch.splitInfo("Table records generated"); + } - for (TableDefinition table : database.getTables(schema)) { - try { - log.info("Generating interface", strategy.getFileName(table, Mode.INTERFACE)); + protected void generateRecord(TableDefinition table) { + log.info("Generating record", strategy.getFileName(table, Mode.RECORD)); - GenerationWriter out = new GenerationWriter(strategy.getFile(table, Mode.INTERFACE)); - printHeader(out, table, Mode.INTERFACE); - printClassJavadoc(out, table); - printTableJPAAnnotation(out, table); + GenerationWriter out = new GenerationWriter(strategy.getFile(table, Mode.RECORD)); + printHeader(out, table, Mode.RECORD); + printClassJavadoc(out, table); + printTableJPAAnnotation(out, table); - out.print("public interface "); - out.print(strategy.getJavaClassName(table, Mode.INTERFACE)); - printImplements(out, table, Mode.INTERFACE); - out.println(" {"); + Class baseClass; - for (ColumnDefinition column : table.getColumns()) { - printGetterAndSetter(out, column, false); - } + if (generateRelations() && table.getMainUniqueKey() != null) { + baseClass = UpdatableRecordImpl.class; + } else { + baseClass = TableRecordImpl.class; + } - out.println("}"); - out.close(); - } catch (Exception e) { - log.error("Error while generating table record " + table, e); - } + out.print("public class "); + out.print(strategy.getJavaClassName(table, Mode.RECORD)); + out.print(" extends "); + out.print(baseClass); + out.print("<"); + out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); + out.print(">"); + printImplements(out, table, Mode.RECORD); + out.println(" {"); + out.printSerial(); + + for (ColumnDefinition column : table.getColumns()) { + printGetterAndSetter(out, column); + } + + out.println(); + out.println("\t/**"); + out.println("\t * Create a detached " + strategy.getJavaClassName(table, Mode.RECORD)); + out.println("\t */"); + out.println("\tpublic " + strategy.getJavaClassName(table, Mode.RECORD) + "() {"); + out.print("\t\tsuper("); + out.print(strategy.getFullJavaIdentifier(table)); + out.println(");"); + out.println("\t}"); + out.println("}"); + out.close(); + } + + protected void generateInterfaces(SchemaDefinition schema) { + log.info("Generating interfaces"); + + for (TableDefinition table : database.getTables(schema)) { + try { + generateInterface(table); + } catch (Exception e) { + log.error("Error while generating table record " + table, e); } - - watch.splitInfo("Table records generated"); } - // ---------------------------------------------------------------------- - // XXX Generating UDTs - // ---------------------------------------------------------------------- - if (database.getUDTs(schema).size() > 0) { - log.info("Generating UDTs"); + watch.splitInfo("Table records generated"); + } - for (UDTDefinition udt : database.getUDTs(schema)) { + protected void generateInterface(TableDefinition table) { + log.info("Generating interface", strategy.getFileName(table, Mode.INTERFACE)); + + GenerationWriter out = new GenerationWriter(strategy.getFile(table, Mode.INTERFACE)); + printHeader(out, table, Mode.INTERFACE); + printClassJavadoc(out, table); + printTableJPAAnnotation(out, table); + + out.print("public interface "); + out.print(strategy.getJavaClassName(table, Mode.INTERFACE)); + printImplements(out, table, Mode.INTERFACE); + out.println(" {"); + + for (ColumnDefinition column : table.getColumns()) { + printGetterAndSetter(out, column, false); + } + + out.println("}"); + out.close(); + } + + protected void generateUDTs(SchemaDefinition schema) { + log.info("Generating UDTs"); + + for (UDTDefinition udt : database.getUDTs(schema)) { + try { + generateUDT(schema, udt); + } catch (Exception e) { + log.error("Error while generating udt " + udt, e); + } + } + + registerInSchema(database.getUDTs(schema), UDT.class, true); + watch.splitInfo("UDTs generated"); + } + + protected void generateUDT(SchemaDefinition schema, UDTDefinition udt) { + log.info("Generating UDT ", strategy.getFileName(udt)); + + GenerationWriter out = new GenerationWriter(strategy.getFile(udt)); + printHeader(out, udt); + printClassJavadoc(out, udt); + + out.print("public class "); + out.print(strategy.getJavaClassName(udt)); + out.print(" extends "); + out.print(UDTImpl.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(udt, Mode.RECORD)); + out.print(">"); + + // [#799] Oracle UDTs with member procedures have similarities + // with packages + if (udt.getRoutines().size() > 0) { + printImplements(out, udt, Mode.DEFAULT, org.jooq.Package.class.getName()); + } + else { + printImplements(out, udt, Mode.DEFAULT); + } + + out.println(" {"); + out.printSerial(); + + printSingletonInstance(udt, out); + printRecordTypeMethod(udt, out); + + for (AttributeDefinition attribute : udt.getAttributes()) { + printUDTColumn(out, attribute, udt); + } + + // [#799] Oracle UDT's can have member procedures + for (RoutineDefinition routine : udt.getRoutines()) { + try { + if (!routine.isSQLUsable()) { + + // Static execute() convenience method + printConvenienceMethodProcedure(out, routine, false); + } + else { + + // Static execute() convenience method + printConvenienceMethodFunction(out, routine, false); + + // Static asField() convenience method + printConvenienceMethodFunctionAsField(out, routine, false); + printConvenienceMethodFunctionAsField(out, routine, true); + } + + } catch (Exception e) { + log.error("Error while generating routine " + routine, e); + } + } + + out.println(); + printNoFurtherInstancesAllowedJavadoc(out); + out.println("\tprivate " + strategy.getJavaClassName(udt) + "() {"); + + if (!schema.isDefaultSchema()) { + out.println("\t\tsuper(\"" + udt.getOutputName() + "\", " + strategy.getFullJavaIdentifier(schema) + ");"); + } else { + out.println("\t\tsuper(\"" + udt.getOutputName() + "\");"); + } + + out.println(); + out.println("\t\t// Initialise data type"); + out.println("\t\tgetDataType();"); + out.println("\t}"); + + out.println("}"); + out.close(); + } + + /** + * Generating UDT record classes + */ + protected void generateUDTDefinitions(SchemaDefinition schema) { + log.info("Generating UDT records"); + + for (UDTDefinition udt : database.getUDTs(schema)) { + try { + generateUDTDefinition(udt); + } catch (Exception e) { + log.error("Error while generating UDT record " + udt, e); + } + } + + watch.splitInfo("UDT records generated"); + } + + protected void generateUDTDefinition(UDTDefinition udt) { + log.info("Generating UDT record", strategy.getFileName(udt, Mode.RECORD)); + + GenerationWriter out = new GenerationWriter(strategy.getFile(udt, Mode.RECORD)); + printHeader(out, udt, Mode.RECORD); + printClassJavadoc(out, udt); + + out.print("public class "); + out.print(strategy.getJavaClassName(udt, Mode.RECORD)); + out.print(" extends "); + out.print(UDTRecordImpl.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(udt, Mode.RECORD)); + out.print(">"); + printImplements(out, udt, Mode.RECORD); + out.println(" {"); + + out.printSerial(); + out.println(); + + for (AttributeDefinition attribute : udt.getAttributes()) { + printGetterAndSetter(out, attribute); + } + + // [#799] Oracle UDT's can have member procedures + for (RoutineDefinition routine : udt.getRoutines()) { + try { + if (!routine.isSQLUsable()) { + // Instance execute() convenience method + printConvenienceMethodProcedure(out, routine, true); + } + else { + // Instance execute() convenience method + printConvenienceMethodFunction(out, routine, true); + } + + } catch (Exception e) { + log.error("Error while generating routine " + routine, e); + } + } + + out.println(); + out.println("\tpublic " + strategy.getJavaClassName(udt, Mode.RECORD) + "() {"); + + out.print("\t\tsuper("); + out.print(strategy.getFullJavaIdentifier(udt)); + out.println(");"); + + out.println("\t}"); + out.println("}"); + out.close(); + } + + protected void generateUDTRoutines(SchemaDefinition schema) { + for (UDTDefinition udt : database.getUDTs(schema)) { + if (udt.getRoutines().size() > 0) { try { - log.info("Generating UDT ", strategy.getFileName(udt)); + log.info("Generating member routines"); - GenerationWriter out = new GenerationWriter(strategy.getFile(udt)); - printHeader(out, udt); - printClassJavadoc(out, udt); - - out.print("public class "); - out.print(strategy.getJavaClassName(udt)); - out.print(" extends "); - out.print(UDTImpl.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(udt, Mode.RECORD)); - out.print(">"); - - // [#799] Oracle UDTs with member procedures have similarities - // with packages - if (udt.getRoutines().size() > 0) { - printImplements(out, udt, Mode.DEFAULT, org.jooq.Package.class.getName()); - } - else { - printImplements(out, udt, Mode.DEFAULT); - } - - out.println(" {"); - out.printSerial(); - - printSingletonInstance(udt, out); - printRecordTypeMethod(udt, out); - - for (AttributeDefinition attribute : udt.getAttributes()) { - printUDTColumn(out, attribute, udt); - } - - // [#799] Oracle UDT's can have member procedures for (RoutineDefinition routine : udt.getRoutines()) { try { - if (!routine.isSQLUsable()) { - - // Static execute() convenience method - printConvenienceMethodProcedure(out, routine, false); - } - else { - - // Static execute() convenience method - printConvenienceMethodFunction(out, routine, false); - - // Static asField() convenience method - printConvenienceMethodFunctionAsField(out, routine, false); - printConvenienceMethodFunctionAsField(out, routine, true); - } - + printRoutine(schema, routine); } catch (Exception e) { - log.error("Error while generating routine " + routine, e); + log.error("Error while generating member routines " + routine, e); } } - - out.println(); - printNoFurtherInstancesAllowedJavadoc(out); - out.println("\tprivate " + strategy.getJavaClassName(udt) + "() {"); - - if (!schema.isDefaultSchema()) { - out.println("\t\tsuper(\"" + udt.getOutputName() + "\", " + strategy.getFullJavaIdentifier(schema) + ");"); - } else { - out.println("\t\tsuper(\"" + udt.getOutputName() + "\");"); - } - - out.println(); - out.println("\t\t// Initialise data type"); - out.println("\t\tgetDataType();"); - out.println("\t}"); - - out.println("}"); - out.close(); } catch (Exception e) { - log.error("Error while generating udt " + udt, e); + log.error("Error while generating UDT " + udt, e); } - } - registerInSchema(outS, database.getUDTs(schema), UDT.class, true); - watch.splitInfo("UDTs generated"); + watch.splitInfo("Member procedures routines"); + } + } + } + + /** + * Generating central static udt access + */ + protected void generateUDTReferences(SchemaDefinition schema, File targetSchemaDir) { + log.info("Generating UDT references"); + + GenerationWriter out = new GenerationWriter(new File(targetSchemaDir, "UDTs.java")); + printHeader(out, schema); + printClassJavadoc(out, "Convenience access to all UDTs in " + schema.getOutputName()); + out.println("public final class UDTs {"); + + for (UDTDefinition udt : database.getUDTs(schema)) { + generateUDTReference(out, udt); } - // ---------------------------------------------------------------------- - // XXX Generating UDT record classes - // ---------------------------------------------------------------------- - if (database.getUDTs(schema).size() > 0) { - log.info("Generating UDT records"); + printPrivateConstructor(out, "UDTs"); + out.println("}"); + out.close(); - for (UDTDefinition udt : database.getUDTs(schema)) { - try { - log.info("Generating UDT record", strategy.getFileName(udt, Mode.RECORD)); + watch.splitInfo("UDT references generated"); + } - GenerationWriter out = new GenerationWriter(strategy.getFile(udt, Mode.RECORD)); - printHeader(out, udt, Mode.RECORD); - printClassJavadoc(out, udt); + protected void generateUDTReference(GenerationWriter out, UDTDefinition udt) { + out.println(); + out.println("\t/**"); + out.println("\t * The type " + udt.getQualifiedOutputName()); + out.println("\t */"); - out.print("public class "); - out.print(strategy.getJavaClassName(udt, Mode.RECORD)); - out.print(" extends "); - out.print(UDTRecordImpl.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(udt, Mode.RECORD)); - out.print(">"); - printImplements(out, udt, Mode.RECORD); - out.println(" {"); + out.print("\tpublic static "); + out.print(strategy.getFullJavaClassName(udt)); + out.print(" "); + out.print(strategy.getJavaIdentifier(udt)); + out.print(" = "); + out.print(strategy.getFullJavaIdentifier(udt)); + out.println(";"); + } - out.printSerial(); - out.println(); + protected void generateArrays(SchemaDefinition schema) { + log.info("Generating ARRAYs"); - for (AttributeDefinition attribute : udt.getAttributes()) { - printGetterAndSetter(out, attribute); - } + for (ArrayDefinition array : database.getArrays(schema)) { + try { + generateArray(schema, array); + } catch (Exception e) { + log.error("Error while generating ARRAY record " + array, e); + } + } - // [#799] Oracle UDT's can have member procedures - for (RoutineDefinition routine : udt.getRoutines()) { - try { - if (!routine.isSQLUsable()) { - // Instance execute() convenience method - printConvenienceMethodProcedure(out, routine, true); - } - else { - // Instance execute() convenience method - printConvenienceMethodFunction(out, routine, true); - } + watch.splitInfo("ARRAYs generated"); + } - } catch (Exception e) { - log.error("Error while generating routine " + routine, e); - } - } + protected void generateArray(SchemaDefinition schema, ArrayDefinition array) { + log.info("Generating ARRAY", strategy.getFileName(array, Mode.RECORD)); - out.println(); - out.println("\tpublic " + strategy.getJavaClassName(udt, Mode.RECORD) + "() {"); + GenerationWriter out = new GenerationWriter(strategy.getFile(array, Mode.RECORD)); + printHeader(out, array, Mode.RECORD); + printClassJavadoc(out, array); - out.print("\t\tsuper("); - out.print(strategy.getFullJavaIdentifier(udt)); - out.println(");"); + out.print("public class "); + out.print(strategy.getJavaClassName(array, Mode.RECORD)); + out.print(" extends "); + out.print(ArrayRecordImpl.class); + out.print("<"); + out.print(getJavaType(array.getElementType())); + out.print(">"); + printImplements(out, array, Mode.RECORD); + out.println(" {"); + out.printSerial(); - out.println("\t}"); - out.println("}"); - out.close(); - } catch (Exception e) { - log.error("Error while generating UDT record " + udt, e); + out.println(); + out.print("\tpublic "); + out.print(strategy.getJavaClassName(array, Mode.RECORD)); + out.print("("); + out.print(Configuration.class); + out.println(" configuration) {"); + out.print("\t\tsuper("); + out.print(strategy.getFullJavaIdentifier(schema)); + out.print(", \""); + out.print(array.getOutputName()); + out.print("\", "); + out.print(getJavaTypeReference(database, array.getElementType())); + out.println(", configuration);"); + out.println("\t}"); + + out.println(); + out.print("\tpublic "); + out.print(strategy.getJavaClassName(array, Mode.RECORD)); + out.print("("); + out.print(Configuration.class); + out.print(" configuration, "); + out.print(getJavaType(array.getElementType())); + out.print("... array"); + out.println(") {"); + out.println("\t\tthis(configuration);"); + out.println("\t\tset(array);"); + out.println("\t}"); + + out.println(); + out.print("\tpublic "); + out.print(strategy.getJavaClassName(array, Mode.RECORD)); + out.print("("); + out.print(Configuration.class); + out.print(" configuration, "); + out.print(List.class); + out.print(" list"); + out.println(") {"); + out.println("\t\tthis(configuration);"); + out.println("\t\tsetList(list);"); + out.println("\t}"); + + out.println("}"); + out.close(); + } + + protected void generateEnums(SchemaDefinition schema) { + log.info("Generating ENUMs"); + + for (EnumDefinition e : database.getEnums(schema)) { + try { + generateEnum(e); + } catch (Exception ex) { + log.error("Error while generating enum " + e, ex); + } + } + + watch.splitInfo("Enums generated"); + } + + protected void generateEnum(EnumDefinition e) { + log.info("Generating ENUM", strategy.getFileName(e, Mode.ENUM)); + + GenerationWriter out = new GenerationWriter(strategy.getFile(e, Mode.ENUM)); + printHeader(out, e); + printClassJavadoc(out, e); + + out.print("public enum "); + out.print(strategy.getJavaClassName(e, Mode.ENUM)); + printImplements(out, e, Mode.ENUM, EnumType.class.getName()); + out.print(" {"); + out.println(); + + for (String literal : e.getLiterals()) { + out.println("\t" + GenerationUtil.convertToJavaIdentifier(literal) + "(\"" + literal + "\"),"); + out.println(); + } + + out.println("\t;"); + out.println(); + out.println("\tprivate final java.lang.String literal;"); + out.println(); + out.println("\tprivate " + strategy.getJavaClassName(e, Mode.ENUM) + "(java.lang.String literal) {"); + out.println("\t\tthis.literal = literal;"); + out.println("\t}"); + out.println(); + out.println("\t@Override"); + out.println("\tpublic java.lang.String getName() {"); + + if (e.isSynthetic()) { + out.println("\t\treturn null;"); + } + else { + out.println("\t\treturn \"" + e.getName() + "\";"); + } + + out.println("\t}"); + out.println(); + out.println("\t@Override"); + out.println("\tpublic java.lang.String getLiteral() {"); + out.println("\t\treturn literal;"); + out.println("\t}"); + + out.println("}"); + + out.close(); + } + + protected void generateRoutines(SchemaDefinition schema, File targetSchemaDir) { + log.info("Generating routines"); + + GenerationWriter outR = new GenerationWriter(new File(targetSchemaDir, "Routines.java")); + printHeader(outR, schema); + printClassJavadoc(outR, "Convenience access to all stored procedures and functions in " + schema.getOutputName()); + + outR.println("public final class Routines {"); + for (RoutineDefinition routine : database.getRoutines(schema)) { + try { + generateRoutine(schema, outR, routine); + } catch (Exception e) { + log.error("Error while generating routine " + routine, e); + } + } + + printPrivateConstructor(outR, "Routines"); + outR.println("}"); + outR.close(); + + watch.splitInfo("Routines generated"); + } + + protected void generateRoutine(SchemaDefinition schema, GenerationWriter outR, + RoutineDefinition routine) { + printRoutine(schema, routine); + + if (!routine.isSQLUsable()) { + + // Static execute() convenience method + printConvenienceMethodProcedure(outR, routine, false); + } + else { + + // Static execute() convenience method + printConvenienceMethodFunction(outR, routine, false); + + // Static asField() convenience method + printConvenienceMethodFunctionAsField(outR, routine, false); + printConvenienceMethodFunctionAsField(outR, routine, true); + } + } + + protected void generatePackages(SchemaDefinition schema) { + log.info("Generating packages"); + + for (PackageDefinition pkg : database.getPackages(schema)) { + try { + generatePackage(schema, pkg); + } catch (Exception e) { + log.error("Error while generating package " + pkg, e); + } + } + + watch.splitInfo("Packages generated"); + } + + protected void generatePackage(SchemaDefinition schema, PackageDefinition pkg) { + log.info("Generating package", pkg); + + for (RoutineDefinition routine : pkg.getRoutines()) { + try { + printRoutine(schema, routine); + } catch (Exception e) { + log.error("Error while generating routine " + routine, e); + } + } + + // Static convenience methods + GenerationWriter outPkg = new GenerationWriter(strategy.getFile(pkg)); + printHeader(outPkg, pkg); + printClassJavadoc(outPkg, "Convenience access to all stored procedures and functions in " + pkg.getName()); + outPkg.print("public final class "); + outPkg.print(strategy.getJavaClassName(pkg)); + outPkg.print(" extends "); + outPkg.print(PackageImpl.class); + printImplements(outPkg, pkg, Mode.DEFAULT); + outPkg.println(" {"); + outPkg.printSerial(); + printSingletonInstance(pkg, outPkg); + + for (RoutineDefinition routine : pkg.getRoutines()) { + try { + if (!routine.isSQLUsable()) { + // Static execute() convenience method + printConvenienceMethodProcedure(outPkg, routine, false); } - } + else { + // Static execute() convenience method + printConvenienceMethodFunction(outPkg, routine, false); - watch.splitInfo("UDT records generated"); - } - - // ---------------------------------------------------------------------- - // XXX Generating UDT member procedures - // ---------------------------------------------------------------------- - if (database.getUDTs(schema).size() > 0) { - for (UDTDefinition udt : database.getUDTs(schema)) { - if (udt.getRoutines().size() > 0) { - try { - log.info("Generating member routines"); - - for (RoutineDefinition routine : udt.getRoutines()) { - try { - printRoutine(database, schema, routine); - } catch (Exception e) { - log.error("Error while generating member routines " + routine, e); - } - } - } catch (Exception e) { - log.error("Error while generating UDT " + udt, e); - } - - watch.splitInfo("Member procedures routines"); + // Static asField() convenience method + printConvenienceMethodFunctionAsField(outPkg, routine, false); + printConvenienceMethodFunctionAsField(outPkg, routine, true); } + + } catch (Exception e) { + log.error("Error while generating routine " + routine, e); } } - // ---------------------------------------------------------------------- - // XXX Generating central static udt access - // ---------------------------------------------------------------------- - if (database.getUDTs(schema).size() > 0) { - log.info("Generating UDT references"); + printNoFurtherInstancesAllowedJavadoc(outPkg); + outPkg.println("\tprivate " + strategy.getJavaClassName(pkg) + "() {"); + outPkg.print("\t\tsuper(\""); + outPkg.print(pkg.getOutputName()); + outPkg.print("\", "); + outPkg.print(strategy.getFullJavaIdentifier(schema)); + outPkg.println(");"); + outPkg.println("\t}"); + outPkg.println("}"); - GenerationWriter out = new GenerationWriter(new File(targetSchemaDir, "UDTs.java")); - printHeader(out, schema); - printClassJavadoc(out, "Convenience access to all UDTs in " + schema.getOutputName()); - out.println("public final class UDTs {"); - - for (UDTDefinition udt : database.getUDTs(schema)) { - out.println(); - out.println("\t/**"); - out.println("\t * The type " + udt.getQualifiedOutputName()); - out.println("\t */"); - - out.print("\tpublic static "); - out.print(strategy.getFullJavaClassName(udt)); - out.print(" "); - out.print(strategy.getJavaIdentifier(udt)); - out.print(" = "); - out.print(strategy.getFullJavaIdentifier(udt)); - out.println(";"); - } - - printPrivateConstructor(out, "UDTs"); - out.println("}"); - out.close(); - - watch.splitInfo("UDT references generated"); - } - - // ---------------------------------------------------------------------- - // XXX Generating ARRAY record classes - // ---------------------------------------------------------------------- - if (database.getArrays(schema).size() > 0) { - log.info("Generating ARRAYs"); - - for (ArrayDefinition array : database.getArrays(schema)) { - try { - log.info("Generating ARRAY", strategy.getFileName(array, Mode.RECORD)); - - GenerationWriter out = new GenerationWriter(strategy.getFile(array, Mode.RECORD)); - printHeader(out, array, Mode.RECORD); - printClassJavadoc(out, array); - - out.print("public class "); - out.print(strategy.getJavaClassName(array, Mode.RECORD)); - out.print(" extends "); - out.print(ArrayRecordImpl.class); - out.print("<"); - out.print(getJavaType(array.getElementType())); - out.print(">"); - printImplements(out, array, Mode.RECORD); - out.println(" {"); - out.printSerial(); - - out.println(); - out.print("\tpublic "); - out.print(strategy.getJavaClassName(array, Mode.RECORD)); - out.print("("); - out.print(Configuration.class); - out.println(" configuration) {"); - out.print("\t\tsuper("); - out.print(strategy.getFullJavaIdentifier(schema)); - out.print(", \""); - out.print(array.getOutputName()); - out.print("\", "); - out.print(getJavaTypeReference(database, array.getElementType())); - out.println(", configuration);"); - out.println("\t}"); - - out.println(); - out.print("\tpublic "); - out.print(strategy.getJavaClassName(array, Mode.RECORD)); - out.print("("); - out.print(Configuration.class); - out.print(" configuration, "); - out.print(getJavaType(array.getElementType())); - out.print("... array"); - out.println(") {"); - out.println("\t\tthis(configuration);"); - out.println("\t\tset(array);"); - out.println("\t}"); - - out.println(); - out.print("\tpublic "); - out.print(strategy.getJavaClassName(array, Mode.RECORD)); - out.print("("); - out.print(Configuration.class); - out.print(" configuration, "); - out.print(List.class); - out.print(" list"); - out.println(") {"); - out.println("\t\tthis(configuration);"); - out.println("\t\tsetList(list);"); - out.println("\t}"); - - out.println("}"); - out.close(); - } catch (Exception e) { - log.error("Error while generating ARRAY record " + array, e); - } - } - - watch.splitInfo("ARRAYs generated"); - } - - // ---------------------------------------------------------------------- - // XXX Generating enums - // ---------------------------------------------------------------------- - if (database.getEnums(schema).size() > 0) { - log.info("Generating ENUMs"); - - for (EnumDefinition e : database.getEnums(schema)) { - try { - log.info("Generating ENUM", strategy.getFileName(e, Mode.ENUM)); - - GenerationWriter out = new GenerationWriter(strategy.getFile(e, Mode.ENUM)); - printHeader(out, e); - printClassJavadoc(out, e); - - out.print("public enum "); - out.print(strategy.getJavaClassName(e, Mode.ENUM)); - printImplements(out, e, Mode.ENUM, EnumType.class.getName()); - out.print(" {"); - out.println(); - - for (String literal : e.getLiterals()) { - out.println("\t" + GenerationUtil.convertToJavaIdentifier(literal) + "(\"" + literal + "\"),"); - out.println(); - } - - out.println("\t;"); - out.println(); - out.println("\tprivate final java.lang.String literal;"); - out.println(); - out.println("\tprivate " + strategy.getJavaClassName(e, Mode.ENUM) + "(java.lang.String literal) {"); - out.println("\t\tthis.literal = literal;"); - out.println("\t}"); - out.println(); - out.println("\t@Override"); - out.println("\tpublic java.lang.String getName() {"); - - if (e.isSynthetic()) { - out.println("\t\treturn null;"); - } - else { - out.println("\t\treturn \"" + e.getName() + "\";"); - } - - out.println("\t}"); - out.println(); - out.println("\t@Override"); - out.println("\tpublic java.lang.String getLiteral() {"); - out.println("\t\treturn literal;"); - out.println("\t}"); - - out.println("}"); - - out.close(); - } catch (Exception ex) { - log.error("Error while generating enum " + e, ex); - } - } - - watch.splitInfo("Enums generated"); - } - - // ---------------------------------------------------------------------- - // XXX Generating routines - // ---------------------------------------------------------------------- - if (database.getRoutines(schema).size() > 0) { - log.info("Generating routines"); - - GenerationWriter outR = new GenerationWriter(new File(targetSchemaDir, "Routines.java")); - printHeader(outR, schema); - printClassJavadoc(outR, "Convenience access to all stored procedures and functions in " + schema.getOutputName()); - - outR.println("public final class Routines {"); - for (RoutineDefinition routine : database.getRoutines(schema)) { - try { - printRoutine(database, schema, routine); - - if (!routine.isSQLUsable()) { - - // Static execute() convenience method - printConvenienceMethodProcedure(outR, routine, false); - } - else { - - // Static execute() convenience method - printConvenienceMethodFunction(outR, routine, false); - - // Static asField() convenience method - printConvenienceMethodFunctionAsField(outR, routine, false); - printConvenienceMethodFunctionAsField(outR, routine, true); - } - } catch (Exception e) { - log.error("Error while generating routine " + routine, e); - } - } - - printPrivateConstructor(outR, "Routines"); - outR.println("}"); - outR.close(); - - watch.splitInfo("Routines generated"); - } - - // ---------------------------------------------------------------------- - // XXX Generating packages - // ---------------------------------------------------------------------- - if (database.getPackages(schema).size() > 0) { - log.info("Generating packages"); - - for (PackageDefinition pkg : database.getPackages(schema)) { - try { - log.info("Generating package", pkg); - - for (RoutineDefinition routine : pkg.getRoutines()) { - try { - printRoutine(database, schema, routine); - } catch (Exception e) { - log.error("Error while generating routine " + routine, e); - } - } - - // Static convenience methods - GenerationWriter outPkg = new GenerationWriter(strategy.getFile(pkg)); - printHeader(outPkg, pkg); - printClassJavadoc(outPkg, "Convenience access to all stored procedures and functions in " + pkg.getName()); - outPkg.print("public final class "); - outPkg.print(strategy.getJavaClassName(pkg)); - outPkg.print(" extends "); - outPkg.print(PackageImpl.class); - printImplements(outPkg, pkg, Mode.DEFAULT); - outPkg.println(" {"); - outPkg.printSerial(); - printSingletonInstance(pkg, outPkg); - - for (RoutineDefinition routine : pkg.getRoutines()) { - try { - if (!routine.isSQLUsable()) { - // Static execute() convenience method - printConvenienceMethodProcedure(outPkg, routine, false); - } - else { - // Static execute() convenience method - printConvenienceMethodFunction(outPkg, routine, false); - - // Static asField() convenience method - printConvenienceMethodFunctionAsField(outPkg, routine, false); - printConvenienceMethodFunctionAsField(outPkg, routine, true); - } - - } catch (Exception e) { - log.error("Error while generating routine " + routine, e); - } - } - - printNoFurtherInstancesAllowedJavadoc(outPkg); - outPkg.println("\tprivate " + strategy.getJavaClassName(pkg) + "() {"); - outPkg.print("\t\tsuper(\""); - outPkg.print(pkg.getOutputName()); - outPkg.print("\", "); - outPkg.print(strategy.getFullJavaIdentifier(schema)); - outPkg.println(");"); - outPkg.println("\t}"); - outPkg.println("}"); - - outPkg.close(); - } catch (Exception e) { - log.error("Error while generating package " + pkg, e); - } - } - - watch.splitInfo("Packages generated"); - } + outPkg.close(); + } + protected void close() { // Finalise schema if (outS != null) { outS.println("}"); @@ -1789,12 +1105,801 @@ public class DefaultGenerator extends AbstractGenerator { outF.println("}"); outF.close(); } - - // XXX [#651] Refactoring-cursor - watch.splitInfo("GENERATION FINISHED!"); } - private void printExtends(GenerationWriter out, Definition definition, Mode mode) { + /** + * Generating central static table access + */ + protected void generateTableReferences(SchemaDefinition schema, File targetSchemaDir) { + log.info("Generating table references"); + + File file = new File(targetSchemaDir, "Tables.java"); + GenerationWriter out; + try { + out = new GenerationWriter(file); + } catch (Exception e) { + log.error("Error while generating " + file, e); + return; + } + printHeader(out, schema); + printClassJavadoc(out, "Convenience access to all tables in " + schema.getOutputName()); + out.println("public final class Tables {"); + + for (TableDefinition table : database.getTables(schema)) { + generateTableReference(out, table); + } + + printPrivateConstructor(out, "Tables"); + out.println("}"); + out.close(); + + watch.splitInfo("Table references generated"); + } + + protected void generateTableReference(GenerationWriter out, TableDefinition table) { + out.println(); + out.println("\t/**"); + + if (!StringUtils.isBlank(table.getComment())) { + out.println("\t * " + table.getComment()); + } + else { + out.println("\t * The table " + table.getQualifiedOutputName()); + } + + out.println("\t */"); + + out.print("\tpublic static "); + out.print(strategy.getFullJavaClassName(table)); + out.print(" "); + out.print(strategy.getJavaIdentifier(table)); + out.print(" = "); + out.print(strategy.getFullJavaIdentifier(table)); + out.println(";"); + } + + protected void generateDaos(SchemaDefinition schema) { + log.info("Generating DAOs"); + + for (TableDefinition table : database.getTables(schema)) { + try { + generateDao(table); + } + catch (Exception e) { + log.error("Error while generating table DAO " + table, e); + } + } + + watch.splitInfo("Table DAOs generated"); + } + + protected void generateDao(TableDefinition table) { + String tType = "Void"; + String pType = strategy.getFullJavaClassName(table, Mode.POJO); + + UniqueKeyDefinition key = table.getMainUniqueKey(); + ColumnDefinition keyColumn = null; + + if (key != null) { + List columns = key.getKeyColumns(); + + if (columns.size() == 1) { + keyColumn = columns.get(0); + tType = getJavaType(keyColumn.getType()); + } + } + + // Skip DAOs for tables that don't have 1-column-PKs (for now) + if (keyColumn == null) { + log.info("Skipping DAO generation", strategy.getFileName(table, Mode.DAO)); + return; + } + else { + log.info("Generating DAO", strategy.getFileName(table, Mode.DAO)); + } + + GenerationWriter out = new GenerationWriter(strategy.getFile(table, Mode.DAO)); + printHeader(out, table, Mode.DAO); + printClassJavadoc(out, table); + + out.print("public class "); + out.print(strategy.getJavaClassName(table, Mode.DAO)); + // printExtends(out, table, Mode.DAO); + // printImplements(out, table, Mode.DAO); + out.print(" extends "); + out.print(DAOImpl.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); + out.print(", "); + out.print(pType); + out.print(", "); + out.print(tType); + out.println("> {"); + out.println(); + + // Default constructor + // ------------------- + printJavadoc(out, "Create a new " + + strategy.getJavaClassName(table, Mode.DAO) + + " without any factory"); + out.print("\tpublic "); + out.print(strategy.getJavaClassName(table, Mode.DAO)); + out.println("() {"); + out.print("\t\tsuper("); + out.print(strategy.getFullJavaIdentifier(table)); + out.print(", "); + out.print(strategy.getFullJavaClassName(table, Mode.POJO)); + out.println(".class);"); + out.println("\t}"); + out.println(); + + // Initialising constructor + // ------------------------ + printJavadoc(out, "Create a new " + + strategy.getJavaClassName(table, Mode.DAO) + + " with an attached factory"); + out.print("\tpublic "); + out.print(strategy.getJavaClassName(table, Mode.DAO)); + out.print("("); + out.print(Factory.class); + out.println(" factory) {"); + out.print("\t\tsuper("); + out.print(strategy.getFullJavaIdentifier(table)); + out.print(", "); + out.print(strategy.getFullJavaClassName(table, Mode.POJO)); + out.println(".class, factory);"); + out.println("\t}"); + out.println(); + + // Template method implementations + // ------------------------------- + printOverride(out); + out.print("\tprotected "); + out.print(tType); + out.print(" getId("); + out.print(strategy.getFullJavaClassName(table, Mode.POJO)); + out.println(" object) {"); + out.print("\t\treturn object."); + out.print(strategy.getJavaGetterName(keyColumn, Mode.POJO)); + out.println("();"); + out.println("\t}"); + + out.println("}"); + out.close(); + } + + protected void generatePojos(SchemaDefinition schema) { + log.info("Generating table POJOs"); + + for (TableDefinition table : database.getTables(schema)) { + try { + generatePojo(table); + } + catch (Exception e) { + log.error("Error while generating table POJO " + table, e); + } + } + + watch.splitInfo("Table POJOs generated"); + } + + protected void generatePojo(TableDefinition table) { + log.info("Generating table POJO", strategy.getFileName(table, Mode.POJO)); + + GenerationWriter out = new GenerationWriter(strategy.getFile(table, Mode.POJO)); + printHeader(out, table, Mode.POJO); + printClassJavadoc(out, table); + printTableJPAAnnotation(out, table); + + out.print("public class "); + out.print(strategy.getJavaClassName(table, Mode.POJO)); + printExtends(out, table, Mode.POJO); + printImplements(out, table, Mode.POJO); + out.print(" {"); + out.println(); + out.printSerial(); + + out.println(); + + int maxLength = 0; + for (ColumnDefinition column : table.getColumns()) { + maxLength = Math.max(maxLength, getJavaType(column.getType()).length()); + } + + for (ColumnDefinition column : table.getColumns()) { + printColumnValidationAnnotation(out, column); + + out.print("\tprivate "); + out.print(StringUtils.rightPad(getJavaType(column.getType()), maxLength)); + out.print(" "); + out.print(convertToJavaIdentifier(strategy.getJavaMemberName(column, Mode.POJO))); + out.println(";"); + } + + for (ColumnDefinition column : table.getColumns()) { + + // Getter + out.println(); + printColumnJPAAnnotation(out, column); + + if (generateInterfaces()) { + printOverride(out); + } + + out.print("\tpublic "); + out.print(getJavaType(column.getType())); + out.print(" "); + out.print(strategy.getJavaGetterName(column, Mode.POJO)); + out.println("() {"); + + out.print("\t\treturn this."); + out.print(convertToJavaIdentifier(strategy.getJavaMemberName(column, Mode.POJO))); + out.println(";"); + out.println("\t}"); + + // Setter + out.println(); + + if (generateInterfaces()) { + printOverride(out); + } + + out.print("\tpublic void "); + out.print(strategy.getJavaSetterName(column, Mode.POJO)); + out.print("("); + out.print(getJavaType(column.getType())); + out.print(" "); + out.print(convertToJavaIdentifier(strategy.getJavaMemberName(column, Mode.POJO))); + out.println(") {"); + + out.print("\t\tthis."); + out.print(convertToJavaIdentifier(strategy.getJavaMemberName(column, Mode.POJO))); + out.print(" = "); + out.print(convertToJavaIdentifier(strategy.getJavaMemberName(column, Mode.POJO))); + out.println(";"); + out.println("\t}"); + } + + out.println("}"); + out.close(); + } + + protected void generateTables(SchemaDefinition schema) { + log.info("Generating tables"); + + for (TableDefinition table : database.getTables(schema)) { + try { + generateTable(schema, table); + } + catch (Exception e) { + log.error("Error while generating table " + table, e); + } + } + + registerInSchema(database.getTables(schema), Table.class, true); + watch.splitInfo("Tables generated"); + } + + protected void generateTable(SchemaDefinition schema, TableDefinition table) { + log.info("Generating table", strategy.getFileName(table)); + + GenerationWriter out = new GenerationWriter(strategy.getFile(table)); + printHeader(out, table); + printClassJavadoc(out, table); + + Class baseClass; + if (generateRelations() && table.getMainUniqueKey() != null) { + baseClass = UpdatableTableImpl.class; + } else { + baseClass = TableImpl.class; + } + + out.print("public class "); + out.print(strategy.getJavaClassName(table)); + out.print(" extends "); + out.print(baseClass); + out.print("<"); + out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); + out.print(">"); + printImplements(out, table, Mode.DEFAULT); + out.println(" {"); + out.printSerial(); + printSingletonInstance(table, out); + printRecordTypeMethod(table, out); + + for (ColumnDefinition column : table.getColumns()) { + printTableColumn(out, column, table); + } + + // [#1255] With instance fields, the table constructor may + // be public, as tables are no longer singletons + out.println(); + if (generateInstanceFields()) { + out.print("\tpublic "); + } + else { + printNoFurtherInstancesAllowedJavadoc(out); + out.print("\tprivate "); + } + out.println(strategy.getJavaClassName(table) + "() {"); + + if (!schema.isDefaultSchema()) { + out.println("\t\tsuper(\"" + table.getOutputName() + "\", " + strategy.getFullJavaIdentifier(schema) + ");"); + } else { + out.println("\t\tsuper(\"" + table.getOutputName() + "\");"); + } + + out.println("\t}"); + + // [#117] With instance fields, it makes sense to create a + // type-safe table alias + // [#1255] With instance fields, the table constructor may + // be public, as tables are no longer singletons + if (generateInstanceFields()) { + out.println(); + out.print("\tpublic "); + out.print(strategy.getJavaClassName(table)); + out.print("("); + out.print(String.class); + out.println(" alias) {"); + + out.print("\t\tsuper(alias, "); + out.print(strategy.getFullJavaIdentifier(schema)); + out.print(", "); + out.print(strategy.getFullJavaIdentifier(table)); + out.println(");"); + out.println("\t}"); + } + + // Add primary / unique / foreign key information + if (generateRelations()) { + IdentityDefinition identity = table.getIdentity(); + + // The identity column + if (identity != null) { + out.println(); + + out.println("\t@Override"); + out.print("\tpublic "); + out.print(Identity.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); + out.print(", "); + out.print(getJavaType(identity.getColumn().getType())); + out.println("> getIdentity() {"); + + out.print("\t\treturn "); + out.print(strategy.getFullJavaIdentifier(identity)); + out.println(";"); + + out.println("\t}"); + } + + UniqueKeyDefinition mainKey = table.getMainUniqueKey(); + + // The primary / main unique key + if (mainKey != null) { + out.println(); + + out.println("\t@Override"); + out.print("\tpublic "); + out.print(UniqueKey.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); + out.println("> getMainKey() {"); + + out.print("\t\treturn "); + out.print(strategy.getFullJavaIdentifier(mainKey)); + out.println(";"); + + out.println("\t}"); + } + + // The remaining unique keys + List uniqueKeys = table.getUniqueKeys(); + if (uniqueKeys.size() > 0) { + out.println(); + out.println("\t@Override"); + out.println("\t@SuppressWarnings(\"unchecked\")"); + + out.print("\tpublic "); + out.print(List.class); + out.print("<"); + out.print(UniqueKey.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); + out.println(">> getKeys() {"); + + out.print("\t\treturn "); + out.print(Arrays.class); + out.print(".<"); + out.print(UniqueKey.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); + out.print(">>asList("); + + String separator = ""; + for (UniqueKeyDefinition uniqueKey : uniqueKeys) { + out.print(separator); + out.print(strategy.getFullJavaIdentifier(uniqueKey)); + + separator = ", "; + } + + out.println(");"); + out.println("\t}"); + } + + // Foreign keys + List foreignKeys = table.getForeignKeys(); + if (foreignKeys.size() > 0) { + out.println(); + out.println("\t@Override"); + out.println("\t@SuppressWarnings(\"unchecked\")"); + + out.print("\tpublic "); + out.print(List.class); + out.print("<"); + out.print(ForeignKey.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); + out.println(", ?>> getReferences() {"); + + out.print("\t\treturn "); + out.print(Arrays.class); + out.print(".<"); + out.print(ForeignKey.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(table, Mode.RECORD)); + out.print(", ?>>asList("); + + String separator = ""; + for (ForeignKeyDefinition foreignKey : foreignKeys) { + TableDefinition referencedTable = foreignKey.getReferencedTable(); + + // Skip master data foreign keys + if (referencedTable instanceof MasterDataTableDefinition) { + continue; + } + + out.print(separator); + out.print(strategy.getFullJavaIdentifier(foreignKey)); + + separator = ", "; + } + + out.println(");"); + out.println("\t}"); + } + } + + // [#117] With instance fields, it makes sense to create a + // type-safe table alias + if (generateInstanceFields()) { + out.println(); + out.println("\t@Override"); + out.print("\tpublic "); + out.print(strategy.getFullJavaClassName(table)); + out.print(" as("); + out.print(String.class); + out.println(" alias) {"); + + out.print("\t\treturn new "); + out.print(strategy.getFullJavaClassName(table)); + out.println("(alias);"); + out.println("\t}"); + } + + out.printStaticInitialisationStatementsPlaceholder(); + out.println("}"); + out.close(); + } + + protected void generateMasterTables(SchemaDefinition schema) { + log.info("Generating master data"); + + for (MasterDataTableDefinition table : database.getMasterDataTables(schema)) { + try { + generateMasterTable(table); + } catch (Exception e) { + log.error("Exception while generating master data table " + table, e); + } + } + + watch.splitInfo("Master data generated"); + } + + protected void generateMasterTable(MasterDataTableDefinition table) { + log.info("Generating table", strategy.getFileName(table)); + + GenerationWriter out = new GenerationWriter(strategy.getFile(table)); + printHeader(out, table); + printClassJavadoc(out, table); + + ColumnDefinition pk = table.getPrimaryKeyColumn(); + ColumnDefinition l = table.getLiteralColumn(); + ColumnDefinition d = table.getDescriptionColumn(); + + Result data = table.getData(); + + out.print("public enum "); + out.print(strategy.getJavaClassName(table)); + printImplements(out, table, Mode.ENUM, + MasterDataType.class.getName() + "<" + getJavaType(pk.getType()) + ">"); + out.println(" {"); + + Set columns = + new LinkedHashSet(Arrays.asList(pk, l, d)); + + + for (Record record : data) { + String literal = record.getValueAsString(l.getName()); + String description = record.getValueAsString(d.getName()); + + if (!StringUtils.isEmpty(description)) { + out.println(); + out.println("\t/**"); + out.println("\t * " + description); + out.println("\t */"); + } + + out.print("\t"); + out.print(GenerationUtil.convertToJavaIdentifier(literal)); + out.print("("); + + String separator = ""; + for (ColumnDefinition column : columns) { + out.print(separator); + out.printNewJavaObject(getJavaType(column.getType()), record.getValue(column.getName())); + + separator = ", "; + } + + out.println("),"); + } + + out.println("\t;"); + out.println(); + + // Fields + for (ColumnDefinition column : columns) { + out.print("\tprivate final "); + out.print(getJavaType(column.getType())); + out.print(" "); + out.println(strategy.getJavaMemberName(column) + ";"); + } + + // Constructor + out.println(); + out.print("\tprivate " + strategy.getJavaClassName(table) + "("); + + String separator = ""; + for (ColumnDefinition column : columns) { + out.print(separator); + out.print(getJavaType(column.getType())); + out.print(" "); + out.print(strategy.getJavaMemberName(column)); + + separator = ", "; + } + + out.println(") {"); + for (ColumnDefinition column : columns) { + out.print("\t\tthis."); + out.print(strategy.getJavaMemberName(column)); + out.print(" = "); + out.print(strategy.getJavaMemberName(column)); + out.println(";"); + } + out.println("\t}"); + + // Implementation methods + out.println(); + printOverride(out); + out.print("\tpublic "); + out.print(getJavaType(pk.getType())); + out.println(" getPrimaryKey() {"); + out.println("\t\treturn " + strategy.getJavaMemberName(pk) + ";"); + out.println("\t}"); + + // Getters + for (ColumnDefinition column : columns) { + printFieldJavaDoc(out, column); + out.print("\tpublic final "); + out.print(getJavaType(column.getType())); + out.print(" "); + out.print(strategy.getJavaGetterName(column, Mode.DEFAULT)); + out.println("() {"); + out.print("\t\treturn "); + out.print(strategy.getJavaMemberName(column)); + out.println(";"); + out.println("\t}"); + } + + out.println("}"); + out.close(); + } + + protected void generateSequences(SchemaDefinition schema, File targetSchemaDir) { + log.info("Generating sequences"); + + GenerationWriter out = new GenerationWriter(new File(targetSchemaDir, "Sequences.java")); + printHeader(out, schema); + printClassJavadoc(out, "Convenience access to all sequences in " + schema.getOutputName()); + out.println("public final class Sequences {"); + + for (SequenceDefinition sequence : database.getSequences(schema)) { + out.println(); + out.println("\t/**"); + out.println("\t * The sequence " + sequence.getQualifiedOutputName()); + out.println("\t */"); + + out.print("\tpublic static final "); + out.print(Sequence.class); + out.print("<"); + out.print(getJavaType(sequence.getType())); + out.print(">"); + out.print(" "); + out.print(strategy.getJavaIdentifier(sequence)); + out.print(" = new "); + out.print(SequenceImpl.class); + out.print("<"); + out.print(getJavaType(sequence.getType())); + out.print(">"); + out.print("(\""); + out.print(sequence.getOutputName()); + out.print("\""); + + if (!schema.isDefaultSchema()) { + out.print(", "); + out.print(strategy.getFullJavaIdentifier(schema)); + } else { + out.print(", null"); + } + + out.print(", "); + out.print(getJavaTypeReference(sequence.getDatabase(), sequence.getType())); + + out.println(");"); + } + + printPrivateConstructor(out, "Sequences"); + out.println("}"); + out.close(); + + registerInSchema(database.getSequences(schema), Sequence.class, true); + watch.splitInfo("Sequences generated"); + } + + protected void generateSchema(SchemaDefinition schema) { + log.info("Generating schema", strategy.getFileName(schema)); + log.info("----------------------------------------------------------"); + + outS = new GenerationWriter(strategy.getFile(schema)); + printHeader(outS, schema); + printClassJavadoc(outS, schema); + + outS.print("public class "); + outS.print(strategy.getJavaClassName(schema)); + outS.print(" extends "); + outS.print(SchemaImpl.class); + printImplements(outS, schema, Mode.DEFAULT); + outS.println(" {"); + outS.printSerial(); + outS.println(); + outS.println("\t/**"); + outS.println("\t * The singleton instance of " + schema.getQualifiedOutputName()); + outS.println("\t */"); + outS.println("\tpublic static final " + strategy.getJavaClassName(schema) + " " + strategy.getJavaIdentifier(schema) + " = new " + strategy.getJavaClassName(schema) + "();"); + + outS.println(); + printNoFurtherInstancesAllowedJavadoc(outS); + outS.println("\tprivate " + strategy.getJavaClassName(schema) + "() {"); + outS.println("\t\tsuper(\"" + schema.getOutputName() + "\");"); + outS.println("\t}"); + + outS.printInitialisationStatementsPlaceholder(); + + // Generating the factory + // ----------------------------------------------------------------- + log.info("Generating factory", strategy.getFileName(schema, Mode.FACTORY)); + + outF = new GenerationWriter(strategy.getFile(schema, Mode.FACTORY)); + printHeader(outF, schema); + printClassJavadoc(outF, + "A Factory for specific use with the " + schema.getOutputName() + + " schema.\n

\nThis Factory will not render the " + schema.getOutputName() + + " schema's schema name in rendered SQL (assuming that you use it as the default schema on your connection!). Use the more generic {@link " + + database.getDialect().getFactory().getName() + + "} or the {@link " + Factory.class.getName() + "} instead, if you want to fully qualify tables, routines, etc."); + + outF.print("public class "); + outF.print(strategy.getJavaClassName(schema, Mode.FACTORY)); + outF.print(" extends "); + outF.print(database.getDialect().getFactory()); + printImplements(outF, schema, Mode.FACTORY); + outF.println(" {"); + outF.printSerial(); + + outF.println(); + outF.println("\t/**"); + outF.println("\t * Create a factory with a connection"); + outF.println("\t *"); + outF.println("\t * @param connection The connection to use with objects created from this factory"); + outF.println("\t */"); + outF.print("\tpublic "); + outF.print(strategy.getJavaClassName(schema, Mode.FACTORY)); + outF.print("("); + outF.print(Connection.class); + outF.println(" connection) {"); + outF.println("\t\tsuper(connection);"); + outF.println(); + outF.println("\t\tinitDefaultSchema();"); + outF.println("\t}"); + + if (generateDeprecated()) { + outF.println(); + outF.println("\t/**"); + outF.println("\t * Create a factory with a connection and a schema mapping"); + outF.println("\t * "); + outF.print("\t * @deprecated - 2.0.5 - Use {@link #"); + outF.print(strategy.getJavaClassName(schema, Mode.FACTORY)); + outF.print("("); + outF.print(Connection.class); + outF.print(", "); + outF.print(Settings.class); + outF.println(")} instead"); + outF.println("\t */"); + outF.println("\t@Deprecated"); + outF.print("\tpublic "); + outF.print(strategy.getJavaClassName(schema, Mode.FACTORY)); + outF.print("("); + outF.print(Connection.class); + outF.println(" connection, org.jooq.SchemaMapping mapping) {"); + outF.println("\t\tsuper(connection, mapping);"); + outF.println(); + outF.println("\t\tinitDefaultSchema();"); + outF.println("\t}"); + } + + outF.println(); + outF.println("\t/**"); + outF.println("\t * Create a factory with a connection and some settings"); + outF.println("\t *"); + outF.println("\t * @param connection The connection to use with objects created from this factory"); + outF.println("\t * @param settings The settings to apply to objects created from this factory"); + outF.println("\t */"); + outF.print("\tpublic "); + outF.print(strategy.getJavaClassName(schema, Mode.FACTORY)); + outF.print("("); + outF.print(Connection.class); + outF.print(" connection, "); + outF.print(Settings.class); + outF.println(" settings) {"); + outF.println("\t\tsuper(connection, settings);"); + outF.println(); + outF.println("\t\tinitDefaultSchema();"); + outF.println("\t}"); + + // [#1315] schema-specific factories override the default schema + outF.println(); + outF.println("\t/**"); + outF.println("\t * Initialise the render mapping's default schema."); + outF.println("\t *

"); + outF.println("\t * For convenience, this schema-specific factory should override any pre-existing setting"); + outF.println("\t */"); + outF.println("\tprivate final void initDefaultSchema() {"); + outF.print("\t\t"); + outF.print(SettingsTools.class); + outF.print(".getRenderMapping(getSettings()).setDefaultSchema("); + outF.print(strategy.getFullJavaIdentifier(schema)); + outF.println(".getName());"); + outF.println("\t}"); + + watch.splitInfo("Schema generated"); + } + + protected void printExtends(GenerationWriter out, Definition definition, Mode mode) { String superclass = strategy.getJavaClassExtends(definition, mode); if (!StringUtils.isBlank(superclass)) { @@ -1803,7 +1908,7 @@ public class DefaultGenerator extends AbstractGenerator { } } - private void printImplements(GenerationWriter out, Definition definition, Mode mode, String... forcedInterfaces) { + protected void printImplements(GenerationWriter out, Definition definition, Mode mode, String... forcedInterfaces) { List interfaces = strategy.getJavaClassImplements(definition, mode); interfaces = new ArrayList(interfaces == null ? Collections.emptyList() : interfaces); @@ -1838,7 +1943,7 @@ public class DefaultGenerator extends AbstractGenerator { } } - private void printTableJPAAnnotation(GenerationWriter out, TableDefinition table) { + protected void printTableJPAAnnotation(GenerationWriter out, TableDefinition table) { SchemaDefinition schema = table.getSchema(); if (generateJPAAnnotations()) { @@ -1889,7 +1994,7 @@ public class DefaultGenerator extends AbstractGenerator { } } - private void printColumnJPAAnnotation(GenerationWriter out, ColumnDefinition column) { + protected void printColumnJPAAnnotation(GenerationWriter out, ColumnDefinition column) { if (generateJPAAnnotations()) { UniqueKeyDefinition pk = column.getPrimaryKey(); List uks = column.getUniqueKeys(); @@ -1940,7 +2045,7 @@ public class DefaultGenerator extends AbstractGenerator { } } - private void printColumnValidationAnnotation(GenerationWriter out, ColumnDefinition column) { + protected void printColumnValidationAnnotation(GenerationWriter out, ColumnDefinition column) { if (generateValidationAnnotations()) { DataTypeDefinition type = column.getType(); @@ -1963,7 +2068,7 @@ public class DefaultGenerator extends AbstractGenerator { } } - private void registerInSchema(GenerationWriter outS, List definitions, Class type, boolean isGeneric) { + protected void registerInSchema(List definitions, Class type, boolean isGeneric) { if (outS != null) { outS.println(); printOverride(outS); @@ -2010,8 +2115,7 @@ public class DefaultGenerator extends AbstractGenerator { } } - private void printRoutine(Database database, SchemaDefinition schema, RoutineDefinition routine) - throws FileNotFoundException { + protected void printRoutine(SchemaDefinition schema, RoutineDefinition routine) { log.info("Generating routine", strategy.getFileName(routine)); GenerationWriter out = new GenerationWriter(strategy.getFile(routine)); @@ -2170,7 +2274,7 @@ public class DefaultGenerator extends AbstractGenerator { out.close(); } - private void printConvenienceMethodFunctionAsField(GenerationWriter out, RoutineDefinition function, boolean parametersAsField) { + protected void printConvenienceMethodFunctionAsField(GenerationWriter out, RoutineDefinition function, boolean parametersAsField) { // [#281] - Java can't handle more than 255 method parameters if (function.getInParameters().size() > 254) { log.warn("Too many parameters", "Function " + function + " has more than 254 in parameters. Skipping generation of convenience method."); @@ -2241,7 +2345,7 @@ public class DefaultGenerator extends AbstractGenerator { out.println("\t}"); } - private void printConvenienceMethodFunction(GenerationWriter out, RoutineDefinition function, boolean instance) { + protected void printConvenienceMethodFunction(GenerationWriter out, RoutineDefinition function, boolean instance) { // [#281] - Java can't handle more than 255 method parameters if (function.getInParameters().size() > 254) { log.warn("Too many parameters", "Function " + function + " has more than 254 in parameters. Skipping generation of convenience method."); @@ -2332,14 +2436,14 @@ public class DefaultGenerator extends AbstractGenerator { out.println("\t}"); } - private void printThrowsDataAccessException(GenerationWriter out) { + protected void printThrowsDataAccessException(GenerationWriter out) { out.print("\t * @throws "); out.print(DataAccessException.class); out.print(" if something went wrong executing the query"); out.println(); } - private void printPrivateConstructor(GenerationWriter out, String javaClassName) { + protected void printPrivateConstructor(GenerationWriter out, String javaClassName) { out.println(); out.println("\t/**"); out.println("\t * No instances"); @@ -2347,7 +2451,7 @@ public class DefaultGenerator extends AbstractGenerator { out.println("\tprivate " + javaClassName + "() {}"); } - private void printConvenienceMethodProcedure(GenerationWriter out, RoutineDefinition procedure, boolean instance) { + protected void printConvenienceMethodProcedure(GenerationWriter out, RoutineDefinition procedure, boolean instance) { // [#281] - Java can't handle more than 255 method parameters if (procedure.getInParameters().size() > 254) { log.warn("Too many parameters", "Procedure " + procedure + " has more than 254 in parameters. Skipping generation of convenience method."); @@ -2470,7 +2574,7 @@ public class DefaultGenerator extends AbstractGenerator { out.println("\t}"); } - private void printRecordTypeMethod(Definition definition, GenerationWriter out) { + protected void printRecordTypeMethod(Definition definition, GenerationWriter out) { out.println(); out.println("\t/**"); out.println("\t * The class holding records for this type"); @@ -2487,7 +2591,7 @@ public class DefaultGenerator extends AbstractGenerator { out.println("\t}"); } - private void printSingletonInstance(Definition definition, GenerationWriter out) { + protected void printSingletonInstance(Definition definition, GenerationWriter out) { out.println(); out.println("\t/**"); out.println("\t * The singleton instance of " + definition.getQualifiedOutputName()); @@ -2501,7 +2605,7 @@ public class DefaultGenerator extends AbstractGenerator { out.println("();"); } - private void printSingletonReference(GenerationWriter out, Definition definition) { + protected void printSingletonReference(GenerationWriter out, Definition definition) { if (definition instanceof SequenceDefinition) { out.print(strategy.getJavaPackageName(definition.getSchema())); out.print("."); @@ -2514,7 +2618,7 @@ public class DefaultGenerator extends AbstractGenerator { } } - private void printOverride(GenerationWriter out) { + protected void printOverride(GenerationWriter out) { out.println("\t@Override"); } @@ -2522,7 +2626,7 @@ public class DefaultGenerator extends AbstractGenerator { * If file is a directory, recursively empty its children. * If file is a file, delete it */ - private void empty(File file) { + protected void empty(File file) { if (file != null) { if (file.isDirectory()) { File[] children = file.listFiles(); @@ -2540,17 +2644,44 @@ public class DefaultGenerator extends AbstractGenerator { } } - private void printGetterAndSetter(GenerationWriter out, TypedElementDefinition element) { + protected void printGetterAndSetter(GenerationWriter out, TypedElementDefinition element) { printGetterAndSetter(out, element, true); } - private void printGetterAndSetter(GenerationWriter out, TypedElementDefinition element, boolean printBody) { + protected void printGetterAndSetter(GenerationWriter out, TypedElementDefinition element, boolean printBody) { printFieldJavaDoc(out, element); if (printBody && generateInterfaces() && element instanceof ColumnDefinition) { printOverride(out); } + printSetter(out, element, printBody); + + printFieldJavaDoc(out, element); + if (element instanceof ColumnDefinition) { + printColumnJPAAnnotation(out, (ColumnDefinition) element); + } + + if (printBody && generateInterfaces() && element instanceof ColumnDefinition) { + printOverride(out); + } + + printGetter(out, element, printBody); + + if (printBody && + generateRelations() && + generateNavigationMethods() && + element instanceof ColumnDefinition) { + + ColumnDefinition column = (ColumnDefinition) element; + + List uniqueKeys = column.getUniqueKeys(); + + generateNavigateMethods(out, column, uniqueKeys); + } + } + + protected void printSetter(GenerationWriter out, TypedElementDefinition element, boolean printBody) { out.print("\tpublic void "); out.print(strategy.getJavaSetterName(element, Mode.DEFAULT)); out.print("("); @@ -2565,16 +2696,9 @@ public class DefaultGenerator extends AbstractGenerator { else { out.println(";"); } + } - printFieldJavaDoc(out, element); - if (element instanceof ColumnDefinition) { - printColumnJPAAnnotation(out, (ColumnDefinition) element); - } - - if (printBody && generateInterfaces() && element instanceof ColumnDefinition) { - printOverride(out); - } - + protected void printGetter(GenerationWriter out, TypedElementDefinition element, boolean printBody) { out.print("\tpublic "); out.print(getJavaType(element.getType())); out.print(" "); @@ -2589,192 +2713,189 @@ public class DefaultGenerator extends AbstractGenerator { else { out.println(";"); } + } - if (printBody && - generateRelations() && - generateNavigationMethods() && - element instanceof ColumnDefinition) { + protected void generateNavigateMethods(GenerationWriter out, ColumnDefinition column, + List uniqueKeys) { + // Print references from this column's unique keys to all + // corresponding foreign keys. - ColumnDefinition column = (ColumnDefinition) element; - - List uniqueKeys = column.getUniqueKeys(); - - // Print references from this column's unique keys to all - // corresponding foreign keys. - - // e.g. in TAuthorRecord, print getTBooks() - // ----------------------------------------------------------------- - Set fetchMethodNames = new HashSet(); - for (UniqueKeyDefinition uniqueKey : uniqueKeys) { - if (out.printOnlyOnce(uniqueKey)) { - foreignKeyLoop: for (ForeignKeyDefinition foreignKey : uniqueKey.getForeignKeys()) { - - // #64 - If the foreign key does not match the referenced key, it - // is most likely because it references a non-primary unique key - // Skip code generation for this foreign key - - // #69 - Should resolve this issue more thoroughly. - if (foreignKey.getReferencedColumns().size() != foreignKey.getKeyColumns().size()) { - log.warn("Foreign key mismatch", foreignKey.getName() + " does not match its primary key! No code is generated for this key. See trac tickets #64 and #69"); - continue foreignKeyLoop; - } - - TableDefinition referencing = foreignKey.getKeyTable(); - - StringBuilder fetchMethodName = new StringBuilder(); - fetchMethodName.append("fetch"); - fetchMethodName.append(strategy.getJavaClassName(referencing)); - - // #352 - Disambiguate foreign key navigation directions - fetchMethodName.append("List"); - - // #350 - Disambiguate multiple foreign keys referencing - // the same table - if (foreignKey.countSimilarReferences() > 1) { - fetchMethodName.append("By"); - fetchMethodName.append(strategy.getJavaClassName(foreignKey.getKeyColumns().get(0))); - } - - // #1270 - Disambiguate identical foreign keys - if (fetchMethodNames.contains(fetchMethodName.toString())) { - log.warn("Duplicate foreign key", foreignKey.getName() + " has the same properties as another foreign key! No code is generated for this key. See trac ticket #1270"); - continue foreignKeyLoop; - } - else { - fetchMethodNames.add(fetchMethodName.toString()); - } - - printFieldJavaDoc(out, column); - out.print("\tpublic "); - out.print(List.class); - out.print("<"); - out.print(strategy.getFullJavaClassName(referencing, Mode.RECORD)); - out.print("> "); - out.print(fetchMethodName); - - out.println("() {"); - out.println("\t\treturn create()"); - out.print("\t\t\t.selectFrom("); - out.print(strategy.getFullJavaIdentifier(referencing)); - out.println(")"); - - String connector = "\t\t\t.where("; - - for (int i = 0; i < foreignKey.getReferencedColumns().size(); i++) { - out.print(connector); - out.print(strategy.getFullJavaIdentifier(foreignKey.getKeyColumns().get(i))); - out.print(".equal(getValue"); - - DataTypeDefinition foreignType = foreignKey.getKeyColumns().get(i).getType(); - DataTypeDefinition primaryType = uniqueKey.getKeyColumns().get(i).getType(); - - // Convert foreign key value, if there is a type mismatch - if (!match(foreignType, primaryType)) { - out.print("As"); - out.print(getSimpleJavaType(foreignKey.getKeyColumns().get(i).getType())); - } - - out.print("("); - out.print(strategy.getFullJavaIdentifier(uniqueKey.getKeyColumns().get(i))); - out.println(")))"); - - connector = "\t\t\t.and("; - } - - out.println("\t\t\t.fetch();"); - out.println("\t}"); - } - } - } - - // Print references from this foreign key to its related primary key - // E.g. in TBookRecord print getTAuthor() - // ----------------------------------------------------------------- - ForeignKeyDefinition foreignKey = column.getForeignKey(); - if (foreignKey != null && out.printOnlyOnce(foreignKey)) { - boolean skipGeneration = false; - - // #64 - If the foreign key does not match the referenced key, it - // is most likely because it references a non-primary unique key - // Skip code generation for this foreign key - - // #69 - Should resolve this issue more thoroughly. - if (foreignKey.getReferencedColumns().size() != foreignKey.getKeyColumns().size()) { - log.warn("Foreign key mismatch", foreignKey.getName() + " does not match its primary key! No code is generated for this key. See trac tickets #64 and #69"); - skipGeneration = true; - } - - // Do not generate referential code for master data tables - TableDefinition referenced = foreignKey.getReferencedTable(); - if (referenced instanceof MasterDataTableDefinition) { - skipGeneration = true; - } - - if (!skipGeneration) { - printFieldJavaDoc(out, column); - out.print("\tpublic "); - out.print(strategy.getFullJavaClassName(referenced, Mode.RECORD)); - out.print(" fetch"); - out.print(strategy.getJavaClassName(referenced)); - - // #350 - Disambiguate multiple foreign keys referencing - // the same table - if (foreignKey.countSimilarReferences() > 1) { - out.print("By"); - out.print(strategy.getJavaClassName(column)); - } - - out.println("() {"); - out.println("\t\treturn create()"); - out.print("\t\t\t.selectFrom("); - out.print(strategy.getFullJavaIdentifier(referenced)); - out.println(")"); - - String connector = "\t\t\t.where("; - - for (int i = 0; i < foreignKey.getReferencedColumns().size(); i++) { - out.print(connector); - out.print(strategy.getFullJavaIdentifier(foreignKey.getReferencedColumns().get(i))); - out.print(".equal(getValue"); - - DataTypeDefinition foreignType = foreignKey.getKeyColumns().get(i).getType(); - DataTypeDefinition primaryType = foreignKey.getReferencedColumns().get(i).getType(); - - // Convert foreign key value, if there is a type mismatch - if (!match(foreignType, primaryType)) { - out.print("As"); - out.print(getSimpleJavaType(foreignKey.getReferencedColumns().get(i).getType())); - } - - out.print("("); - out.print(strategy.getFullJavaIdentifier(foreignKey.getKeyColumns().get(i))); - out.println(")))"); - - connector = "\t\t\t.and("; - } - - out.println("\t\t\t.fetchOne();"); - out.println("\t}"); + // e.g. in TAuthorRecord, print getTBooks() + // ----------------------------------------------------------------- + Set fetchMethodNames = new HashSet(); + for (UniqueKeyDefinition uniqueKey : uniqueKeys) { + if (out.printOnlyOnce(uniqueKey)) { + for (ForeignKeyDefinition foreignKey : uniqueKey.getForeignKeys()) { + generateFetchFKList(out, uniqueKey, foreignKey, column, fetchMethodNames); } } } + + // Print references from this foreign key to its related primary key + // E.g. in TBookRecord print getTAuthor() + // ----------------------------------------------------------------- + ForeignKeyDefinition foreignKey = column.getForeignKey(); + if (foreignKey != null && out.printOnlyOnce(foreignKey)) { + generateFetchFK(out, column, foreignKey); + } } - private void printUDTColumn(GenerationWriter out, AttributeDefinition attribute, Definition table) { + protected void generateFetchFK(GenerationWriter out, ColumnDefinition column, ForeignKeyDefinition foreignKey) { + + // #64 - If the foreign key does not match the referenced key, it + // is most likely because it references a non-primary unique key + // Skip code generation for this foreign key + + // #69 - Should resolve this issue more thoroughly. + if (foreignKey.getReferencedColumns().size() != foreignKey.getKeyColumns().size()) { + log.warn("Foreign key mismatch", foreignKey.getName() + " does not match its primary key! No code is generated for this key. See trac tickets #64 and #69"); + return; + } + + // Do not generate referential code for master data tables + TableDefinition referenced = foreignKey.getReferencedTable(); + if (referenced instanceof MasterDataTableDefinition) { + return; + } + + printFieldJavaDoc(out, column); + out.print("\tpublic "); + out.print(strategy.getFullJavaClassName(referenced, Mode.RECORD)); + out.print(" fetch"); + out.print(strategy.getJavaClassName(referenced)); + + // #350 - Disambiguate multiple foreign keys referencing + // the same table + if (foreignKey.countSimilarReferences() > 1) { + out.print("By"); + out.print(strategy.getJavaClassName(column)); + } + + out.println("() {"); + out.println("\t\treturn create()"); + out.print("\t\t\t.selectFrom("); + out.print(strategy.getFullJavaIdentifier(referenced)); + out.println(")"); + + String connector = "\t\t\t.where("; + + for (int i = 0; i < foreignKey.getReferencedColumns().size(); i++) { + out.print(connector); + out.print(strategy.getFullJavaIdentifier(foreignKey.getReferencedColumns().get(i))); + out.print(".equal(getValue"); + + DataTypeDefinition foreignType = foreignKey.getKeyColumns().get(i).getType(); + DataTypeDefinition primaryType = foreignKey.getReferencedColumns().get(i).getType(); + + // Convert foreign key value, if there is a type mismatch + if (!match(foreignType, primaryType)) { + out.print("As"); + out.print(getSimpleJavaType(foreignKey.getReferencedColumns().get(i).getType())); + } + + out.print("("); + out.print(strategy.getFullJavaIdentifier(foreignKey.getKeyColumns().get(i))); + out.println(")))"); + + connector = "\t\t\t.and("; + } + + out.println("\t\t\t.fetchOne();"); + out.println("\t}"); + } + + private void generateFetchFKList(GenerationWriter out, UniqueKeyDefinition uniqueKey, ForeignKeyDefinition foreignKey, ColumnDefinition column, Set fetchMethodNames) { + // #64 - If the foreign key does not match the referenced key, it + // is most likely because it references a non-primary unique key + // Skip code generation for this foreign key + + // #69 - Should resolve this issue more thoroughly. + if (foreignKey.getReferencedColumns().size() != foreignKey.getKeyColumns().size()) { + log.warn("Foreign key mismatch", foreignKey.getName() + " does not match its primary key! No code is generated for this key. See trac tickets #64 and #69"); + return; + } + + TableDefinition referencing = foreignKey.getKeyTable(); + + StringBuilder fetchMethodName = new StringBuilder(); + fetchMethodName.append("fetch"); + fetchMethodName.append(strategy.getJavaClassName(referencing)); + + // #352 - Disambiguate foreign key navigation directions + fetchMethodName.append("List"); + + // #350 - Disambiguate multiple foreign keys referencing + // the same table + if (foreignKey.countSimilarReferences() > 1) { + fetchMethodName.append("By"); + fetchMethodName.append(strategy.getJavaClassName(foreignKey.getKeyColumns().get(0))); + } + + // #1270 - Disambiguate identical foreign keys + if (fetchMethodNames.contains(fetchMethodName.toString())) { + log.warn("Duplicate foreign key", foreignKey.getName() + " has the same properties as another foreign key! No code is generated for this key. See trac ticket #1270"); + return; + } + else { + fetchMethodNames.add(fetchMethodName.toString()); + } + + printFieldJavaDoc(out, column); + out.print("\tpublic "); + out.print(List.class); + out.print("<"); + out.print(strategy.getFullJavaClassName(referencing, Mode.RECORD)); + out.print("> "); + out.print(fetchMethodName); + + out.println("() {"); + out.println("\t\treturn create()"); + out.print("\t\t\t.selectFrom("); + out.print(strategy.getFullJavaIdentifier(referencing)); + out.println(")"); + + String connector = "\t\t\t.where("; + + for (int i = 0; i < foreignKey.getReferencedColumns().size(); i++) { + out.print(connector); + out.print(strategy.getFullJavaIdentifier(foreignKey.getKeyColumns().get(i))); + out.print(".equal(getValue"); + + DataTypeDefinition foreignType = foreignKey.getKeyColumns().get(i).getType(); + DataTypeDefinition primaryType = uniqueKey.getKeyColumns().get(i).getType(); + + // Convert foreign key value, if there is a type mismatch + if (!match(foreignType, primaryType)) { + out.print("As"); + out.print(getSimpleJavaType(foreignKey.getKeyColumns().get(i).getType())); + } + + out.print("("); + out.print(strategy.getFullJavaIdentifier(uniqueKey.getKeyColumns().get(i))); + out.println(")))"); + + connector = "\t\t\t.and("; + } + + out.println("\t\t\t.fetch();"); + out.println("\t}"); + } + + protected void printUDTColumn(GenerationWriter out, AttributeDefinition attribute, Definition table) { Class declaredMemberClass = UDTField.class; printColumnDefinition(out, attribute, table, declaredMemberClass); } - private void printTableColumn(GenerationWriter out, ColumnDefinition column, Definition table) { + protected void printTableColumn(GenerationWriter out, ColumnDefinition column, Definition table) { Class declaredMemberClass = TableField.class; printColumnDefinition(out, column, table, declaredMemberClass); } - private void printParameter(GenerationWriter out, ParameterDefinition parameter, Definition proc) { + protected void printParameter(GenerationWriter out, ParameterDefinition parameter, Definition proc) { printColumnDefinition(out, parameter, proc, Parameter.class); } - private void printColumnDefinition(GenerationWriter out, TypedElementDefinition column, Definition type, Class declaredMemberClass) { + protected void printColumnDefinition(GenerationWriter out, TypedElementDefinition column, Definition type, Class declaredMemberClass) { printFieldJavaDoc(out, column); boolean hasType = @@ -2844,11 +2965,11 @@ public class DefaultGenerator extends AbstractGenerator { out.println(");"); } - private void printFieldJavaDoc(GenerationWriter out, TypedElementDefinition element) { + protected void printFieldJavaDoc(GenerationWriter out, TypedElementDefinition element) { printFieldJavaDoc(out, element, null); } - private void printFieldJavaDoc(GenerationWriter out, TypedElementDefinition element, String deprecation) { + protected void printFieldJavaDoc(GenerationWriter out, TypedElementDefinition element, String deprecation) { out.println(); out.println("\t/**"); @@ -2927,7 +3048,7 @@ public class DefaultGenerator extends AbstractGenerator { } } - private void printDeprecation(GenerationWriter out, String deprecation) { + protected void printDeprecation(GenerationWriter out, String deprecation) { if (deprecation != null) { out.println("\t *"); @@ -2943,25 +3064,25 @@ public class DefaultGenerator extends AbstractGenerator { } } - private void printNoFurtherInstancesAllowedJavadoc(GenerationWriter out) { + protected void printNoFurtherInstancesAllowedJavadoc(GenerationWriter out) { printJavadoc(out, "No further instances allowed"); } - private void printJavadoc(GenerationWriter out, String doc) { + protected void printJavadoc(GenerationWriter out, String doc) { out.println("\t/**"); out.println("\t * " + doc); out.println("\t */"); } - private void printClassJavadoc(GenerationWriter out, Definition definition) { + protected void printClassJavadoc(GenerationWriter out, Definition definition) { printClassJavadoc(out, definition.getComment()); } - private void printClassJavadoc(GenerationWriter out, String comment) { + protected void printClassJavadoc(GenerationWriter out, String comment) { printClassJavadoc(out, comment, null); } - private void printClassJavadoc(GenerationWriter out, String comment, String deprecation) { + protected void printClassJavadoc(GenerationWriter out, String comment, String deprecation) { out.println("/**"); out.println(" * This class is generated by jOOQ."); @@ -2993,7 +3114,7 @@ public class DefaultGenerator extends AbstractGenerator { /** * This method is used to add line breaks in lengthy javadocs */ - private void printJavadocParagraph(GenerationWriter out, String comment, String indent) { + protected void printJavadocParagraph(GenerationWriter out, String comment, String indent) { boolean newLine = true; int lineLength = 0; @@ -3024,11 +3145,11 @@ public class DefaultGenerator extends AbstractGenerator { } } - private void printHeader(GenerationWriter out, Definition definition) { + protected void printHeader(GenerationWriter out, Definition definition) { printHeader(out, definition, Mode.DEFAULT); } - private void printHeader(GenerationWriter out, Definition definition, Mode mode) { + protected void printHeader(GenerationWriter out, Definition definition, Mode mode) { out.println("/**"); out.println(" * This class is generated by jOOQ"); out.println(" */"); @@ -3036,15 +3157,15 @@ public class DefaultGenerator extends AbstractGenerator { out.println(); } - private void printExtendsNumberType(GenerationWriter out, DataTypeDefinition type) { + protected void printExtendsNumberType(GenerationWriter out, DataTypeDefinition type) { printNumberType(out, type, "? extends "); } - private void printNumberType(GenerationWriter out, DataTypeDefinition type) { + protected void printNumberType(GenerationWriter out, DataTypeDefinition type) { printNumberType(out, type, ""); } - private void printNumberType(GenerationWriter out, DataTypeDefinition type, String prefix) { + protected void printNumberType(GenerationWriter out, DataTypeDefinition type, String prefix) { if (type.isGenericNumberType()) { out.print(prefix); out.print(Number.class); @@ -3054,11 +3175,11 @@ public class DefaultGenerator extends AbstractGenerator { } } - private String getSimpleJavaType(DataTypeDefinition type) { + protected String getSimpleJavaType(DataTypeDefinition type) { return GenerationUtil.getSimpleJavaType(getJavaType(type)); } - private String getJavaTypeReference(Database db, DataTypeDefinition type) { + protected String getJavaTypeReference(Database db, DataTypeDefinition type) { if (type instanceof MasterDataTypeDefinition) { StringBuilder sb = new StringBuilder(); @@ -3071,7 +3192,7 @@ public class DefaultGenerator extends AbstractGenerator { } else { - if (db.isArrayType(type.getType())) { + if (database.isArrayType(type.getType())) { String baseType = GenerationUtil.getArrayBaseType(db.getDialect(), type.getType(), type.getUserType()); return getTypeReference(db, type.getSchema(), baseType, 0, 0, baseType) + ".getArrayDataType()"; } @@ -3081,7 +3202,7 @@ public class DefaultGenerator extends AbstractGenerator { } } - private String getJavaType(DataTypeDefinition type) { + protected String getJavaType(DataTypeDefinition type) { if (type instanceof MasterDataTypeDefinition) { return strategy.getFullJavaClassName(((MasterDataTypeDefinition) type).table); } @@ -3097,7 +3218,7 @@ public class DefaultGenerator extends AbstractGenerator { } } - private String getType(Database db, SchemaDefinition schema, String t, int p, int s, String u, String defaultType) { + protected String getType(Database db, SchemaDefinition schema, String t, int p, int s, String u, String defaultType) { String type = defaultType; // Array types @@ -3156,10 +3277,10 @@ public class DefaultGenerator extends AbstractGenerator { return type; } - private String getTypeReference(Database db, SchemaDefinition schema, String t, int p, int s, String u) { + protected String getTypeReference(Database db, SchemaDefinition schema, String t, int p, int s, String u) { StringBuilder sb = new StringBuilder(); if (db.getArray(schema, u) != null) { - ArrayDefinition array = db.getArray(schema, u); + ArrayDefinition array = database.getArray(schema, u); sb.append(getJavaTypeReference(db, array.getElementType())); sb.append(".asArrayDataType("); @@ -3259,7 +3380,7 @@ public class DefaultGenerator extends AbstractGenerator { return sb.toString(); } - private boolean match(DataTypeDefinition type1, DataTypeDefinition type2) { + protected boolean match(DataTypeDefinition type1, DataTypeDefinition type2) { return getJavaType(type1).equals(getJavaType(type2)); } } diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java b/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java index 1b9a69927d..dfe7059d2f 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java @@ -36,8 +36,6 @@ package org.jooq.util; -import java.io.IOException; - import javax.annotation.Generated; /** @@ -50,7 +48,7 @@ public interface Generator { /** * Do the code generation */ - void generate(Database database) throws IOException; + void generate(Database database); /** * Set a naming strategy to this generator