X-Git-Url: https://juplo.de/gitweb/?p=hibernate4-maven-plugin;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fplugins%2Fhibernate%2FAbstractSchemaMojo.java;h=06024c212756577ca84a6876da7d8e5428702076;hp=9006f352d08ed9bb5384eb651a5b1d3968f32ddd;hb=a20fb5535864f495b8117891e155f636a83f73bc;hpb=f92a01a5043d0ac2f6a8eaf5aeed6f724b102f34 diff --git a/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java b/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java index 9006f352..06024c21 100644 --- a/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java +++ b/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java @@ -4,11 +4,13 @@ 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; @@ -87,13 +89,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 +129,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 +139,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 +167,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 +506,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 +632,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 +644,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); @@ -681,7 +699,7 @@ public abstract class AbstractSchemaMojo extends AbstractMojo SchemaManagementToolCoordinator .buildExecutionOptions(settings, handler); final EnumSet targetTypes = EnumSet.of(TargetType.SCRIPT); - if (export) + if (execute) targetTypes.add(TargetType.DATABASE); TargetDescriptor target = new TargetDescriptor() { @@ -721,6 +739,8 @@ public abstract class AbstractSchemaMojo extends AbstractMojo 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) @@ -901,10 +921,10 @@ 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) tracker.touch(); /** @@ -992,14 +1012,22 @@ public abstract class AbstractSchemaMojo extends AbstractMojo if (value != null) { if (properties.containsKey(key)) - getLog().info( - "Overwriting property " + key + "=\"" + - properties.getProperty(key) + - "\" with 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 value \"" + value + "\" for property " + key); - properties.setProperty(key, value); + properties.setProperty(key, value); + } } } @@ -1064,6 +1092,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 {