+ * This parameter defaults to the maven build-output-directory for classes.
+ * Additionally, all dependencies are scanned for annotated classes.
+ *
+ * @parameter property="project.build.outputDirectory"
+ * @since 1.0
*/
private String outputDirectory;
+ /**
+ * Whether to scan test-classes too, or not.
+ *
+ * If this parameter is set to true the test-classes of the
+ * artifact will be scanned for hibernate-annotated classes additionally.
+ *
+ * @parameter property="hibernate.export.scan_testclasses" default-value="false"
+ * @since 1.0.1
+ */
+ private boolean scanTestClasses;
+
+ /**
+ * Dependency-Scopes, that should be scanned for annotated classes.
+ *
+ * By default, only dependencies in the scope compile are
+ * scanned for annotated classes. Multiple scopes can be seperated by
+ * white space or commas.
+ *
+ * If you do not want any dependencies to be scanned for annotated
+ * classes, set this parameter to none.
+ *
+ * The plugin does not scan for annotated classes in transitive
+ * dependencies. If some of your annotated classes are hidden in a
+ * transitive dependency, you can simply add that dependency explicitly.
+ *
+ * @parameter property="hibernate.export.scan_dependencies" default-value="compile"
+ * @since 1.0.3
+ */
+ private String scanDependencies;
+
+ /**
+ * Test-Classes-Directory to scan.
+ *
+ * This parameter defaults to the maven build-output-directory for
+ * test-classes.
+ *
+ * This parameter is only used, when scanTestClasses is set
+ * to true!
+ *
+ * @parameter property="project.build.testOutputDirectory"
+ * @since 1.0.2
+ */
+ private String testOutputDirectory;
+
/**
* Skip execution
+ *
+ * If set to true, the execution is skipped.
+ *
+ * A skipped execution is signaled via the maven-property
+ * ${hibernate.export.skipped}.
+ *
+ * The execution is skipped automatically, if no modified or newly added
+ * annotated classes are found and the dialect was not changed.
*
- * @parameter expression="${maven.test.skip}"
+ * @parameter property="hibernate.skip" default-value="${maven.test.skip}"
+ * @since 1.0
*/
private boolean skip;
+ /**
+ * Force execution
+ *
+ * Force execution, even if no modified or newly added annotated classes
+ * where found and the dialect was not changed.
+ *
+ * skip takes precedence over force.
+ *
+ * @parameter property="hibernate.export.force" default-value="false"
+ * @since 1.0
+ */
+ private boolean force;
+
/**
* SQL-Driver name.
*
- * @parameter expression="${hibernate.connection.driver_class}
+ * @parameter property="hibernate.connection.driver_class"
+ * @since 1.0
*/
private String driverClassName;
/**
* Database URL.
*
- * @parameter expression="${hibernate.connection.url}"
+ * @parameter property="hibernate.connection.url"
+ * @since 1.0
*/
private String url;
/**
* Database username
*
- * @parameter expression="${hibernate.connection.username}"
+ * @parameter property="hibernate.connection.username"
+ * @since 1.0
*/
private String username;
/**
* Database password
*
- * @parameter expression="${hibernate.connection.password}"
+ * @parameter property="hibernate.connection.password"
+ * @since 1.0
*/
private String password;
/**
* Hibernate dialect.
*
- * @parameter expression="${hibernate.dialect}"
+ * @parameter property="hibernate.dialect"
+ * @since 1.0
*/
private String hibernateDialect;
/**
- * Hibernate configuration file.
+ * Hibernate Naming Strategy
*
- * @parameter default-value="${project.build.outputDirectory}/hibernate.properties"
+ * @parameter property="hibernate.ejb.naming_strategy"
+ * @since 1.0.2
+ */
+ private String hibernateNamingStrategy;
+
+ /**
+ * Path to Hibernate properties file.
+ * If this parameter is not set the plugin will try to load the configuration
+ * from a file hibernate.properties on the classpath. The
+ * test-classpath takes precedence.
+ *
+ * @parameter
+ * @since 1.0
*/
private String hibernateProperties;
+ /**
+ * Path to Hibernate configuration file (.cfg.xml).
+ * Settings in this file will overwrite settings in the properties file.
+ * If this parameter is not set the plugin will try to load the configuration
+ * from a file hibernate.cfg.xml on the classpath. The
+ * test-classpath takes precedence.
+ *
+ * @parameter
+ * @since 1.1.0
+ */
+ private String hibernateConfig;
+
+ /**
+ * Name of the persistence-unit.
+ * If there is only one persistence-unit available, that unit will be used
+ * automatically.
+ * Settings in this file will overwrite settings in the properties or the
+ * configuration file.
+ *
+ * @parameter
+ * @since 1.1.0
+ */
+ private String persistenceUnit;
+
+ /**
+ * List of Hibernate-Mapping-Files (XML).
+ * Multiple files can be separated with white-spaces and/or commas.
+ *
+ * @parameter property="hibernate.mapping"
+ * @since 1.0.2
+ */
+ private String hibernateMapping;
+
/**
* Target of execution:
*
- *
NONE do nothing - just validate the configuration
- *
EXPORT create database (DEFAULT!)
- *
SCRIPT export schema to SQL-script
+ *
NONE only export schema to SQL-script (forces execution, signals skip)
SCRIPT export schema to SQL-script and print it to STDOUT
*
BOTH
*
- * @parameter default-value="EXPORT"
+ *
+ * A database connection is only needed for EXPORT and BOTH, but a
+ * Hibernate-Dialect must always be chosen.
+ *
+ * @parameter property="hibernate.export.target" default-value="EXPORT"
+ * @since 1.0
*/
private String target;
/**
- * Type of export.
+ * Type of execution.
*
*
NONE do nothing - just validate the configuration
*
CREATE create database-schema
*
DROP drop database-schema
- *
BOTH(DEFAULT!)
+ *
BOTH (DEFAULT!)
*
- * @parameter default-value="BOTH"
+ *
+ * If NONE is choosen, no databaseconnection is needed.
+ *
+ * @parameter property="hibernate.export.type" default-value="BOTH"
+ * @since 1.0
*/
private String type;
/**
* Output file.
*
- * @parameter default-value="${project.build.outputDirectory}/schema.sql"
+ * @parameter property="hibernate.export.schema.filename" default-value="${project.build.directory}/schema.sql"
+ * @since 1.0
*/
private String outputFile;
/**
* Delimiter in output-file.
*
- * @parameter default-value=";"
+ * @parameter property="hibernate.export.schema.delimiter" default-value=";"
+ * @since 1.0
*/
private String delimiter;
/**
* Format output-file.
*
- * @parameter default-value="true"
+ * @parameter property="hibernate.export.schema.format" default-value="true"
+ * @since 1.0
*/
private boolean format;
+ /**
+ * Generate envers schema for auditing tables.
+ *
+ * @parameter property="hibernate.export.envers" default-value="true"
+ * @since 1.0.3
+ */
+ private boolean envers;
+
@Override
public void execute()
@@ -186,160 +379,76 @@ public class Hbm2DdlMojo extends AbstractMojo
{
if (skip)
{
- getLog().info("Exectuion of hibernate4-maven-plugin:export was skipped!");
+ getLog().info("Execution of hibernate4-maven-plugin:export was skipped!");
+ project.getProperties().setProperty(EXPORT_SKIPPED_PROPERTY, "true");
return;
}
- File dir = new File(outputDirectory);
- if (!dir.exists())
- throw new MojoExecutionException("Cannot scan for annotated classes in " + outputDirectory + ": directory does not exist!");
-
-
- Set classes = new HashSet();
- try
- {
- AnnotationDB db = new AnnotationDB();
- getLog().info("Scanning directory " + outputDirectory + " for annotated classes...");
- URL dirUrl = dir.toURI().toURL();
- db.scanArchives(dirUrl);
- if (db.getAnnotationIndex().containsKey(Entity.class.getName()))
- classes.addAll(db.getAnnotationIndex().get(Entity.class.getName()));
- if (db.getAnnotationIndex().containsKey(MappedSuperclass.class.getName()))
- classes.addAll(db.getAnnotationIndex().get(MappedSuperclass.class.getName()));
- if (db.getAnnotationIndex().containsKey(Embeddable.class.getName()))
- classes.addAll(db.getAnnotationIndex().get(Embeddable.class.getName()));
- }
- catch (IOException e)
- {
- getLog().error("Error while scanning!", e);
- throw new MojoFailureException(e.getMessage());
- }
- if (classes.isEmpty())
- throw new MojoFailureException("No annotated classes found in directory " + outputDirectory);
-
- Properties properties = new Properties();
+ Map md5s;
+ boolean modified = false;
+ File saved = new File(buildDirectory + File.separator + MD5S);
- /** Try to read configuration from properties-file */
- try
+ if (saved.isFile() && saved.length() > 0)
{
- File file = new File(hibernateProperties);
- if (file.exists())
+ try
{
- getLog().info("Reading properties from file " + hibernateProperties + "...");
- properties.load(new FileInputStream(file));
+ FileInputStream fis = new FileInputStream(saved);
+ ObjectInputStream ois = new ObjectInputStream(fis);
+ md5s = (HashMap)ois.readObject();
+ ois.close();
+ }
+ catch (Exception e)
+ {
+ md5s = new HashMap();
+ getLog().warn("Cannot read timestamps from saved: " + e);
}
- else
- getLog().info("No hibernate-properties-file found! Checked path: " + hibernateProperties);
- }
- catch (IOException e)
- {
- getLog().error("Error while reading properties!", e);
- throw new MojoExecutionException(e.getMessage());
- }
-
- /** Overwrite values from propertie-file or set, if given */
- if (driverClassName != null)
- {
- if (properties.containsKey(DRIVER_CLASS))
- getLog().debug(
- "Overwriting property " +
- DRIVER_CLASS + "=" + properties.getProperty(DRIVER_CLASS) +
- " with the value " + driverClassName +
- " from the plugin-configuration-parameter driverClassName!"
- );
- else
- getLog().debug(
- "Using the value " + driverClassName +
- " from the plugin-configuration-parameter driverClassName!"
- );
- properties.setProperty(DRIVER_CLASS, driverClassName);
- }
- if (url != null)
- {
- if (properties.containsKey(URL))
- getLog().debug(
- "Overwriting property " +
- URL + "=" + properties.getProperty(URL) +
- " with the value " + url +
- " from the plugin-configuration-parameter url!"
- );
- else
- getLog().debug(
- "Using the value " + url +
- " from the plugin-configuration-parameter url!"
- );
- properties.setProperty(URL, url);
- }
- if (username != null)
- {
- if (properties.containsKey(USERNAME))
- getLog().debug(
- "Overwriting property " +
- USERNAME + "=" + properties.getProperty(USERNAME) +
- " with the value " + username +
- " from the plugin-configuration-parameter username!"
- );
- else
- getLog().debug(
- "Using the value " + username +
- " from the plugin-configuration-parameter username!"
- );
- properties.setProperty(USERNAME, username);
- }
- if (password != null)
- {
- if (properties.containsKey(PASSWORD))
- getLog().debug(
- "Overwriting property " +
- PASSWORD + "=" + properties.getProperty(PASSWORD) +
- " with the value " + password +
- " from the plugin-configuration-parameter password!"
- );
- else
- getLog().debug(
- "Using the value " + password +
- " from the plugin-configuration-parameter password!"
- );
- properties.setProperty(PASSWORD, password);
- }
- if (hibernateDialect != null)
- {
- if (properties.containsKey(DIALECT))
- getLog().debug(
- "Overwriting property " +
- DIALECT + "=" + properties.getProperty(DIALECT) +
- " with the value " + hibernateDialect +
- " from the plugin-configuration-parameter hibernateDialect!"
- );
- else
- getLog().debug(
- "Using the value " + hibernateDialect +
- " from the plugin-configuration-parameter hibernateDialect!"
- );
- properties.setProperty(DIALECT, hibernateDialect);
}
-
- getLog().info("Gathered hibernate-configuration (turn on debugging for details):");
- if (properties.isEmpty())
+ else
{
- getLog().error("No properties set!");
- throw new MojoFailureException("Hibernate-Configuration is missing!");
+ md5s = new HashMap();
+ try
+ {
+ saved.createNewFile();
+ }
+ catch (IOException e)
+ {
+ getLog().debug("Cannot create file \"" + saved.getPath() + "\" for timestamps: " + e);
+ }
}
- for (Entry