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;
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;
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;
* @required
* @readonly
*/
- private String buildDirectory;
+ String buildDirectory;
/** Parameters to configure the genaration of the SQL *********************/
- public final void execute(String filename)
+ public final void execute(ModificationTracker tracker)
throws
MojoFailureException,
MojoExecutionException
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());
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 =
/** 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);
);
}
- /** 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
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();
+ 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);
+ 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)
}
- abstract void build(
- MetadataImplementor metadata,
- ExecutionOptions options,
- TargetDescriptor target
- )
+ abstract ExceptionHandlerCollectingImpl build(MetadataImplementor metadata)
throws
MojoFailureException,
MojoExecutionException;
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
{