/hibernate-core/src/main/java/org/hibernate/tool/hbm2ddl/SchemaValidator.java

https://github.com/aleksabl/hibernate-core · Java · 199 lines · 149 code · 28 blank · 22 comment · 24 complexity · c096cbc189c2252a435e88bc397546c8 MD5 · raw file

  1. /*
  2. * Hibernate, Relational Persistence for Idiomatic Java
  3. *
  4. * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  5. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  6. */
  7. package org.hibernate.tool.hbm2ddl;
  8. import java.io.File;
  9. import java.io.FileInputStream;
  10. import java.util.ArrayList;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.Properties;
  15. import org.hibernate.boot.Metadata;
  16. import org.hibernate.boot.MetadataBuilder;
  17. import org.hibernate.boot.MetadataSources;
  18. import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
  19. import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
  20. import org.hibernate.boot.registry.BootstrapServiceRegistry;
  21. import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
  22. import org.hibernate.boot.registry.StandardServiceRegistry;
  23. import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
  24. import org.hibernate.boot.registry.selector.spi.StrategySelector;
  25. import org.hibernate.boot.spi.MetadataImplementor;
  26. import org.hibernate.engine.config.spi.ConfigurationService;
  27. import org.hibernate.internal.CoreLogging;
  28. import org.hibernate.internal.CoreMessageLogger;
  29. import org.hibernate.internal.log.DeprecationLogger;
  30. import org.hibernate.service.ServiceRegistry;
  31. import org.hibernate.tool.schema.internal.ExceptionHandlerHaltImpl;
  32. import org.hibernate.tool.schema.spi.ExecutionOptions;
  33. import org.hibernate.tool.schema.spi.SchemaManagementTool;
  34. import org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator;
  35. /**
  36. * A commandline tool to update a database schema. May also be called from
  37. * inside an application.
  38. *
  39. * @author Christoph Sturm
  40. */
  41. public class SchemaValidator {
  42. private static final CoreMessageLogger LOG = CoreLogging.messageLogger( SchemaValidator.class );
  43. public void validate(Metadata metadata) {
  44. validate( metadata, ( (MetadataImplementor) metadata ).getMetadataBuildingOptions().getServiceRegistry() );
  45. }
  46. @SuppressWarnings("unchecked")
  47. public void validate(Metadata metadata, ServiceRegistry serviceRegistry) {
  48. LOG.runningSchemaValidator();
  49. Map config = new HashMap();
  50. config.putAll( serviceRegistry.getService( ConfigurationService.class ).getSettings() );
  51. final SchemaManagementTool tool = serviceRegistry.getService( SchemaManagementTool.class );
  52. final ExecutionOptions executionOptions = SchemaManagementToolCoordinator.buildExecutionOptions(
  53. config,
  54. ExceptionHandlerHaltImpl.INSTANCE
  55. );
  56. tool.getSchemaValidator( config ).doValidation( metadata, executionOptions );
  57. }
  58. public static void main(String[] args) {
  59. try {
  60. final CommandLineArgs parsedArgs = CommandLineArgs.parseCommandLineArgs( args );
  61. final StandardServiceRegistry serviceRegistry = buildStandardServiceRegistry( parsedArgs );
  62. try {
  63. final MetadataImplementor metadata = buildMetadata( parsedArgs, serviceRegistry );
  64. new SchemaValidator().validate( metadata, serviceRegistry );
  65. }
  66. finally {
  67. StandardServiceRegistryBuilder.destroy( serviceRegistry );
  68. }
  69. }
  70. catch (Exception e) {
  71. LOG.unableToRunSchemaUpdate( e );
  72. e.printStackTrace();
  73. }
  74. }
  75. private static class CommandLineArgs {
  76. String implicitNamingStrategy = null;
  77. String physicalNamingStrategy = null;
  78. String propertiesFile = null;
  79. String cfgXmlFile = null;
  80. List<String> hbmXmlFiles = new ArrayList<String>();
  81. List<String> jarFiles = new ArrayList<String>();
  82. public static CommandLineArgs parseCommandLineArgs(String[] args) {
  83. final CommandLineArgs parsedArgs = new CommandLineArgs();
  84. for ( String arg : args ) {
  85. if ( arg.startsWith( "--" ) ) {
  86. if ( arg.startsWith( "--properties=" ) ) {
  87. parsedArgs.propertiesFile = arg.substring( 13 );
  88. }
  89. else if ( arg.startsWith( "--config=" ) ) {
  90. parsedArgs.cfgXmlFile = arg.substring( 9 );
  91. }
  92. else if ( arg.startsWith( "--naming=" ) ) {
  93. DeprecationLogger.DEPRECATION_LOGGER.logDeprecatedNamingStrategyArgument();
  94. }
  95. else if ( arg.startsWith( "--implicit-naming=" ) ) {
  96. parsedArgs.implicitNamingStrategy = arg.substring( 18 );
  97. }
  98. else if ( arg.startsWith( "--physical-naming=" ) ) {
  99. parsedArgs.physicalNamingStrategy = arg.substring( 18 );
  100. }
  101. }
  102. else {
  103. if ( arg.endsWith( ".jar" ) ) {
  104. parsedArgs.jarFiles.add( arg );
  105. }
  106. else {
  107. parsedArgs.hbmXmlFiles.add( arg );
  108. }
  109. }
  110. }
  111. return parsedArgs;
  112. }
  113. }
  114. private static StandardServiceRegistry buildStandardServiceRegistry(CommandLineArgs parsedArgs) throws Exception {
  115. final BootstrapServiceRegistry bsr = new BootstrapServiceRegistryBuilder().build();
  116. final StandardServiceRegistryBuilder ssrBuilder = new StandardServiceRegistryBuilder( bsr );
  117. if ( parsedArgs.cfgXmlFile != null ) {
  118. ssrBuilder.configure( parsedArgs.cfgXmlFile );
  119. }
  120. if ( parsedArgs.propertiesFile != null ) {
  121. Properties properties = new Properties();
  122. properties.load( new FileInputStream( parsedArgs.propertiesFile ) );
  123. ssrBuilder.applySettings( properties );
  124. }
  125. return ssrBuilder.build();
  126. }
  127. private static MetadataImplementor buildMetadata(
  128. CommandLineArgs parsedArgs,
  129. StandardServiceRegistry serviceRegistry) throws Exception {
  130. final MetadataSources metadataSources = new MetadataSources(serviceRegistry);
  131. for ( String filename : parsedArgs.hbmXmlFiles ) {
  132. metadataSources.addFile( filename );
  133. }
  134. for ( String filename : parsedArgs.jarFiles ) {
  135. metadataSources.addJar( new File( filename ) );
  136. }
  137. final MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder();
  138. final StrategySelector strategySelector = serviceRegistry.getService( StrategySelector.class );
  139. if ( parsedArgs.implicitNamingStrategy != null ) {
  140. metadataBuilder.applyImplicitNamingStrategy(
  141. strategySelector.resolveStrategy( ImplicitNamingStrategy.class, parsedArgs.implicitNamingStrategy )
  142. );
  143. }
  144. if ( parsedArgs.physicalNamingStrategy != null ) {
  145. metadataBuilder.applyPhysicalNamingStrategy(
  146. strategySelector.resolveStrategy( PhysicalNamingStrategy.class, parsedArgs.physicalNamingStrategy )
  147. );
  148. }
  149. return (MetadataImplementor) metadataBuilder.build();
  150. }
  151. /**
  152. * Intended for test usage only. Builds a Metadata using the same algorithm as
  153. * {@link #main}
  154. *
  155. * @param args The "command line args"
  156. *
  157. * @return The built Metadata
  158. *
  159. * @throws Exception Problems building the Metadata
  160. */
  161. public static MetadataImplementor buildMetadataFromMainArgs(String[] args) throws Exception {
  162. final CommandLineArgs commandLineArgs = CommandLineArgs.parseCommandLineArgs( args );
  163. StandardServiceRegistry serviceRegistry = buildStandardServiceRegistry( commandLineArgs );
  164. try {
  165. return buildMetadata( commandLineArgs, serviceRegistry );
  166. }
  167. finally {
  168. StandardServiceRegistryBuilder.destroy( serviceRegistry );
  169. }
  170. }
  171. }