package org.codehaus.mojo.hibernate3.configuration; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.JDBCMetaDataConfiguration; import org.hibernate.cfg.reveng.ReverseEngineeringSettings; import org.hibernate.cfg.reveng.ReverseEngineeringStrategy; import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy; import org.hibernate.cfg.reveng.OverrideRepository; import org.hibernate.util.ReflectHelper; import org.codehaus.mojo.hibernate3.HibernateUtils; import java.io.File; import java.lang.reflect.Constructor; public class JDBCComponentConfiguration extends AbstractComponentConfiguration { // --------------------- Interface ComponentConfiguration --------------------- public String getName() { return "jdbcconfiguration"; } protected Configuration createConfiguration() { return new JDBCMetaDataConfiguration(); } protected void doConfiguration( Configuration configuration ) { JDBCMetaDataConfiguration jmdc = (JDBCMetaDataConfiguration) configuration; super.doConfiguration( jmdc ); jmdc.setPreferBasicCompositeIds( getExporterMojo().getComponentProperty( "preferbasiccompositeids", true ) ); ReverseEngineeringStrategy strategy = new DefaultReverseEngineeringStrategy(); strategy = loadRevengFile( strategy ); strategy = loadReverseStrategy( strategy ); ReverseEngineeringSettings qqsettings = new ReverseEngineeringSettings( strategy ); String packageName = getExporterMojo().getComponentProperty( "packagename" ); if ( packageName != null ) { qqsettings.setDefaultPackageName( packageName ); } String detectManyToMany = getExporterMojo().getComponentProperty( "detectmanytomany" ); if ( "false".equals( detectManyToMany ) ) { qqsettings.setDetectManyToMany( false ); } String detectOptimisticLock = getExporterMojo().getComponentProperty( "detectoptmisticlock" ); if ( "false".equals( detectOptimisticLock ) ) { qqsettings.setDetectOptimisticLock( false ); } strategy.setSettings( qqsettings ); jmdc.setReverseEngineeringStrategy( strategy ); jmdc.readFromJDBC(); } private ReverseEngineeringStrategy loadRevengFile( ReverseEngineeringStrategy delegate ) { String revengFile = getExporterMojo().getComponentProperty( "revengfile" ); if ( revengFile != null ) { OverrideRepository or = new OverrideRepository(); File rf = HibernateUtils.getFile( getExporterMojo().getProject().getBasedir(), revengFile ); if ( rf == null ) { getExporterMojo().getLog().info( "Couldn't find the revengfile in the project. Trying absolute path." ); rf = HibernateUtils.getFile( null, revengFile ); } if ( rf != null ) { or.addFile( rf ); return or.getReverseEngineeringStrategy( delegate ); } } return delegate; } private ReverseEngineeringStrategy loadReverseStrategy( ReverseEngineeringStrategy delegate ) { String reverseStrategy = getExporterMojo().getComponentProperty( "reversestrategy" ); if ( reverseStrategy != null ) { try { Class clazz = ReflectHelper.classForName( reverseStrategy ); //noinspection RedundantArrayCreation Constructor constructor = clazz.getConstructor( new Class[]{ReverseEngineeringStrategy.class} ); //noinspection RedundantArrayCreation return (ReverseEngineeringStrategy) constructor.newInstance( new Object[]{delegate} ); } catch ( NoSuchMethodException e ) { try { getExporterMojo().getLog().info( "Could not find public " + reverseStrategy + "(ReverseEngineeringStrategy delegate) constructor on ReverseEngineeringStrategy. Trying no-arg version." ); Class clazz = ReflectHelper.classForName( reverseStrategy ); ReverseEngineeringStrategy rev = (ReverseEngineeringStrategy) clazz.newInstance(); getExporterMojo().getLog().info( "Using non-delegating strategy, thus packagename and revengfile will be ignored." ); return rev; } catch ( Exception eq ) { getExporterMojo().getLog().error( "Could not create or find " + reverseStrategy + " with default no-arg constructor", eq ); } } catch ( Exception e ) { getExporterMojo().getLog().error( "Could not create or find " + reverseStrategy + " with one argument delegate constructor", e ); } } return delegate; } }