From 96ad5b07d2518a384c2cd14acd11e4bac81bbbac Mon Sep 17 00:00:00 2001 From: Miguel Moquillon Date: Mon, 5 Aug 2019 16:11:59 +0200 Subject: [PATCH] Bug #10769 Restructure the different sections of settings of the plugin SilverSetup in order to separate correctly what are for configuration of Silverpeas, what are for installation and what are for the migration of the data source. Add a new plugin setting property: timeout. It sets the timeout of the waiting for JBoss to answer to the requests sent by the plugin. By default it is set to 5mn (instead of 2mn) but it can be changed by setting the property silversetup { timeout = } in the SILVERPEAS_HOME/bin/build.gradle file. --- .../SilverpeasConfigurationProperties.groovy | 10 --- .../SilverpeasInstallationProperties.groovy | 65 ++++++++++++++ .../SilverpeasMigrationProperties.groovy | 39 ++++++++ .../setup/SilverpeasSetupExtension.groovy | 89 ++++++------------- .../setup/SilverpeasSetupPlugin.groovy | 77 ++++++++-------- .../silverpeas/setup/SoftwareBundles.groovy | 44 +++++++++ .../silverpeas/setup/TaskEventLogging.groovy | 6 +- .../silverpeas/setup/api/JBossServer.groovy | 6 +- .../setup/api/SilverpeasSetupTask.groovy | 18 ++++ .../JBossConfigurationTask.groovy | 32 +++---- .../SilverpeasConfigurationTask.groovy | 8 +- .../construction/SilverpeasBuilder.groovy | 11 +-- .../SilverpeasConstructionTask.groovy | 46 ++++------ .../SilverpeasInstallationTask.groovy | 21 ++--- .../migration/SilverpeasMigrationTask.groovy | 15 ++-- .../SilverpeasInstallationTaskTest.groovy | 2 +- 16 files changed, 302 insertions(+), 187 deletions(-) create mode 100644 src/main/groovy/org/silverpeas/setup/SilverpeasInstallationProperties.groovy create mode 100644 src/main/groovy/org/silverpeas/setup/SilverpeasMigrationProperties.groovy create mode 100644 src/main/groovy/org/silverpeas/setup/SoftwareBundles.groovy create mode 100644 src/main/groovy/org/silverpeas/setup/api/SilverpeasSetupTask.groovy diff --git a/src/main/groovy/org/silverpeas/setup/SilverpeasConfigurationProperties.groovy b/src/main/groovy/org/silverpeas/setup/SilverpeasConfigurationProperties.groovy index 0bdbef64..883c0112 100644 --- a/src/main/groovy/org/silverpeas/setup/SilverpeasConfigurationProperties.groovy +++ b/src/main/groovy/org/silverpeas/setup/SilverpeasConfigurationProperties.groovy @@ -67,12 +67,6 @@ class SilverpeasConfigurationProperties { */ final File jbossModulesDir - /** - * The Silverpeas settings as defined in the config.properties file. - * Some of them are computed from the properties in the file config.properties. - */ - final Map settings = [:] - @Inject SilverpeasConfigurationProperties(Project project, File silverpeasHome) { configurationHome = project.file("${silverpeasHome.path}/configuration") @@ -80,8 +74,4 @@ class SilverpeasConfigurationProperties { silverpeasConfigurationDir = project.file("${silverpeasHome.path}/configuration/silverpeas") jbossModulesDir = project.file("${jbossConfigurationDir.path}/modules") } - - void setSettings(final Map configProperties) { - this.settings.putAll(configProperties) - } } diff --git a/src/main/groovy/org/silverpeas/setup/SilverpeasInstallationProperties.groovy b/src/main/groovy/org/silverpeas/setup/SilverpeasInstallationProperties.groovy new file mode 100644 index 00000000..4d41c454 --- /dev/null +++ b/src/main/groovy/org/silverpeas/setup/SilverpeasInstallationProperties.groovy @@ -0,0 +1,65 @@ +package org.silverpeas.setup + +import org.gradle.api.Action +import org.gradle.api.Project +import org.gradle.api.provider.Property + +import javax.inject.Inject +/** + * Properties for the installation and deployment of Silverpeas in a JBoss server. + * @author mmoquillon + */ +class SilverpeasInstallationProperties { + + /** + * The distribution directory. It is the directory that contains all the content of the + * constructed Silverpeas collaborative application. Defaulted into the build directory. Set a + * different location is pertinent only for development mode as in this mode the distribution + * directory is deployed as such in the JBoss/Wildfly application server. + * environment variable. + */ + final Property distDir + + /** + * Directory that have to contain all the application or resource archives to deploy into + * JBoss/Wildfly. Defaulted in the SILVERPEAS_HOME/deployments directory. + */ + final Property deploymentDir + + /** + * Directory that have to contain all the drivers required by Silverpeas and the Silverpeas Setup + * plugin to access the data source of Silverpeas. + */ + final Property dsDriversDir + + /** + * Is in development mode? (In this case, some peculiar configuration are applied to support the + * dev mode in the application server.) This is a property and hence can be set by the user input + * from the build script. + */ + final Property developmentMode + + /** + * Collections of software bundles required to construct the Silverpeas application.These bundles + * will be downloaded from our software repository server (provided by our Nexus service) and then + * unpacked to a given directory in order to generate the final application. + */ + final SoftwareBundles bundles + + @Inject + SilverpeasInstallationProperties(Project project, File silverpeasHome) { + distDir = project.objects.property(File) + distDir.set(new File(project.buildDir, "dist")) + deploymentDir = project.objects.property(File) + deploymentDir.set(new File(silverpeasHome, 'deployments')) + dsDriversDir = project.objects.property(File) + dsDriversDir.set(new File(project.buildDir, "drivers")) + developmentMode = project.objects.property(Boolean) + developmentMode.set(false) + bundles = project.objects.newInstance(SoftwareBundles, project) + } + + void bundles(Action action) { + action.execute(bundles) + } +} diff --git a/src/main/groovy/org/silverpeas/setup/SilverpeasMigrationProperties.groovy b/src/main/groovy/org/silverpeas/setup/SilverpeasMigrationProperties.groovy new file mode 100644 index 00000000..58111874 --- /dev/null +++ b/src/main/groovy/org/silverpeas/setup/SilverpeasMigrationProperties.groovy @@ -0,0 +1,39 @@ +package org.silverpeas.setup + +import org.gradle.api.Project +import org.gradle.api.provider.Property + +import javax.inject.Inject + +/** + * Properties for the migration of the data source used by Silverpeas when installing it or + * upgrading it to a new version. + * @author mmoquillon + */ +class SilverpeasMigrationProperties { + + /** + * The directory in which are all located both the data source migration descriptors + * and the scripts to create or to update the schema of the database to be used by Silverpeas. + * It is defaulted to SILVERPEAS_HOME/migrations. + * It is expected to contain two kinds of subdirectories: + *
    + *
  • modules in which are provided the XML descriptor of each migration + * module. These descriptors refers the scripts to use to create or to update the + * database schema for a given Silverpeas module;
  • + *
  • db in which are located per database type and per module the + * different SQL scripts to create or to upgrade the schema of the database;
  • + *
  • scripts in which are located per module the different programming + * scripts (currently, only Groovy is supported) to perform complex tasks on the database or + * any other data sources used by Silverpeas (like the JCR for example). + *
  • + *
