X-Git-Url: http://juplo.de/gitweb/?p=hibernate4-maven-plugin;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fplugins%2Fhibernate%2FAbstractSchemaMojo.java;h=71e1250f608c628a8f47aa4a7871affb301a9693;hp=ff68ea73f0838d626074d9c946b7d917df897f7f;hb=505d13bdca776dd80f661a52797789b87e97b200;hpb=ee7f6da0225efc14d89fab58d88a45c98823399e diff --git a/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java b/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java index ff68ea73..71e1250f 100644 --- a/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java +++ b/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java @@ -4,14 +4,14 @@ package de.juplo.plugins.hibernate; import com.pyx4j.log4j.MavenLogAppender; import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.security.NoSuchAlgorithmException; +import java.time.ZonedDateTime; import java.util.Collections; -import java.util.EnumSet; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; @@ -47,7 +47,6 @@ import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.boot.spi.MetadataImplementor; -import org.hibernate.cfg.AvailableSettings; import static org.hibernate.cfg.AvailableSettings.DIALECT; import static org.hibernate.cfg.AvailableSettings.DRIVER; import static org.hibernate.cfg.AvailableSettings.FORMAT_SQL; @@ -63,18 +62,11 @@ import static org.hibernate.cfg.AvailableSettings.PHYSICAL_NAMING_STRATEGY; import static org.hibernate.cfg.AvailableSettings.SHOW_SQL; import static org.hibernate.cfg.AvailableSettings.USER; import static org.hibernate.cfg.AvailableSettings.URL; -import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.internal.util.config.ConfigurationException; import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor; import org.hibernate.jpa.boot.internal.PersistenceXmlParser; -import org.hibernate.tool.schema.TargetType; import org.hibernate.tool.schema.internal.ExceptionHandlerCollectingImpl; -import org.hibernate.tool.schema.internal.exec.ScriptTargetOutputToFile; -import org.hibernate.tool.schema.spi.ExecutionOptions; -import org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator; -import org.hibernate.tool.schema.spi.ScriptTargetOutput; -import org.hibernate.tool.schema.spi.TargetDescriptor; import org.scannotation.AnnotationDB; @@ -87,13 +79,14 @@ import org.scannotation.AnnotationDB; */ public abstract class AbstractSchemaMojo extends AbstractMojo { - public final static String EXPORT = "hibernate.schema.export"; + public final static String EXECUTE = "hibernate.schema.execute"; public final static String OUTPUTDIRECTORY = "project.build.outputDirectory"; public final static String SCAN_CLASSES = "hibernate.schema.scan.classes"; public final static String SCAN_DEPENDENCIES = "hibernate.schema.scan.dependencies"; public final static String SCAN_TESTCLASSES = "hibernate.schema.scan.test_classes"; public final static String TEST_OUTPUTDIRECTORY = "project.build.testOutputDirectory"; public final static String SKIPPED = "hibernate.schema.skipped"; + public final static String SCRIPT = "hibernate.schema.script"; private final static Pattern SPLIT = Pattern.compile("[^,\\s]+"); @@ -126,7 +119,7 @@ public abstract class AbstractSchemaMojo extends AbstractMojo /** Parameters to configure the genaration of the SQL *********************/ /** - * Export the database-schma to the database. + * Excecute the generated SQL. * If set to false, only the SQL-script is created and the * database is not touched. *

