/* * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 . * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and limitations under the License. */ package org.jboss.loom; import java.util.LinkedList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.jboss.loom.conf.AS7Config; import org.jboss.loom.conf.Configuration; import org.jboss.loom.conf.Configuration.ModuleSpecificProperty; import org.jboss.loom.conf.ConfigurationValidator; import org.jboss.loom.conf.GlobalConfiguration; import org.jboss.loom.ex.MigrationException; import org.jboss.loom.ex.RollbackMigrationException; import org.jboss.loom.utils.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Main class of the application. * Contains app-specific code, like arguments parsing, instantiating the Migrator etc. * * @author Ondrej Zizka */ public class MigratorApp { private static final Logger log = LoggerFactory.getLogger(MigratorApp.class); public static void main(String[] args) { if (args.length == 0) { Utils.writeHelp(); return; } // Parse arguments. Configuration configuration = parseArguments( args ); if( null == configuration ) System.exit(1); // Apply defaults. applyDefaults( configuration ); // MIGR-84 if( null != System.getenv("JBOSS_HOME") ) log.warn("JBOSS_HOME is set, might cause the migration to fail. Unset if you run in trouble."); // Validate config. List<String> problems = ConfigurationValidator.validate( configuration ); if( !problems.isEmpty() ){ for( String problem : problems ) log.error(problem); System.exit(1); } // Migrate. try { migrate( configuration ); } catch (MigrationException ex) { log.error("Migration failed (details at DEBUG level): " + ex.getMessage()); log.debug("Migration failed: ", ex); } }// main() // TODO: Some files are declared for example in standard profile in AS5 but files which they reference are not? security web-console* /** * Parses app's arguments. * @returns Configuration initialized according to args. */ static Configuration parseArguments(String[] args) { // Global config GlobalConfiguration globalConfig = new GlobalConfiguration(); // Module-specific options. List<ModuleSpecificProperty> moduleConfigs = new LinkedList<>(); // For each argument... for (String arg : args) { arg = StringUtils.removeStart( arg, "--" ); if( arg.equals("help") ){ Utils.writeHelp(); return null; } if( arg.startsWith("as5.dir=") || arg.startsWith("eap5.dir=") || arg.startsWith("src.dir=") ) { globalConfig.getAS5Config().setDir(StringUtils.substringAfter(arg, "=")); continue; } if( arg.startsWith("dest.dir=") || arg.startsWith("eap6.dir=") || arg.startsWith("dest.dir=") || arg.startsWith("wfly.dir=") ) { globalConfig.getAS7Config().setDir(StringUtils.substringAfter(arg, "=")); continue; } if( arg.startsWith("as5.profile=") || arg.startsWith("eap5.profile=") || arg.startsWith("src.profile=") ) { globalConfig.getAS5Config().setProfileName(StringUtils.substringAfter(arg, "=")); continue; } if( arg.startsWith("dest.confPath=") || arg.startsWith("eap6.confPath=") || arg.startsWith("dest.conf.file=") || arg.startsWith("wfly.confPath=") ) { globalConfig.getAS7Config().setConfigPath(StringUtils.substringAfter(arg, "=")); continue; } if( arg.startsWith("dest.mgmt=") || arg.startsWith("eap6.mgmt=") || arg.startsWith("dest.mgmt=") || arg.startsWith("wfly.mgmt=") ) { parseMgmtConn( StringUtils.substringAfter(arg, "="), globalConfig.getAS7Config() ); continue; } if( arg.startsWith("app.path=") ) { globalConfig.addDeploymentPath( StringUtils.substringAfter(arg, "=")); continue; } if( arg.startsWith("valid.skip") ) { globalConfig.setSkipValidation(true); continue; } if( arg.equals("dry") || arg.equals("dryRun") || arg.equals("dry-run") ) { globalConfig.setDryRun(true); continue; } if( arg.equals("test") || arg.equals("testRun") || arg.equals("test-run") ) { globalConfig.setTestRun(true); continue; } if( arg.startsWith("report.dir=") ) { globalConfig.setReportDir( StringUtils.substringAfter(arg, "=")); continue; } if( arg.startsWith("migrators.dir=") || arg.startsWith("migr.dir=") ) { globalConfig.setExternalMigratorsDir( StringUtils.substringAfter(arg, "=")); continue; } // User variables available in EL and Groovy in external migrators. if (arg.startsWith("userVar.")) { // --userVar.<property.name>=<value> String rest = StringUtils.substringAfter(arg, "."); String name = StringUtils.substringBefore(rest, "="); String value = StringUtils.substringAfter(rest, "="); globalConfig.getUserVars().put( name, value ); } // Module-specific configurations. // TODO: Process by calling IMigrator instances' callback. if (arg.startsWith("conf.")) { // --conf.<module>.<property.name>[=<value>] String conf = StringUtils.substringAfter(arg, "."); String module = StringUtils.substringBefore(conf, "."); String propName = StringUtils.substringAfter(conf, "."); int pos = propName.indexOf('='); String value = null; if( pos == -1 ){ value = propName.substring(pos+1); propName = propName.substring(0, pos); } moduleConfigs.add( new ModuleSpecificProperty(module, propName, value)); } // Unrecognized. if( ! arg.contains("=") ){ // TODO: Could be AS5 or AS7 dir. } System.err.println("Warning: Unknown argument: " + arg + " !"); Utils.writeHelp(); continue; } Configuration configuration = new Configuration(); configuration.setModuleConfigs(moduleConfigs); configuration.setGlobalConfig(globalConfig); return configuration; }// parseArguments() /** * Sets the default values. */ private static void applyDefaults(Configuration configuration) { // TODO } /** * Performs the migration. */ public static void migrate( Configuration conf ) throws MigrationException { log.info("Commencing migration."); MigrationEngine migrator = new MigrationEngine(conf); try { migrator.doMigration(); log.info(""); log.info("Migration was successful."); } catch( Throwable ex ) { log.error("Migration failed. See previous messages for progress. "); if( ex instanceof RollbackMigrationException ){ log.error("Yet, the rollback attempt failed as well. " + "The server configuration may have ended up in an inconsistent state!"); log.error(""); RollbackMigrationException rollEx = (RollbackMigrationException) ex; log.error("Rollback failure cause: " + rollEx.getRollbackCause(), rollEx.getRollbackCause()); ex = rollEx.getCause(); } log.error(""); log.error("Migration failure cause: " + ex, ex); } }// migrate() /** * @param mgmtConn localhost:9999 */ private static void parseMgmtConn( String mgmtConn, AS7Config aS7Config ) { String host = StringUtils.substringBefore(mgmtConn, ":"); if( ! mgmtConn.contains(":")) return; String port = StringUtils.substringAfter(mgmtConn, ":"); aS7Config.setHost( host ); try { aS7Config.setManagementPort( Integer.parseInt( port ) ); } catch( NumberFormatException ex ){ aS7Config.setManagementPort( -1 ); } } }// class