X-Git-Url: https://juplo.de/gitweb/?p=website;a=blobdiff_plain;f=dist%2Fhibernate-maven-plugin-2.0.0%2Fxref%2Fde%2Fjuplo%2Fplugins%2Fhibernate%2FAbstractSchemaMojo.html;fp=dist%2Fhibernate-maven-plugin-2.0.0%2Fxref%2Fde%2Fjuplo%2Fplugins%2Fhibernate%2FAbstractSchemaMojo.html;h=0000000000000000000000000000000000000000;hp=16fa7a9e710331e959c3b34a8a2724d35266c4f4;hb=b293b312d6f0dd8b2dc716375fd442dd295a9942;hpb=9179a67d9952d3b63e95686dbd6cacd3c9e13cb2 diff --git a/dist/hibernate-maven-plugin-2.0.0/xref/de/juplo/plugins/hibernate/AbstractSchemaMojo.html b/dist/hibernate-maven-plugin-2.0.0/xref/de/juplo/plugins/hibernate/AbstractSchemaMojo.html deleted file mode 100644 index 16fa7a9e..00000000 --- a/dist/hibernate-maven-plugin-2.0.0/xref/de/juplo/plugins/hibernate/AbstractSchemaMojo.html +++ /dev/null @@ -1,1191 +0,0 @@ - - -
--1 package de.juplo.plugins.hibernate; -2 -3 -4 import com.pyx4j.log4j.MavenLogAppender; -5 import java.io.File; -6 import java.io.FileInputStream; -7 import java.io.IOException; -8 import java.io.InputStream; -9 import java.net.MalformedURLException; -10 import java.net.URL; -11 import java.security.NoSuchAlgorithmException; -12 import java.util.Collections; -13 import java.util.HashSet; -14 import java.util.Iterator; -15 import java.util.LinkedHashSet; -16 import java.util.List; -17 import java.util.Map; -18 import java.util.Map.Entry; -19 import java.util.Properties; -20 import java.util.Set; -21 import java.util.regex.Matcher; -22 import java.util.regex.Pattern; -23 import javax.persistence.Embeddable; -24 import javax.persistence.Entity; -25 import javax.persistence.MappedSuperclass; -26 import javax.persistence.spi.PersistenceUnitTransactionType; -27 import org.apache.maven.artifact.Artifact; -28 import org.apache.maven.model.Resource; -29 import org.apache.maven.plugin.AbstractMojo; -30 import org.apache.maven.plugin.MojoExecutionException; -31 import org.apache.maven.plugin.MojoFailureException; -32 import org.apache.maven.project.MavenProject; -33 import org.hibernate.boot.MetadataBuilder; -34 import org.hibernate.boot.MetadataSources; -35 import org.hibernate.boot.cfgxml.internal.ConfigLoader; -36 import org.hibernate.boot.cfgxml.spi.LoadedConfig; -37 import org.hibernate.boot.cfgxml.spi.MappingReference; -38 import org.hibernate.boot.model.naming.ImplicitNamingStrategy; -39 import org.hibernate.boot.model.naming.PhysicalNamingStrategy; -40 import org.hibernate.boot.registry.BootstrapServiceRegistry; -41 import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; -42 import org.hibernate.boot.registry.StandardServiceRegistry; -43 import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -44 import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; -45 import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; -46 import org.hibernate.boot.registry.selector.spi.StrategySelector; -47 import org.hibernate.boot.spi.MetadataImplementor; -48 import static org.hibernate.cfg.AvailableSettings.DIALECT; -49 import static org.hibernate.cfg.AvailableSettings.DRIVER; -50 import static org.hibernate.cfg.AvailableSettings.FORMAT_SQL; -51 import static org.hibernate.cfg.AvailableSettings.HBM2DLL_CREATE_NAMESPACES; -52 import static org.hibernate.cfg.AvailableSettings.IMPLICIT_NAMING_STRATEGY; -53 import static org.hibernate.cfg.AvailableSettings.PASS; -54 import static org.hibernate.cfg.AvailableSettings.PHYSICAL_NAMING_STRATEGY; -55 import static org.hibernate.cfg.AvailableSettings.SHOW_SQL; -56 import static org.hibernate.cfg.AvailableSettings.USER; -57 import static org.hibernate.cfg.AvailableSettings.URL; -58 import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; -59 import org.hibernate.internal.util.config.ConfigurationException; -60 import static org.hibernate.jpa.AvailableSettings.JDBC_DRIVER; -61 import static org.hibernate.jpa.AvailableSettings.JDBC_PASSWORD; -62 import static org.hibernate.jpa.AvailableSettings.JDBC_URL; -63 import static org.hibernate.jpa.AvailableSettings.JDBC_USER; -64 import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor; -65 import org.hibernate.jpa.boot.internal.PersistenceXmlParser; -66 import org.hibernate.jpa.boot.spi.ProviderChecker; -67 import org.scannotation.AnnotationDB; -68 -69 -70 /** -71 * Baseclass with common attributes and methods. -72 * -73 * @phase process-classes -74 * @threadSafe -75 * @requiresDependencyResolution runtime -76 */ -77 public abstract class AbstractSchemaMojo extends AbstractMojo -78 { -79 public final static String EXPORT = "hibernate.schema.export"; -80 public final static String DELIMITER = "hibernate.schema.delimiter"; -81 public final static String OUTPUTDIRECTORY = "project.build.outputDirectory"; -82 public final static String SCAN_CLASSES = "hibernate.schema.scan.classes"; -83 public final static String SCAN_DEPENDENCIES = "hibernate.schema.scan.dependencies"; -84 public final static String SCAN_TESTCLASSES = "hibernate.schema.scan.test_classes"; -85 public final static String TEST_OUTPUTDIRECTORY = "project.build.testOutputDirectory"; -86 public final static String SKIPPED = "hibernate.schema.skipped"; -87 -88 private final static Pattern SPLIT = Pattern.compile("[^,\\s]+"); -89 -90 private final Set<String> packages = new HashSet<String>(); -91 -92 /** -93 * The maven project. -94 * <p> -95 * Only needed internally. -96 * -97 * @parameter property="project" -98 * @required -99 * @readonly -100 */ -101 private MavenProject project; -102 -103 /** -104 * Build-directory. -105 * <p> -106 * Only needed internally. -107 * -108 * @parameter property="project.build.directory" -109 * @required -110 * @readonly -111 */ -112 String buildDirectory; -113 -114 -115 /** Parameters to configure the genaration of the SQL *********************/ -116 -117 /** -118 * Export the database-schma to the database. -119 * If set to <code>false</code>, only the SQL-script is created and the -120 * database is not touched. -121 * <p> -122 * <strong>Important:</strong> -123 * This configuration value can only be configured through the -124 * <code>pom.xml</code>, or by the definition of a system-property, because -125 * it is not known by Hibernate nor JPA and, hence, not picked up from -126 * their configuration! -127 * -128 * @parameter property="hibernate.schema.export" default-value="true" -129 * @since 2.0 -130 */ -131 Boolean export; -132 -133 /** -134 * Skip execution -135 * <p> -136 * If set to <code>true</code>, the execution is skipped. -137 * <p> -138 * A skipped execution is signaled via the maven-property -139 * <code>${hibernate.schema.skipped}</code>. -140 * <p> -141 * The execution is skipped automatically, if no modified or newly added -142 * annotated classes are found and the dialect was not changed. -143 * <p> -144 * <strong>Important:</strong> -145 * This configuration value can only be configured through the -146 * <code>pom.xml</code>, or by the definition of a system-property, because -147 * it is not known by Hibernate nor JPA and, hence, not picked up from -148 * their configuration! -149 * -150 * @parameter property="hibernate.schema.skip" default-value="${maven.test.skip}" -151 * @since 1.0 -152 */ -153 private boolean skip; -154 -155 /** -156 * Force execution -157 * <p> -158 * Force execution, even if no modified or newly added annotated classes -159 * where found and the dialect was not changed. -160 * <p> -161 * <code>skip</code> takes precedence over <code>force</code>. -162 * <p> -163 * <strong>Important:</strong> -164 * This configuration value can only be configured through the -165 * <code>pom.xml</code>, or by the definition of a system-property, because -166 * it is not known by Hibernate nor JPA and, hence, not picked up from -167 * their configuration! -168 * -169 * @parameter property="hibernate.schema.force" default-value="false" -170 * @since 1.0 -171 */ -172 private boolean force; -173 -174 /** -175 * Hibernate dialect. -176 * -177 * @parameter property="hibernate.dialect" -178 * @since 1.0 -179 */ -180 private String dialect; -181 -182 /** -183 * Delimiter in output-file. -184 * <p> -185 * <strong>Important:</strong> -186 * This configuration value can only be configured through the -187 * <code>pom.xml</code>, or by the definition of a system-property, because -188 * it is not known by Hibernate nor JPA and, hence, not picked up from -189 * their configuration! -190 * -191 * @parameter property="hibernate.schema.delimiter" default-value=";" -192 * @since 1.0 -193 */ -194 String delimiter; -195 -196 /** -197 * Show the generated SQL in the command-line output. -198 * -199 * @parameter property="hibernate.show_sql" -200 * @since 1.0 -201 */ -202 Boolean show; -203 -204 /** -205 * Format output-file. -206 * -207 * @parameter property="hibernate.format_sql" -208 * @since 1.0 -209 */ -210 Boolean format; -211 -212 /** -213 * Specifies whether to automatically create also the database schema/catalog. -214 * -215 * @parameter property="hibernate.hbm2dll.create_namespaces" default-value="false" -216 * @since 2.0 -217 */ -218 Boolean createNamespaces; -219 -220 /** -221 * Implicit naming strategy -222 * -223 * @parameter property="hibernate.implicit_naming_strategy" -224 * @since 2.0 -225 */ -226 private String implicitNamingStrategy; -227 -228 /** -229 * Physical naming strategy -230 * -231 * @parameter property="hibernate.physical_naming_strategy" -232 * @since 2.0 -233 */ -234 private String physicalNamingStrategy; -235 -236 /** -237 * Wether the project should be scanned for annotated-classes, or not -238 * <p> -239 * This parameter is intended to allow overwriting of the parameter -240 * <code>exclude-unlisted-classes</code> of a <code>persistence-unit</code>. -241 * If not specified, it defaults to <code>true</code> -242 * -243 * @parameter property="hibernate.schema.scan.classes" -244 * @since 2.0 -245 */ -246 private Boolean scanClasses; -247 -248 /** -249 * Classes-Directory to scan. -250 * <p> -251 * This parameter defaults to the maven build-output-directory for classes. -252 * Additionally, all dependencies are scanned for annotated classes. -253 * <p> -254 * <strong>Important:</strong> -255 * This configuration value can only be configured through the -256 * <code>pom.xml</code>, or by the definition of a system-property, because -257 * it is not known by Hibernate nor JPA and, hence, not picked up from -258 * their configuration! -259 * -260 * @parameter property="project.build.outputDirectory" -261 * @since 1.0 -262 */ -263 private String outputDirectory; -264 -265 /** -266 * Dependency-Scopes, that should be scanned for annotated classes. -267 * <p> -268 * By default, only dependencies in the scope <code>compile</code> are -269 * scanned for annotated classes. Multiple scopes can be seperated by -270 * white space or commas. -271 * <p> -272 * If you do not want any dependencies to be scanned for annotated -273 * classes, set this parameter to <code>none</code>. -274 * <p> -275 * The plugin does not scan for annotated classes in transitive -276 * dependencies. If some of your annotated classes are hidden in a -277 * transitive dependency, you can simply add that dependency explicitly. -278 * -279 * @parameter property="hibernate.schema.scan.dependencies" default-value="compile" -280 * @since 1.0.3 -281 */ -282 private String scanDependencies; -283 -284 /** -285 * Whether to scan the test-branch of the project for annotated classes, or -286 * not. -287 * <p> -288 * If this parameter is set to <code>true</code> the test-classes of the -289 * artifact will be scanned for hibernate-annotated classes additionally. -290 * <p> -291 * <strong>Important:</strong> -292 * This configuration value can only be configured through the -293 * <code>pom.xml</code>, or by the definition of a system-property, because -294 * it is not known by Hibernate nor JPA and, hence, not picked up from -295 * their configuration! -296 * -297 * @parameter property="hibernate.schema.scan.test_classes" default-value="false" -298 * @since 1.0.1 -299 */ -300 private Boolean scanTestClasses; -301 -302 /** -303 * Test-Classes-Directory to scan. -304 * <p> -305 * This parameter defaults to the maven build-output-directory for -306 * test-classes. -307 * <p> -308 * This parameter is only used, when <code>scanTestClasses</code> is set -309 * to <code>true</code>! -310 * <p> -311 * <strong>Important:</strong> -312 * This configuration value can only be configured through the -313 * <code>pom.xml</code>, or by the definition of a system-property, because -314 * it is not known by Hibernate nor JPA and, hence, not picked up from -315 * their configuration! -316 * -317 * @parameter property="project.build.testOutputDirectory" -318 * @since 1.0.2 -319 */ -320 private String testOutputDirectory; -321 -322 -323 /** Conection parameters *************************************************/ -324 -325 /** -326 * SQL-Driver name. -327 * -328 * @parameter property="hibernate.connection.driver_class" -329 * @since 1.0 -330 */ -331 private String driver; -332 -333 /** -334 * Database URL. -335 * -336 * @parameter property="hibernate.connection.url" -337 * @since 1.0 -338 */ -339 private String url; -340 -341 /** -342 * Database username -343 * -344 * @parameter property="hibernate.connection.username" -345 * @since 1.0 -346 */ -347 private String username; -348 -349 /** -350 * Database password -351 * -352 * @parameter property="hibernate.connection.password" -353 * @since 1.0 -354 */ -355 private String password; -356 -357 -358 /** Parameters to locate configuration sources ****************************/ -359 -360 /** -361 * Path to a file or name of a ressource with hibernate properties. -362 * If this parameter is specified, the plugin will try to load configuration -363 * values from a file with the given path or a ressource on the classpath with -364 * the given name. If both fails, the execution of the plugin will fail. -365 * <p> -366 * If this parameter is not set the plugin will load configuration values -367 * from a ressource named <code>hibernate.properties</code> on the classpath, -368 * if it is present, but will not fail if there is no such ressource. -369 * <p> -370 * During ressource-lookup, the test-classpath takes precedence. -371 * -372 * @parameter -373 * @since 1.0 -374 */ -375 private String hibernateProperties; -376 -377 /** -378 * Path to Hibernate configuration file (.cfg.xml). -379 * If this parameter is specified, the plugin will try to load configuration -380 * values from a file with the given path or a ressource on the classpath with -381 * the given name. If both fails, the execution of the plugin will fail. -382 * <p> -383 * If this parameter is not set the plugin will load configuration values -384 * from a ressource named <code>hibernate.cfg.xml</code> on the classpath, -385 * if it is present, but will not fail if there is no such ressource. -386 * <p> -387 * During ressource-lookup, the test-classpath takes precedence. -388 * <p> -389 * Settings in this file will overwrite settings in the properties file. -390 * -391 * @parameter -392 * @since 1.1.0 -393 */ -394 private String hibernateConfig; -395 -396 /** -397 * Name of the persistence-unit. -398 * If this parameter is specified, the plugin will try to load configuration -399 * values from a persistence-unit with the specified name. If no such -400 * persistence-unit can be found, the plugin will throw an exception. -401 * <p> -402 * If this parameter is not set and there is only one persistence-unit -403 * available, that unit will be used automatically. But if this parameter is -404 * not set and there are multiple persistence-units available on, -405 * the class-path, the execution of the plugin will fail. -406 * <p> -407 * Settings in this file will overwrite settings in the properties or the -408 * configuration file. -409 * -410 * @parameter -411 * @since 1.1.0 -412 */ -413 private String persistenceUnit; -414 -415 /** -416 * List of Hibernate-Mapping-Files (XML). -417 * Multiple files can be separated with white-spaces and/or commas. -418 * -419 * @parameter property="hibernate.mapping" -420 * @since 1.0.2 -421 */ -422 private String mappings; -423 -424 -425 -426 public final void execute(String filename) -427 throws -428 MojoFailureException, -429 MojoExecutionException -430 { -431 if (skip) -432 { -433 getLog().info("Execution of hibernate-maven-plugin was skipped!"); -434 project.getProperties().setProperty(SKIPPED, "true"); -435 return; -436 } -437 -438 ModificationTracker tracker; -439 try -440 { -441 tracker = new ModificationTracker(buildDirectory, filename, getLog()); -442 } -443 catch (NoSuchAlgorithmException e) -444 { -445 throw new MojoFailureException("Digest-Algorithm MD5 is missing!", e); -446 } -447 -448 SimpleConnectionProvider connectionProvider = -449 new SimpleConnectionProvider(getLog()); -450 -451 try -452 { -453 /** Start extended logging */ -454 MavenLogAppender.startPluginLog(this); -455 -456 /** Load checksums for old mapping and configuration */ -457 tracker.load(); -458 -459 /** Create the ClassLoader */ -460 MutableClassLoader classLoader = createClassLoader(); -461 -462 /** Create a BootstrapServiceRegistry with the created ClassLoader */ -463 BootstrapServiceRegistry bootstrapServiceRegitry = -464 new BootstrapServiceRegistryBuilder() -465 .applyClassLoader(classLoader) -466 .build(); -467 ClassLoaderService classLoaderService = -468 bootstrapServiceRegitry.getService(ClassLoaderService.class); -469 -470 Properties properties = new Properties(); -471 ConfigLoader configLoader = new ConfigLoader(bootstrapServiceRegitry); -472 -473 /** Loading and merging configuration */ -474 properties.putAll(loadProperties(configLoader)); -475 LoadedConfig config = loadConfig(configLoader); -476 if (config != null) -477 properties.putAll(config.getConfigurationValues()); -478 ParsedPersistenceXmlDescriptor unit = -479 loadPersistenceUnit(classLoaderService, properties); -480 if (unit != null) -481 properties.putAll(unit.getProperties()); -482 -483 /** Overwriting/Completing configuration */ -484 configure(properties, tracker); -485 -486 /** Check configuration for modifications */ -487 if(tracker.track(properties)) -488 getLog().debug("Configuration has changed."); -489 else -490 getLog().debug("Configuration unchanged."); -491 -492 /** Configure Hibernate */ -493 StandardServiceRegistry serviceRegistry = -494 new StandardServiceRegistryBuilder(bootstrapServiceRegitry) -495 .applySettings(properties) -496 .addService(ConnectionProvider.class, connectionProvider) -497 .build(); -498 MetadataSources sources = new MetadataSources(serviceRegistry); -499 -500 /** Add the remaining class-path-elements */ -501 completeClassPath(classLoader); -502 -503 /** Apply mappings from hibernate-configuration, if present */ -504 if (config != null) -505 { -506 for (MappingReference mapping : config.getMappingReferences()) -507 mapping.apply(sources); -508 } -509 -510 Set<String> classes; -511 if (unit == null) -512 { -513 /** No persistent unit: default behaviour */ -514 if (scanClasses == null) -515 scanClasses = true; -516 Set<URL> urls = new HashSet<URL>(); -517 if (scanClasses) -518 addRoot(urls, outputDirectory); -519 if (scanTestClasses) -520 addRoot(urls, testOutputDirectory); -521 addDependencies(urls); -522 classes = scanUrls(urls); -523 } -524 else -525 { -526 /** Follow configuration in persisten unit */ -527 if (scanClasses == null) -528 scanClasses = !unit.isExcludeUnlistedClasses(); -529 Set<URL> urls = new HashSet<URL>(); -530 if (scanClasses) -531 { -532 /** -533 * Scan the root of the persiten unit and configured jars for -534 * annotated classes -535 */ -536 urls.add(unit.getPersistenceUnitRootUrl()); -537 for (URL url : unit.getJarFileUrls()) -538 urls.add(url); -539 } -540 if (scanTestClasses) -541 addRoot(urls, testOutputDirectory); -542 classes = scanUrls(urls); -543 for (String className : unit.getManagedClassNames()) -544 classes.add(className); -545 /** -546 * Add mappings from the default mapping-file -547 * <code>META-INF/orm.xml</code>, if present -548 */ -549 try -550 { -551 InputStream is = classLoader.getResourceAsStream("META-INF/orm.xml"); -552 if (is != null) -553 { -554 getLog().info("Adding default JPA-XML-mapping from META-INF/orm.xml"); -555 tracker.track("META-INF/orm.xml", is); -556 sources.addResource("META-INF/orm.xml"); -557 } -558 /** -559 * Add mappings from files, that are explicitly configured in the -560 * persistence unit -561 */ -562 for (String mapping : unit.getMappingFileNames()) -563 { -564 getLog().info("Adding explicitly configured mapping from " + mapping); -565 tracker.track(mapping, classLoader.getResourceAsStream(mapping)); -566 sources.addResource(mapping); -567 } -568 } -569 catch (IOException e) -570 { -571 throw new MojoFailureException("Error reading XML-mappings", e); -572 } -573 } -574 -575 /** Add the configured/collected annotated classes */ -576 for (String className : classes) -577 addAnnotated(className, sources, classLoaderService, tracker); -578 -579 /** Add explicitly configured classes */ -580 addMappings(sources, tracker); -581 -582 /** Skip execution, if mapping and configuration is unchanged */ -583 if (!tracker.modified()) -584 { -585 getLog().info( -586 "Mapping and configuration unchanged." -587 ); -588 if (force) -589 getLog().info("Schema generation is forced!"); -590 else -591 { -592 getLog().info("Skipping schema generation!"); -593 project.getProperties().setProperty(SKIPPED, "true"); -594 return; -595 } -596 } -597 -598 -599 /** Create a connection, if sufficient configuration infromation is available */ -600 connectionProvider.open(classLoaderService, properties); -601 -602 MetadataBuilder metadataBuilder = sources.getMetadataBuilder(); -603 -604 StrategySelector strategySelector = -605 serviceRegistry.getService(StrategySelector.class); -606 -607 if (properties.containsKey(IMPLICIT_NAMING_STRATEGY)) -608 { -609 metadataBuilder.applyImplicitNamingStrategy( -610 strategySelector.resolveStrategy( -611 ImplicitNamingStrategy.class, -612 properties.getProperty(IMPLICIT_NAMING_STRATEGY) -613 ) -614 ); -615 } -616 -617 if (properties.containsKey(PHYSICAL_NAMING_STRATEGY)) -618 { -619 metadataBuilder.applyPhysicalNamingStrategy( -620 strategySelector.resolveStrategy( -621 PhysicalNamingStrategy.class, -622 properties.getProperty(PHYSICAL_NAMING_STRATEGY) -623 ) -624 ); -625 } -626 -627 /** -628 * Change class-loader of current thread. -629 * This is necessary, because still not all parts of Hibernate 5 use -630 * the newly introduced ClassLoaderService and will fail otherwise! -631 */ -632 Thread thread = Thread.currentThread(); -633 ClassLoader contextClassLoader = thread.getContextClassLoader(); -634 try -635 { -636 thread.setContextClassLoader(classLoader); -637 build((MetadataImplementor)metadataBuilder.build()); -638 } -639 finally -640 { -641 thread.setContextClassLoader(contextClassLoader); -642 } -643 } -644 catch (MojoExecutionException e) -645 { -646 tracker.failed(); -647 throw e; -648 } -649 catch (MojoFailureException e) -650 { -651 tracker.failed(); -652 throw e; -653 } -654 catch (RuntimeException e) -655 { -656 tracker.failed(); -657 throw e; -658 } -659 finally -660 { -661 /** Remember mappings and configuration */ -662 tracker.save(); -663 -664 /** Close the connection - if one was opened */ -665 connectionProvider.close(); -666 -667 /** Stop Log-Capturing */ -668 MavenLogAppender.endPluginLog(this); -669 } -670 } -671 -672 -673 abstract void build(MetadataImplementor metadata) -674 throws -675 MojoFailureException, -676 MojoExecutionException; -677 -678 -679 private MutableClassLoader createClassLoader() throws MojoExecutionException -680 { -681 try -682 { -683 getLog().debug("Creating ClassLoader for project-dependencies..."); -684 LinkedHashSet<URL> urls = new LinkedHashSet<URL>(); -685 File file; -686 -687 file = new File(testOutputDirectory); -688 if (!file.exists()) -689 { -690 getLog().info("Creating test-output-directory: " + testOutputDirectory); -691 file.mkdirs(); -692 } -693 urls.add(file.toURI().toURL()); -694 -695 file = new File(outputDirectory); -696 if (!file.exists()) -697 { -698 getLog().info("Creating output-directory: " + outputDirectory); -699 file.mkdirs(); -700 } -701 urls.add(file.toURI().toURL()); -702 -703 return new MutableClassLoader(urls, getLog()); -704 } -705 catch (Exception e) -706 { -707 getLog().error("Error while creating ClassLoader!", e); -708 throw new MojoExecutionException(e.getMessage()); -709 } -710 } -711 -712 private void completeClassPath(MutableClassLoader classLoader) -713 throws -714 MojoExecutionException -715 { -716 try -717 { -718 getLog().debug("Completing class-paths of the ClassLoader for project-dependencies..."); -719 List<String> classpathFiles = project.getCompileClasspathElements(); -720 if (scanTestClasses) -721 classpathFiles.addAll(project.getTestClasspathElements()); -722 LinkedHashSet<URL> urls = new LinkedHashSet<URL>(); -723 for (String pathElement : classpathFiles) -724 { -725 getLog().debug("Dependency: " + pathElement); -726 urls.add(new File(pathElement).toURI().toURL()); -727 } -728 classLoader.add(urls); -729 } -730 catch (Exception e) -731 { -732 getLog().error("Error while creating ClassLoader!", e); -733 throw new MojoExecutionException(e.getMessage()); -734 } -735 } -736 -737 private Map loadProperties(ConfigLoader configLoader) -738 throws -739 MojoExecutionException -740 { -741 /** Try to read configuration from properties-file */ -742 if (hibernateProperties == null) -743 { -744 try -745 { -746 return configLoader.loadProperties("hibernate.properties"); -747 } -748 catch (ConfigurationException e) -749 { -750 getLog().debug(e.getMessage()); -751 return Collections.EMPTY_MAP; -752 } -753 } -754 else -755 { -756 try -757 { -758 File file = new File(hibernateProperties); -759 if (file.exists()) -760 { -761 getLog().info("Reading settings from file " + hibernateProperties + "..."); -762 return configLoader.loadProperties(file); -763 } -764 else -765 return configLoader.loadProperties(hibernateProperties); -766 } -767 catch (ConfigurationException e) -768 { -769 getLog().error("Error while reading properties!", e); -770 throw new MojoExecutionException(e.getMessage()); -771 } -772 } -773 } -774 -775 private LoadedConfig loadConfig(ConfigLoader configLoader) -776 throws MojoExecutionException -777 { -778 /** Try to read configuration from configuration-file */ -779 if (hibernateConfig == null) -780 { -781 try -782 { -783 return configLoader.loadConfigXmlResource("hibernate.cfg.xml"); -784 } -785 catch (ConfigurationException e) -786 { -787 getLog().debug(e.getMessage()); -788 return null; -789 } -790 } -791 else -792 { -793 try -794 { -795 File file = new File(hibernateConfig); -796 if (file.exists()) -797 { -798 getLog().info("Reading configuration from file " + hibernateConfig + "..."); -799 return configLoader.loadConfigXmlFile(file); -800 } -801 else -802 { -803 return configLoader.loadConfigXmlResource(hibernateConfig); -804 } -805 } -806 catch (ConfigurationException e) -807 { -808 getLog().error("Error while reading configuration!", e); -809 throw new MojoExecutionException(e.getMessage()); -810 } -811 } -812 } -813 -814 private void configure(Properties properties, ModificationTracker tracker) -815 throws MojoFailureException -816 { -817 /** -818 * Special treatment for the configuration-value "export": if it is -819 * switched to "true", the genearation fo the schema should be forced! -820 */ -821 if (tracker.check(EXPORT, export.toString()) && export) -822 tracker.touch(); -823 -824 /** -825 * Configure the generation of the SQL. -826 * Overwrite values from properties-file if the configuration parameter is -827 * known to Hibernate. -828 */ -829 dialect = configure(properties, dialect, DIALECT); -830 tracker.track(DELIMITER, delimiter); // << not reflected in hibernate configuration! -831 format = configure(properties, format, FORMAT_SQL); -832 createNamespaces = configure(properties, createNamespaces, HBM2DLL_CREATE_NAMESPACES); -833 implicitNamingStrategy = configure(properties, implicitNamingStrategy, IMPLICIT_NAMING_STRATEGY); -834 physicalNamingStrategy = configure(properties, physicalNamingStrategy, PHYSICAL_NAMING_STRATEGY); -835 tracker.track(OUTPUTDIRECTORY, outputDirectory); // << not reflected in hibernate configuration! -836 tracker.track(SCAN_DEPENDENCIES, scanDependencies); // << not reflected in hibernate configuration! -837 tracker.track(SCAN_TESTCLASSES, scanTestClasses.toString()); // << not reflected in hibernate configuration! -838 tracker.track(TEST_OUTPUTDIRECTORY, testOutputDirectory); // << not reflected in hibernate configuration! -839 -840 /** -841 * Special treatment for the configuration-value "show": a change of its -842 * configured value should not lead to a regeneration of the database -843 * schama! -844 */ -845 if (show == null) -846 show = Boolean.valueOf(properties.getProperty(SHOW_SQL)); -847 else -848 properties.setProperty(SHOW_SQL, show.toString()); -849 -850 /** -851 * Configure the connection parameters. -852 * Overwrite values from properties-file. -853 */ -854 driver = configure(properties, driver, DRIVER, JDBC_DRIVER); -855 url = configure(properties, url, URL, JDBC_URL); -856 username = configure(properties, username, USER, JDBC_USER); -857 password = configure(properties, password, PASS, JDBC_PASSWORD); -858 -859 if (properties.isEmpty()) -860 { -861 getLog().error("No properties set!"); -862 throw new MojoFailureException("Hibernate configuration is missing!"); -863 } -864 -865 getLog().info("Gathered hibernate-configuration (turn on debugging for details):"); -866 for (Entry<Object,Object> entry : properties.entrySet()) -867 getLog().info(" " + entry.getKey() + " = " + entry.getValue()); -868 } -869 -870 private String configure( -871 Properties properties, -872 String value, -873 String key, -874 String alternativeKey -875 ) -876 { -877 value = configure(properties, value, key); -878 if (value == null) -879 return properties.getProperty(alternativeKey); -880 -881 if (properties.containsKey(alternativeKey)) -882 { -883 getLog().warn( -884 "Ignoring property " + alternativeKey + "=" + -885 properties.getProperty(alternativeKey) + " in favour for property " + -886 key + "=" + properties.getProperty(key) -887 ); -888 properties.remove(alternativeKey); -889 } -890 return properties.getProperty(alternativeKey); -891 } -892 -893 private String configure(Properties properties, String value, String key) -894 { -895 if (value != null) -896 { -897 if (properties.containsKey(key)) -898 getLog().debug( -899 "Overwriting property " + key + "=" + properties.getProperty(key) + -900 " with the value " + value -901 ); -902 else -903 getLog().debug("Using the value " + value + " for property " + key); -904 properties.setProperty(key, value); -905 } -906 return properties.getProperty(key); -907 } -908 -909 private boolean configure(Properties properties, Boolean value, String key) -910 { -911 if (value != null) -912 { -913 if (properties.containsKey(key)) -914 getLog().debug( -915 "Overwriting property " + key + "=" + properties.getProperty(key) + -916 " with the value " + value -917 ); -918 else -919 getLog().debug("Using the value " + value + " for property " + key); -920 properties.setProperty(key, value.toString()); -921 } -922 return Boolean.valueOf(properties.getProperty(key)); -923 } -924 -925 private void addMappings(MetadataSources sources, ModificationTracker tracker) -926 throws MojoFailureException -927 { -928 getLog().debug("Adding explicitly configured mappings..."); -929 if (mappings != null) -930 { -931 try -932 { -933 for (String filename : mappings.split("[\\s,]+")) -934 { -935 // First try the filename as absolute/relative path -936 File file = new File(filename); -937 if (!file.exists()) -938 { -939 // If the file was not found, search for it in the resource-directories -940 for (Resource resource : project.getResources()) -941 { -942 file = new File(resource.getDirectory() + File.separator + filename); -943 if (file.exists()) -944 break; -945 } -946 } -947 if (file.exists()) -948 { -949 if (file.isDirectory()) -950 // TODO: add support to read all mappings under a directory -951 throw new MojoFailureException(file.getAbsolutePath() + " is a directory"); -952 if (tracker.track(filename, new FileInputStream(file))) -953 getLog().debug("Found new or modified mapping-file: " + filename); -954 else -955 getLog().debug("Mapping-file unchanged: " + filename); -956 -957 sources.addFile(file); -958 } -959 else -960 throw new MojoFailureException("File " + filename + " could not be found in any of the configured resource-directories!"); -961 } -962 } -963 catch (IOException e) -964 { -965 throw new MojoFailureException("Cannot calculate MD5 sums!", e); -966 } -967 } -968 } -969 -970 private void addRoot(Set<URL> urls, String path) throws MojoFailureException -971 { -972 try -973 { -974 File dir = new File(outputDirectory); -975 if (dir.exists()) -976 { -977 getLog().info("Adding " + dir.getAbsolutePath() + " to the list of roots to scan..."); -978 urls.add(dir.toURI().toURL()); -979 } -980 } -981 catch (MalformedURLException e) -982 { -983 getLog().error("error while adding the project-root to the list of roots to scan!", e); -984 throw new MojoFailureException(e.getMessage()); -985 } -986 } -987 -988 private void addDependencies(Set<URL> urls) throws MojoFailureException -989 { -990 try -991 { -992 if (scanDependencies != null) -993 { -994 Matcher matcher = SPLIT.matcher(scanDependencies); -995 while (matcher.find()) -996 { -997 getLog().info("Adding dependencies from scope " + matcher.group() + " to the list of roots to scan"); -998 for (Artifact artifact : project.getDependencyArtifacts()) -999 { -1000 if (!artifact.getScope().equalsIgnoreCase(matcher.group())) -1001 continue; -1002 if (artifact.getFile() == null) -1003 { -1004 getLog().warn("Cannot add dependency " + artifact.getId() + ": no JAR-file available!"); -1005 continue; -1006 } -1007 getLog().info("Adding dependencies from scope " + artifact.getId() + " to the list of roots to scan"); -1008 urls.add(artifact.getFile().toURI().toURL()); -1009 } -1010 } -1011 } -1012 } -1013 catch (MalformedURLException e) -1014 { -1015 getLog().error("Error while adding dependencies to the list of roots to scan!", e); -1016 throw new MojoFailureException(e.getMessage()); -1017 } -1018 } -1019 -1020 private Set<String> scanUrls(Set<URL> scanRoots) -1021 throws -1022 MojoFailureException -1023 { -1024 try -1025 { -1026 AnnotationDB db = new AnnotationDB(); -1027 for (URL root : scanRoots) -1028 db.scanArchives(root); -1029 -1030 Set<String> classes = new HashSet<String>(); -1031 if (db.getAnnotationIndex().containsKey(Entity.class.getName())) -1032 classes.addAll(db.getAnnotationIndex().get(Entity.class.getName())); -1033 if (db.getAnnotationIndex().containsKey(MappedSuperclass.class.getName())) -1034 classes.addAll(db.getAnnotationIndex().get(MappedSuperclass.class.getName())); -1035 if (db.getAnnotationIndex().containsKey(Embeddable.class.getName())) -1036 classes.addAll(db.getAnnotationIndex().get(Embeddable.class.getName())); -1037 -1038 return classes; -1039 } -1040 catch (Exception e) -1041 { -1042 getLog().error("Error while scanning!", e); -1043 throw new MojoFailureException(e.getMessage()); -1044 } -1045 } -1046 -1047 private void addAnnotated( -1048 String name, -1049 MetadataSources sources, -1050 ClassLoaderService classLoaderService, -1051 ModificationTracker tracker -1052 ) -1053 throws -1054 MojoFailureException, -1055 MojoExecutionException -1056 { -1057 try -1058 { -1059 getLog().info("Adding annotated resource: " + name); -1060 String packageName; -1061 -1062 try -1063 { -1064 Class<?> annotatedClass = classLoaderService.classForName(name); -1065 String resourceName = annotatedClass.getName(); -1066 resourceName = -1067 resourceName.substring( -1068 resourceName.lastIndexOf(".") + 1, -1069 resourceName.length() -1070 ) + ".class"; -1071 InputStream is = annotatedClass.getResourceAsStream(resourceName); -1072 if (tracker.track(name, is)) -1073 getLog().debug("New or modified class: " + name); -1074 else -1075 getLog().debug("Unchanged class: " + name); -1076 sources.addAnnotatedClass(annotatedClass); -1077 packageName = annotatedClass.getPackage().getName(); -1078 } -1079 catch(ClassLoadingException e) -1080 { -1081 packageName = name; -1082 } -1083 -1084 while (packageName != null) -1085 { -1086 if (packages.contains(packageName)) -1087 return; -1088 String resource = packageName.replace('.', '/') + "/package-info.class"; -1089 InputStream is = classLoaderService.locateResourceStream(resource); -1090 if (is == null) -1091 { -1092 // No compiled package-info available: no package-level annotations! -1093 getLog().debug("Package " + packageName + " is not annotated."); -1094 } -1095 else -1096 { -1097 if (tracker.track(packageName, is)) -1098 getLog().debug("New or modified package: " + packageName); -1099 else -1100 getLog().debug("Unchanged package: " + packageName); -1101 getLog().info("Adding annotations from package " + packageName); -1102 sources.addPackage(packageName); -1103 } -1104 packages.add(packageName); -1105 int i = packageName.lastIndexOf('.'); -1106 if (i < 0) -1107 packageName = null; -1108 else -1109 packageName = packageName.substring(0,i); -1110 } -1111 } -1112 catch (Exception e) -1113 { -1114 getLog().error("Error while adding the annotated class " + name, e); -1115 throw new MojoFailureException(e.getMessage()); -1116 } -1117 } -1118 -1119 private ParsedPersistenceXmlDescriptor loadPersistenceUnit( -1120 ClassLoaderService classLoaderService, -1121 Properties properties -1122 ) -1123 throws -1124 MojoFailureException -1125 { -1126 PersistenceXmlParser parser = -1127 new PersistenceXmlParser( -1128 classLoaderService, -1129 PersistenceUnitTransactionType.RESOURCE_LOCAL -1130 ); -1131 -1132 List<ParsedPersistenceXmlDescriptor> units = parser.doResolve(properties); -1133 -1134 if (persistenceUnit == null) -1135 { -1136 switch (units.size()) -1137 { -1138 case 0: -1139 getLog().info("Found no META-INF/persistence.xml."); -1140 return null; -1141 case 1: -1142 getLog().info("Using persistence-unit " + units.get(0).getName()); -1143 return units.get(0); -1144 default: -1145 StringBuilder builder = new StringBuilder(); -1146 builder.append("No name provided and multiple persistence units found: "); -1147 Iterator<ParsedPersistenceXmlDescriptor> it = units.iterator(); -1148 builder.append(it.next().getName()); -1149 while (it.hasNext()) -1150 { -1151 builder.append(", "); -1152 builder.append(it.next().getName()); -1153 } -1154 builder.append('.'); -1155 throw new MojoFailureException(builder.toString()); -1156 } -1157 } -1158 -1159 for (ParsedPersistenceXmlDescriptor unit : units) -1160 { -1161 getLog().debug("Found persistence-unit " + unit.getName()); -1162 if (!unit.getName().equals(persistenceUnit)) -1163 continue; -1164 -1165 // See if we (Hibernate) are the persistence provider -1166 if (!ProviderChecker.isProvider(unit, properties)) -1167 { -1168 getLog().debug("Wrong provider: " + unit.getProviderClassName()); -1169 continue; -1170 } -1171 -1172 getLog().info("Using persistence-unit " + unit.getName()); -1173 return unit; -1174 } -1175 -1176 throw new MojoFailureException("Could not find persistence-unit " + persistenceUnit); -1177 } -1178 } --