X-Git-Url: https://juplo.de/gitweb/?p=hibernate4-maven-plugin;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fplugins%2Fhibernate%2FModificationTracker.java;fp=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fplugins%2Fhibernate%2FModificationTracker.java;h=e03f78e9ab96bcb6a43d75b5541b15427ce577b9;hp=0000000000000000000000000000000000000000;hb=4940080670944a15916c68fb294e18a6bfef12d5;hpb=fdda82a6f76deefd10f83da89d7e82054e3c3ecd diff --git a/src/main/java/de/juplo/plugins/hibernate/ModificationTracker.java b/src/main/java/de/juplo/plugins/hibernate/ModificationTracker.java new file mode 100644 index 00000000..e03f78e9 --- /dev/null +++ b/src/main/java/de/juplo/plugins/hibernate/ModificationTracker.java @@ -0,0 +1,171 @@ +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; + + + +/** + * + * @author Kai Moritz + */ +public class ModificationTracker +{ + public final static String MD5S = "hibernate-generatedschema.md5s"; + + private Map properties; + private Map classes; + + private final Set propertyNames; + private final Set classNames; + + private boolean modified = false; + + private final File saved; + private final MessageDigest digest; + private final Log log; + + + ModificationTracker(String buildDirectory, Log log) + throws + NoSuchAlgorithmException + { + propertyNames = new HashSet(); + classNames = new HashSet(); + saved = new File(buildDirectory + File.separator + MD5S); + 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 check(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) + { + boolean result = check(properties, name, property); + propertyNames.add(name); + modified |= result; + return result; + } + + boolean check(Properties properties) + { + boolean result = false; + for (String name : properties.stringPropertyNames()) + result |= check(name, properties.getProperty(name)); + return result; + } + + + boolean modified() + { + modified |= !propertyNames.containsAll(properties.keySet()); + modified |= !properties.keySet().containsAll(propertyNames); + modified |= !classNames.containsAll(classes.keySet()); + modified |= !classes.keySet().containsAll(classNames); + return modified; + } + + + 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 (!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); + } + } +}