package jp.co.worksap.workspace.cli; import static com.google.common.base.Preconditions.checkNotNull; import java.io.File; import java.io.IOException; import java.util.Map; import jp.co.worksap.workspace.common.download.AuthenticationInfoProvider; import jp.co.worksap.workspace.database.db2.DB2Configuration; import jp.co.worksap.workspace.database.db2.DB2Installer; import jp.co.worksap.workspace.ide.eclipse.EclipseConfiguration; import jp.co.worksap.workspace.ide.eclipse.EclipseInstaller; import jp.co.worksap.workspace.ide.eclipse.EclipsePluginInstaller; import jp.co.worksap.workspace.lombok.LombokConfiguration; import jp.co.worksap.workspace.lombok.LombokInstaller; import jp.co.worksap.workspace.packagemanagement.Package; import jp.co.worksap.workspace.packagemanagement.PackageManagementFacade; import jp.co.worksap.workspace.repository.git.GitInitializer; import jp.co.worksap.workspace.repository.git.GitRepositoryConfiguration; import jp.co.worksap.workspace.wasinstall.WASInstallConfiguration; import jp.co.worksap.workspace.wasinstall.WASInstaller; import jp.co.worksap.workspace.wasprofile.WebSphereProfileConfiguration; import jp.co.worksap.workspace.wasprofile.WebSphereProfileCreator; import lombok.extern.slf4j.Slf4j; import com.google.common.base.Optional; import com.google.common.collect.Iterables; @Slf4j final class Provisioner { private final PackageManagementFacade packageManagerFacade; private final EclipseInstaller eclipseInstaller; private final EclipsePluginInstaller eclipsePluginInstaller; private final LombokInstaller lombokInstaller; private final DB2Installer db2Installer; private final WASInstaller wasInstaller; private final WebSphereProfileCreator wasProfileCreator; private final GitInitializer gitInitializer; Provisioner(PackageManagementFacade packageManagerFacade, EclipseInstaller eclipseInstaller, EclipsePluginInstaller eclipsePluginInstaller, LombokInstaller lombokInstaller, DB2Installer db2Installer, WASInstaller wasInstaller, WebSphereProfileCreator wasProfileCreator, GitInitializer gitInitializer) { this.packageManagerFacade = checkNotNull(packageManagerFacade); this.eclipseInstaller = checkNotNull(eclipseInstaller); this.eclipsePluginInstaller = checkNotNull(eclipsePluginInstaller); this.lombokInstaller = checkNotNull(lombokInstaller); this.db2Installer = checkNotNull(db2Installer); this.wasInstaller = checkNotNull(wasInstaller); this.wasProfileCreator = checkNotNull(wasProfileCreator); this.gitInitializer = checkNotNull(gitInitializer); } StatusCode execute(Configuration configuration, AuthenticationInfoProvider infoProvider) throws IOException { File targetLocation = configuration.getTargetLocation(); if (!targetLocation.isDirectory()) { log.error("targetLocation should be existed directory: " + targetLocation.getAbsolutePath()); return StatusCode.ERROR; } try { installPackages(configuration); installEclipseAndPlugin(configuration, targetLocation, infoProvider); installDB2(configuration, infoProvider); installWAS(configuration, infoProvider); configureWebsphere(configuration); cloneRepository(configuration); return StatusCode.NORMAL; } catch (RuntimeException e) { log.error("fail to provision", e); return StatusCode.ERROR; } } private void cloneRepository(Configuration configuration) { Map<String, GitRepositoryConfiguration> repository = configuration.getRepository(); if (repository == null || repository.isEmpty()) { log.info("no Git repository is specified"); } else { gitInitializer.initialize(configuration.getTargetLocation(), repository, configuration.getGitHook()); } } private void installEclipseAndPlugin(Configuration configuration, File targetLocation, AuthenticationInfoProvider infoProvider) { EclipseConfiguration eclipseConfiguration = configuration.getEclipse(); if (eclipseConfiguration != null) { File eclipseDir = eclipseInstaller.install(eclipseConfiguration, targetLocation, infoProvider); eclipsePluginInstaller.install(eclipseConfiguration, eclipseDir); LombokConfiguration lombok = configuration.getLombok(); if (configuration.getLombok() != null) { lombokInstaller.install(Optional.fromNullable(lombok), eclipseDir, infoProvider); } } else if (configuration.getLombok() != null) { log.warn("you need Eclipse configuration to set up lombok"); } else { log.info("no Eclipse is required"); } } private void installPackages(Configuration configuration) { Iterable<Package> targetPackage = configuration.getTargetPackage(); if (targetPackage != null && !Iterables.isEmpty(targetPackage)) { packageManagerFacade.install(targetPackage); } else { log.info("no package is required"); } } private void installDB2(Configuration configuration, AuthenticationInfoProvider infoProvider) { DB2Configuration db2Configuration = configuration.getDb2(); if (db2Configuration != null) { db2Installer.install(db2Configuration, infoProvider); } else { log.info("no DB2 is required"); } } public void configureWebsphere(Configuration configuration) throws IOException { WebSphereProfileConfiguration wasProfileConfiguration = configuration.getWasProfile(); if (wasProfileConfiguration != null) { wasProfileCreator.createAndConfigureProfile(wasProfileConfiguration); } else { log.info("no WebSphere Configuration is required"); } } private void installWAS(Configuration configuration, AuthenticationInfoProvider infoProvider) { WASInstallConfiguration wasInstallConfiguration = configuration.getWasInstall(); if (wasInstallConfiguration != null) { wasInstaller.install(wasInstallConfiguration, infoProvider); } else { log.info("no DB2 is required"); } } }