diff --git a/Jenkinsfile b/Jenkinsfile index 4da7d831..c1424548 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -6,7 +6,7 @@ node { checkout scm } stage('Build and deployment') { - sh "./gradlew clean test install publish -Djava.awt.headless=true" + sh "./gradlew clean build publish -Djava.awt.headless=true" } } } diff --git a/build.gradle b/build.gradle index a32cd25b..2b4a93dd 100644 --- a/build.gradle +++ b/build.gradle @@ -24,9 +24,6 @@ import org.apache.tools.ant.filters.ReplaceTokens buildscript { - dependencies { - classpath 'org.hibernate.build.gradle:gradle-maven-publish-auth:2.0.1' - } repositories { maven { url 'https://www.silverpeas.org/nexus/content/groups/silverpeas' @@ -38,15 +35,13 @@ buildscript { plugins { id 'java-gradle-plugin' - id 'org.ajoberstar.grgit' version '3.0.0' apply true + id 'org.ajoberstar.grgit' version '4.0.2' apply true id 'idea' - id 'maven' id 'maven-publish' id 'groovy' + id "net.linguica.maven-settings" version "0.5" } -apply plugin: 'maven-publish-auth' - description = 'The Gradle plugin to set up Silverpeas. It is used both to install or to upgrade Silverpeas.' group = 'org.silverpeas' version = '6.1-SNAPSHOT' @@ -73,7 +68,7 @@ project.configure(project) { repositories { maven { name 'silverpeas' - url 'http://www.silverpeas.org/nexus/content/groups/silverpeas' + url 'https://www.silverpeas.org/nexus/content/groups/silverpeas' } maven { name 'gradle-plugins' @@ -82,24 +77,27 @@ repositories { mavenLocal() } +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + withSourcesJar() +} + publishing { publications { - mavenJava(MavenPublication) { + maven(MavenPublication) { from components.java - - artifact sourceJar { - classifier 'sources' - } } } + repositories { maven { if (project.snapshot) { name 'silverpeas-snapshots' - url 'http://www.silverpeas.org/nexus/content/repositories/snapshots/' + url 'https://www.silverpeas.org/nexus/content/repositories/snapshots/' } else { name 'silverpeas' - url 'http://www.silverpeas.org/nexus/content/repositories/releases/' + url 'https://www.silverpeas.org/nexus/content/repositories/releases/' } } } @@ -107,21 +105,21 @@ publishing { dependencies { - compile gradleApi() - compile 'org.apache.commons:commons-lang3:3.6' - compile 'commons-io:commons-io:2.4' - compile 'org.apache.commons:commons-dbcp2:2.2.0' - compile 'commons-codec:commons-codec:1.10' - compile 'javax.jcr:jcr:2.0' - compile 'org.apache.jackrabbit:jackrabbit-core:2.18.2' - runtime 'org.eclipse.jetty:jetty-jndi:9.4.8.v20171121' - runtime 'org.eclipse.jetty:jetty-util:9.4.8.v20171121' - runtime 'com.h2database:h2:1.4.196' - runtime 'org.postgresql:postgresql:42.1.4' - runtime 'net.sourceforge.jtds:jtds:1.3.1' - testCompile gradleTestKit() - testCompile 'junit:junit:4.12' - testImplementation('org.spockframework:spock-core:1.1-groovy-2.4') { + api gradleApi() + api 'org.apache.commons:commons-lang3:3.10' + api 'commons-io:commons-io:2.7' + api 'org.apache.commons:commons-dbcp2:2.7.0' + api 'commons-codec:commons-codec:1.14' + api 'javax.jcr:jcr:2.0' + api 'org.apache.jackrabbit:jackrabbit-core:2.18.4' + runtimeOnly 'org.eclipse.jetty:jetty-jndi:9.4.29.v20200521' + runtimeOnly 'org.eclipse.jetty:jetty-util:9.4.29.v20200521' + runtimeOnly 'com.h2database:h2:1.4.200' + runtimeOnly 'org.postgresql:postgresql:42.2.12' + runtimeOnly 'net.sourceforge.jtds:jtds:1.3.1' + testImplementation gradleTestKit() + testImplementation 'junit:junit:4.13' + testImplementation('org.spockframework:spock-core:1.3-groovy-2.4') { exclude module: 'groovy-all' } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f39d71a7..62d4c053 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1dac09ad..622ab64a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Tue Jan 23 14:16:56 CET 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-all.zip diff --git a/gradlew b/gradlew index 4453ccea..fbd7c515 100755 --- a/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,16 +44,16 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -66,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -109,10 +126,11 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -138,35 +156,30 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi # Escape application args -save ( ) { +save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index e95643d6..b33f4487 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,8 +29,11 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -65,7 +84,9 @@ set CMD_LINE_ARGS=%* set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle +set JAVA_OPTS="%JAVA_OPTS% -Dillegal-access=permit" "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% :end diff --git a/src/main/groovy/org/silverpeas/setup/SilverpeasConfigurationProperties.groovy b/src/main/groovy/org/silverpeas/setup/SilverpeasConfigurationProperties.groovy index 96dbd974..c18fddff 100644 --- a/src/main/groovy/org/silverpeas/setup/SilverpeasConfigurationProperties.groovy +++ b/src/main/groovy/org/silverpeas/setup/SilverpeasConfigurationProperties.groovy @@ -25,6 +25,8 @@ package org.silverpeas.setup import org.gradle.api.Project import org.gradle.api.provider.Property +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.Internal import javax.inject.Inject import java.nio.file.Files @@ -42,24 +44,28 @@ class SilverpeasConfigurationProperties { * configuration properties, the Silverpeas and the JBoss configuration directory. By default * SILVERPEAS_HOME/configuration. */ + @InputDirectory final Property configurationHome /** * The directory that contains all the configuration scripts to configure JBoss/Wildfly for * Silverpeas. By default SILVERPEAS_HOME/configuration/jboss. */ + @InputDirectory final Property jbossConfigurationDir /** * The directory that contains all the configuration scripts to configure specifically the * Silverpeas web portal and components. By default SILVERPEAS_HOME/configuration/silverpeas. */ + @InputDirectory final Property silverpeasConfigurationDir /** * The directory that contains the additional JBoss/Wildfly modules to install in JBoss/Wildfy * for Silverpeas. By default SILVERPEAS_HOME/configuration/jboss/modules. */ + @InputDirectory final Property jbossModulesDir /** @@ -68,6 +74,7 @@ class SilverpeasConfigurationProperties { * that it can be retrieved in the next configuration process by the different steps so that they * can adapt their behaviour according to the properties they have set. */ + @Internal final Context context @Inject diff --git a/src/main/groovy/org/silverpeas/setup/SilverpeasInstallationProperties.groovy b/src/main/groovy/org/silverpeas/setup/SilverpeasInstallationProperties.groovy index 4d41c454..e4d0d6bc 100644 --- a/src/main/groovy/org/silverpeas/setup/SilverpeasInstallationProperties.groovy +++ b/src/main/groovy/org/silverpeas/setup/SilverpeasInstallationProperties.groovy @@ -3,6 +3,9 @@ package org.silverpeas.setup import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Nested +import org.gradle.api.tasks.OutputDirectory import javax.inject.Inject /** @@ -18,18 +21,21 @@ class SilverpeasInstallationProperties { * directory is deployed as such in the JBoss/Wildfly application server. * environment variable. */ + @OutputDirectory 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. */ + @OutputDirectory 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. */ + @OutputDirectory final Property dsDriversDir /** @@ -37,6 +43,7 @@ class SilverpeasInstallationProperties { * dev mode in the application server.) This is a property and hence can be set by the user input * from the build script. */ + @Input final Property developmentMode /** @@ -44,6 +51,7 @@ class SilverpeasInstallationProperties { * 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. */ + @Nested final SoftwareBundles bundles @Inject diff --git a/src/main/groovy/org/silverpeas/setup/SilverpeasMigrationProperties.groovy b/src/main/groovy/org/silverpeas/setup/SilverpeasMigrationProperties.groovy index 58111874..52e87937 100644 --- a/src/main/groovy/org/silverpeas/setup/SilverpeasMigrationProperties.groovy +++ b/src/main/groovy/org/silverpeas/setup/SilverpeasMigrationProperties.groovy @@ -2,6 +2,7 @@ package org.silverpeas.setup import org.gradle.api.Project import org.gradle.api.provider.Property +import org.gradle.api.tasks.InputDirectory import javax.inject.Inject @@ -29,6 +30,7 @@ class SilverpeasMigrationProperties { * * */ + @InputDirectory final Property homeDir @Inject diff --git a/src/main/groovy/org/silverpeas/setup/SilverpeasSetupPlugin.groovy b/src/main/groovy/org/silverpeas/setup/SilverpeasSetupPlugin.groovy index e01a0f77..1ffab8ee 100644 --- a/src/main/groovy/org/silverpeas/setup/SilverpeasSetupPlugin.groovy +++ b/src/main/groovy/org/silverpeas/setup/SilverpeasSetupPlugin.groovy @@ -23,8 +23,8 @@ */ package org.silverpeas.setup + import org.gradle.api.* -import org.gradle.api.provider.Property import org.silverpeas.setup.api.* import org.silverpeas.setup.configuration.JBossConfigurationTask import org.silverpeas.setup.configuration.SilverpeasConfigurationTask @@ -62,42 +62,25 @@ class SilverpeasSetupPlugin implements Plugin { @Override void apply(Project project) { - def extension = project.extensions.create(EXTENSION, SilverpeasSetupExtension, project) - initSilverpeasSetupExtention(extension) + SilverpeasSetupExtension extension = createSilverpeasSetupExtention(project) + // once the whole asked Silverpeas setup's tasks are done, the configuration context is saved project.gradle.buildFinished { extension.config.context.save() } - SilverpeasSetupService setupService = new SilverpeasSetupService(extension.settings) - ManagedBeanContainer.registry() - .register(new DataSourceProvider(extension.settings)) - .register(setupService) - String.metaClass.asPath = { Paths.get(setupService.expanseVariables(delegate.toString())) } - - Property jBossServer = project.objects.property(JBossServer) - project.afterEvaluate { Project currentProject, ProjectState state -> - SilverpeasSetupExtension silverSetup = - (SilverpeasSetupExtension) currentProject.extensions.getByName(EXTENSION) - silverSetup.settings.DEV_MODE = silverSetup.installation.developmentMode.get() as String - if (silverSetup.logging.useLogger) { - initLogging(currentProject, silverSetup.logging) - } - 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))) - } + JBossServer jBossServer = new JBossServer(extension.jbossHome.path) + initializePluginParameters(project, jBossServer) Task construction = project.tasks.create(CONSTRUCT.name, SilverpeasConstructionTask) { - it.silverpeasHome = extension.silverpeasHome - it.installation = extension.installation - it.settings = extension.settings + it.silverpeasHome = extension.silverpeasHome + it.installation = extension.installation + it.settings = extension.settings } Task jbossConf = project.tasks.create(CONFIGURE_JBOSS.name, JBossConfigurationTask) { - it.driversDir = extension.installation.dsDriversDir.get() - it.config = extension.config + it.driversDir = extension.installation.dsDriversDir.get() + it.config = extension.config it.jboss = jBossServer it.settings = extension.settings } @@ -123,15 +106,21 @@ class SilverpeasSetupPlugin implements Plugin { }.dependsOn(configuration) project.tasks.create(INSTALL.name, SilverpeasInstallationTask) { - it.installation = extension.installation - it.settings = extension.settings - it.jboss = jBossServer + it.installation = extension.installation + it.settings = extension.settings + it.jboss = jBossServer }.dependsOn(construction, configuration, migration) setUpGradleAssemblingTaskForThisPlugin(project, extension) setUpGradleBuildTaskForThisPlugin(project, extension) } + /** + * Setup the predefined Assemble Gradle task to the peculiar behaviour of the plugin that is the + * extraction of the content of the software bundles that made up a Silverpeas distribution. + * @param project the Gradle project that uses the plugin + * @param extension the project extension of the plugin + */ private void setUpGradleAssemblingTaskForThisPlugin(Project project, SilverpeasSetupExtension extension) { try { @@ -148,7 +137,8 @@ class SilverpeasSetupPlugin implements Plugin { } assemble.description = 'Assemble all the software bundles that made Silverpeas' assemble.onlyIf { !extension.installation.distDir.get().exists() && - !extension.installation.dsDriversDir.get().exists()} + !extension.installation.dsDriversDir.get().exists() + } assemble.outputs.upToDateWhen { extension.installation.distDir.get().exists() && extension.installation.dsDriversDir.get().exists() @@ -158,6 +148,13 @@ class SilverpeasSetupPlugin implements Plugin { } } + /** + * Setup the predefined Build Gradle task to the peculiar behaviour of the plugin that is to + * generate the Silverpeas Collaborative portal application from the extracted content of the + * software bundles that made up a Silverpeas distribution. + * @param project the Gradle project + * @param extension the project extension of the plugin + */ private void setUpGradleBuildTaskForThisPlugin(Project project, SilverpeasSetupExtension extension) { try { @@ -181,17 +178,72 @@ class SilverpeasSetupPlugin implements Plugin { } return ok } - } catch (UnknownTaskException e) { + } catch (UnknownTaskException e) { // nothing to do } } - private void initSilverpeasSetupExtention(SilverpeasSetupExtension silverSetup) { - silverSetup.settings = loadConfigurationProperties(silverSetup.config.configurationHome.get()) - completeSettings(silverSetup.settings, silverSetup) - encryptAdminPassword(silverSetup.settings) + /** + * Constructs and initializes the project extension through which some plugin parameters are + * communicating between the plugin and the project using it + * @param project the Gradle project that uses the plugin to setup a Silverpeas distribution + * @return the project extension of the plugin + */ + private SilverpeasSetupExtension createSilverpeasSetupExtention(Project project) { + def extension = project.extensions.create(EXTENSION, SilverpeasSetupExtension, project) + extension.settings = loadConfigurationProperties(extension.config.configurationHome.get()) + completeSettings(extension.settings, extension) + encryptAdminPassword(extension.settings) + return extension + } + + /** + * Initializes the parameters required by the plugin once the project using it has been + * completely evaluated by Gradle, meaning that all the exposed input properties of the plugin are + * set. + * @param project the Gradle project using the plugin + * @param jBossServer the JBoss server wrapper to initialize with some of the plugin's input + * properties exposed to the project. + */ + private void initializePluginParameters(Project project, + JBossServer jBossServer) { + project.afterEvaluate { Project currentProject, ProjectState state -> + SilverpeasSetupExtension extension = + (SilverpeasSetupExtension) currentProject.extensions.getByName(EXTENSION) + registerManagedBeansForScripts(extension) + extension.settings.DEV_MODE = extension.installation.developmentMode.get() as String + if (extension.logging.useLogger) { + initLogging(currentProject, extension.logging) + } + extension.settings.SILVERPEAS_VERSION = currentProject.version as String + jBossServer.redirectOutputTo(new File(extension.logging.logDir, JBOSS_OUTPUT_LOG)) + .withStartingTimeout(extension.timeout.get()) + } + } + + /** + * Registers all the beans that are required by the setup scripts defined in the project in order + * to perform their task. A new method is added to the String class: asPath; this method uses one + * of the registered bean to convert the String value to Path by expanding any variables within + * the String value. + * @param extension the project extension of the plugin + */ + private void registerManagedBeansForScripts(SilverpeasSetupExtension extension) { + SilverpeasSetupService setupService = new SilverpeasSetupService(extension.settings) + String.metaClass.asPath = { Paths.get(setupService.expanseVariables(delegate.toString())) } + ManagedBeanContainer.registry() + .register(new DataSourceProvider(extension.settings)) + .register(setupService) } + /** + * Loads all the Silverpeas configuration properties defined in the config.properties file located + * at the specified directory. These configuration properties will be then available to all the + * setup scripts provided by a Silverpeas distribution as well as by the customers. + * @param configurationHome the directory containing the expected Silverpeas configuration + * properties file. + * @return a Map of the Silverpeas configuration properties + */ private Map loadConfigurationProperties(File configurationHome) { Properties properties = new Properties() properties.load(getClass().getResourceAsStream('/default_config.properties')) @@ -208,10 +260,16 @@ class SilverpeasSetupPlugin implements Plugin { return VariableReplacement.parseParameters(properties, properties) } - private void completeSettings(Map settings, SilverpeasSetupExtension silverSetup) { - settings.SILVERPEAS_HOME = normalizePath(silverSetup.silverpeasHome.path) - settings.MIGRATION_HOME = normalizePath(silverSetup.migration.homeDir.get().path) - settings.CONFIGURATION_HOME = normalizePath(silverSetup.config.configurationHome.get().path) + /** + * Completes the specified settings with some of the plugin parameters that have been alimented + * by the project through the plugin's extension object. + * @param settings the settings to complete/ + * @param extension the project extension of the plugin + */ + private void completeSettings(Map settings, SilverpeasSetupExtension extension) { + settings.SILVERPEAS_HOME = normalizePath(extension.silverpeasHome.path) + settings.MIGRATION_HOME = normalizePath(extension.migration.homeDir.get().path) + settings.CONFIGURATION_HOME = normalizePath(extension.config.configurationHome.get().path) settings.SILVERPEAS_DATA_HOME = normalizePath(settings.SILVERPEAS_DATA_HOME) settings.SILVERPEAS_DATA_WEB = normalizePath(settings.SILVERPEAS_DATA_WEB) settings.JCR_HOME = normalizePath(settings.JCR_HOME) @@ -258,11 +316,20 @@ class SilverpeasSetupPlugin implements Plugin { settings.DB_SCHEMA = settings.DB_SERVERTYPE.toLowerCase() } + /** + * Replaces the administrator password set in the specified settings by its encrypted counterpart. + * @param settings the settings with the administrator password. + */ private void encryptAdminPassword(Map settings) { Encryption encryption = EncryptionFactory.instance.createDefaultEncryption() settings.SILVERPEAS_ADMIN_PASSWORD = encryption.encrypt(settings.SILVERPEAS_ADMIN_PASSWORD) } + /** + * Initializes the logging system for the project with the specified logging properties. + * @param project the Gradle project + * @param loggingProperties the logging properties. + */ private void initLogging(Project project, SilverpeasLoggingProperties loggingProperties) { String timestamp = new Date().format('yyyyMMdd_HHmmss') if (!loggingProperties.logDir.exists()) { @@ -276,6 +343,12 @@ class SilverpeasSetupPlugin implements Plugin { .withTasks(loggingProperties.scriptTasks)) } + /** + * Normalizes the specified file path by replacing any MS-Windows-only specific separator + * characters by the universal and standard ones. + * @param path a path to a file (or a directory) + * @return the normalized path + */ private static String normalizePath(String path) { return path.replace('\\', '/') } diff --git a/src/main/groovy/org/silverpeas/setup/SoftwareBundles.groovy b/src/main/groovy/org/silverpeas/setup/SoftwareBundles.groovy index 569a8e9d..f37c5961 100644 --- a/src/main/groovy/org/silverpeas/setup/SoftwareBundles.groovy +++ b/src/main/groovy/org/silverpeas/setup/SoftwareBundles.groovy @@ -3,6 +3,7 @@ package org.silverpeas.setup import org.gradle.api.Project import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.FileCollection +import org.gradle.api.tasks.InputFiles import javax.inject.Inject @@ -20,12 +21,14 @@ class SoftwareBundles { * the final Silverpeas Web Application. The Jar libraries other than the supported JDBC drivers * aren't taken in charge. */ + @InputFiles 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. */ + @InputFiles final ConfigurableFileCollection tiers @Inject diff --git a/src/main/groovy/org/silverpeas/setup/api/SilverpeasSetupTask.groovy b/src/main/groovy/org/silverpeas/setup/api/SilverpeasSetupTask.groovy index 6de8374a..2e9a0d28 100644 --- a/src/main/groovy/org/silverpeas/setup/api/SilverpeasSetupTask.groovy +++ b/src/main/groovy/org/silverpeas/setup/api/SilverpeasSetupTask.groovy @@ -1,6 +1,7 @@ package org.silverpeas.setup.api import org.gradle.api.DefaultTask +import org.gradle.api.tasks.Internal /** * Common definition of a task in the Silverpeas Setup plugin. @@ -14,5 +15,6 @@ abstract class SilverpeasSetupTask extends DefaultTask { * 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. */ + @Internal 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 175921bc..87fb2734 100644 --- a/src/main/groovy/org/silverpeas/setup/configuration/JBossConfigurationTask.groovy +++ b/src/main/groovy/org/silverpeas/setup/configuration/JBossConfigurationTask.groovy @@ -23,12 +23,9 @@ */ package org.silverpeas.setup.configuration - import org.gradle.api.Project import org.gradle.api.ProjectState -import org.gradle.api.provider.Property -import org.gradle.api.tasks.TaskAction -import org.gradle.api.tasks.TaskExecutionException +import org.gradle.api.tasks.* import org.silverpeas.setup.SilverpeasConfigurationProperties import org.silverpeas.setup.api.FileLogger import org.silverpeas.setup.api.JBossServer @@ -45,9 +42,13 @@ import java.util.regex.Matcher */ class JBossConfigurationTask extends SilverpeasSetupTask { + @InputDirectory File driversDir + @Nested SilverpeasConfigurationProperties config - Property jboss = project.objects.property(JBossServer) + @Internal + JBossServer jboss + @Internal final FileLogger log = FileLogger.getLogger(this.name) JBossConfigurationTask() { @@ -59,7 +60,7 @@ class JBossConfigurationTask extends SilverpeasSetupTask { project.afterEvaluate { Project currentProject, ProjectState state -> if (state.executed) { - jboss.get().useLogger(log) + jboss.useLogger(log) } } } @@ -70,7 +71,7 @@ class JBossConfigurationTask extends SilverpeasSetupTask { @TaskAction void configureJBoss() { - JBossServer server = jboss.get() + JBossServer server = jboss try { if (server.isStartingOrRunning()) { server.stop() @@ -90,7 +91,7 @@ class JBossConfigurationTask extends SilverpeasSetupTask { private void setUpJVMOptions() { log.info 'JVM options setting' - new File(jboss.get().jbossHome, 'bin').listFiles(new FilenameFilter() { + new File(jboss.jbossHome, 'bin').listFiles(new FilenameFilter() { @Override boolean accept(final File dir, final String name) { return name.endsWith('.conf') || name.endsWith('.conf.bat') @@ -128,13 +129,13 @@ class JBossConfigurationTask extends SilverpeasSetupTask { log.info 'Additional modules installation' project.copy { it.from config.jbossModulesDir.get().toPath() - it.into Paths.get(jboss.get().jbossHome, 'modules') + it.into Paths.get(jboss.jbossHome, 'modules') } } private void setUpJDBCDriver() throws Exception { log.info "Install database driver for ${settings.DB_SERVERTYPE}" - JBossServer server = jboss.get() + JBossServer server = jboss if (settings.DB_SERVERTYPE == 'H2') { // H2 is already available by default in JBoss/Wildfly settings.DB_DRIVER_NAME = 'h2' @@ -179,7 +180,7 @@ class JBossConfigurationTask extends SilverpeasSetupTask { aScript .useLogger(log) .useSettings(settings) - .run(jboss: jboss.get()) + .run(jboss: jboss) } } catch(Exception ex) { log.error("Error while running cli script: ${ex.message}", ex) diff --git a/src/main/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTask.groovy b/src/main/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTask.groovy index 7e39917f..c019add0 100644 --- a/src/main/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTask.groovy +++ b/src/main/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTask.groovy @@ -23,7 +23,9 @@ */ package org.silverpeas.setup.configuration - +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.Nested import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskExecutionException import org.silverpeas.setup.SilverpeasConfigurationProperties @@ -33,7 +35,6 @@ 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. @@ -41,8 +42,11 @@ import java.nio.file.Paths */ class SilverpeasConfigurationTask extends SilverpeasSetupTask { + @InputDirectory File silverpeasHome + @Nested SilverpeasConfigurationProperties config + @Internal final FileLogger log = FileLogger.getLogger(this.name) SilverpeasConfigurationTask() { diff --git a/src/main/groovy/org/silverpeas/setup/construction/SilverpeasConstructionTask.groovy b/src/main/groovy/org/silverpeas/setup/construction/SilverpeasConstructionTask.groovy index f6c06984..0a1f6c64 100644 --- a/src/main/groovy/org/silverpeas/setup/construction/SilverpeasConstructionTask.groovy +++ b/src/main/groovy/org/silverpeas/setup/construction/SilverpeasConstructionTask.groovy @@ -23,7 +23,9 @@ */ package org.silverpeas.setup.construction - +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.Nested import org.gradle.api.tasks.TaskAction import org.silverpeas.setup.SilverpeasInstallationProperties import org.silverpeas.setup.api.FileLogger @@ -41,8 +43,11 @@ class SilverpeasConstructionTask extends SilverpeasSetupTask { public static final String SILVERPEAS_WAR = 'silverpeas.war' + @InputDirectory File silverpeasHome + @Nested SilverpeasInstallationProperties installation + @Internal final FileLogger log = FileLogger.getLogger(this.name) SilverpeasConstructionTask() { @@ -56,11 +61,11 @@ class SilverpeasConstructionTask extends SilverpeasSetupTask { } } - boolean precondition() { + def precondition() { !installation.distDir.get().exists() && !installation.dsDriversDir.get().exists() } - boolean isUpToDate() { + def isUpToDate() { 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)) diff --git a/src/main/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTask.groovy b/src/main/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTask.groovy index c53eafc8..002930b8 100644 --- a/src/main/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTask.groovy +++ b/src/main/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTask.groovy @@ -26,14 +26,14 @@ package org.silverpeas.setup.installation import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.ProjectState -import org.gradle.api.provider.Property +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.Nested 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. @@ -41,9 +41,13 @@ import static org.silverpeas.setup.construction.SilverpeasConstructionTask.SILVE */ class SilverpeasInstallationTask extends DefaultTask { - Property jboss = project.objects.property(JBossServer) + @Nested SilverpeasInstallationProperties installation + @Internal + JBossServer jboss + @Internal Map settings + @Internal final FileLogger log = FileLogger.getLogger(this.name) SilverpeasInstallationTask() { @@ -52,14 +56,14 @@ class SilverpeasInstallationTask extends DefaultTask { project.afterEvaluate { Project currentProject, ProjectState state -> if (state.executed) { - jboss.get().useLogger(log) + jboss.useLogger(log) } } } @TaskAction void install() { - final JBossServer server = jboss.get() + final JBossServer server = jboss final File deploymentDir = installation.deploymentDir.get() if (server.isStartingOrRunning()) { server.stop() diff --git a/src/main/groovy/org/silverpeas/setup/migration/DatasourceMigration.groovy b/src/main/groovy/org/silverpeas/setup/migration/DatasourceMigration.groovy index ca1e7800..df53cfbd 100644 --- a/src/main/groovy/org/silverpeas/setup/migration/DatasourceMigration.groovy +++ b/src/main/groovy/org/silverpeas/setup/migration/DatasourceMigration.groovy @@ -78,11 +78,11 @@ class DatasourceMigration { } } - boolean isAnInstallation() { + private def isAnInstallation() { return fromVersion == null } - boolean isAnUpgrade() { + private def isAnUpgrade() { return fromVersion != null && (fromVersion as int) < (toVersion as int) } diff --git a/src/main/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTask.groovy b/src/main/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTask.groovy index 650493e9..7ba00465 100644 --- a/src/main/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTask.groovy +++ b/src/main/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTask.groovy @@ -25,6 +25,8 @@ package org.silverpeas.setup.migration import groovy.sql.Sql import org.gradle.api.logging.LogLevel +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.Nested import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskExecutionException import org.silverpeas.setup.SilverpeasMigrationProperties @@ -59,7 +61,9 @@ class SilverpeasMigrationTask extends SilverpeasSetupTask { static final String MIGRATION_SETTING_MODULE = 'dbbuilder-migration.xml' + @Nested SilverpeasMigrationProperties migration + @Internal final FileLogger log = FileLogger.getLogger(this.name) SilverpeasMigrationTask() { diff --git a/src/test/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTaskTest.groovy b/src/test/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTaskTest.groovy index 842847b4..c8c8c2ff 100644 --- a/src/test/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTaskTest.groovy +++ b/src/test/groovy/org/silverpeas/setup/configuration/SilverpeasConfigurationTaskTest.groovy @@ -1,6 +1,8 @@ package org.silverpeas.setup.configuration - +import org.junit.After +import org.junit.Before +import org.junit.Test import org.silverpeas.setup.test.TestContext import java.time.LocalDate @@ -11,22 +13,21 @@ import static org.gradle.testkit.runner.TaskOutcome.SUCCESS * Test the case of the configuration of Silverpeas performed by a dedicated Gradle task. * @author mmoquillon */ -class SilverpeasConfigurationTaskTest extends GroovyTestCase { +class SilverpeasConfigurationTaskTest { private TestContext context - @Override + @Before void setUp() { - super.setUp() context = TestContext.create().setUpSystemEnv().initGradleProject() } - @Override + @After void tearDown() throws Exception { - super.tearDown() context.cleanUp() } + @Test void testSilverpeasConfiguration() { TestProperties testProperties = new TestProperties().before() diff --git a/src/test/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTaskTest.groovy b/src/test/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTaskTest.groovy index 878c361c..9503b938 100644 --- a/src/test/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTaskTest.groovy +++ b/src/test/groovy/org/silverpeas/setup/installation/SilverpeasInstallationTaskTest.groovy @@ -1,8 +1,10 @@ package org.silverpeas.setup.installation import groovy.mock.interceptor.MockFor +import org.apache.commons.io.FileUtils import org.gradle.api.Project -import org.gradle.testfixtures.ProjectBuilder +import org.junit.Before +import org.junit.Test import org.silverpeas.setup.api.JBossServer import org.silverpeas.setup.test.TestContext @@ -11,24 +13,18 @@ import static org.silverpeas.setup.api.SilverpeasSetupTaskNames.INSTALL * Test the case of the installation of Silverpeas performed by a dedicated Gradle task. * @author mmoquillon */ -class SilverpeasInstallationTaskTest extends GroovyTestCase { +class SilverpeasInstallationTaskTest { private Project project - protected TestContext context + private TestContext context - @Override + @Before void setUp() { - super.setUp() - context = TestContext.create().setUpSystemEnv() - - project = ProjectBuilder.builder().build() - project.apply plugin: 'silversetup' - - project.silversetup.logging.logDir = new File(project.buildDir, 'log') - project.silversetup.logging.useLogger = false + project = context.createGradleProject() } + @Test void testInstallJustSilverpeas() { SilverpeasInstallationTask task = project.tasks.findByPath(INSTALL.name) def mock = new MockFor(JBossServer) @@ -43,12 +39,13 @@ class SilverpeasInstallationTaskTest extends GroovyTestCase { } def jboss = mock.proxyInstance() - task.jboss.set(jboss) + task.jboss = jboss task.install() mock.verify(jboss) } + @Test void testInstall() { SilverpeasInstallationTask task = project.tasks.findByPath(INSTALL.name) @@ -72,9 +69,11 @@ class SilverpeasInstallationTaskTest extends GroovyTestCase { } def jboss = mock.proxyInstance() - task.jboss.set(jboss) + task.jboss = jboss task.install() + FileUtils.deleteQuietly(jackrabbit) + mock.verify(jboss) } } diff --git a/src/test/groovy/org/silverpeas/setup/migration/AbstractDatabaseTest.groovy b/src/test/groovy/org/silverpeas/setup/migration/AbstractDatabaseTest.groovy index 803b4967..1ac74fc5 100644 --- a/src/test/groovy/org/silverpeas/setup/migration/AbstractDatabaseTest.groovy +++ b/src/test/groovy/org/silverpeas/setup/migration/AbstractDatabaseTest.groovy @@ -24,15 +24,21 @@ package org.silverpeas.setup.migration import groovy.sql.Sql +import org.gradle.api.Project +import org.junit.After +import org.junit.Before +import org.silverpeas.setup.SilverpeasSetupExtension +import org.silverpeas.setup.SilverpeasSetupPlugin import org.silverpeas.setup.api.ManagedBeanContainer import org.silverpeas.setup.api.SilverpeasSetupService import org.silverpeas.setup.test.DatabaseSetUp import org.silverpeas.setup.test.TestContext + /** * The common class for all test cases about a database migration. * @author mmoquillon */ -abstract class AbstractDatabaseTest extends GroovyTestCase { +abstract class AbstractDatabaseTest { protected DatabaseSetUp databaseSetUp protected TestContext context @@ -41,20 +47,21 @@ abstract class AbstractDatabaseTest extends GroovyTestCase { return DatabaseSetUp.setUp(withDatasource: true).createSrPackagesTable() } - @Override + @Before void setUp() { - super.setUp() context = TestContext.create() databaseSetUp = initDatabaseSetUp() - ManagedBeanContainer.registry().register(new SilverpeasSetupService([:])) } - @Override + @After void tearDown() { - super.tearDown() databaseSetUp.dropAll() } + def mockSilverpeasSetupService() { + ManagedBeanContainer.registry().register(new SilverpeasSetupService([:])) + } + def prepareInitialData(String module, String version) { databaseSetUp.prepare { Sql sql -> sql.executeScript("${context.migrationHome}/db/h2/${module}/${version}/create_table.sql") diff --git a/src/test/groovy/org/silverpeas/setup/migration/DatasourceMigrationTest.groovy b/src/test/groovy/org/silverpeas/setup/migration/DatasourceMigrationTest.groovy index d871e075..2fe0a1ff 100644 --- a/src/test/groovy/org/silverpeas/setup/migration/DatasourceMigrationTest.groovy +++ b/src/test/groovy/org/silverpeas/setup/migration/DatasourceMigrationTest.groovy @@ -23,6 +23,9 @@ */ package org.silverpeas.setup.migration +import groovy.test.GroovyAssert +import org.junit.Before +import org.junit.Test import org.silverpeas.setup.api.FileLogger import org.silverpeas.setup.api.Script @@ -40,6 +43,12 @@ class DatasourceMigrationTest extends AbstractDatabaseTest { def settings = ['SIVLERPEAS_HOME': '/home/silverpeas'] + @Before + void prepareTest() { + mockSilverpeasSetupService() + } + + @Test void testMigrationForAFreshInstallation() { assert versionOfModule(databaseSetUp.sql, 'toto') == null @@ -59,6 +68,7 @@ class DatasourceMigrationTest extends AbstractDatabaseTest { assert versionOfModule(databaseSetUp.sql, 'toto') == '002' } + @Test void testUpgradeWithOnlySQLScripts() { prepareInitialData('toto', '002') assert versionOfModule(databaseSetUp.sql, 'toto') == '002' @@ -80,6 +90,7 @@ class DatasourceMigrationTest extends AbstractDatabaseTest { assert versionOfModule(databaseSetUp.sql, 'toto') == '003' } + @Test void testUpgradeWithOnlyGroovyScripts() { prepareInitialData('toto', '003') assert versionOfModule(databaseSetUp.sql, 'toto') == '003' @@ -103,6 +114,7 @@ class DatasourceMigrationTest extends AbstractDatabaseTest { assert numberOfItems(databaseSetUp.sql, 'Person') == 1 } + @Test void testMigrationForAnUpgrade() { prepareInitialData('toto', '003') assert versionOfModule(databaseSetUp.sql, 'toto') == '003' @@ -130,6 +142,7 @@ class DatasourceMigrationTest extends AbstractDatabaseTest { assert numberOfItems(databaseSetUp.sql, 'Person') == 1 } + @Test void testAnInstallationFailure() { assert versionOfModule(databaseSetUp.sql, 'foo') == null @@ -138,7 +151,7 @@ class DatasourceMigrationTest extends AbstractDatabaseTest { .ofType(sql) .build() - shouldFail(SQLException) { + GroovyAssert.shouldFail(SQLException) { DatasourceMigration migration = DatasourceMigration.builder() .module('foo') .toVersion('002') @@ -152,6 +165,7 @@ class DatasourceMigrationTest extends AbstractDatabaseTest { assert versionOfModule(databaseSetUp.sql, 'foo') == null } + @Test void testAnUpgradeFailure() { prepareInitialData('foo', '003') assert versionOfModule(databaseSetUp.sql, 'foo') == '003' @@ -161,7 +175,7 @@ class DatasourceMigrationTest extends AbstractDatabaseTest { .ofType(groovy) .build() - shouldFail(SQLException) { + GroovyAssert.shouldFail(SQLException) { DatasourceMigration migration = DatasourceMigration.builder() .module('foo') .fromVersion('003') diff --git a/src/test/groovy/org/silverpeas/setup/migration/JcrRepositoryTest.groovy b/src/test/groovy/org/silverpeas/setup/migration/JcrRepositoryTest.groovy index bdce0bf5..b27d346c 100644 --- a/src/test/groovy/org/silverpeas/setup/migration/JcrRepositoryTest.groovy +++ b/src/test/groovy/org/silverpeas/setup/migration/JcrRepositoryTest.groovy @@ -1,5 +1,8 @@ package org.silverpeas.setup.migration +import org.junit.After +import org.junit.Before +import org.junit.Test import org.silverpeas.setup.api.JcrRepositoryFactory import org.silverpeas.setup.test.DatabaseSetUp import org.silverpeas.setup.test.TestContext @@ -12,23 +15,23 @@ import javax.jcr.SimpleCredentials * Test case on the JCR repository fetching. * @author mmoquillon */ -class JcrRepositoryTest extends GroovyTestCase { +class JcrRepositoryTest { private DatabaseSetUp databaseSetUp private TestContext context - @Override + @Before void setUp() { - super.setUp() context = TestContext.create() databaseSetUp = DatabaseSetUp.setUp(withDatasource: true) } - @Override + @After void tearDown() { databaseSetUp.dropAll() } + @Test void testRepositoryAccess() { Repository repository = JcrRepositoryFactory.instance.createRepository([SILVERPEAS_HOME: context.resourcesDir]) diff --git a/src/test/groovy/org/silverpeas/setup/migration/MigrationModuleTest.groovy b/src/test/groovy/org/silverpeas/setup/migration/MigrationModuleTest.groovy index 93e9f76b..c38cd886 100644 --- a/src/test/groovy/org/silverpeas/setup/migration/MigrationModuleTest.groovy +++ b/src/test/groovy/org/silverpeas/setup/migration/MigrationModuleTest.groovy @@ -23,6 +23,9 @@ */ package org.silverpeas.setup.migration +import groovy.test.GroovyAssert +import org.junit.Before +import org.junit.Test import org.silverpeas.setup.api.FileLogger import org.xml.sax.SAXParseException @@ -35,6 +38,12 @@ import static org.silverpeas.setup.test.Assertion.versionOfModule */ class MigrationModuleTest extends AbstractDatabaseTest{ + @Before + void prepareTest() { + mockSilverpeasSetupService() + } + + @Test void testAFreshInstallation() { assert versionOfModule(databaseSetUp.sql, 'toto') == null @@ -48,6 +57,7 @@ class MigrationModuleTest extends AbstractDatabaseTest{ assert versionOfModule(databaseSetUp.sql, 'toto') == '004' } + @Test void testAnUpgradeFrom002To004() { prepareInitialData('toto', '002') assert versionOfModule(databaseSetUp.sql, 'toto') == '002' @@ -64,6 +74,7 @@ class MigrationModuleTest extends AbstractDatabaseTest{ assert numberOfItems(databaseSetUp.sql, 'Person') == 1 } + @Test void testAnUpgradeFrom003To004() { prepareInitialData('toto', '003') assert versionOfModule(databaseSetUp.sql, 'toto') == '003' @@ -80,8 +91,9 @@ class MigrationModuleTest extends AbstractDatabaseTest{ assert numberOfItems(databaseSetUp.sql, 'Person') == 1 } + @Test void testAMalformedMigrationDescriptor() { - shouldFail(SAXParseException) { + GroovyAssert.shouldFail(SAXParseException) { new MigrationModule() .withSettings([MIGRATION_HOME:context.migrationHome, DB_SERVERTYPE: 'H2']) .withStatus(['toto':'003']) diff --git a/src/test/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTaskTest.groovy b/src/test/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTaskTest.groovy index 8a40c107..29267b0b 100644 --- a/src/test/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTaskTest.groovy +++ b/src/test/groovy/org/silverpeas/setup/migration/SilverpeasMigrationTaskTest.groovy @@ -1,12 +1,12 @@ package org.silverpeas.setup.migration import org.gradle.api.Project -import org.gradle.testfixtures.ProjectBuilder +import org.junit.Before +import org.junit.Test import org.silverpeas.setup.test.DatabaseSetUp import static org.silverpeas.setup.api.SilverpeasSetupTaskNames.MIGRATE import static org.silverpeas.setup.test.Assertion.versionOfModule - /** * Test the case of the migration of the data sources performed by a dedicated Gradle task. * @author mmoquillon @@ -20,15 +20,13 @@ class SilverpeasMigrationTaskTest extends AbstractDatabaseTest { return DatabaseSetUp.setUp(withDatasource: true) } - @Override - void setUp() { - super.setUp() + @Before + void prepareTest() { context.setUpSystemEnv() - - project = ProjectBuilder.builder().build() - project.apply plugin: 'silversetup' + project = context.createGradleProject() } + @Test void testSilverpeasInstallation() { assert versionOfModule(databaseSetUp.sql, 'toto') == null assert versionOfModule(databaseSetUp.sql, 'busCore') == null @@ -39,6 +37,7 @@ class SilverpeasMigrationTaskTest extends AbstractDatabaseTest { assert versionOfModule(databaseSetUp.sql, 'busCore') == '032' } + @Test void testSilverpeasUpgrade() { databaseSetUp.createSrPackagesTable() prepareInitialData('toto', '002') diff --git a/src/test/groovy/org/silverpeas/setup/test/TestContext.groovy b/src/test/groovy/org/silverpeas/setup/test/TestContext.groovy index 0b56896e..324c7574 100644 --- a/src/test/groovy/org/silverpeas/setup/test/TestContext.groovy +++ b/src/test/groovy/org/silverpeas/setup/test/TestContext.groovy @@ -23,7 +23,14 @@ */ package org.silverpeas.setup.test +import org.apache.commons.io.FileUtils +import org.gradle.api.Project +import org.gradle.testfixtures.ProjectBuilder import org.gradle.testkit.runner.GradleRunner +import org.silverpeas.setup.SilverpeasSetupExtension +import org.silverpeas.setup.SilverpeasSetupPlugin +import org.silverpeas.setup.api.ManagedBeanContainer +import org.silverpeas.setup.api.SilverpeasSetupService import java.nio.file.Files import java.nio.file.Paths @@ -38,7 +45,10 @@ class TestContext { String migrationHome private TestContext() { - + Properties properties = new Properties() + properties.load(getClass().getResourceAsStream('/test.properties')) + this.migrationHome = properties.migrationHome + this.resourcesDir = properties.resourcesDir } /** @@ -46,27 +56,41 @@ class TestContext { * @return a new TestContext instance */ static TestContext create() { - Properties properties = new Properties() - properties.load(getClass().getResourceAsStream('/test.properties')) - TestContext testSetUp = new TestContext() - testSetUp.migrationHome = properties.migrationHome - testSetUp.resourcesDir = properties.resourcesDir - return testSetUp + return new TestContext() } + /** + * Sets up the environment variables required by the plugin to work. + * @return itself. + */ TestContext setUpSystemEnv() { System.setProperty('SILVERPEAS_HOME',resourcesDir) System.setProperty('JBOSS_HOME', resourcesDir) return this } + /** + * Cleans up any resources that were allocated for the tests to run. + */ void cleanUp() { Files.deleteIfExists(Paths.get(resourcesDir, 'build.gradle')) + Files.deleteIfExists(Paths.get(resourcesDir, 'settings.gradle')) + FileUtils.deleteDirectory(Paths.get(resourcesDir, 'build').toFile()) } + /** + * Initializes in the filesystem a Gradle project that uses the plugin. The Gradle project + * can then be ran by using the Gradle runner returned by the TestContext#getGradleRunner method. + * @return itself. + */ TestContext initGradleProject() { Files.createDirectories(Paths.get(resourcesDir, 'build', 'drivers')) Files.createDirectories(Paths.get(resourcesDir, 'build', 'dist')) + Files.createFile(Paths.get(resourcesDir, 'settings.gradle')) + .toFile() + .text = """ +rootProject.name = 'silverpeas-installer' +""" Files.createFile(Paths.get(resourcesDir, 'build.gradle')) .toFile() .text = """ @@ -84,6 +108,30 @@ silversetup { return this } + /** + * Creates in memory a Gradle project that uses the plugin and returns it. The different tasks + * provided by the plugin can be then get from the returned project in order to be executed + * directly without using a Gradle runner. + * @return a Project instance. + */ + Project createGradleProject() { + Project project = ProjectBuilder.builder().withName('silverpeas-installer').build() + project.apply plugin: 'silversetup' + project.silversetup.logging.logDir = new File(project.buildDir, 'log') + project.silversetup.logging.useLogger = false + + SilverpeasSetupExtension extension = + (SilverpeasSetupExtension) project.extensions.getByName(SilverpeasSetupPlugin.EXTENSION) + ManagedBeanContainer.registry().register(new SilverpeasSetupService(extension.settings)) + return project + } + + /** + * Gets a Gradle runner configured to execute a task (with its dependencies) of a Gradle project + * that was previously initialized with the TestContext#initGradleProject method. + * @param debug a boolean indicating whether the project'tasks have to be executed in debug + * @return a GradleRunner instance. + */ GradleRunner getGradleRunner(boolean debug = false) { GradleRunner.create() .withProjectDir(new File(resourcesDir)) diff --git a/src/test/resources/configuration/jboss/modules/.gitkeep b/src/test/resources/configuration/jboss/modules/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/test/resources/migrations/db/h2/busCore/032/init.sql b/src/test/resources/migrations/db/h2/busCore/032/init.sql index 468860ba..76f3a7ea 100644 --- a/src/test/resources/migrations/db/h2/busCore/032/init.sql +++ b/src/test/resources/migrations/db/h2/busCore/032/init.sql @@ -6,13 +6,13 @@ insert into ST_AccessLevel(id, name) values ('K', 'KMManager'); insert into ST_AccessLevel(id, name) values ('D', 'DomainManager'); INSERT INTO ST_User (id, specificId, domainId, lastName, login, accessLevel, state, stateSaveDate) - VALUES (0, '0', 0, 'Administrateur', '${SILVERPEAS_ADMIN_LOGIN}', 'A', 'VALID', CURRENT_TIMESTAMP); + VALUES (0, '0', 0, '${SILVERPEAS_ADMIN_NAME}', '${SILVERPEAS_ADMIN_LOGIN}', 'A', 'VALID', CURRENT_TIMESTAMP); insert into DomainSP_User(id, lastName, login, password) -values (0, 'Administrateur', '${SILVERPEAS_ADMIN_LOGIN}', '${SILVERPEAS_ADMIN_PASSWORD}'); +values (0, '${SILVERPEAS_ADMIN_NAME}', '${SILVERPEAS_ADMIN_LOGIN}', '${SILVERPEAS_ADMIN_PASSWORD}'); insert into ST_Domain(id, name, description, propFileName, className, authenticationServer, theTimeStamp, silverpeasServerURL) values (-1, 'internal', 'Do not remove - Used by Silverpeas engine', '-', '-', '-', '0', ''); insert into ST_Domain(id, name, description, propFileName, className, authenticationServer, theTimeStamp, silverpeasServerURL) -values (0, 'domainSilverpeas', 'default domain for Silverpeas', 'com.stratelia.silverpeas.domains.domainSP', 'com.silverpeas.domains.silverpeasdriver.SilverpeasDomainDriver', 'autDomainSP', '0', '${SERVER_URL}'); +values (0, 'domainSilverpeas', 'default domain for Silverpeas', 'org.silverpeas.domains.domainSP', 'org.silverpeas.domains.silverpeasdriver.SilverpeasDomainDriver', 'autDomainSP', '0', '${SERVER_URL}');