WIP
[hibernate4-maven-plugin] / src / main / java / de / juplo / plugins / hibernate / AbstractSchemaMojo.java
index c9ef2c5..5f6b9bf 100644 (file)
@@ -4,16 +4,11 @@ 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;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
@@ -49,7 +44,6 @@ import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
 import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
 import org.hibernate.boot.registry.selector.spi.StrategySelector;
 import org.hibernate.boot.spi.MetadataImplementor;
-import org.hibernate.cfg.AvailableSettings;
 import static org.hibernate.cfg.AvailableSettings.DIALECT;
 import static org.hibernate.cfg.AvailableSettings.DRIVER;
 import static org.hibernate.cfg.AvailableSettings.FORMAT_SQL;
@@ -65,18 +59,11 @@ import static org.hibernate.cfg.AvailableSettings.PHYSICAL_NAMING_STRATEGY;
 import static org.hibernate.cfg.AvailableSettings.SHOW_SQL;
 import static org.hibernate.cfg.AvailableSettings.USER;
 import static org.hibernate.cfg.AvailableSettings.URL;
-import org.hibernate.engine.config.spi.ConfigurationService;
 import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
 import org.hibernate.internal.util.config.ConfigurationException;
 import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor;
 import org.hibernate.jpa.boot.internal.PersistenceXmlParser;
-import org.hibernate.tool.schema.TargetType;
 import org.hibernate.tool.schema.internal.ExceptionHandlerCollectingImpl;
-import org.hibernate.tool.schema.internal.exec.ScriptTargetOutputToFile;
-import org.hibernate.tool.schema.spi.ExecutionOptions;
-import org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator;
-import org.hibernate.tool.schema.spi.ScriptTargetOutput;
-import org.hibernate.tool.schema.spi.TargetDescriptor;
 import org.scannotation.AnnotationDB;
 
 
@@ -123,7 +110,7 @@ public abstract class AbstractSchemaMojo extends AbstractMojo
    * @required
    * @readonly
    */
-  private String buildDirectory;
+  String buildDirectory;
 
 
   /** Parameters to configure the genaration of the SQL *********************/
@@ -438,7 +425,7 @@ public abstract class AbstractSchemaMojo extends AbstractMojo
 
 
 
-  public final void execute(String filename)
+  public final void execute(ModificationTracker tracker)
     throws
       MojoFailureException,
       MojoExecutionException
@@ -450,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());
 
@@ -504,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 =
@@ -647,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);
@@ -686,42 +671,6 @@ public abstract class AbstractSchemaMojo extends AbstractMojo
             );
       }
 
-      /** Prepare the generation of the SQL */
-      Map settings = new HashMap();
-      settings.putAll(
-          serviceRegistry
-              .getService(ConfigurationService.class)
-              .getSettings()
-              );
-      ExceptionHandlerCollectingImpl handler =
-          new ExceptionHandlerCollectingImpl();
-      ExecutionOptions options =
-          SchemaManagementToolCoordinator
-              .buildExecutionOptions(settings, handler);
-      final EnumSet<TargetType> targetTypes = EnumSet.of(TargetType.SCRIPT);
-      if (execute)
-        targetTypes.add(TargetType.DATABASE);
-      TargetDescriptor target = new TargetDescriptor()
-      {
-        @Override
-        public EnumSet<TargetType> getTargetTypes()
-        {
-          return targetTypes;
-        }
-
-        @Override
-        public ScriptTargetOutput getScriptTargetOutput()
-        {
-          String charset =
-              (String)
-              serviceRegistry
-                  .getService(ConfigurationService.class)
-                  .getSettings()
-                  .get(AvailableSettings.HBM2DDL_CHARSET_NAME);
-          return new ScriptTargetOutputToFile(output, charset);
-        }
-      };
-
       /**
        * Change class-loader of current thread.
        * This is necessary, because still not all parts of Hibernate 5 use
@@ -732,7 +681,8 @@ public abstract class AbstractSchemaMojo extends AbstractMojo
       try
       {
         thread.setContextClassLoader(classLoader);
-        build((MetadataImplementor)metadataBuilder.build(), options, target);
+        ExceptionHandlerCollectingImpl handler =
+            build((MetadataImplementor)metadataBuilder.build());
         if (handler.getExceptions().size() > 0)
         {
           StringBuilder builder = new StringBuilder();
@@ -751,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)
@@ -783,11 +743,7 @@ public abstract class AbstractSchemaMojo extends AbstractMojo
   }
 
 
-  abstract void build(
-      MetadataImplementor metadata,
-      ExecutionOptions options,
-      TargetDescriptor target
-      )
+  abstract ExceptionHandlerCollectingImpl build(MetadataImplementor metadata)
     throws
       MojoFailureException,
       MojoExecutionException;
@@ -1110,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
   {