Search in sources :

Example 1 with Target

use of org.jooq.util.jaxb.Target in project jOOQ by jOOQ.

the class Plugin method execute.

@Override
public void execute() throws MojoExecutionException {
    if (skip) {
        getLog().info("Skipping jOOQ code generation");
        return;
    }
    if (configurationFile != null) {
        getLog().info("Reading external configuration");
        File file = new File(configurationFile);
        if (!file.isAbsolute())
            file = new File(project.getBasedir(), configurationFile);
        FileInputStream in = null;
        try {
            in = new FileInputStream(file);
            Configuration configuration = GenerationTool.load(in);
            generator = configuration.getGenerator();
            jdbc = configuration.getJdbc();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException ignore) {
                }
            }
        }
    }
    //         correctly at this point. We'll log them all here.
    if (generator == null) {
        getLog().error("Incorrect configuration of jOOQ code generation tool");
        getLog().error("\n" + "The jOOQ-codegen-maven module's generator configuration is not set up correctly.\n" + "This can have a variety of reasons, among which:\n" + "- Your pom.xml's <configuration> contains invalid XML according to " + XSD_CODEGEN + "\n" + "- There is a version or artifact mismatch between your pom.xml and your commandline");
        throw new MojoExecutionException("Incorrect configuration of jOOQ code generation tool. See error above for details.");
    }
    ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
    try {
        // [#2886] Add the surrounding project's dependencies to the current classloader
        Thread.currentThread().setContextClassLoader(getClassLoader());
        // [#5881] Target is allowed to be null
        if (generator.getTarget() == null)
            generator.setTarget(new Target());
        if (generator.getTarget().getDirectory() == null)
            generator.getTarget().setDirectory(DEFAULT_TARGET_DIRECTORY);
        // [#2887] Patch relative paths to take plugin execution basedir into account
        if (!new File(generator.getTarget().getDirectory()).isAbsolute())
            generator.getTarget().setDirectory(project.getBasedir() + File.separator + generator.getTarget().getDirectory());
        Configuration configuration = new Configuration();
        configuration.setLogging(logging);
        configuration.setJdbc(jdbc);
        configuration.setGenerator(generator);
        StringWriter writer = new StringWriter();
        JAXB.marshal(configuration, writer);
        getLog().debug("Using this configuration:\n" + writer.toString());
        GenerationTool.generate(configuration);
    } catch (Exception ex) {
        throw new MojoExecutionException("Error running jOOQ code generation tool", ex);
    } finally // [#2886] Restore old class loader
    {
        Thread.currentThread().setContextClassLoader(oldCL);
    }
    project.addCompileSourceRoot(generator.getTarget().getDirectory());
}
Also used : Target(org.jooq.util.jaxb.Target) Configuration(org.jooq.util.jaxb.Configuration) MojoExecutionException(org.apache.maven.plugin.MojoExecutionException) StringWriter(java.io.StringWriter) URLClassLoader(java.net.URLClassLoader) IOException(java.io.IOException) File(java.io.File) FileInputStream(java.io.FileInputStream) IOException(java.io.IOException) MojoExecutionException(org.apache.maven.plugin.MojoExecutionException)

Example 2 with Target

use of org.jooq.util.jaxb.Target in project jOOQ by jOOQ.

the class GenerationTool method run.

