import com.pyx4j.log4j.MavenLogAppender;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.MappedSuperclass;
+import org.apache.maven.model.Resource;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
/**
* Hibernate Naming Strategy
* @parameter property="hibernate.ejb.naming_strategy"
- * @author nicus
*/
private String hibernateNamingStrategy;
*/
private String hibernateProperties;
+ /**
+ * List of Hibernate-Mapping-Files (XML).
+ * Multiple files can be separated with white-spaces and/or commas.
+ *
+ * @parameter property="hibernate.mapping"
+ */
+ private String hibernateMapping;
+
/**
* 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;
* <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;
}
if (classes.isEmpty())
- throw new MojoFailureException("No annotated classes found in directory " + outputDirectory);
-
- getLog().debug("Detected classes with mapping-annotations:");
- for (Class<?> annotatedClass : classes)
- getLog().debug(" " + annotatedClass.getName());
+ {
+ if (hibernateMapping == null || hibernateMapping.isEmpty())
+ throw new MojoFailureException("No annotated classes found in directory " + outputDirectory);
+ }
+ else
+ {
+ getLog().debug("Detected classes with mapping-annotations:");
+ for (Class<?> annotatedClass : classes)
+ getLog().debug(" " + annotatedClass.getName());
+ }
Properties properties = new Properties();
config.addAnnotatedClass(annotatedClass);
}
+ if (hibernateMapping != null)
+ {
+ try
+ {
+ MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
+ for (String filename : hibernateMapping.split("[\\s,]+"))
+ {
+ // First try the filename as absolute/relative path
+ File file = new File(filename);
+ if (!file.exists())
+ {
+ // 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())
+ {
+ InputStream is = new FileInputStream(file);
+ 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);
+ String newMd5 = String.format("%0" + (bytes.length << 1) + "x", bi);
+ String oldMd5 = !md5s.containsKey(filename) ? "" : md5s.get(filename);
+ if (!newMd5.equals(oldMd5))
+ {
+ getLog().debug("Found new or modified mapping-file: " + filename);
+ modified = true;
+ md5s.put(filename, newMd5);
+ }
+ else
+ {
+ getLog().debug(oldMd5 + " -> mapping-file unchanged: " + filename);
+ }
+ getLog().debug("Adding mappings from XML-configurationfile: " + file);
+ config.addFile(file);
+ }
+ else
+ throw new MojoFailureException("File " + filename + " could not be found in any of the configured resource-directories!");
+ }
+ }
+ catch (NoSuchAlgorithmException e)
+ {
+ throw new MojoFailureException("Cannot calculate MD5-summs!", e);
+ }
+ catch (FileNotFoundException e)
+ {
+ throw new MojoFailureException("Cannot calculate MD5-summs!", e);
+ }
+ catch (IOException e)
+ {
+ throw new MojoFailureException("Cannot calculate MD5-summs!", e);
+ }
+ }
+
Target target = null;
try
{
&& !force
)
{
- getLog().info("No modified annotated classes found and dialect unchanged.");
+ getLog().info("No modified annotated classes or mapping-files found and dialect unchanged.");
getLog().info("Skipping schema generation!");
project.getProperties().setProperty(EXPORT_SKIPPED_PROPERTY, "true");
return;
* 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: