From: Kai Moritz Date: Sat, 26 Nov 2016 17:56:46 +0000 (+0100) Subject: WIP X-Git-Url: http://juplo.de/gitweb/?p=hibernate4-maven-plugin;a=commitdiff_plain;h=bec99c73fea6edf073dcf885ef07defee1ed8608 WIP --- diff --git a/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java b/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java index 71e1250f..5f6b9bf5 100644 --- a/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java +++ b/src/main/java/de/juplo/plugins/hibernate/AbstractSchemaMojo.java @@ -4,13 +4,10 @@ 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.HashSet; import java.util.Iterator; @@ -113,7 +110,7 @@ public abstract class AbstractSchemaMojo extends AbstractMojo * @required * @readonly */ - private String buildDirectory; + String buildDirectory; /** Parameters to configure the genaration of the SQL *********************/ @@ -428,7 +425,7 @@ public abstract class AbstractSchemaMojo extends AbstractMojo - public final void execute(String filename) + public final void execute(ModificationTracker tracker) throws MojoFailureException, MojoExecutionException @@ -440,16 +437,6 @@ public abstract class AbstractSchemaMojo extends AbstractMojo return; } - ModificationTracker tracker; - try - { - tracker = new ModificationTracker(buildDirectory, filename, getLog()); - } - catch (NoSuchAlgorithmException e) - { - throw new MojoFailureException("Digest-Algorithm MD5 is missing!", e); - } - final SimpleConnectionProvider connectionProvider = new SimpleConnectionProvider(getLog()); @@ -494,10 +481,18 @@ public abstract class AbstractSchemaMojo extends AbstractMojo else getLog().debug("Configuration unchanged."); - /** Check, that the outputfile is writable */ - final File output = getOutputFile(filename); /** Check, if the outputfile is missing or was changed */ - checkOutputFile(output, tracker); + try + { + tracker.track(); + } + catch (IOException e) + { + String error = + "Error while checking the generated script: " + e.getMessage(); + getLog().error(error); + throw new MojoExecutionException(error); + } /** Configure Hibernate */ final StandardServiceRegistry serviceRegistry = @@ -637,12 +632,12 @@ public abstract class AbstractSchemaMojo extends AbstractMojo /** Truncate output file */ try { - new FileOutputStream(output).getChannel().truncate(0).close(); + tracker.turncat(); } catch (IOException e) { String error = - "Error while truncating " + output.getAbsolutePath() + ": " + "Error while truncating output file: " // TODO: Filename unknown here! + e.getMessage(); getLog().warn(error); throw new MojoExecutionException(error); @@ -687,7 +682,7 @@ public abstract class AbstractSchemaMojo extends AbstractMojo { thread.setContextClassLoader(classLoader); ExceptionHandlerCollectingImpl handler = - build((MetadataImplementor)metadataBuilder.build(), output); + build((MetadataImplementor)metadataBuilder.build()); if (handler.getExceptions().size() > 0) { StringBuilder builder = new StringBuilder(); @@ -706,7 +701,17 @@ public abstract class AbstractSchemaMojo extends AbstractMojo { thread.setContextClassLoader(contextClassLoader); /** Track, the content of the generated script */ - checkOutputFile(output, tracker); + try + { + tracker.track(); + } + catch (IOException e) + { + String error = + "Error while checking the generated script: " + e.getMessage(); + getLog().error(error); + throw new MojoExecutionException(error); + } } } catch (MojoExecutionException e) @@ -738,10 +743,7 @@ public abstract class AbstractSchemaMojo extends AbstractMojo } - abstract ExceptionHandlerCollectingImpl build( - MetadataImplementor metadata, - File file - ) + abstract ExceptionHandlerCollectingImpl build(MetadataImplementor metadata) throws MojoFailureException, MojoExecutionException; @@ -1064,26 +1066,6 @@ 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 { diff --git a/src/main/java/de/juplo/plugins/hibernate/CreateMojo.java b/src/main/java/de/juplo/plugins/hibernate/CreateMojo.java index a6c2ba42..9a959ec3 100644 --- a/src/main/java/de/juplo/plugins/hibernate/CreateMojo.java +++ b/src/main/java/de/juplo/plugins/hibernate/CreateMojo.java @@ -18,6 +18,7 @@ package de.juplo.plugins.hibernate; import static de.juplo.plugins.hibernate.AbstractSchemaMojo.EXECUTE; import java.io.File; +import java.security.NoSuchAlgorithmException; import java.util.EnumSet; import java.util.Map; import org.apache.maven.plugin.MojoExecutionException; @@ -66,15 +67,19 @@ public class CreateMojo extends AbstractSchemaMojo MojoFailureException, MojoExecutionException { - super.execute(outputFile); + try + { + super.execute(new MD5ModificationTracker(buildDirectory, outputFile, getLog())); + } + catch (NoSuchAlgorithmException e) + { + throw new MojoFailureException("Digest-Algorithm MD5 is missing!", e); + } } @Override - ExceptionHandlerCollectingImpl build( - final MetadataImplementor metadata, - final File output - ) + ExceptionHandlerCollectingImpl build(final MetadataImplementor metadata) throws MojoExecutionException, MojoFailureException @@ -102,7 +107,7 @@ public class CreateMojo extends AbstractSchemaMojo { String charset = (String)settings.get(AvailableSettings.HBM2DDL_CHARSET_NAME); - return new ScriptTargetOutputToFile(output, charset); + return new ScriptTargetOutputToFile(new File(outputFile), charset); } }; diff --git a/src/main/java/de/juplo/plugins/hibernate/DropMojo.java b/src/main/java/de/juplo/plugins/hibernate/DropMojo.java index 2f592722..88f66986 100644 --- a/src/main/java/de/juplo/plugins/hibernate/DropMojo.java +++ b/src/main/java/de/juplo/plugins/hibernate/DropMojo.java @@ -17,6 +17,7 @@ package de.juplo.plugins.hibernate; */ import java.io.File; +import java.security.NoSuchAlgorithmException; import java.util.EnumSet; import java.util.Map; import org.apache.maven.plugin.MojoExecutionException; @@ -65,15 +66,19 @@ public class DropMojo extends AbstractSchemaMojo MojoFailureException, MojoExecutionException { - super.execute(outputFile); + try + { + super.execute(new MD5ModificationTracker(buildDirectory, outputFile, getLog())); + } + catch (NoSuchAlgorithmException e) + { + throw new MojoFailureException("Digest-Algorithm MD5 is missing!", e); + } } @Override - ExceptionHandlerCollectingImpl build( - final MetadataImplementor metadata, - final File output - ) + ExceptionHandlerCollectingImpl build(final MetadataImplementor metadata) throws MojoExecutionException, MojoFailureException @@ -101,7 +106,7 @@ public class DropMojo extends AbstractSchemaMojo { String charset = (String)settings.get(AvailableSettings.HBM2DDL_CHARSET_NAME); - return new ScriptTargetOutputToFile(output, charset); + return new ScriptTargetOutputToFile(new File(outputFile), charset); } }; diff --git a/src/main/java/de/juplo/plugins/hibernate/MD5ModificationTracker.java b/src/main/java/de/juplo/plugins/hibernate/MD5ModificationTracker.java new file mode 100644 index 00000000..0349906a --- /dev/null +++ b/src/main/java/de/juplo/plugins/hibernate/MD5ModificationTracker.java @@ -0,0 +1,239 @@ +package de.juplo.plugins.hibernate; + + +import static de.juplo.plugins.hibernate.AbstractSchemaMojo.SCRIPT; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import org.apache.maven.plugin.logging.Log; + + + +/** + * + * @author Kai Moritz + */ +public class MD5ModificationTracker implements ModificationTracker +{ + private Map properties; + private Map classes; + + private final Set propertyNames; + private final Set classNames; + + private boolean modified = false; + private boolean failed = false; + + private final File output; + private final File saved; + private final MessageDigest digest; + private final Log log; + + + MD5ModificationTracker(String buildDirectory, String filename, Log log) + throws + NoSuchAlgorithmException + { + propertyNames = new HashSet(); + classNames = new HashSet(); + output = new File(filename); + File tmp = new File(filename + ".md5s"); + if (tmp.isAbsolute()) + { + saved = tmp; + } + else + { + // Interpret relative file path relative to build directory + saved = new File(buildDirectory, tmp.getPath()); + log.debug("Adjusted relative path, resulting path is " + saved.getPath()); + } + digest = java.security.MessageDigest.getInstance("MD5"); + this.log = log; + } + + + private String calculate(InputStream is) + throws + IOException + { + byte[] buffer = new byte[1024*4]; // copy data in 4MB-chunks + int i; + while((i = is.read(buffer)) > -1) + digest.update(buffer, 0, i); + is.close(); + byte[] bytes = digest.digest(); + BigInteger bi = new BigInteger(1, bytes); + return String.format("%0" + (bytes.length << 1) + "x", bi); + } + + private boolean check(Map values, String name, String value) + { + if (!values.containsKey(name) || !values.get(name).equals(value)) + { + values.put(name, value); + return true; + } + else + return false; + } + + + @Override + public boolean track(String name, InputStream is) throws IOException + { + boolean result = check(classes, name, calculate(is)); + classNames.add(name); + modified |= result; + return result; + } + + @Override + public boolean check(String name, String property) + { + propertyNames.add(name); + return check(properties, name, property); + } + + @Override + public boolean track(String name, String property) + { + boolean result = check(name, property); + modified |= result; + return result; + } + + @Override + public boolean track(Properties properties) + { + boolean result = false; + for (String name : properties.stringPropertyNames()) + result |= track(name, properties.getProperty(name)); + return result; + } + + @Override + public void track() throws IOException + { + if (output.exists()) + track(SCRIPT, new FileInputStream(output)); + else + track(SCRIPT, ZonedDateTime.now().toString()); + } + + + @Override + public void touch() + { + modified = true; + } + + @Override + public boolean modified() + { + for (String property : new HashSet(properties.keySet())) + if (!propertyNames.contains(property)) + { + modified = true; + properties.remove(property); + } + for (String clazz : new HashSet(classes.keySet())) + if (!classNames.contains(clazz)) + { + modified = true; + classes.remove(clazz); + } + return modified; + } + + + @Override + public void failed() + { + failed = true; + } + + + @Override + public void load() + { + if (saved.isFile() && saved.length() > 0) + { + try + { + FileInputStream fis = new FileInputStream(saved); + ObjectInputStream ois = new ObjectInputStream(fis); + properties = (HashMap)ois.readObject(); + classes = (HashMap)ois.readObject(); + ois.close(); + } + catch (Exception e) + { + properties = new HashMap(); + classes = new HashMap(); + log.warn("Cannot read md5s from saved: " + e); + } + } + else + { + properties = new HashMap(); + classes = new HashMap(); + try + { + saved.createNewFile(); + } + catch (IOException e) + { + log.debug("Cannot create file \"" + saved.getPath() + "\" for md5s: " + e); + } + } + } + + @Override + public void save() + { + if (failed) + { + saved.delete(); + return; + } + + if (!modified) + return; + + /** Write md5-sums for annotated classes to file */ + try + { + FileOutputStream fos = new FileOutputStream(saved); + ObjectOutputStream oos = new ObjectOutputStream(fos); + oos.writeObject(properties); + oos.writeObject(classes); + oos.close(); + fos.close(); + } + catch (Exception e) + { + log.error("Cannot write md5-sums to file: " + e); + } + } + + + @Override + public void turncat() throws IOException + { + new FileOutputStream(output).getChannel().truncate(0).close(); + } +} diff --git a/src/main/java/de/juplo/plugins/hibernate/ModificationTracker.java b/src/main/java/de/juplo/plugins/hibernate/ModificationTracker.java index 7b5791f1..3bb34636 100644 --- a/src/main/java/de/juplo/plugins/hibernate/ModificationTracker.java +++ b/src/main/java/de/juplo/plugins/hibernate/ModificationTracker.java @@ -1,22 +1,9 @@ package de.juplo.plugins.hibernate; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.math.BigInteger; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; import java.util.Properties; -import java.util.Set; -import org.apache.maven.plugin.logging.Log; @@ -24,188 +11,22 @@ import org.apache.maven.plugin.logging.Log; * * @author Kai Moritz */ -public class ModificationTracker +public interface ModificationTracker { - private Map properties; - private Map classes; + boolean track(String name, InputStream is) throws IOException; + boolean track(String name, String property); + boolean track(Properties properties); + void track() throws IOException; - private final Set propertyNames; - private final Set classNames; + boolean check(String name, String property); - private boolean modified = false; - private boolean failed = false; + void touch(); - private final File saved; - private final MessageDigest digest; - private final Log log; + boolean modified(); + void failed(); + void load(); + void save(); - ModificationTracker(String buildDirectory, String filename, Log log) - throws - NoSuchAlgorithmException - { - propertyNames = new HashSet(); - classNames = new HashSet(); - File output = new File(filename + ".md5s"); - if (output.isAbsolute()) - { - saved = output; - } - else - { - // Interpret relative file path relative to build directory - saved = new File(buildDirectory, output.getPath()); - log.debug("Adjusted relative path, resulting path is " + saved.getPath()); - } - digest = java.security.MessageDigest.getInstance("MD5"); - this.log = log; - } - - - private String calculate(InputStream is) - throws - IOException - { - byte[] buffer = new byte[1024*4]; // copy data in 4MB-chunks - int i; - while((i = is.read(buffer)) > -1) - digest.update(buffer, 0, i); - is.close(); - byte[] bytes = digest.digest(); - BigInteger bi = new BigInteger(1, bytes); - return String.format("%0" + (bytes.length << 1) + "x", bi); - } - - private boolean check(Map values, String name, String value) - { - if (!values.containsKey(name) || !values.get(name).equals(value)) - { - values.put(name, value); - return true; - } - else - return false; - } - - - boolean track(String name, InputStream is) throws IOException - { - boolean result = check(classes, name, calculate(is)); - classNames.add(name); - modified |= result; - return result; - } - - - boolean check(String name, String property) - { - propertyNames.add(name); - return check(properties, name, property); - } - - boolean track(String name, String property) - { - boolean result = check(name, property); - modified |= result; - return result; - } - - boolean track(Properties properties) - { - boolean result = false; - for (String name : properties.stringPropertyNames()) - result |= track(name, properties.getProperty(name)); - return result; - } - - - void touch() - { - modified = true; - } - - boolean modified() - { - for (String property : new HashSet(properties.keySet())) - if (!propertyNames.contains(property)) - { - modified = true; - properties.remove(property); - } - for (String clazz : new HashSet(classes.keySet())) - if (!classNames.contains(clazz)) - { - modified = true; - classes.remove(clazz); - } - return modified; - } - - - void failed() - { - failed = true; - } - - - void load() - { - if (saved.isFile() && saved.length() > 0) - { - try - { - FileInputStream fis = new FileInputStream(saved); - ObjectInputStream ois = new ObjectInputStream(fis); - properties = (HashMap)ois.readObject(); - classes = (HashMap)ois.readObject(); - ois.close(); - } - catch (Exception e) - { - properties = new HashMap(); - classes = new HashMap(); - log.warn("Cannot read md5s from saved: " + e); - } - } - else - { - properties = new HashMap(); - classes = new HashMap(); - try - { - saved.createNewFile(); - } - catch (IOException e) - { - log.debug("Cannot create file \"" + saved.getPath() + "\" for md5s: " + e); - } - } - } - - void save() - { - if (failed) - { - saved.delete(); - return; - } - - if (!modified) - return; - - /** Write md5-sums for annotated classes to file */ - try - { - FileOutputStream fos = new FileOutputStream(saved); - ObjectOutputStream oos = new ObjectOutputStream(fos); - oos.writeObject(properties); - oos.writeObject(classes); - oos.close(); - fos.close(); - } - catch (Exception e) - { - log.error("Cannot write md5-sums to file: " + e); - } - } + void turncat() throws IOException; } diff --git a/src/main/java/de/juplo/plugins/hibernate/UpdateMojo.java b/src/main/java/de/juplo/plugins/hibernate/UpdateMojo.java index 6d9e62ef..a97982eb 100644 --- a/src/main/java/de/juplo/plugins/hibernate/UpdateMojo.java +++ b/src/main/java/de/juplo/plugins/hibernate/UpdateMojo.java @@ -17,6 +17,7 @@ package de.juplo.plugins.hibernate; */ import java.io.File; +import java.security.NoSuchAlgorithmException; import java.util.EnumSet; import java.util.Map; import org.apache.maven.plugin.MojoExecutionException; @@ -65,15 +66,19 @@ public class UpdateMojo extends AbstractSchemaMojo MojoFailureException, MojoExecutionException { - super.execute(outputFile); + try + { + super.execute(new MD5ModificationTracker(buildDirectory, outputFile, getLog())); + } + catch (NoSuchAlgorithmException e) + { + throw new MojoFailureException("Digest-Algorithm MD5 is missing!", e); + } } @Override - ExceptionHandlerCollectingImpl build( - final MetadataImplementor metadata, - final File output - ) + ExceptionHandlerCollectingImpl build(final MetadataImplementor metadata) throws MojoExecutionException, MojoFailureException @@ -101,7 +106,7 @@ public class UpdateMojo extends AbstractSchemaMojo { String charset = (String)settings.get(AvailableSettings.HBM2DDL_CHARSET_NAME); - return new ScriptTargetOutputToFile(output, charset); + return new ScriptTargetOutputToFile(new File(outputFile), charset); } }; diff --git a/src/main/java/de/juplo/plugins/hibernate/ValidateMojo.java b/src/main/java/de/juplo/plugins/hibernate/ValidateMojo.java index 8c8f3e75..2e51cf6f 100644 --- a/src/main/java/de/juplo/plugins/hibernate/ValidateMojo.java +++ b/src/main/java/de/juplo/plugins/hibernate/ValidateMojo.java @@ -50,10 +50,7 @@ public class ValidateMojo extends AbstractSchemaMojo @Override - ExceptionHandlerCollectingImpl build( - MetadataImplementor metadata, - File output - ) + ExceptionHandlerCollectingImpl build(final MetadataImplementor metadata) throws MojoExecutionException, MojoFailureException