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=6f3ff9763ef09bc76f0b352fd4b283efd65040c9;hp=922b77db69fdab1bf77ad09f732f7cfebe88c1f7;hb=ef0947b306d9515d6af6dbc1fdfd675efcd9eca4;hpb=c81cd2f66c77e823cf03591db42d50811706c0de diff --git a/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java b/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java index 922b77db..6f3ff976 100644 --- a/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java +++ b/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java @@ -10,6 +10,7 @@ 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; @@ -88,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]+"); @@ -127,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. *

@@ -137,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 @@ -165,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. *

@@ -503,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 = @@ -627,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!"); @@ -696,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() { @@ -730,12 +733,25 @@ public abstract class AbstractSchemaMojo extends AbstractMojo { thread.setContextClassLoader(classLoader); build((MetadataImplementor)metadataBuilder.build(), options, target); + 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) @@ -916,11 +932,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. @@ -933,10 +956,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 @@ -963,7 +986,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()); } @@ -1007,14 +1030,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); + } } } @@ -1079,6 +1110,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 { @@ -1128,7 +1179,7 @@ public abstract class AbstractSchemaMojo extends AbstractMojo { try { - File dir = new File(outputDirectory); + File dir = new File(path); if (dir.exists()) { getLog().info("Adding " + dir.getAbsolutePath() + " to the list of roots to scan...");