+ */ + final Property homeDir + + @Inject + SilverpeasMigrationProperties(Project project, File silverpeasHome) { + this.homeDir = project.objects.property(File) + this.homeDir.set(new File(silverpeasHome, 'migrations')) + } +} diff --git a/src/main/groovy/org/silverpeas/setup/SilverpeasSetupExtension.groovy b/src/main/groovy/org/silverpeas/setup/SilverpeasSetupExtension.groovy index 5faa8624..f0c87d3a 100644 --- a/src/main/groovy/org/silverpeas/setup/SilverpeasSetupExtension.groovy +++ b/src/main/groovy/org/silverpeas/setup/SilverpeasSetupExtension.groovy @@ -25,9 +25,8 @@ package org.silverpeas.setup import org.gradle.api.Action import org.gradle.api.Project -import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.file.FileCollection import org.gradle.api.provider.Property +import org.silverpeas.setup.api.JBossServer import org.silverpeas.setup.api.SystemWrapper /** * Extension of the plugin in which are defined the different properties required by the plugin to @@ -64,43 +63,21 @@ class SilverpeasSetupExtension { final File jbossHome /** - * The distribution directory. It is the directory that contains all the content of the - * constructed Silverpeas collaborative application. Defaulted into the build directory. Set a - * different location is pertinent only for development mode as in this mode the distribution - * directory is deployed as such in the JBoss/Wildfly application server. - * environment variable. - */ - final Property distDir - - /** - * The properties to access the configuration if Silverpeas in order to apply it to the - * current Silverpeas distribution. + * The properties required by the configuration execution of a Silverpeas distribution. */ final SilverpeasConfigurationProperties config /** - * The directory in which are all located both the data source migration descriptors - * and the scripts to create or to update the schema of the database to be used by Silverpeas. - * It is expected to contain two kinds of subdirectories: - *
    - *
  • modules in which are provided the XML descriptor of each migration - * module. These descriptors refers the scripts to use to create or to update the - * database schema for a given Silverpeas module;
  • - *
  • db in which are located per database type and per module the - * different SQL scripts to create or to upgrade the schema of the database;
  • - *
  • scripts in which are located per module the different programming - * scripts (currently, only Groovy is supported) to perform complex tasks on the database or - * any other data sources used by Silverpeas (like the JCR for example). - *
  • - *
+ * The properties required by the build of a given version of Silverpeas and its deployment + * in a JBoss server. */ - final File migrationHome + final SilverpeasInstallationProperties installation /** - * Directory that have to contain all the application or resource archives to deploy into - * JBoss/Wildfly. + * The properties required to perform a data source migration when upgrading Silverpeas to a newer + * version or when installing a fresh Silverpeas version. */ - final File deploymentDir + final SilverpeasMigrationProperties migration /** * The properties to configure the logging. They define the location of the logging file, the @@ -109,25 +86,16 @@ class SilverpeasSetupExtension { final SilverpeasLoggingProperties logging /** - * All the software bundles that made Silverpeas. Those bundles are usually downloaded from our - * own Software Repository by the Silverpeas installer. They are required to assemble and build - * the final Silverpeas Web Application. The Jar libraries other than the supported JDBC drivers - * aren't taken in charge. - */ - final ConfigurableFileCollection silverpeasBundles - - /** - * Any tiers bundles to add into the Silverpeas Application being built. The tiers bundles are - * processed differently by the plugin: only the JAR libraries are taken in charge. + * The time out when waiting JBoss answering to our requests. Defaulted to 5mn. */ - final ConfigurableFileCollection tiersBundles + final Property timeout /** - * Is in development mode ? (In this case, some peculiar configuration are applied to support the - * dev mode in the application server.) This is a property and hence can be set by the user input - * from the build script. + * The Silverpeas settings as defined in the config.properties file. + * Some of them are computed from the properties in the file config.properties. + * Tasks can overwrite some of the settings as well as add their own properties. */ - final Property developmentMode + final Map settings = [:] /** * Constructs a new silverpeas configuration extension. It checks the environment variables @@ -148,24 +116,17 @@ class SilverpeasSetupExtension { println 'The path referred by SILVERPEAS_HOME or by JBOSS_HOME doesn\'t exist or isn\'t a directory!' throw new IllegalStateException() } - migrationHome = project.file("${silverpeasHome.path}/migrations") - deploymentDir = project.file("${silverpeasHome.path}/deployments") - distDir = project.objects.property(File) - distDir.set(new File(project.buildDir, "dist")) config = project.objects.newInstance(SilverpeasConfigurationProperties, project, silverpeasHome) + installation = project.objects.newInstance(SilverpeasInstallationProperties, project, silverpeasHome) + migration = project.objects.newInstance(SilverpeasMigrationProperties, project, silverpeasHome) logging = project.objects.newInstance(SilverpeasLoggingProperties) - silverpeasBundles = project.files() - tiersBundles = project.files(); - developmentMode = project.objects.property(Boolean) - developmentMode.set(false) + timeout = project.objects.property(Long) + timeout.set(300000l) + JBossServer.DEFAULT_TIMEOUT = timeout.get() } - void setSilverpeasBundles(FileCollection bundles) { - this.silverpeasBundles.setFrom(bundles) - } - - void setTiersBundles(FileCollection bundles) { - this.tiersBundles.setFrom(bundles) + void setSettings(final Map configProperties) { + this.settings.putAll(configProperties) } void logging(Action action) { @@ -175,4 +136,12 @@ class SilverpeasSetupExtension { void config(Action action) { action.execute(config) } + + void installation(Action action) { + action.execute(installation) + } + + void migration(Action action) { + action.execute(migration) + } } diff --git a/src/main/groovy/org/silverpeas/setup/SilverpeasSetupPlugin.groovy b/src/main/groovy/org/silverpeas/setup/SilverpeasSetupPlugin.groovy index 64db4031..7ce45e0e 100644 --- a/src/main/groovy/org/silverpeas/setup/SilverpeasSetupPlugin.groovy +++ b/src/main/groovy/org/silverpeas/setup/SilverpeasSetupPlugin.groovy @@ -65,9 +65,9 @@ class SilverpeasSetupPlugin implements Plugin { def extension = project.extensions.create(EXTENSION, SilverpeasSetupExtension, project) initSilverpeasSetupExtention(extension) - SilverpeasSetupService setupService = new SilverpeasSetupService(extension.config.settings) + SilverpeasSetupService setupService = new SilverpeasSetupService(extension.settings) ManagedBeanContainer.registry() - .register(new DataSourceProvider(extension.config.settings)) + .register(new DataSourceProvider(extension.settings)) .register(setupService) String.metaClass.asPath = { Paths.get(setupService.expanseVariables(delegate.toString())) } @@ -75,35 +75,33 @@ class SilverpeasSetupPlugin implements Plugin { project.afterEvaluate { Project currentProject, ProjectState state -> SilverpeasSetupExtension silverSetup = (SilverpeasSetupExtension) currentProject.extensions.getByName(EXTENSION) - silverSetup.config.settings.DEV_MODE = silverSetup.developmentMode.get() as String + silverSetup.settings.DEV_MODE = silverSetup.installation.developmentMode.get() as String if (silverSetup.logging.useLogger) { initLogging(currentProject, silverSetup.logging) } - silverSetup.config.settings.SILVERPEAS_VERSION = currentProject.version as String + silverSetup.settings.SILVERPEAS_VERSION = currentProject.version as String jBossServer.set(new JBossServer(extension.jbossHome.path) + .withStartingTimeout(extension.timeout.get()) .redirectOutputTo(new File(extension.logging.logDir, JBOSS_OUTPUT_LOG))) } - File driversDir = new File(project.buildDir, 'drivers') Task construction = project.tasks.create(CONSTRUCT.name, SilverpeasConstructionTask) { it.silverpeasHome = extension.silverpeasHome - it.driversDir = driversDir - it.settings = extension.config.settings - it.developmentMode = extension.developmentMode - it.silverpeasBundles = extension.silverpeasBundles - it.tiersBundles = extension.tiersBundles - it.destinationDir = extension.distDir + it.installation = extension.installation + it.settings = extension.settings } Task jbossConf = project.tasks.create(CONFIGURE_JBOSS.name, JBossConfigurationTask) { - it.driversDir = driversDir + it.driversDir = extension.installation.dsDriversDir.get() it.config = extension.config it.jboss = jBossServer + it.settings = extension.settings } Task silverpeasConf = project.tasks.create(CONFIGURE_SILVERPEAS.name, SilverpeasConfigurationTask) { it.silverpeasHome = extension.silverpeasHome it.config = extension.config + it.settings = extension.settings }.dependsOn(construction) Task configuration = project.tasks.create(CONFIGURE.name) { @@ -116,41 +114,40 @@ class SilverpeasSetupPlugin implements Plugin { }.dependsOn(construction) Task migration = project.tasks.create(MIGRATE.name, SilverpeasMigrationTask) { - it.migrationHome = extension.migrationHome - it.config = extension.config + it.migration = extension.migration + it.settings = extension.settings }.dependsOn(configuration) project.tasks.create(INSTALL.name, SilverpeasInstallationTask) { - it.deploymentDir = extension.deploymentDir - it.settings = extension.config.settings - it.distDir = extension.distDir - it.developmentMode = extension.developmentMode + it.installation = extension.installation + it.settings = extension.settings it.jboss = jBossServer }.dependsOn(construction, configuration, migration) - setUpGradleAssemblingTaskForThisPlugin(project, extension, driversDir) + setUpGradleAssemblingTaskForThisPlugin(project, extension) setUpGradleBuildTaskForThisPlugin(project, extension) } private void setUpGradleAssemblingTaskForThisPlugin(Project project, - SilverpeasSetupExtension extension, - File driversDir) { + SilverpeasSetupExtension extension) { try { Task assemble = project.tasks.getByName(ASSEMBLE.name).doLast { - if (!extension.distDir.get().exists()) { - extension.distDir.get().mkdirs() + if (!extension.installation.distDir.get().exists()) { + extension.installation.distDir.get().mkdirs() } SilverpeasBuilder builder = new SilverpeasBuilder(project, FileLogger.getLogger(delegate.name)) - builder.driversDir = driversDir + builder.driversDir = extension.installation.dsDriversDir.get() builder.silverpeasHome = extension.silverpeasHome - builder.settings = extension.config.settings - builder.extractSoftwareBundles(extension.silverpeasBundles.files, - extension.tiersBundles.files, extension.distDir.get()) + builder.settings = extension.settings + builder.extractSoftwareBundles(extension.installation.bundles, + extension.installation.distDir.get()) } assemble.description = 'Assemble all the software bundles that made Silverpeas' - assemble.onlyIf { !extension.distDir.get().exists() && !driversDir.exists()} + assemble.onlyIf { !extension.installation.distDir.get().exists() && + !extension.installation.dsDriversDir.get().exists()} assemble.outputs.upToDateWhen { - extension.distDir.get().exists() && driversDir.exists() + extension.installation.distDir.get().exists() && + extension.installation.dsDriversDir.get().exists() } } catch (UnknownTaskException e) { // nothing to do @@ -163,18 +160,18 @@ class SilverpeasSetupPlugin implements Plugin { Task build = project.tasks.getByName(BUILD.name).doLast { SilverpeasBuilder builder = new SilverpeasBuilder(project, FileLogger.getLogger(delegate.name)) builder.silverpeasHome = extension.silverpeasHome - builder.settings = extension.config.settings - builder.developmentMode = extension.developmentMode.get() - builder.generateSilverpeasApplication(extension.distDir.get()) + builder.settings = extension.settings + builder.developmentMode = extension.installation.developmentMode.get() + builder.generateSilverpeasApplication(extension.installation.distDir.get()) } build.description = 'Build the Silverpeas Collaborative Web Application' build.onlyIf { - extension.distDir.get().exists() + extension.installation.distDir.get().exists() } build.outputs.upToDateWhen { - boolean ok = extension.distDir.get().exists() && - Files.exists(Paths.get(extension.distDir.get().path, 'WEB-INF', 'web.xml')) - if (!extension.developmentMode) { + boolean ok = extension.installation.distDir.get().exists() && + Files.exists(Paths.get(extension.installation.distDir.get().path, 'WEB-INF', 'web.xml')) + if (!extension.installation.developmentMode) { ok = ok && Files.exists( Paths.get(project.buildDir.path, SilverpeasConstructionTask.SILVERPEAS_WAR)) } @@ -186,9 +183,9 @@ class SilverpeasSetupPlugin implements Plugin { } private void initSilverpeasSetupExtention(SilverpeasSetupExtension silverSetup) { - silverSetup.config.settings = loadConfigurationProperties(silverSetup.config.configurationHome) - completeSettings(silverSetup.config.settings, silverSetup) - encryptAdminPassword(silverSetup.config.settings) + silverSetup.settings = loadConfigurationProperties(silverSetup.config.configurationHome) + completeSettings(silverSetup.settings, silverSetup) + encryptAdminPassword(silverSetup.settings) } private Map loadConfigurationProperties(File configurationHome) { @@ -209,7 +206,7 @@ class SilverpeasSetupPlugin implements Plugin { private void completeSettings(Map settings, SilverpeasSetupExtension silverSetup) { settings.SILVERPEAS_HOME = normalizePath(silverSetup.silverpeasHome.path) - settings.MIGRATION_HOME = normalizePath(silverSetup.migrationHome.path) + settings.MIGRATION_HOME = normalizePath(silverSetup.migration.homeDir.get().path) settings.CONFIGURATION_HOME = normalizePath(silverSetup.config.configurationHome.path) settings.SILVERPEAS_DATA_HOME = normalizePath(settings.SILVERPEAS_DATA_HOME) settings.SILVERPEAS_DATA_WEB = normalizePath(settings.SILVERPEAS_DATA_WEB) diff --git a/src/main/groovy/org/silverpeas/setup/SoftwareBundles.groovy b/src/main/groovy/org/silverpeas/setup/SoftwareBundles.groovy new file mode 100644 index 00000000..569a8e9d --- /dev/null +++ b/src/main/groovy/org/silverpeas/setup/SoftwareBundles.groovy @@ -0,0 +1,44 @@ +package org.silverpeas.setup + +import org.gradle.api.Project +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.FileCollection + +import javax.inject.Inject + +/** + * Collections of software bundles required to construct the Silverpeas application.These bundles + * will be downloaded from our software repository server (provided by our Nexus service) and then + * unpacked to a given directory in order to generate the final application. + * @author mmoquillon + */ +class SoftwareBundles { + + /** + * All the software bundles that made Silverpeas. Those bundles are usually downloaded from our + * own Software Repository by the Silverpeas installer. They are required to assemble and build + * the final Silverpeas Web Application. The Jar libraries other than the supported JDBC drivers + * aren't taken in charge. + */ + final ConfigurableFileCollection silverpeas + + /** + * Any tiers bundles to add into the Silverpeas Application being built. The tiers bundles are + * processed differently by the plugin: only the JAR libraries are taken in charge. + */ + final ConfigurableFileCollection tiers + + @Inject + SoftwareBundles(Project project) { + silverpeas = project.files() + tiers = project.files() + } + + void setSilverpeas(FileCollection bundles) { + this.silverpeas.setFrom(bundles) + } + + void setTiers(FileCollection bundles) { + this.tiers.setFrom(bundles) + } +} diff --git a/src/main/groovy/org/silverpeas/setup/TaskEventLogging.groovy b/src/main/groovy/org/silverpeas/setup/TaskEventLogging.groovy index d44ac696..4bfd71e5 100644 --- a/src/main/groovy/org/silverpeas/setup/TaskEventLogging.groovy +++ b/src/main/groovy/org/silverpeas/setup/TaskEventLogging.groovy @@ -72,11 +72,11 @@ class TaskEventLogging extends BuildAdapter implements TaskExecutionListener { "SILVERPEAS SETUP: ${task.project.version}", "SILVERPEAS HOME: ${silverSetup.silverpeasHome.path}", "JBOSS HOME: ${silverSetup.jbossHome.path}", - "JCR HOME: ${silverSetup.config.settings.JCR_HOME.asPath().toString()}", + "JCR HOME: ${silverSetup.settings.JCR_HOME.asPath().toString()}", "JAVA HOME: ${System.getenv('JAVA_HOME')}", - "DATABASE: ${silverSetup.config.settings.DB_SERVERTYPE.toLowerCase()}", + "DATABASE: ${silverSetup.settings.DB_SERVERTYPE.toLowerCase()}", "OPERATING SYSTEM: ${System.getProperty('os.name')}", - "PRODUCTION MODE: ${!silverSetup.developmentMode}") + "PRODUCTION MODE: ${!silverSetup.installation.developmentMode}") } FileLogger log = FileLogger.getLogger(task.name) String taskTitle = unformat(task.name) diff --git a/src/main/groovy/org/silverpeas/setup/api/JBossServer.groovy b/src/main/groovy/org/silverpeas/setup/api/JBossServer.groovy index d95abcae..62d44427 100644 --- a/src/main/groovy/org/silverpeas/setup/api/JBossServer.groovy +++ b/src/main/groovy/org/silverpeas/setup/api/JBossServer.groovy @@ -43,6 +43,8 @@ import java.util.regex.Matcher */ class JBossServer { + static long DEFAULT_TIMEOUT = 120000 + private String cli private String starter @@ -51,7 +53,7 @@ class JBossServer { private File redirection = null - private long timeout = 120000 + private long timeout = DEFAULT_TIMEOUT private FileLogger logger = FileLogger.getLogger(getClass().getSimpleName(), System.out) @@ -165,7 +167,7 @@ class JBossServer { * @return itself. */ JBossServer withStartingTimeout(long timeout) { - if (this.timeout!= null && this.timeout > 0) { + if (this.timeout != null && this.timeout > 0) { this.timeout = timeout } return this diff --git a/src/main/groovy/org/silverpeas/setup/api/SilverpeasSetupTask.groovy b/src/main/groovy/org/silverpeas/setup/api/SilverpeasSetupTask.groovy new file mode 100644 index 00000000..6de8374a --- /dev/null +++ b/src/main/groovy/org/silverpeas/setup/api/SilverpeasSetupTask.groovy @@ -0,0 +1,18 @@ +package org.silverpeas.setup.api + +import org.gradle.api.DefaultTask + +/** + * Common definition of a task in the Silverpeas Setup plugin. + * @author mmoquillon + */ +abstract class SilverpeasSetupTask extends DefaultTask { + + /** + * The settings is a dictionary of all configuration properties initially loaded from the + * config.properties file and computed by the plugin. Any task can also set + * additional properties in order to share information with other tasks. Usually, the settings + * should be injected in the scripts that are executed by a task. + */ + Map settings +} diff --git a/src/main/groovy/org/silverpeas/setup/configuration/JBossConfigurationTask.groovy b/src/main/groovy/org/silverpeas/setup/configuration/JBossConfigurationTask.groovy index 63475141..52f125c7 100644 --- a/src/main/groovy/org/silverpeas/setup/configuration/JBossConfigurationTask.groovy +++ b/src/main/groovy/org/silverpeas/setup/configuration/JBossConfigurationTask.groovy @@ -23,7 +23,7 @@ */ package org.silverpeas.setup.configuration -import org.gradle.api.DefaultTask + import org.gradle.api.Project import org.gradle.api.ProjectState import org.gradle.api.provider.Property @@ -33,17 +33,17 @@ import org.silverpeas.setup.SilverpeasConfigurationProperties import org.silverpeas.setup.api.FileLogger import org.silverpeas.setup.api.JBossServer import org.silverpeas.setup.api.Script +import org.silverpeas.setup.api.SilverpeasSetupTask import java.nio.file.Files import java.nio.file.Paths import java.util.regex.Matcher - /** * A Gradle task to configure a JBoss/Wildfly instance from some CLI scripts to be ready to run * Silverpeas. * @author mmoquillon */ -class JBossConfigurationTask extends DefaultTask { +class JBossConfigurationTask extends SilverpeasSetupTask { File driversDir SilverpeasConfigurationProperties config @@ -98,11 +98,11 @@ class JBossConfigurationTask extends DefaultTask { }).each { conf -> String jvmOpts; def regexp if (conf.name.endsWith('.bat')) { - jvmOpts = "set \"JAVA_OPTS=-Xmx${config.settings.JVM_RAM_MAX} ${config.settings.JVM_OPTS}" + jvmOpts = "set \"JAVA_OPTS=-Xmx${settings.JVM_RAM_MAX} ${settings.JVM_OPTS}" regexp = /\s*set\s+"JAVA_OPTS=-Xm.+/ } else { jvmOpts = - "JAVA_OPTS=\"-Xmx${config.settings.JVM_RAM_MAX} -Djava.net.preferIPv4Stack=true ${config.settings.JVM_OPTS}" + "JAVA_OPTS=\"-Xmx${settings.JVM_RAM_MAX} -Djava.net.preferIPv4Stack=true ${settings.JVM_OPTS}" regexp = /\s*JAVA_OPTS="-Xm.+/ } jvmOpts += '"' @@ -133,23 +133,23 @@ class JBossConfigurationTask extends DefaultTask { } private void setUpJDBCDriver() throws Exception { - log.info "Install database driver for ${config.settings.DB_SERVERTYPE}" + log.info "Install database driver for ${settings.DB_SERVERTYPE}" JBossServer server = jboss.get() - if (config.settings.DB_SERVERTYPE == 'H2') { + if (settings.DB_SERVERTYPE == 'H2') { // H2 is already available by default in JBoss/Wildfly - config.settings.DB_DRIVER_NAME = 'h2' + settings.DB_DRIVER_NAME = 'h2' } else { // install the required driver other than H2 driversDir.listFiles().each { driver -> - if ((driver.name.startsWith('postgresql') && config.settings.DB_SERVERTYPE == 'POSTGRESQL') || - (driver.name.startsWith('jtds') && config.settings.DB_SERVERTYPE == 'MSSQL') || - (driver.name.startsWith('ojdbc') && config.settings.DB_SERVERTYPE == 'ORACLE')) { - config.settings.DB_DRIVER_NAME = driver.name + if ((driver.name.startsWith('postgresql') && settings.DB_SERVERTYPE == 'POSTGRESQL') || + (driver.name.startsWith('jtds') && settings.DB_SERVERTYPE == 'MSSQL') || + (driver.name.startsWith('ojdbc') && settings.DB_SERVERTYPE == 'ORACLE')) { + settings.DB_DRIVER_NAME = driver.name try { - server.add(Paths.get(driversDir.path, config.settings.DB_DRIVER_NAME).toString()) - server.deploy(config.settings.DB_DRIVER_NAME) + server.add(Paths.get(driversDir.path, settings.DB_DRIVER_NAME).toString()) + server.deploy(settings.DB_DRIVER_NAME) } catch (Exception ex) { - log.error("Error: cannot deploy ${config.settings.DB_DRIVER_NAME}", ex) + log.error("Error: cannot deploy ${settings.DB_DRIVER_NAME}", ex) throw ex } } @@ -177,7 +177,7 @@ class JBossConfigurationTask extends DefaultTask { scripts.each { aScript -> aScript .useLogger(log) - .useSettings(config.settings) + .useSettings(settings) .run(jboss: jboss.get()) } } catch(Exception ex) { diff --git a/src/main/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTask.groovy b/src/main/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTask.groovy index 936cc766..e5fbbd2e 100644 --- a/src/main/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTask.groovy +++ b/src/main/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTask.groovy @@ -23,21 +23,23 @@ */ package org.silverpeas.setup.configuration -import org.gradle.api.DefaultTask + import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskExecutionException import org.silverpeas.setup.SilverpeasConfigurationProperties import org.silverpeas.setup.api.FileLogger import org.silverpeas.setup.api.Script +import org.silverpeas.setup.api.SilverpeasSetupTask import java.nio.file.Files import java.nio.file.Paths + /** * This task aims to configure Silverpeas from the Silverpeas configuration file, from some XML * configuration rules and from Groovy scripts. * @author mmoquillon */ -class SilverpeasConfigurationTask extends DefaultTask { +class SilverpeasConfigurationTask extends SilverpeasSetupTask { File silverpeasHome SilverpeasConfigurationProperties config @@ -70,7 +72,7 @@ class SilverpeasConfigurationTask extends DefaultTask { Script script = ConfigurationScriptBuilder.fromScript(configurationFile.path).build() script .useLogger(log) - .useSettings(config.settings) + .useSettings(settings) .run() } catch (Exception ex) { log.error("Error while processing the configuration file ${configurationFile.path}", ex) diff --git a/src/main/groovy/org/silverpeas/setup/construction/SilverpeasBuilder.groovy b/src/main/groovy/org/silverpeas/setup/construction/SilverpeasBuilder.groovy index 12e0c1dd..1ceb0719 100644 --- a/src/main/groovy/org/silverpeas/setup/construction/SilverpeasBuilder.groovy +++ b/src/main/groovy/org/silverpeas/setup/construction/SilverpeasBuilder.groovy @@ -27,6 +27,7 @@ import groovy.util.slurpersupport.GPathResult import groovy.xml.XmlUtil import org.gradle.api.Project import org.gradle.util.GFileUtils +import org.silverpeas.setup.SoftwareBundles import org.silverpeas.setup.api.FileLogger import org.silverpeas.setup.api.ManagedBeanContainer import org.silverpeas.setup.api.SilverpeasSetupService @@ -66,16 +67,16 @@ class SilverpeasBuilder { * Extracts all the specified software bundles into the specified destination directory. The * way the bundles are extracted follows the guide rules of the Silverpeas Portal Application * construction. - * @param silverpeasBundles a collection of the software bundles that makes Silverpeas. - * @param tiersBundles a collection of tiers bundles to add to Silverpeas. This bundles are - * processed differently than the Silverpeas ones. + * @param bundles collections of software bundles that makes Silverpeas. * @param destinationDir the destination directory into which the bundles will be extracted */ void extractSoftwareBundles( - final Collection silverpeasBundles, - final Collection tiersBundles, final File destinationDir) { + final SoftwareBundles bundles, + final File destinationDir) { Objects.requireNonNull(silverpeasHome) Objects.requireNonNull(driversDir) + final Collection silverpeasBundles = bundles.silverpeas.files + final Collection tiersBundles = bundles.tiers.files def isAWar = { File f -> f.name.endsWith('.war') && !f.name.startsWith(CORE_WAR_BUNDLE_ID) } diff --git a/src/main/groovy/org/silverpeas/setup/construction/SilverpeasConstructionTask.groovy b/src/main/groovy/org/silverpeas/setup/construction/SilverpeasConstructionTask.groovy index fa91cc56..58858c7d 100644 --- a/src/main/groovy/org/silverpeas/setup/construction/SilverpeasConstructionTask.groovy +++ b/src/main/groovy/org/silverpeas/setup/construction/SilverpeasConstructionTask.groovy @@ -23,12 +23,11 @@ */ package org.silverpeas.setup.construction -import org.gradle.api.DefaultTask -import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.file.FileCollection -import org.gradle.api.provider.Property + import org.gradle.api.tasks.TaskAction +import org.silverpeas.setup.SilverpeasInstallationProperties import org.silverpeas.setup.api.FileLogger +import org.silverpeas.setup.api.SilverpeasSetupTask import java.nio.file.Files import java.nio.file.Paths @@ -38,17 +37,12 @@ import java.nio.file.Paths * Silverpeas. It gathers both the assembling and the build tasks. * @author mmoquillon */ -class SilverpeasConstructionTask extends DefaultTask { +class SilverpeasConstructionTask extends SilverpeasSetupTask { public static final String SILVERPEAS_WAR = 'silverpeas.war' File silverpeasHome - File driversDir - Map settings - final Property destinationDir = project.objects.property(File) - final ConfigurableFileCollection silverpeasBundles = project.files() - final ConfigurableFileCollection tiersBundles = project.files() - final Property developmentMode = project.objects.property(Boolean) + SilverpeasInstallationProperties installation final FileLogger log = FileLogger.getLogger(this.name) SilverpeasConstructionTask() { @@ -63,40 +57,32 @@ class SilverpeasConstructionTask extends DefaultTask { } boolean precondition() { - !destinationDir.get().exists() && !driversDir.exists() + !installation.distDir.get().exists() && !installation.dsDriversDir.get().exists() } boolean isUpToDate() { - boolean ok = destinationDir.get().exists() && driversDir.exists() - if (!developmentMode.get()) { + boolean ok = installation.distDir.get().exists() && installation.dsDriversDir.get().exists() + if (!installation.developmentMode.get()) { ok = ok && Files.exists(Paths.get(project.buildDir.path, SILVERPEAS_WAR)) } return ok } - void setSilverpeasBundles(FileCollection bundles) { - this.silverpeasBundles.setFrom(bundles) - } - - void setTiersBundles(FileCollection bundles) { - this.tiersBundles.setFrom(bundles) - } - @TaskAction void construct() { - if (!destinationDir.get().exists()) { - destinationDir.get().mkdirs() + if (!installation.distDir.get().exists()) { + installation.distDir.get().mkdirs() } - if (!driversDir.exists()) { - driversDir.mkdirs() + if (!installation.dsDriversDir.get().exists()) { + installation.dsDriversDir.get().mkdirs() } SilverpeasBuilder builder = new SilverpeasBuilder(project, log) - builder.driversDir = driversDir + builder.driversDir = installation.dsDriversDir.get() builder.silverpeasHome = silverpeasHome - builder.developmentMode = developmentMode.get() + builder.developmentMode = installation.developmentMode.get() builder.settings = settings - builder.extractSoftwareBundles(silverpeasBundles.files, tiersBundles.files, destinationDir.get()) - builder.generateSilverpeasApplication(destinationDir.get()) + builder.extractSoftwareBundles(installation.bundles, installation.distDir.get()) + builder.generateSilverpeasApplication(installation.distDir.get()) } } diff --git a/src/main/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTask.groovy b/src/main/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTask.groovy index 8e326f0a..30e7e540 100644 --- a/src/main/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTask.groovy +++ b/src/main/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTask.groovy @@ -28,10 +28,12 @@ import org.gradle.api.Project import org.gradle.api.ProjectState import org.gradle.api.provider.Property import org.gradle.api.tasks.TaskAction +import org.silverpeas.setup.SilverpeasInstallationProperties import org.silverpeas.setup.api.FileLogger import org.silverpeas.setup.api.JBossServer import static org.silverpeas.setup.construction.SilverpeasConstructionTask.SILVERPEAS_WAR + /** * A Gradle task to install the Web archive of the Silverpeas application into the JEE application * server. @@ -40,9 +42,7 @@ import static org.silverpeas.setup.construction.SilverpeasConstructionTask.SILVE class SilverpeasInstallationTask extends DefaultTask { Property jboss = project.objects.property(JBossServer) - File deploymentDir - final Property distDir = project.objects.property(File) - final Property developmentMode = project.objects.property(Boolean) + SilverpeasInstallationProperties installation Map settings final FileLogger log = FileLogger.getLogger(this.name) @@ -59,7 +59,8 @@ class SilverpeasInstallationTask extends DefaultTask { @TaskAction void install() { - JBossServer server = jboss.get() + final JBossServer server = jboss.get() + final File deploymentDir = installation.deploymentDir.get() if (server.isStartingOrRunning()) { server.stop() } @@ -76,14 +77,14 @@ class SilverpeasInstallationTask extends DefaultTask { it.into deploymentDir } try { - installAdditionalArtifacts(server) - installSilverpeas(server) + installAdditionalArtifacts(server, deploymentDir) + installSilverpeas(server, deploymentDir) } finally { server.stop() } } - private void installAdditionalArtifacts(final JBossServer server) { + private void installAdditionalArtifacts(final JBossServer server, final File deploymentDir) { deploymentDir.listFiles().sort().findAll { artifact -> artifact.name != SILVERPEAS_WAR }.each { artifact -> @@ -95,13 +96,13 @@ class SilverpeasInstallationTask extends DefaultTask { } } - private void installSilverpeas(final JBossServer server) { + private void installSilverpeas(final JBossServer server, final File deploymentDir) { String name = 'silverpeas.war' String context = settings.SILVERPEAS_CONTEXT + '.war' File silverpeas = new File(deploymentDir.path, SILVERPEAS_WAR) - if (developmentMode.get()) { + if (installation.developmentMode.get()) { name += ' as exploded (dev mode)' - silverpeas = distDir.get() + silverpeas = installation.distDir.get() } log.info "(Re)Installation of ${name}" server.remove(SILVERPEAS_WAR) diff --git a/src/main/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTask.groovy b/src/main/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTask.groovy index b9443592..f14c185e 100644 --- a/src/main/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTask.groovy +++ b/src/main/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTask.groovy @@ -29,9 +29,11 @@ import org.gradle.api.logging.LogLevel import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskExecutionException import org.silverpeas.setup.SilverpeasConfigurationProperties +import org.silverpeas.setup.SilverpeasMigrationProperties import org.silverpeas.setup.api.DataSourceProvider import org.silverpeas.setup.api.FileLogger import org.silverpeas.setup.api.ManagedBeanContainer +import org.silverpeas.setup.api.SilverpeasSetupTask import java.nio.file.Path import java.nio.file.Paths @@ -55,12 +57,11 @@ import java.sql.SQLException * MS-SQL, and Oracle). * @author mmoquillon */ -class SilverpeasMigrationTask extends DefaultTask { +class SilverpeasMigrationTask extends SilverpeasSetupTask { static final String MIGRATION_SETTING_MODULE = 'dbbuilder-migration.xml' - File migrationHome - SilverpeasConfigurationProperties config + SilverpeasMigrationProperties migration final FileLogger log = FileLogger.getLogger(this.name) SilverpeasMigrationTask() { @@ -91,10 +92,10 @@ class SilverpeasMigrationTask extends DefaultTask { private void initMigrationTask() { log.info 'Migration initialization...' def status = loadInstalledModuleStatus() - Path descriptor = Paths.get(migrationHome.path, 'modules', MIGRATION_SETTING_MODULE) + Path descriptor = Paths.get(migration.homeDir.get().path, 'modules', MIGRATION_SETTING_MODULE) MigrationModule module = new MigrationModule() .withStatus(status) - .withSettings(config.settings) + .withSettings(settings) .withLogger(log) .loadMigrationsFrom(descriptor.toFile()) module.migrate() @@ -108,11 +109,11 @@ class SilverpeasMigrationTask extends DefaultTask { private List loadMigrationModules() { def status = loadInstalledModuleStatus() List modules = [] - new File(migrationHome, 'modules').listFiles().each { descriptor -> + new File(migration.homeDir.get(), 'modules').listFiles().each { descriptor -> if (descriptor.name != MIGRATION_SETTING_MODULE) { MigrationModule module = new MigrationModule() .withStatus(status) - .withSettings(config.settings) + .withSettings(settings) .withLogger(log) .loadMigrationsFrom(descriptor) modules << module diff --git a/src/test/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTaskTest.groovy b/src/test/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTaskTest.groovy index 620e38ed..9739ee2f 100644 --- a/src/test/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTaskTest.groovy +++ b/src/test/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTaskTest.groovy @@ -55,7 +55,7 @@ class SilverpeasInstallationTaskTest extends GroovyTestCase { void testInstall() { SilverpeasInstallationTask task = project.tasks.findByPath(INSTALL.name) - File jackrabbit = new File(task.deploymentDir, 'jackrabbit-jca.rar') + File jackrabbit = new File(task.installation.deploymentDir.get(), 'jackrabbit-jca.rar') jackrabbit.createNewFile() def mock = new MockFor(JBossServer)