@@ -136,10 +129,10 @@ public abstract class AbstractSchemaMojo extends AbstractMojo * it is not known by Hibernate nor JPA and, hence, not picked up from * their configuration! * - * @parameter property="hibernate.schema.export" default-value="true" + * @parameter property="hibernate.schema.execute" default-value="true" * @since 2.0 */ - private Boolean export; + private Boolean execute; /** * Skip execution @@ -164,10 +157,11 @@ public abstract class AbstractSchemaMojo extends AbstractMojo private boolean skip; /** - * Force execution + * Force generation/execution *

- * Force execution, even if no modified or newly added annotated classes - * where found and the dialect was not changed. + * Force the generation and (if configured) the execution of the SQL, even if + * no modified or newly added annotated classes where found and the + * configuration was not changed. *

* skip takes precedence over force. *

@@ -502,6 +496,8 @@ public abstract class AbstractSchemaMojo extends AbstractMojo /** Check, that the outputfile is writable */ final File output = getOutputFile(filename); + /** Check, if the outputfile is missing or was changed */ + checkOutputFile(output, tracker); /** Configure Hibernate */ final StandardServiceRegistry serviceRegistry = @@ -626,11 +622,9 @@ public abstract class AbstractSchemaMojo extends AbstractMojo /** Skip execution, if mapping and configuration is unchanged */ if (!tracker.modified()) { - getLog().info( - "Mapping and configuration unchanged." - ); + getLog().info("Mapping and configuration unchanged."); if (force) - getLog().info("Schema generation is forced!"); + getLog().info("Generation/execution is forced!"); else { getLog().info("Skipping schema generation!"); @@ -640,6 +634,20 @@ public abstract class AbstractSchemaMojo extends AbstractMojo } + /** Truncate output file */ + try + { + new FileOutputStream(output).getChannel().truncate(0).close(); + } + catch (IOException e) + { + String error = + "Error while truncating " + output.getAbsolutePath() + ": " + + e.getMessage(); + getLog().warn(error); + throw new MojoExecutionException(error); + } + /** Create a connection, if sufficient configuration infromation is available */ connectionProvider.open(classLoaderService, properties); @@ -668,42 +676,6 @@ public abstract class AbstractSchemaMojo extends AbstractMojo ); } - /** Prepare the generation of the SQL */ - Map settings = new HashMap(); - settings.putAll( - serviceRegistry - .getService(ConfigurationService.class) - .getSettings() - ); - ExceptionHandlerCollectingImpl handler = - new ExceptionHandlerCollectingImpl(); - ExecutionOptions options = - SchemaManagementToolCoordinator - .buildExecutionOptions(settings, handler); - final EnumSet targetTypes = EnumSet.of(TargetType.SCRIPT); - if (export) - targetTypes.add(TargetType.DATABASE); - TargetDescriptor target = new TargetDescriptor() - { - @Override - public EnumSet getTargetTypes() - { - return targetTypes; - } - - @Override - public ScriptTargetOutput getScriptTargetOutput() - { - String charset = - (String) - serviceRegistry - .getService(ConfigurationService.class) - .getSettings() - .get(AvailableSettings.HBM2DDL_CHARSET_NAME); - return new ScriptTargetOutputToFile(output, charset); - } - }; - /** * Change class-loader of current thread. * This is necessary, because still not all parts of Hibernate 5 use @@ -714,13 +686,27 @@ public abstract class AbstractSchemaMojo extends AbstractMojo try { thread.setContextClassLoader(classLoader); - build((MetadataImplementor)metadataBuilder.build(), options, target); + ExceptionHandlerCollectingImpl handler = + build((MetadataImplementor)metadataBuilder.build(), output); + if (handler.getExceptions().size() > 0) + { + StringBuilder builder = new StringBuilder(); + builder.append("Hibernate failed:"); + for (Exception e : handler.getExceptions()) + { + builder.append("\n * "); + builder.append(e.getMessage()); + } + String error = builder.toString(); + getLog().error(error); + throw new MojoFailureException(error); + } } finally { thread.setContextClassLoader(contextClassLoader); - for (Exception e : handler.getExceptions()) - getLog().error(e.getMessage()); + /** Track, the content of the generated script */ + checkOutputFile(output, tracker); } } catch (MojoExecutionException e) @@ -752,10 +738,9 @@ public abstract class AbstractSchemaMojo extends AbstractMojo } - abstract void build( + abstract ExceptionHandlerCollectingImpl build( MetadataImplementor metadata, - ExecutionOptions options, - TargetDescriptor target + File file ) throws MojoFailureException, @@ -901,11 +886,18 @@ public abstract class AbstractSchemaMojo extends AbstractMojo throws MojoFailureException { /** - * Special treatment for the configuration-value "export": if it is + * Special treatment for the configuration-value "execute": if it is * switched to "true", the genearation fo the schema should be forced! */ - if (tracker.check(EXPORT, export.toString()) && export) + if (tracker.check(EXECUTE, execute.toString()) && execute) + { + getLog().info( + "hibernate.schema.execute was switched on: " + + "forcing generation/execution of SQL" + ); tracker.touch(); + } + configure(properties, execute, EXECUTE); /** * Configure the generation of the SQL. @@ -918,10 +910,10 @@ public abstract class AbstractSchemaMojo extends AbstractMojo configure(properties, createNamespaces, HBM2DLL_CREATE_NAMESPACES); configure(properties, implicitNamingStrategy, IMPLICIT_NAMING_STRATEGY); configure(properties, physicalNamingStrategy, PHYSICAL_NAMING_STRATEGY); - tracker.track(OUTPUTDIRECTORY, outputDirectory); // << not reflected in hibernate configuration! - tracker.track(SCAN_DEPENDENCIES, scanDependencies); // << not reflected in hibernate configuration! - tracker.track(SCAN_TESTCLASSES, scanTestClasses.toString()); // << not reflected in hibernate configuration! - tracker.track(TEST_OUTPUTDIRECTORY, testOutputDirectory); // << not reflected in hibernate configuration! + configure(properties, outputDirectory, OUTPUTDIRECTORY); + configure(properties, scanDependencies, SCAN_DEPENDENCIES); + configure(properties, scanTestClasses, SCAN_TESTCLASSES); + configure(properties, testOutputDirectory, TEST_OUTPUTDIRECTORY); /** * Special treatment for the configuration-value "show": a change of its @@ -948,7 +940,7 @@ public abstract class AbstractSchemaMojo extends AbstractMojo throw new MojoFailureException("Hibernate configuration is missing!"); } - getLog().info("Gathered hibernate-configuration (turn on debugging for details):"); + getLog().info("Gathered configuration:"); for (Entry entry : properties.entrySet()) getLog().info(" " + entry.getKey() + " = " + entry.getValue()); } @@ -960,50 +952,60 @@ public abstract class AbstractSchemaMojo extends AbstractMojo String alternativeKey ) { - value = configure(properties, value, key); - if (value == null) - return; + configure(properties, value, key); if (properties.containsKey(alternativeKey)) { - getLog().warn( - "Ignoring property " + alternativeKey + "=" + - properties.getProperty(alternativeKey) + " in favour for property " + - key + "=" + properties.getProperty(key) - ); - properties.remove(alternativeKey); + if (properties.containsKey(key)) + { + getLog().warn( + "Ignoring property " + alternativeKey + "=\"" + + properties.getProperty(alternativeKey) + + "\" in favour for property " + key + "=\"" + + properties.getProperty(key) + "\"" + ); + properties.remove(alternativeKey); + } + else + { + value = properties.getProperty(alternativeKey); + properties.remove(alternativeKey); + getLog().info( + "Using value \"" + value + "\" from property " + alternativeKey + + " for property " + key + ); + properties.setProperty(key, value); + } } } - private String configure(Properties properties, String value, String key) + private void configure(Properties properties, String value, String key) { if (value != null) { if (properties.containsKey(key)) - getLog().debug( - "Overwriting property " + key + "=" + properties.getProperty(key) + - " with the value " + value - ); + { + if (!properties.getProperty(key).equals(value)) + { + getLog().info( + "Overwriting property " + key + "=\"" + + properties.getProperty(key) + + "\" with value \"" + value + "\"" + ); + properties.setProperty(key, value); + } + } else - getLog().debug("Using the value " + value + " for property " + key); - properties.setProperty(key, value); + { + getLog().debug("Using value \"" + value + "\" for property " + key); + properties.setProperty(key, value); + } } - return properties.getProperty(key); } private void configure(Properties properties, Boolean value, String key) { - if (value != null) - { - if (properties.containsKey(key)) - getLog().debug( - "Overwriting property " + key + "=" + properties.getProperty(key) + - " with the value " + value - ); - else - getLog().debug("Using the value " + value + " for property " + key); - properties.setProperty(key, value.toString()); - } + configure(properties, value == null ? null : value.toString(), key); } private File getOutputFile(String filename) @@ -1062,6 +1064,26 @@ public abstract class AbstractSchemaMojo extends AbstractMojo return output; } + private void checkOutputFile(File output, ModificationTracker tracker) + throws + MojoExecutionException + { + try + { + if (output.exists()) + tracker.track(SCRIPT, new FileInputStream(output)); + else + tracker.track(SCRIPT, ZonedDateTime.now().toString()); + } + catch (IOException e) + { + String error = + "Error while checking the generated script: " + e.getMessage(); + getLog().error(error); + throw new MojoExecutionException(error); + } + } + private void addMappings(MetadataSources sources, ModificationTracker tracker) throws MojoFailureException {