Variable "envers" should not be put into hibernate.properties
[hibernate4-maven-plugin] / src / main / java / de / juplo / plugins / hibernate4 / Hbm2DdlMojo.java
index 044e330..f991253 100644 (file)
@@ -57,6 +57,7 @@ import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
 import org.hibernate.cfg.Configuration;
 import org.hibernate.cfg.NamingStrategy;
+import org.hibernate.envers.configuration.AuditConfiguration;
 import org.hibernate.tool.hbm2ddl.SchemaExport;
 import org.hibernate.tool.hbm2ddl.SchemaExport.Type;
 import org.hibernate.tool.hbm2ddl.Target;
@@ -82,6 +83,7 @@ public class Hbm2DdlMojo extends AbstractMojo
   public final static String PASSWORD = "hibernate.connection.password";
   public final static String DIALECT = "hibernate.dialect";
   public final static String NAMING_STRATEGY="hibernate.ejb.naming_strategy";
+  public final static String ENVERS = "hibernate.export.envers";
 
   private final static String MD5S = "schema.md5s";
 
@@ -151,7 +153,7 @@ public class Hbm2DdlMojo extends AbstractMojo
    * The excecution is skipped automatically, if no modified or newly added
    * annotated classes are found and the dialect was not changed.
    *
-   * @parameter property="maven.test.skip" default-value="false"
+   * @parameter property="hibernate.export.skip" default-value="false"
    */
   private boolean skip;
 
@@ -226,12 +228,15 @@ public class Hbm2DdlMojo extends AbstractMojo
   /**
    * Target of execution:
    * <ul>
-   *   <li><strong>NONE</strong> do nothing - just validate the configuration (forces excecution, signals skip)</li>
-   *   <li><strong>EXPORT</strong> create database (<strong>DEFAULT!</strong>. forces excecution, signals skip)</li>
-   *   <li><strong>SCRIPT</strong> export schema to SQL-script</li>
+   *   <li><strong>NONE</strong> only export schema to SQL-script (forces excecution, signals skip)</li>
+   *   <li><strong>EXPORT</strong> create database (<strong>DEFAULT!</strong>). forces excecution, signals skip)</li>
+   *   <li><strong>SCRIPT</strong> export schema to SQL-script and print it to STDOUT</li>
    *   <li><strong>BOTH</strong></li>
    * </ul>
    *
+   * A databaseconnection is only needed for EXPORT and BOTH, but a
+   * Hibernate-Dialect must always be choosen.
+   *
    * @parameter property="hibernate.export.target" default-value="EXPORT"
    */
   private String target;
@@ -245,6 +250,8 @@ public class Hbm2DdlMojo extends AbstractMojo
    *   <li><strong>BOTH</strong> (<strong>DEFAULT!</strong>)</li>
    * </ul>
    *
+   * If NONE is choosen, no databaseconnection is needed.
+   *
    * @parameter property="hibernate.export.type" default-value="BOTH"
    */
   private String type;
@@ -270,6 +277,12 @@ public class Hbm2DdlMojo extends AbstractMojo
    */
   private boolean format;
 
+  /**
+   * Generate envers schema for auditing tables.
+   *
+   * @parameter property="hibernate.export.envers" default-value="false"
+   */
+  private boolean envers;
 
   @Override
   public void execute()
@@ -284,10 +297,6 @@ public class Hbm2DdlMojo extends AbstractMojo
       return;
     }
 
-    File dir = new File(outputDirectory);
-    if (!dir.exists())
-      throw new MojoExecutionException("Cannot scan for annotated classes in " + outputDirectory + ": directory does not exist!");
-
     Map<String,String> md5s;
     boolean modified = false;
     File saved = new File(buildDirectory + File.separator + MD5S);
@@ -316,7 +325,7 @@ public class Hbm2DdlMojo extends AbstractMojo
       }
       catch (IOException e)
       {
-        getLog().warn("Cannot create saved for timestamps: " + e);
+        getLog().debug("Cannot create file \"" + saved.getPath() + "\" for timestamps: " + e);
       }
     }
 
