package org.jboss.loom; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.jboss.loom.actions.review.BeansXmlReview; import org.jboss.loom.actions.review.IActionReview; import org.jboss.loom.conf.Configuration; import org.jboss.loom.conf.GlobalConfiguration; import org.jboss.loom.ex.InitMigratorsExceptions; import org.jboss.loom.ex.MigrationException; import org.jboss.loom.ex.MigrationExceptions; import org.jboss.loom.migrators.IMigratorFilter; import org.jboss.loom.migrators.classloading.ClassloadingMigrator; import org.jboss.loom.migrators.connectionFactories.ResAdapterMigrator; import org.jboss.loom.migrators.dataSources.DatasourceMigrator; import org.jboss.loom.migrators.ejb3.Ejb3Migrator; import org.jboss.loom.migrators.jaxr.JaxrMigrator; import org.jboss.loom.migrators.logging.LoggingMigrator; import org.jboss.loom.migrators.mail.MailMigrator; import org.jboss.loom.migrators.messaging.MessagingMigrator; import org.jboss.loom.migrators.remoting.RemotingMigrator; import org.jboss.loom.migrators.security.SecurityMigrator; import org.jboss.loom.migrators.server.ServerMigrator; import org.jboss.loom.migrators.windup.WindUpMigrator; import org.jboss.loom.spi.IMigrator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author Ondrej Zizka, ozizka at redhat.com */ public class MigratorsInstantiator { private static final Logger log = LoggerFactory.getLogger( MigratorsInstantiator.class ); /** * Finds the static java Migrator classes, filters them according to the config, and returns instantiated migrators. */ static Map<Class<? extends IMigrator>, IMigrator> findAndInstantiateStaticMigratorClasses( IMigratorFilter filter, Configuration config ) throws InitMigratorsExceptions, MigrationException { // Find IMigrator implementations. List<Class<? extends IMigrator>> migratorClasses = MigratorsInstantiator.findMigratorClasses(); // Filter based on $config. /*List<String> onlyMigrators = config.getGlobal().getOnlyMigrators(); for( Iterator<Class<? extends IMigrator>> it = migratorClasses.iterator(); it.hasNext(); ) { Class<? extends IMigrator> cls = it.next(); for( String name : onlyMigrators ) { if( ! cls.getSimpleName().equals( name ) ) it.remove(); } }*/ // Filter out based on given filter. for( Iterator<Class<? extends IMigrator>> it = migratorClasses.iterator(); it.hasNext(); ) { if( ! filter.filterClass( it.next() ) ) it.remove(); } // Initialize migrator instances. Map<Class<? extends IMigrator>, IMigrator> migratorsMap = createJavaMigrators( migratorClasses, config.getGlobal() ); return migratorsMap; } /** * Instantiate the plugins. */ static Map<Class<? extends IMigrator>, IMigrator> createJavaMigrators( List<Class<? extends IMigrator>> migratorClasses, GlobalConfiguration globalConfig) throws InitMigratorsExceptions, MigrationException { Map<Class<? extends IMigrator>, IMigrator> migs = new LinkedHashMap(); List<Exception> exs = new LinkedList<>(); for( Class<? extends IMigrator> cls : migratorClasses ){ try { Constructor<? extends IMigrator> ctor = cls.getConstructor(GlobalConfiguration.class); IMigrator mig = ctor.newInstance(globalConfig); migs.put(cls, mig); } catch( NoSuchMethodException ex ){ String msg = cls.getName() + " doesn't have constructor ...(GlobalConfiguration globalConfig)."; log.error( msg ); exs.add( new MigrationException(msg) ); } catch( InvocationTargetException | InstantiationException | IllegalAccessException ex) { log.error("Failed instantiating " + cls.getSimpleName() + ": " + ex.toString()); log.debug("Stack trace: ", ex); exs.add(ex); } } MigrationExceptions.wrapExceptions( exs, "Failed processing migrator definitions. "); return migs; }// createMigrators() /** * Finds the implementations of the IMigrator. * TODO: Implement scanning for classes. */ static List<Class<? extends IMigrator>> findMigratorClasses() { LinkedList<Class<? extends IMigrator>> migratorClasses = new LinkedList(); findStaticMigratorClasses( migratorClasses ); //findExternalMigratorClasses( migratorClasses ); return migratorClasses; } static void findStaticMigratorClasses( LinkedList<Class<? extends IMigrator>> migratorClasses ) { migratorClasses.add( SecurityMigrator.class ); migratorClasses.add( ServerMigrator.class ); migratorClasses.add( DatasourceMigrator.class ); migratorClasses.add( ResAdapterMigrator.class ); migratorClasses.add( LoggingMigrator.class ); //migratorClasses.add( DeploymentScannerMigrator.class ); migratorClasses.add( ClassloadingMigrator.class ); // Warn-only impl. migratorClasses.add( MailMigrator.class ); // Warn-only impl. migratorClasses.add( JaxrMigrator.class ); // Warn-only impl. migratorClasses.add( RemotingMigrator.class ); // Warn-only impl. migratorClasses.add( Ejb3Migrator.class ); // Warn-only impl. migratorClasses.add( MessagingMigrator.class ); // Warn-only impl. migratorClasses.add( WindUpMigrator.class ); } static List<Class<? extends IActionReview>> findActionReviewers(){ LinkedList<Class<? extends IActionReview>> reviewers = new LinkedList(); reviewers.add( BeansXmlReview.class ); return reviewers; } }// class