@SuppressWarnings("unchecked")
public void run(Configuration configuration) throws Exception {
    if (configuration.getLogging() != null) {
        switch(configuration.getLogging()) {
            case TRACE:
                JooqLogger.globalThreshold(Level.TRACE);
                break;
            case DEBUG:
                JooqLogger.globalThreshold(Level.DEBUG);
                break;
            case INFO:
                JooqLogger.globalThreshold(Level.INFO);
                break;
            case WARN:
                JooqLogger.globalThreshold(Level.WARN);
                break;
            case ERROR:
                JooqLogger.globalThreshold(Level.ERROR);
                break;
            case FATAL:
                JooqLogger.globalThreshold(Level.FATAL);
                break;
        }
    }
    Jdbc j = configuration.getJdbc();
    org.jooq.util.jaxb.Generator g = configuration.getGenerator();
    if (g == null)
        throw new GeneratorException("The <generator/> tag is mandatory. For details, see " + Constants.NS_CODEGEN);
    // Some default values for optional elements to avoid NPE's
    if (g.getStrategy() == null)
        g.setStrategy(new Strategy());
    if (g.getTarget() == null)
        g.setTarget(new Target());
    try {
        // ---------------------
        if (connection == null) {
            close = true;
            if (dataSource != null) {
                connection = dataSource.getConnection();
            } else if (j != null) {
                Class<? extends Driver> driver = (Class<? extends Driver>) loadClass(driverClass(j));
                Properties properties = properties(j.getProperties());
                if (!properties.containsKey("user"))
                    properties.put("user", defaultString(defaultString(j.getUser(), j.getUsername())));
                if (!properties.containsKey("password"))
                    properties.put("password", defaultString(j.getPassword()));
                connection = driver.newInstance().connect(defaultString(j.getUrl()), properties);
            }
        }
        j = defaultIfNull(j, new Jdbc());
        // Initialise generator
        // --------------------
        Class<Generator> generatorClass = (Class<Generator>) (!isBlank(g.getName()) ? loadClass(trim(g.getName())) : JavaGenerator.class);
        Generator generator = generatorClass.newInstance();
        GeneratorStrategy strategy;
        Matchers matchers = g.getStrategy().getMatchers();
        if (matchers != null) {
            strategy = new MatcherStrategy(matchers);
            if (g.getStrategy().getName() != null) {
                log.warn("WARNING: Matchers take precedence over custom strategy. Strategy ignored: " + g.getStrategy().getName());
                g.getStrategy().setName(null);
            }
        } else {
            Class<GeneratorStrategy> strategyClass = (Class<GeneratorStrategy>) (!isBlank(g.getStrategy().getName()) ? loadClass(trim(g.getStrategy().getName())) : DefaultGeneratorStrategy.class);
            strategy = strategyClass.newInstance();
        }
        generator.setStrategy(strategy);
        org.jooq.util.jaxb.Database d = defaultIfNull(g.getDatabase(), new org.jooq.util.jaxb.Database());
        String databaseName = trim(d.getName());
        Class<? extends Database> databaseClass = !isBlank(databaseName) ? (Class<? extends Database>) loadClass(databaseName) : connection != null ? databaseClass(connection) : databaseClass(j);
        Database database = databaseClass.newInstance();
        database.setProperties(properties(d.getProperties()));
        List<Catalog> catalogs = d.getCatalogs();
        List<Schema> schemata = d.getSchemata();
        boolean catalogsEmpty = catalogs.isEmpty();
        boolean schemataEmpty = schemata.isEmpty();
        // For convenience, the catalog configuration can be set also directly in the <database/> element
        if (catalogsEmpty) {
            Catalog catalog = new Catalog();
            catalog.setInputCatalog(trim(d.getInputCatalog()));
            catalog.setOutputCatalog(trim(d.getOutputCatalog()));
            catalog.setOutputCatalogToDefault(d.isOutputCatalogToDefault());
            catalogs.add(catalog);
            if (!StringUtils.isBlank(catalog.getInputCatalog()))
                catalogsEmpty = false;
            // in the <database/> element
            if (schemataEmpty) {
                Schema schema = new Schema();
                schema.setInputSchema(trim(d.getInputSchema()));
                schema.setOutputSchema(trim(d.getOutputSchema()));
                schema.setOutputSchemaToDefault(d.isOutputSchemaToDefault());
                catalog.getSchemata().add(schema);
                if (!StringUtils.isBlank(schema.getInputSchema()))
                    schemataEmpty = false;
            } else {
                catalog.getSchemata().addAll(schemata);
                if (!StringUtils.isBlank(d.getInputSchema()))
                    log.warn("WARNING: Cannot combine configuration properties /configuration/generator/database/inputSchema and /configuration/generator/database/schemata");
                if (!StringUtils.isBlank(d.getOutputSchema()))
                    log.warn("WARNING: Cannot combine configuration properties /configuration/generator/database/outputSchema and /configuration/generator/database/schemata");
            }
        } else {
            if (!StringUtils.isBlank(d.getInputCatalog()))
                log.warn("WARNING: Cannot combine configuration properties /configuration/generator/database/inputCatalog and /configuration/generator/database/catalogs");
            if (!StringUtils.isBlank(d.getOutputCatalog()))
                log.warn("WARNING: Cannot combine configuration properties /configuration/generator/database/outputCatalog and /configuration/generator/database/catalogs");
            if (!StringUtils.isBlank(d.getInputSchema()))
                log.warn("WARNING: Cannot combine configuration properties /configuration/generator/database/inputSchema and /configuration/generator/database/catalogs");
            if (!StringUtils.isBlank(d.getOutputSchema()))
                log.warn("WARNING: Cannot combine configuration properties /configuration/generator/database/outputSchema and /configuration/generator/database/catalogs");
            if (!schemataEmpty)
                log.warn("WARNING: Cannot combine configuration properties /configuration/generator/database/catalogs and /configuration/generator/database/schemata");
        }
        for (Catalog catalog : catalogs) {
            if ("".equals(catalog.getOutputCatalog()))
                log.warn("WARNING: Empty <outputCatalog/> should not be used to model default outputCatalogs. Use <outputCatalogToDefault>true</outputCatalogToDefault>, instead. See also: https://github.com/jOOQ/jOOQ/issues/3018");
            // [#3018] If users want the output catalog to be "" then, ignore the actual <outputCatalog/> configuration
            if (TRUE.equals(catalog.isOutputCatalogToDefault()))
                catalog.setOutputCatalog("");
            else if (catalog.getOutputCatalog() == null)
                catalog.setOutputCatalog(trim(catalog.getInputCatalog()));
            for (Schema schema : catalog.getSchemata()) {
                if (catalogsEmpty && schemataEmpty && StringUtils.isBlank(schema.getInputSchema())) {
                    if (!StringUtils.isBlank(j.getSchema()))
                        log.warn("WARNING: The configuration property jdbc.Schema is deprecated and will be removed in the future. Use /configuration/generator/database/inputSchema instead");
                    schema.setInputSchema(trim(j.getSchema()));
                }
                // work when Maven parses the XML configurations.
                if ("".equals(schema.getOutputSchema()))
                    log.warn("WARNING: Empty <outputSchema/> should not be used to model default outputSchemas. Use <outputSchemaToDefault>true</outputSchemaToDefault>, instead. See also: https://github.com/jOOQ/jOOQ/issues/3018");
                // [#3018] If users want the output schema to be "" then, ignore the actual <outputSchema/> configuration
                if (TRUE.equals(schema.isOutputSchemaToDefault()))
                    schema.setOutputSchema("");
                else if (schema.getOutputSchema() == null)
                    schema.setOutputSchema(trim(schema.getInputSchema()));
            }
        }
        if (catalogsEmpty)
            log.info("No <inputCatalog/> was provided. Generating ALL available catalogs instead.");
        if (catalogsEmpty && schemataEmpty)
            log.info("No <inputSchema/> was provided. Generating ALL available schemata instead.");
        database.setConnection(connection);
        database.setConfiguredCatalogs(catalogs);
        database.setConfiguredSchemata(schemata);
        database.setIncludes(new String[] { defaultString(d.getIncludes()) });
        database.setExcludes(new String[] { defaultString(d.getExcludes()) });
        database.setIncludeExcludeColumns(TRUE.equals(d.isIncludeExcludeColumns()));
        database.setIncludeForeignKeys(!FALSE.equals(d.isIncludeForeignKeys()));
        database.setIncludePackages(!FALSE.equals(d.isIncludePackages()));
        database.setIncludePrimaryKeys(!FALSE.equals(d.isIncludePrimaryKeys()));
        database.setIncludeRoutines(!FALSE.equals(d.isIncludeRoutines()));
        database.setIncludeSequences(!FALSE.equals(d.isIncludeSequences()));
        database.setIncludeTables(!FALSE.equals(d.isIncludeTables()));
        database.setIncludeUDTs(!FALSE.equals(d.isIncludeUDTs()));
        database.setIncludeUniqueKeys(!FALSE.equals(d.isIncludeUniqueKeys()));
        database.setRecordVersionFields(new String[] { defaultString(d.getRecordVersionFields()) });
        database.setRecordTimestampFields(new String[] { defaultString(d.getRecordTimestampFields()) });
        database.setSyntheticPrimaryKeys(new String[] { defaultString(d.getSyntheticPrimaryKeys()) });
        database.setOverridePrimaryKeys(new String[] { defaultString(d.getOverridePrimaryKeys()) });
        database.setSyntheticIdentities(new String[] { defaultString(d.getSyntheticIdentities()) });
        database.setConfiguredCustomTypes(d.getCustomTypes());
        database.setConfiguredEnumTypes(d.getEnumTypes());
        database.setConfiguredForcedTypes(d.getForcedTypes());
        if (d.getRegexFlags() != null)
            database.setRegexFlags(d.getRegexFlags());
        SchemaVersionProvider svp = null;
        CatalogVersionProvider cvp = null;
        if (!StringUtils.isBlank(d.getSchemaVersionProvider())) {
            try {
                svp = (SchemaVersionProvider) Class.forName(d.getSchemaVersionProvider()).newInstance();
                log.info("Using custom schema version provider : " + svp);
            } catch (Exception ignore) {
                if (d.getSchemaVersionProvider().toLowerCase().startsWith("select")) {
                    svp = new SQLSchemaVersionProvider(connection, d.getSchemaVersionProvider());
                    log.info("Using SQL schema version provider : " + d.getSchemaVersionProvider());
                } else {
                    svp = new ConstantSchemaVersionProvider(d.getSchemaVersionProvider());
                }
            }
        }
        if (!StringUtils.isBlank(d.getCatalogVersionProvider())) {
            try {
                cvp = (CatalogVersionProvider) Class.forName(d.getCatalogVersionProvider()).newInstance();
                log.info("Using custom catalog version provider : " + cvp);
            } catch (Exception ignore) {
                if (d.getCatalogVersionProvider().toLowerCase().startsWith("select")) {
                    cvp = new SQLCatalogVersionProvider(connection, d.getCatalogVersionProvider());
                    log.info("Using SQL catalog version provider : " + d.getCatalogVersionProvider());
                } else {
                    cvp = new ConstantCatalogVersionProvider(d.getCatalogVersionProvider());
                }
            }
        }
        if (svp == null)
            svp = new ConstantSchemaVersionProvider(null);
        if (cvp == null)
            cvp = new ConstantCatalogVersionProvider(null);
        database.setSchemaVersionProvider(svp);
        database.setCatalogVersionProvider(cvp);
        if (d.getEnumTypes().size() > 0)
            log.warn("DEPRECATED", "The configuration property /configuration/generator/database/enumTypes is experimental and deprecated and will be removed in the future.");
        if (Boolean.TRUE.equals(d.isDateAsTimestamp()))
            log.warn("DEPRECATED", "The configuration property /configuration/generator/database/dateAsTimestamp is deprecated as it is superseded by custom bindings and converters. It will thus be removed in the future.");
        if (d.isDateAsTimestamp() != null)
            database.setDateAsTimestamp(d.isDateAsTimestamp());
        if (d.isUnsignedTypes() != null)
            database.setSupportsUnsignedTypes(d.isUnsignedTypes());
        if (d.isIgnoreProcedureReturnValues() != null)
            database.setIgnoreProcedureReturnValues(d.isIgnoreProcedureReturnValues());
        if (Boolean.TRUE.equals(d.isIgnoreProcedureReturnValues()))
            log.warn("DEPRECATED", "The <ignoreProcedureReturnValues/> flag is deprecated and used for backwards-compatibility only. It will be removed in the future.");
        if (StringUtils.isBlank(g.getTarget().getPackageName()))
            g.getTarget().setPackageName(DEFAULT_TARGET_PACKAGENAME);
        if (StringUtils.isBlank(g.getTarget().getDirectory()))
            g.getTarget().setDirectory(DEFAULT_TARGET_DIRECTORY);
        if (StringUtils.isBlank(g.getTarget().getEncoding()))
            g.getTarget().setEncoding(DEFAULT_TARGET_ENCODING);
        generator.setTargetPackage(g.getTarget().getPackageName());
        generator.setTargetDirectory(g.getTarget().getDirectory());
        generator.setTargetEncoding(g.getTarget().getEncoding());
        // [#1394] The <generate/> element should be optional
        if (g.getGenerate() == null)
            g.setGenerate(new Generate());
        if (g.getGenerate().isRelations() != null)
            generator.setGenerateRelations(g.getGenerate().isRelations());
        if (g.getGenerate().isDeprecated() != null)
            generator.setGenerateDeprecated(g.getGenerate().isDeprecated());
        if (g.getGenerate().isInstanceFields() != null)
            generator.setGenerateInstanceFields(g.getGenerate().isInstanceFields());
        if (g.getGenerate().isGeneratedAnnotation() != null)
            generator.setGenerateGeneratedAnnotation(g.getGenerate().isGeneratedAnnotation());
        if (g.getGenerate().isRoutines() != null)
            generator.setGenerateRoutines(g.getGenerate().isRoutines());
        if (g.getGenerate().isSequences() != null)
            generator.setGenerateSequences(g.getGenerate().isSequences());
        if (g.getGenerate().isUdts() != null)
            generator.setGenerateUDTs(g.getGenerate().isUdts());
        if (g.getGenerate().isTables() != null)
            generator.setGenerateTables(g.getGenerate().isTables());
        if (g.getGenerate().isRecords() != null)
            generator.setGenerateRecords(g.getGenerate().isRecords());
        if (g.getGenerate().isPojos() != null)
            generator.setGeneratePojos(g.getGenerate().isPojos());
        if (g.getGenerate().isImmutablePojos() != null)
            generator.setGenerateImmutablePojos(g.getGenerate().isImmutablePojos());
        if (g.getGenerate().isInterfaces() != null)
            generator.setGenerateInterfaces(g.getGenerate().isInterfaces());
        if (g.getGenerate().isImmutableInterfaces() != null)
            generator.setGenerateImmutableInterfaces(g.getGenerate().isImmutableInterfaces());
        if (g.getGenerate().isDaos() != null)
            generator.setGenerateDaos(g.getGenerate().isDaos());
        if (g.getGenerate().isJpaAnnotations() != null)
            generator.setGenerateJPAAnnotations(g.getGenerate().isJpaAnnotations());
        if (g.getGenerate().isValidationAnnotations() != null)
            generator.setGenerateValidationAnnotations(g.getGenerate().isValidationAnnotations());
        if (g.getGenerate().isSpringAnnotations() != null)
            generator.setGenerateSpringAnnotations(g.getGenerate().isSpringAnnotations());
        if (g.getGenerate().isQueues() != null)
            generator.setGenerateQueues(g.getGenerate().isQueues());
        if (g.getGenerate().isLinks() != null)
            generator.setGenerateLinks(g.getGenerate().isLinks());
        if (g.getGenerate().isGlobalLinkReferences() != null)
            generator.setGenerateGlobalLinkReferences(g.getGenerate().isGlobalLinkReferences());
        if (g.getGenerate().isGlobalObjectReferences() != null)
            generator.setGenerateGlobalObjectReferences(g.getGenerate().isGlobalObjectReferences());
        if (g.getGenerate().isGlobalCatalogReferences() != null)
            generator.setGenerateGlobalCatalogReferences(g.getGenerate().isGlobalCatalogReferences());
        if (g.getGenerate().isGlobalSchemaReferences() != null)
            generator.setGenerateGlobalSchemaReferences(g.getGenerate().isGlobalSchemaReferences());
        if (g.getGenerate().isGlobalRoutineReferences() != null)
            generator.setGenerateGlobalRoutineReferences(g.getGenerate().isGlobalRoutineReferences());
        if (g.getGenerate().isGlobalSequenceReferences() != null)
            generator.setGenerateGlobalSequenceReferences(g.getGenerate().isGlobalSequenceReferences());
        if (g.getGenerate().isGlobalTableReferences() != null)
            generator.setGenerateGlobalTableReferences(g.getGenerate().isGlobalTableReferences());
        if (g.getGenerate().isGlobalUDTReferences() != null)
            generator.setGenerateGlobalUDTReferences(g.getGenerate().isGlobalUDTReferences());
        if (g.getGenerate().isGlobalQueueReferences() != null)
            generator.setGenerateGlobalQueueReferences(g.getGenerate().isGlobalQueueReferences());
        if (g.getGenerate().isGlobalLinkReferences() != null)
            generator.setGenerateGlobalLinkReferences(g.getGenerate().isGlobalLinkReferences());
        if (g.getGenerate().isFluentSetters() != null)
            generator.setGenerateFluentSetters(g.getGenerate().isFluentSetters());
        if (g.getGenerate().isVarargSetters() != null)
            generator.setGenerateVarargsSetters(g.getGenerate().isVarargSetters());
        if (g.getGenerate().isPojosEqualsAndHashCode() != null)
            generator.setGeneratePojosEqualsAndHashCode(g.getGenerate().isPojosEqualsAndHashCode());
        if (g.getGenerate().isPojosToString() != null)
            generator.setGeneratePojosToString(g.getGenerate().isPojosToString());
        if (g.getGenerate().getFullyQualifiedTypes() != null)
            generator.setGenerateFullyQualifiedTypes(g.getGenerate().getFullyQualifiedTypes());
        if (g.getGenerate().isJavaTimeTypes() != null)
            generator.setGenerateJavaTimeTypes(g.getGenerate().isJavaTimeTypes());
        if (g.getGenerate().isEmptyCatalogs() != null)
            generator.setGenerateEmptyCatalogs(g.getGenerate().isEmptyCatalogs());
        if (g.getGenerate().isEmptySchemas() != null)
            generator.setGenerateEmptySchemas(g.getGenerate().isEmptySchemas());
        // [#3669] Optional Database element
        if (g.getDatabase() == null)
            g.setDatabase(new org.jooq.util.jaxb.Database());
        if (!StringUtils.isBlank(g.getDatabase().getSchemaVersionProvider()))
            generator.setUseSchemaVersionProvider(true);
        if (!StringUtils.isBlank(g.getDatabase().getCatalogVersionProvider()))
            generator.setUseCatalogVersionProvider(true);
        if (g.getDatabase().isTableValuedFunctions() != null)
            generator.setGenerateTableValuedFunctions(g.getDatabase().isTableValuedFunctions());
        else {
            generator.setGenerateTableValuedFunctions(true);
        }
        // Generator properties that should in fact be strategy properties
        strategy.setInstanceFields(generator.generateInstanceFields());
        if (true)
            ;
        else if (g.getGenerate().isJavaTimeTypes() != null) {
            log.warn("INVALID CONFIG", "The java.time API cannot be used in the Java 6 distribution of jOOQ 3.9+");
            generator.setGenerateJavaTimeTypes(false);
        }
        generator.generate(database);
    } finally {
        // Close connection only if it was created by the GenerationTool
        if (close && connection != null)
            connection.close();
    }
}
Also used : Schema(org.jooq.util.jaxb.Schema) Driver(java.sql.Driver) StringUtils.defaultString(org.jooq.tools.StringUtils.defaultString) Properties(java.util.Properties) Target(org.jooq.util.jaxb.Target) Generate(org.jooq.util.jaxb.Generate) Matchers(org.jooq.util.jaxb.Matchers) Catalog(org.jooq.util.jaxb.Catalog) SQLException(java.sql.SQLException) IOException(java.io.IOException) Jdbc(org.jooq.util.jaxb.Jdbc) Strategy(org.jooq.util.jaxb.Strategy)

Aggregations

IOException (java.io.IOException)2 Target (org.jooq.util.jaxb.Target)2 File (java.io.File)1 FileInputStream (java.io.FileInputStream)1 StringWriter (java.io.StringWriter)1 URLClassLoader (java.net.URLClassLoader)1 Driver (java.sql.Driver)1 SQLException (java.sql.SQLException)1 Properties (java.util.Properties)1 MojoExecutionException (org.apache.maven.plugin.MojoExecutionException)1 StringUtils.defaultString (org.jooq.tools.StringUtils.defaultString)1 Catalog (org.jooq.util.jaxb.Catalog)1 Configuration (org.jooq.util.jaxb.Configuration)1 Generate (org.jooq.util.jaxb.Generate)1 Jdbc (org.jooq.util.jaxb.Jdbc)1 Matchers (org.jooq.util.jaxb.Matchers)1 Schema (org.jooq.util.jaxb.Schema)1 Strategy (org.jooq.util.jaxb.Strategy)1