@@ -355,17 +364,22 @@ public class Hbm2DdlMojo extends AbstractMojo
     try
     {
       AnnotationDB db = new AnnotationDB();
-      getLog().info("Scanning directory " + outputDirectory + " for annotated classes...");
-      URL dirUrl = dir.toURI().toURL();
-      db.scanArchives(dirUrl);
+      File dir = new File(outputDirectory);
+      if (dir.exists())
+      {
+        getLog().info("Scanning directory " + outputDirectory + " for annotated classes...");
+        URL dirUrl = dir.toURI().toURL();
+        db.scanArchives(dirUrl);
+      }
       if (scanTestClasses)
       {
         dir = new File(testOutputDirectory);
-        if (!dir.exists())
-          throw new MojoExecutionException("Cannot scan for annotated test-classes in " + testOutputDirectory + ": directory does not exist!");
-        getLog().info("Scanning directory " + testOutputDirectory + " for annotated classes...");
-        dirUrl = dir.toURI().toURL();
-        db.scanArchives(dirUrl);
+        if (dir.exists())
+        {
+          getLog().info("Scanning directory " + testOutputDirectory + " for annotated classes...");
+          URL dirUrl = dir.toURI().toURL();
+          db.scanArchives(dirUrl);
+        }
       }
 
       Set<String> classNames = new HashSet<String>();
@@ -381,9 +395,11 @@ public class Hbm2DdlMojo extends AbstractMojo
       {
         Class<?> annotatedClass = classLoader.loadClass(name);
         classes.add(annotatedClass);
+        String resourceName = annotatedClass.getName();
+        resourceName = resourceName.substring(resourceName.lastIndexOf(".") + 1, resourceName.length()) + ".class";
         InputStream is =
             annotatedClass
-                .getResourceAsStream(annotatedClass.getSimpleName() + ".class");
+                .getResourceAsStream(resourceName);
         byte[] buffer = new byte[1024*4]; // copy data in 4MB-chunks
         int i;
         while((i = is.read(buffer)) > -1)
@@ -542,6 +558,24 @@ public class Hbm2DdlMojo extends AbstractMojo
       md5s.put(DIALECT, properties.getProperty(DIALECT));
     }
 
+    /** The generated SQL varies with the envers-configuration */
+    if (md5s.get(ENVERS) != null)
+    {
+      if (md5s.get(ENVERS).equals(Boolean.toString(envers)))
+        getLog().debug("Envers-Configuration unchanged. Enabled: " + envers);
+      else
+      {
+        getLog().debug("Envers-Configuration changed. Enabled: " + envers);
+        modified = true;
+        md5s.put(ENVERS, Boolean.toString(envers));
+      }
+    }
+    else
+    {
+      modified = true;
+      md5s.put(ENVERS, Boolean.toString(envers));
+    }
+
     if (properties.isEmpty())
     {
       getLog().error("No properties set!");
@@ -582,12 +616,17 @@ public class Hbm2DdlMojo extends AbstractMojo
         MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
         for (String filename : hibernateMapping.split("[\\s,]+"))
         {
-          File file = null;
-          for (Resource resource : project.getResources())
+          // First try the filename as absolute/relative path
+          File file = new File(filename);
+          if (!file.exists())
           {
-            file = new File(resource.getDirectory() + File.separator + filename);
-            if (file.exists())
-              break;
+            // If the file was not found, search for it in the resource-directories
+            for (Resource resource : project.getResources())
+            {
+              file = new File(resource.getDirectory() + File.separator + filename);
+              if (file.exists())
+                break;
+            }
           }
           if (file != null && file.exists())
           {
@@ -684,6 +723,7 @@ public class Hbm2DdlMojo extends AbstractMojo
        * hibernate does not use the context-classloader of the current
        * thread and, hence, would not be able to resolve the driver-class!
        */
+      getLog().debug("Target: " + target + ", Type: " + type);
       switch (target)
       {
         case EXPORT:
@@ -738,6 +778,14 @@ public class Hbm2DdlMojo extends AbstractMojo
        */
       Thread.currentThread().setContextClassLoader(classLoader);
 
+      config.buildMappings();
+
+      if (envers)
+      {
+        getLog().info("Automatic auditing via hibernate-envers enabled!");
+        AuditConfiguration.getFor(config);
+      }
+
       SchemaExport export = new SchemaExport(config, connection);
       export.setOutputFile(outputFile);
       export.setDelimiter(delimiter);