diff --git a/README.md b/README.md index 82a1879..32b6b59 100644 --- a/README.md +++ b/README.md @@ -123,4 +123,10 @@ Also you must provide values for: Environment Variables - `S3_BUCKET` and `S3_REGION` -An example of a value for `S3_REGION` could be `eu-west-1` for Ireland buckets. \ No newline at end of file +An example of a value for `S3_REGION` could be `eu-west-1` for Ireland buckets. + +# Dependencies + +- [Webdriver Binaries Gradle Plugin](https://github.com/erdi/webdriver-binaries-gradle-plugin/blob/master/README.md) [Gradle Portal](https://plugins.gradle.org/plugin/com.github.erdi.webdriver-binaries) - A plugin that downloads and caches WebDriver binaries specific to the OS the build runs on. + +- [Grails AWS SDK S3 Plugin](https://github.com/agorapulse/grails-aws-sdk/tree/master/grails-aws-sdk-s3) diff --git a/build.gradle b/build.gradle index cf1ee3f..e74e76c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,17 +1,11 @@ buildscript { repositories { - mavenLocal() - maven { - url "https://repo.grails.org/grails/core" - } - maven { - url "https://plugins.gradle.org/m2/" - } + maven { url "https://repo.grails.org/grails/core" } } dependencies { classpath "org.grails:grails-gradle-plugin:$grailsVersion" - classpath "gradle.plugin.com.energizedwork.webdriver-binaries:webdriver-binaries-gradle-plugin:$webdriverBinariesGradleVersion" - classpath "org.grails.plugins:hibernate5:${gormVersion-".RELEASE"}" + classpath "gradle.plugin.com.github.erdi.webdriver-binaries:webdriver-binaries-gradle-plugin:$webdriverBinariesGradleVersion" + classpath "org.grails.plugins:hibernate5:7.1.0.RC3" classpath "com.bertramlabs.plugins:asset-pipeline-gradle:$assetPipelineVersion" classpath "org.grails.plugins:views-gradle:$jsonViewsVersion" classpath "com.moowork.gradle:gradle-node-plugin:1.2.0" @@ -25,17 +19,15 @@ apply plugin:"eclipse" apply plugin:"idea" apply plugin:"war" apply plugin:"org.grails.grails-web" -apply plugin:"com.energizedwork.webdriver-binaries" +apply plugin: "com.github.erdi.webdriver-binaries" apply plugin:"asset-pipeline" apply plugin:"org.grails.grails-gsp" apply plugin: "org.grails.plugins.views-json" apply plugin: "com.moowork.node" repositories { - mavenLocal() + maven { url 'https://jitpack.io' } maven { url "https://repo.grails.org/grails/core" } - jcenter() - maven { url 'http://dl.bintray.com/agorapulse/libs' } } node { @@ -81,39 +73,65 @@ task bowerInstall(type: NodeTask) { dependencies { - compile "org.springframework.boot:spring-boot-starter-logging" - compile "org.springframework.boot:spring-boot-autoconfigure" - compile "org.grails:grails-core" - compile "org.springframework.boot:spring-boot-starter-actuator" - compile "org.springframework.boot:spring-boot-starter-tomcat" - compile "org.grails:grails-web-boot" - compile "org.grails:grails-logging" - compile "org.grails:grails-plugin-rest" - compile "org.grails:grails-plugin-databinding" - compile "org.grails:grails-plugin-i18n" - compile "org.grails:grails-plugin-services" - compile "org.grails:grails-plugin-url-mappings" - compile "org.grails:grails-plugin-interceptors" - compile "org.grails.plugins:cache" - compile "org.grails.plugins:async" - compile "org.grails.plugins:scaffolding" - compile "org.grails.plugins:events" - compile "org.grails.plugins:hibernate5" - compile "org.hibernate:hibernate-core:5.1.5.Final" - compile "org.grails.plugins:gsp" + developmentOnly("org.springframework.boot:spring-boot-devtools") + compileOnly "io.micronaut:micronaut-inject-groovy" + console "org.grails:grails-console" + implementation "org.springframework.boot:spring-boot-starter-validation" + implementation "org.grails.plugins:views-json" + + implementation "org.springframework.boot:spring-boot-starter-logging" + implementation "org.springframework.boot:spring-boot-autoconfigure" + + implementation "org.grails:grails-core" + + + + implementation "org.grails.plugins:cache" + + implementation "org.springframework.boot:spring-boot-starter-actuator" + implementation "org.springframework.boot:spring-boot-starter-tomcat" + implementation "org.grails:grails-web-boot" + implementation "org.grails:grails-logging" + implementation "org.grails:grails-plugin-rest" + implementation "org.grails:grails-plugin-databinding" + implementation "org.grails:grails-plugin-i18n" + implementation "org.grails:grails-plugin-services" + implementation "org.grails:grails-plugin-url-mappings" + + implementation "org.grails:grails-plugin-interceptors" + + + implementation "org.grails.plugins:async" + implementation "org.grails.plugins:scaffolding" + implementation "org.grails.plugins:events" + + implementation "org.grails.plugins:hibernate5" + implementation "org.hibernate:hibernate-core:5.5.7.Final" + implementation "org.grails.plugins:gsp" console "org.grails:grails-console" profile "org.grails.profiles:web" - runtime "org.glassfish.web:el-impl:2.1.2-b03" - runtime "org.apache.tomcat:tomcat-jdbc" - runtime "com.bertramlabs.plugins:asset-pipeline-grails:$assetPipelineVersion" - testCompile "org.grails:grails-gorm-testing-support" - testCompile "org.grails:grails-web-testing-support" - testCompile "org.grails.plugins:geb" - testRuntime "org.seleniumhq.selenium:selenium-chrome-driver:$seleniumVersion" - testRuntime "org.seleniumhq.selenium:selenium-firefox-driver:$seleniumVersion" - testCompile "org.seleniumhq.selenium:selenium-remote-driver:$seleniumVersion" - testCompile "org.seleniumhq.selenium:selenium-api:$seleniumVersion" - testCompile "org.seleniumhq.selenium:selenium-support:$seleniumVersion" + + runtimeOnly "javax.xml.bind:jaxb-api:2.3.1" + runtimeOnly "org.glassfish.web:el-impl:2.2.1-b05" + + runtimeOnly "org.apache.tomcat:tomcat-jdbc" + runtimeOnly "com.bertramlabs.plugins:asset-pipeline-grails:$assetPipelineVersion" + + testImplementation "io.micronaut:micronaut-inject-groovy" + testImplementation "io.micronaut:micronaut-http-client" + + testImplementation "org.grails:grails-gorm-testing-support" + testImplementation "org.mockito:mockito-core" + testImplementation "org.grails:grails-web-testing-support" + + testImplementation "org.grails.plugins:geb" + testImplementation "org.seleniumhq.selenium:selenium-remote-driver:$seleniumVersion" + testImplementation "org.seleniumhq.selenium:selenium-api:$seleniumVersion" + testImplementation "org.seleniumhq.selenium:selenium-support:$seleniumVersion" + testRuntimeOnly "org.seleniumhq.selenium:selenium-chrome-driver:$seleniumVersion" + + testRuntimeOnly "org.seleniumhq.selenium:selenium-firefox-driver:$seleniumVersion" + runtime "mysql:mysql-connector-java:$mysqlVersion" @@ -142,18 +160,27 @@ dependencies { compile "com.github.mpkorstanje:simmetrics-core:$simmetricsVersion" - compile "org.grails.plugins:aws-sdk-s3:$awsSdkS3Version" + compile 'com.github.agorapulse.grails-aws-sdk:aws-sdk-s3:2.4.14' } bootRun { systemProperties System.properties - jvmArgs('-Dspring.output.ansi.enabled=always') - addResources = true + ignoreExitValue true + jvmArgs( + '-Dspring.output.ansi.enabled=always', + '-noverify', + '-XX:TieredStopAtLevel=1', + '-Xmx1024m') + sourceResources sourceSets.main + String springProfilesActive = 'spring.profiles.active' + systemProperty springProfilesActive, System.getProperty(springProfilesActive) } -webdriverBinaries { - chromedriver "${chromedriverVersion}" - geckodriver "${geckodriverVersion}" +if (System.getProperty('geb.env')) { + webdriverBinaries { + chromedriver "${chromedriverVersion}" + geckodriver "${geckodriverVersion}" + } } test { @@ -164,6 +191,17 @@ integrationTest { systemProperties System.properties } +tasks.withType(GroovyCompile) { + configure(groovyOptions) { + forkOptions.jvmArgs = ['-Xmx1024m'] + } +} + +tasks.withType(Test) { + useJUnitPlatform() +} + + tasks.withType(Test) { systemProperties System.properties systemProperty "grails.env", 'test' diff --git a/gradle.properties b/gradle.properties index 383d214..a6d5a6d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,22 +1,25 @@ #Tue Jun 26 14:44:22 BST 2018 -jsonViewsVersion=1.2.7 -webdriverBinariesGradleVersion=1.4 -grailsWrapperVersion=1.0.0 -grailsVersion=3.3.6 -hamcrestVersion=1.3 -seleniumVersion=3.6.0 -gradleWrapperVersion=3.5 -gormVersion=6.1.10.RELEASE +jsonViewsVersion=2.0.4 +webdriverBinariesGradleVersion=2.4 +grailsVersion=5.0.0-RC3 +groovyVersion=3.0.7 +hamcrestVersion=2.2 +seleniumVersion=3.141.59 +gorm.version=7.1.0.RC3 +org.gradle.daemon=true +org.gradle.parallel=true +org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xmx1024M + mysqlVersion=5.1.46 ersatzVersion=1.6.2 -assetPipelineVersion=2.14.8 +assetPipelineVersion=3.3.4 okHttpVersion=3.9.1 moshiVersion=1.5.0 droolsVersion=7.5.0.Final chromedriverVersion=2.40 geckodriverVersion=0.21.0 spreadsheetBuilderVersion=1.0.5 -springSecurityCoreVersion=3.2.3 +springSecurityCoreVersion=4.0.3 simmetricsVersion=4.1.1 -awsSdkS3Version=2.2.4 +awsSdkS3Version=2.4.8 poiVersion=3.16 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index deedc7f..e708b1c 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 b236e4e..3ab0b72 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Wed Feb 07 16:55:23 CET 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip diff --git a/gradlew b/gradlew index 9d82f78..4f906e0 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,20 @@ -#!/usr/bin/env bash +#!/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. +# ############################################################################## ## @@ -6,20 +22,38 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null 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='"-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 @@ -30,6 +64,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,28 +75,14 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - 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 @@ -85,7 +106,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -105,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 @@ -134,27 +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 -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +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" -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec9973..107acd3 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,90 +1,89 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@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 DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%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 -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@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 +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +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="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/grails-app/conf/application.yml b/grails-app/conf/application.yml index 1ab3ea9..201a0c9 100644 --- a/grails-app/conf/application.yml +++ b/grails-app/conf/application.yml @@ -14,17 +14,26 @@ info: version: '@info.app.version@' grailsVersion: '@info.app.grailsVersion@' spring: + jmx: + unique-names: true main: banner-mode: "off" groovy: template: check-template-location: false + devtools: + restart: + additional-exclude: + - '*.gsp' + - '**/*.gsp' + - '*.gson' + - '**/*.gson' + - 'logback.groovy' + - '*.properties' -# Spring Actuator Endpoints are Disabled by Default -endpoints: - enabled: false - jmx: - enabled: true +management: + endpoints: + enabled-by-default: false server: port: 8090 @@ -46,23 +55,22 @@ grails: csv: text/csv form: application/x-www-form-urlencoded html: - - text/html - - application/xhtml+xml + - text/html + - application/xhtml+xml js: text/javascript json: - - application/json - - text/json + - application/json + - text/json multipartForm: multipart/form-data pdf: application/pdf rss: application/rss+xml text: text/plain hal: - - application/hal+json - - application/hal+xml + - application/hal+json + - application/hal+xml xml: - - text/xml - - application/xml - + - text/xml + - application/xml urlmapping: cache: maxsize: 1000 @@ -81,12 +89,13 @@ grails: htmlcodec: xml codecs: expression: html - scriptlets: html + scriptlet: html taglib: none staticparts: none -endpoints: - jmx: - unique-names: true +management: + endpoints: + jmx: + unique-names: true --- grails: plugin: diff --git a/grails-app/conf/logback.groovy b/grails-app/conf/logback.groovy index 00d20ce..599d542 100644 --- a/grails-app/conf/logback.groovy +++ b/grails-app/conf/logback.groovy @@ -37,4 +37,5 @@ root(ERROR, ['STDOUT']) logger('uk.co.metadataconsulting.monitor', DEBUG, ['STDOUT'], false) logger('metadata', DEBUG, ['STDOUT'], false) //logger 'org.springframework.security', TRACE, ['STDOUT'], false +logger 'grails.plugin.awssdk.s3', TRACE, ['STDOUT'], false //logger 'grails.plugin.springsecurity', TRACE, ['STDOUT'], false \ No newline at end of file diff --git a/grails-app/controllers/uk/co/metadataconsulting/monitor/RecordCollectionController.groovy b/grails-app/controllers/uk/co/metadataconsulting/monitor/RecordCollectionController.groovy index 5964800..4ac0881 100644 --- a/grails-app/controllers/uk/co/metadataconsulting/monitor/RecordCollectionController.groovy +++ b/grails-app/controllers/uk/co/metadataconsulting/monitor/RecordCollectionController.groovy @@ -16,6 +16,10 @@ import uk.co.metadataconsulting.monitor.export.RecordCollectionExportView import uk.co.metadataconsulting.monitor.modelcatalogue.DataModel import uk.co.metadataconsulting.monitor.modelcatalogue.GormUrlName import uk.co.metadataconsulting.monitor.modelcatalogue.ValidationRules +import uk.co.metadataconsulting.monitor.validationTask.ValidationPass +import uk.co.metadataconsulting.monitor.validationTask.ValidationPassGormService +import uk.co.metadataconsulting.monitor.validationTask.ValidationTask +import uk.co.metadataconsulting.monitor.validationTask.ValidationTaskGormService import javax.servlet.ServletOutputStream @@ -41,6 +45,10 @@ class RecordCollectionController implements ValidateableErrorsMessage, GrailsCon MessageSource messageSource + ValidationTaskGormService validationTaskGormService + + ValidationPassGormService validationPassGormService + RecordCollectionGormService recordCollectionGormService RecordCollectionService recordCollectionService @@ -253,6 +261,9 @@ class RecordCollectionController implements ValidateableErrorsMessage, GrailsCon return } final String fileKey = recordCollectionEntity.fileKey + for (ValidationPass validationPass : validationPassGormService.findAllByRecordCollection(recordCollectionEntity)) { + validationTaskGormService.delete(validationPass.validationTask) + } recordCollectionGormService.delete(recordCollectionId) uploadFileService.deleteFile(fileKey) flash.message = messageSource.getMessage('recordCollection.deleted', [] as Object[],'Record Collection deleted', request.locale) diff --git a/grails-app/controllers/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskController.groovy b/grails-app/controllers/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskController.groovy index c08a79b..0f3f3fa 100644 --- a/grails-app/controllers/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskController.groovy +++ b/grails-app/controllers/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskController.groovy @@ -1,5 +1,6 @@ package uk.co.metadataconsulting.monitor.validationTask +import groovy.util.logging.Slf4j import org.springframework.context.MessageSource import uk.co.metadataconsulting.monitor.PaginationQuery import uk.co.metadataconsulting.monitor.RecordCollectionGormEntity @@ -8,6 +9,7 @@ import uk.co.metadataconsulting.monitor.RuleFetcherService import uk.co.metadataconsulting.monitor.SaveRecordCollectionService import uk.co.metadataconsulting.monitor.ValidateableErrorsMessage +@Slf4j class ValidationTaskController implements ValidateableErrorsMessage { static allowedMethods = [ @@ -109,24 +111,21 @@ class ValidationTaskController implements ValidateableErrorsMessage { dataModelList: dataModelList, datasetName: cmd.datasetName, dataModelId: cmd.dataModelId, - validationTask: validationTaskService.validationTaskProjection(cmd.validationTaskId), + validationTask: cmd.validationTaskId == null ? null : validationTaskService.validationTaskProjection(cmd.validationTaskId), about: cmd.about, ] return } log.debug 'Content Type {}', cmd.csvFile.contentType - RecordCollectionGormEntity recordCollectionGormEntity = saveRecordCollectionService.save(RecordFileCommand.of(cmd)) - if (cmd.validationTaskId) { - ValidationTask validationTask = validationTaskService.addRecordCollectionToValidationTask(recordCollectionGormEntity, cmd.validationTaskId) - } - else { - ValidationTask validationTask = validationTaskService.newValidationTaskFromRecordCollection(recordCollectionGormEntity) - } - - + RecordFileCommand recordFileCommand = RecordFileCommand.of(cmd) + Long recordCollectionId = saveRecordCollectionService.saveWithValidationTask(recordFileCommand, cmd.validationTaskId) + saveRecordCollectionService.uploadFileToRecordCollection(recordCollectionId, recordFileCommand) + saveRecordCollectionService.importFileContents(recordCollectionId, recordFileCommand) redirect controller: 'recordCollection', action: 'headersMapping', - params: [recordCollectionId: recordCollectionGormEntity.id] + params: [recordCollectionId: recordCollectionId] } + + } diff --git a/grails-app/services/uk/co/metadataconsulting/monitor/CsvImportService.groovy b/grails-app/services/uk/co/metadataconsulting/monitor/CsvImportService.groovy index adf7dcc..ce6a1dd 100644 --- a/grails-app/services/uk/co/metadataconsulting/monitor/CsvImportService.groovy +++ b/grails-app/services/uk/co/metadataconsulting/monitor/CsvImportService.groovy @@ -22,50 +22,36 @@ class CsvImportService implements TabularDataImportService, Benchmark { ImportService importService - SessionFactory sessionFactory - - @CompileDynamic - @Override /** * Save a CSV file as the Records of a given (should be newly created) RecordCollection. A preliminary "default" mapping is made here. */ + @CompileDynamic + @Override void save(InputStream inputStream, Integer batchSize, RecordCollectionGormEntity recordCollectionEntity) { - Promise p = task { - RecordCollectionGormEntity.withNewSession { log.info 'fetching validation rules' MappingMetadata metadata = new MappingMetadata() log.info 'processing input stream' csvImportProcessorService.processInputStream(inputStream, batchSize, { List headersList -> + log.info 'updating headers' metadata.setHeadersList(headersList) recordCollectionGormService.addHeadersList(recordCollectionEntity, headersList) }) { List> valuesList -> log.info('inside closure block') importService.saveMatrixOfValuesToRecordCollection(recordCollectionEntity, valuesList, metadata) - cleanUpGorm() } - recordCollectionService.generateSuggestedMappings(recordCollectionEntity) - - } } p.onComplete { - log.info 'excel import finished' + log.info 'csv import finished' } p.onError { Throwable t -> - log.error 'error while importing csv', t.message + log.error('error while importing csv', t) } } - - - def cleanUpGorm() { - Session session = sessionFactory.currentSession - session.flush() - session.clear() - } } diff --git a/grails-app/services/uk/co/metadataconsulting/monitor/ExcelImportService.groovy b/grails-app/services/uk/co/metadataconsulting/monitor/ExcelImportService.groovy index 9b84b1c..576d143 100644 --- a/grails-app/services/uk/co/metadataconsulting/monitor/ExcelImportService.groovy +++ b/grails-app/services/uk/co/metadataconsulting/monitor/ExcelImportService.groovy @@ -22,8 +22,6 @@ class ExcelImportService implements TabularDataImportService, Benchmark { ImportService importService - SessionFactory sessionFactory - @CompileDynamic @Override void save(InputStream inputStream, @@ -31,7 +29,6 @@ class ExcelImportService implements TabularDataImportService, Benchmark { RecordCollectionGormEntity recordCollectionEntity) { Promise p = task { - RecordCollectionGormEntity.withNewSession { log.info 'fetching validation rules' MappingMetadata metadata = new MappingMetadata() Closure headerListClosure = { List l -> @@ -49,23 +46,14 @@ class ExcelImportService implements TabularDataImportService, Benchmark { log.info 'processing input stream' ExcelReader.read(inputStream, 0, true, headerListClosure) { List values -> importService.saveListOfValuesAsRecord(recordCollectionEntity, values, metadata) - cleanUpGorm() } - } - } p.onComplete { log.info 'excel import finished' } p.onError { Throwable t -> - log.error 'error while importing excel', t.message + log.error('error while importing excel', t) } } - - def cleanUpGorm() { - Session session = sessionFactory.currentSession - session.flush() - session.clear() - } } diff --git a/grails-app/services/uk/co/metadataconsulting/monitor/RecordCollectionGormService.groovy b/grails-app/services/uk/co/metadataconsulting/monitor/RecordCollectionGormService.groovy index b9d5087..578f70d 100644 --- a/grails-app/services/uk/co/metadataconsulting/monitor/RecordCollectionGormService.groovy +++ b/grails-app/services/uk/co/metadataconsulting/monitor/RecordCollectionGormService.groovy @@ -89,7 +89,7 @@ class RecordCollectionGormService implements GormErrorsMessage { @Transactional void delete(Serializable id) { - RecordCollectionGormEntity.get(id).delete() + RecordCollectionGormEntity.get(id)?.delete() } @Transactional diff --git a/grails-app/services/uk/co/metadataconsulting/monitor/RecordGormService.groovy b/grails-app/services/uk/co/metadataconsulting/monitor/RecordGormService.groovy index 096d865..5170f03 100644 --- a/grails-app/services/uk/co/metadataconsulting/monitor/RecordGormService.groovy +++ b/grails-app/services/uk/co/metadataconsulting/monitor/RecordGormService.groovy @@ -44,10 +44,11 @@ class RecordGormService implements GormErrorsMessage { recordGormEntity } - @Transactional + /** * Save a Record for RecordCollection recordCollection from the list of RecordPortions portionList */ + @Transactional RecordGormEntity save(RecordCollectionGormEntity recordCollection, List portionList) { RecordGormEntity record = new RecordGormEntity() record.recordCollection = recordCollection diff --git a/grails-app/services/uk/co/metadataconsulting/monitor/RuleFetcherService.groovy b/grails-app/services/uk/co/metadataconsulting/monitor/RuleFetcherService.groovy index 705984f..20d7c50 100644 --- a/grails-app/services/uk/co/metadataconsulting/monitor/RuleFetcherService.groovy +++ b/grails-app/services/uk/co/metadataconsulting/monitor/RuleFetcherService.groovy @@ -95,11 +95,13 @@ class RuleFetcherService implements GrailsConfigurationAware { final String url = "${metadataUrl}/api/dashboard/dataModels".toString() final String credential = basic() HttpUrl.Builder httpBuider = HttpUrl.parse(url).newBuilder() - Request request = new Request.Builder() + Request.Builder builder = new Request.Builder() .url(httpBuider.build()) - .header("Authorization", credential) .header("Accept", 'application/json') - .build() + if (credential) { + builder = builder.header("Authorization", credential) + } + Request request = builder.build() DataModels dataModels try { Response response = client.newCall(request).execute() diff --git a/grails-app/services/uk/co/metadataconsulting/monitor/SaveRecordCollectionService.groovy b/grails-app/services/uk/co/metadataconsulting/monitor/SaveRecordCollectionService.groovy index fc345a5..7fec81f 100644 --- a/grails-app/services/uk/co/metadataconsulting/monitor/SaveRecordCollectionService.groovy +++ b/grails-app/services/uk/co/metadataconsulting/monitor/SaveRecordCollectionService.groovy @@ -1,17 +1,22 @@ package uk.co.metadataconsulting.monitor - +import grails.async.Promise +import grails.gorm.transactions.Transactional import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.util.logging.Slf4j +import org.springframework.transaction.annotation.Propagation import uk.co.metadataconsulting.monitor.modelcatalogue.DataModel +import uk.co.metadataconsulting.monitor.validationTask.ValidationTaskGormService + +import static grails.async.Promises.task -@Slf4j -@CompileStatic /** * Service to save (create new) a RecordCollection and populate it with Records from an file (InputStream) using a tabular data import service, * given a RecordFileCommand from a controller. */ +@Slf4j +@CompileStatic class SaveRecordCollectionService { CsvImportService csvImportService @@ -22,12 +27,49 @@ class SaveRecordCollectionService { RecordCollectionGormService recordCollectionGormService + ValidationTaskGormService validationTaskGormService + UploadFileService uploadFileService - @CompileDynamic + @Transactional + Long saveWithValidationTask(RecordFileCommand cmd, Long validationTaskId) { + RecordCollectionGormEntity recordCollectionGormEntity = save(cmd) + if (validationTaskId) { + validationTaskGormService.update(validationTaskId, recordCollectionGormEntity) + } else { + validationTaskGormService.save("${recordCollectionGormEntity.datasetName} Validation Task", recordCollectionGormEntity) + } + recordCollectionGormEntity.id + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + void uploadFileToRecordCollection(Long recordCollectionEntityId, RecordFileCommand cmd) { + try { + log.info 'uploading File' + RecordCollectionGormEntity recordCollectionEntity = recordCollectionGormService.find(recordCollectionEntityId) + if (recordCollectionEntity) { + UploadFileResult uploadFileResult = uploadFileService.uploadFile(recordCollectionEntityId, cmd.csvFile) + if (uploadFileResult) { + recordCollectionEntity.fileUrl = uploadFileResult.fileUrl + recordCollectionEntity.fileKey = uploadFileResult.path + recordCollectionGormService.save(recordCollectionEntity) + } else { + log.warn("file upload failed") + } + } else { + log.warn("record collection not found by id {}", recordCollectionEntityId) + } + log.info 'upload file finished' + } catch(Throwable t) { + log.error('error while uploading file', t) + } + } + /** * Create a new RecordCollection and populate it with Records from an file (InputStream) using the CSV import service. */ + @Transactional + @CompileDynamic RecordCollectionGormEntity save(RecordFileCommand cmd) { List dataModelList = ruleFetcherService.fetchDataModels()?.dataModels DataModel dataModel = dataModelList?.find { it.id == cmd.dataModelId } @@ -35,27 +77,19 @@ class SaveRecordCollectionService { log.warn 'data model not found with Id: {}', cmd.dataModelId return null } - - final InputStream inputStream = cmd.csvFile.inputStream - final Integer batchSize = cmd.batchSize - RecordCollectionGormEntity recordCollectionEntity = recordCollectionGormService.save(cmd) - - final Long recordCollectionEntityId = recordCollectionEntity.id - recordCollectionGormService.associateWithDataModel(recordCollectionEntity, dataModel) + recordCollectionEntity + } + @Transactional(propagation = Propagation.REQUIRES_NEW) + void importFileContents(Long recordCollectionId, RecordFileCommand cmd) { + RecordCollectionGormEntity recordCollectionEntity = recordCollectionGormService.find(recordCollectionId) + final InputStream inputStream = cmd.csvFile.inputStream + final Integer batchSize = cmd.batchSize TabularDataImportService tabularDataImportService = csvImportByContentType(ImportContentType.of(cmd.csvFile.contentType)) tabularDataImportService.save(inputStream, batchSize, recordCollectionEntity) - UploadFileResult uploadFileResult = uploadFileService.uploadFile(recordCollectionEntityId, cmd.csvFile) - if (uploadFileResult != null) { - RecordCollectionGormEntity.withNewSession { - recordCollectionGormService.updateFileMetadata(recordCollectionEntityId, uploadFileResult) - } - } - - recordCollectionEntity } protected TabularDataImportService csvImportByContentType(ImportContentType contentType) { diff --git a/grails-app/services/uk/co/metadataconsulting/monitor/UploadFileService.groovy b/grails-app/services/uk/co/metadataconsulting/monitor/UploadFileService.groovy index 7790c34..5c7ceeb 100644 --- a/grails-app/services/uk/co/metadataconsulting/monitor/UploadFileService.groovy +++ b/grails-app/services/uk/co/metadataconsulting/monitor/UploadFileService.groovy @@ -28,6 +28,7 @@ class UploadFileService implements GrailsConfigurationAware { UploadFileResult uploadFile(Long recordCollectionId, MultipartFile multipartFile) { if (!enabled) { + log.warn("UploadFile service not enabled") return null } final String path = "${recordCollectionId}_${multipartFile.originalFilename}".toString() diff --git a/grails-app/services/uk/co/metadataconsulting/monitor/ValidateRecordPortionService.groovy b/grails-app/services/uk/co/metadataconsulting/monitor/ValidateRecordPortionService.groovy index 8735cc3..6a12c75 100644 --- a/grails-app/services/uk/co/metadataconsulting/monitor/ValidateRecordPortionService.groovy +++ b/grails-app/services/uk/co/metadataconsulting/monitor/ValidateRecordPortionService.groovy @@ -44,7 +44,7 @@ class ValidateRecordPortionService { } for ( ValidationRule validationRule : validationRules.rules ) { - Map m = [:] + Map m = [:] for ( String identifier : validationRule.identifiersToGormUrls.keySet() ) { m[identifier] = valuesOfGormUrl(validationRule.identifiersToGormUrls[identifier], gormUrls, values) } diff --git a/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationPassGormService.groovy b/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationPassGormService.groovy index f479646..fef3b22 100644 --- a/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationPassGormService.groovy +++ b/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationPassGormService.groovy @@ -1,12 +1,10 @@ package uk.co.metadataconsulting.monitor.validationTask +import grails.gorm.DetachedCriteria import grails.gorm.transactions.ReadOnly import groovy.transform.CompileStatic import groovy.util.logging.Slf4j -import uk.co.metadataconsulting.monitor.validationTask.ValidationPass -import uk.co.metadataconsulting.monitor.validationTask.ValidationTask - - +import uk.co.metadataconsulting.monitor.RecordCollectionGormEntity @Slf4j @CompileStatic @@ -20,4 +18,16 @@ class ValidationPassGormService { Number count() { ValidationPass.count() } + + @ReadOnly + List findAllByRecordCollection(RecordCollectionGormEntity recordCollection) { + DetachedCriteria query = queryByRecordCollection(recordCollection) + query.list() + } + + private DetachedCriteria queryByRecordCollection(RecordCollectionGormEntity recordCollectionGormEntity) { + ValidationPass.where { + recordCollection == recordCollectionGormEntity + } + } } \ No newline at end of file diff --git a/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskGormService.groovy b/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskGormService.groovy index 3ddb5d2..e471289 100644 --- a/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskGormService.groovy +++ b/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskGormService.groovy @@ -2,25 +2,26 @@ package uk.co.metadataconsulting.monitor.validationTask import grails.gorm.DetachedCriteria import grails.gorm.transactions.ReadOnly +import grails.gorm.transactions.Transactional import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.util.logging.Slf4j +import org.springframework.context.MessageSource +import uk.co.metadataconsulting.monitor.GormErrorsMessage +import uk.co.metadataconsulting.monitor.RecordCollectionGormEntity @Slf4j @CompileStatic -class ValidationTaskGormService { -// /** -// * Cascading delete -// * @param validationTaskId -// */ -// void delete(Long validationTaskId) { -// ValidationTask validationTask = getValidationTask(validationTaskId) -// queryByRecordCollection(validationTask).list().each {it.delete(flush:true)} -// validationTask.delete(flush:true) -// -// } -// +class ValidationTaskGormService implements GormErrorsMessage { + + MessageSource messageSource + + @Transactional + void delete(ValidationTask validationTask) { + validationTask.delete() + } + @ReadOnly ValidationTask getValidationTask(Long validationTaskId) { return ValidationTask.get(validationTaskId) @@ -56,4 +57,27 @@ class ValidationTaskGormService { ValidationTask.count() } + @Transactional + ValidationTask save(ValidationTask entity) { + if ( !entity.save(validate:false) ) { + log.warn '{}', errorsMsg(entity, messageSource) + } + entity + } + + @Transactional + void update(Long id, RecordCollectionGormEntity recordCollectionGormEntity) { + ValidationTask validationTask = getValidationTask(id) + if (validationTask) { + validationTask.addToValidationPasses(recordCollection: recordCollectionGormEntity) + save(validationTask) + } + } + @Transactional + ValidationTask save(String name, + RecordCollectionGormEntity recordCollectionGormEntity) { + ValidationTask validationTask = new ValidationTask(name: name) + validationTask.addToValidationPasses(recordCollection: recordCollectionGormEntity) + save(validationTask) + } } \ No newline at end of file diff --git a/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskService.groovy b/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskService.groovy index 5d3ea45..68e8c9f 100644 --- a/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskService.groovy +++ b/grails-app/services/uk/co/metadataconsulting/monitor/validationTask/ValidationTaskService.groovy @@ -16,17 +16,13 @@ class ValidationTaskService { ) } - ValidationTask newValidationTaskFromRecordCollection(RecordCollectionGormEntity recordCollectionGormEntity) { - ValidationTask validationTask = new ValidationTask(name: "${recordCollectionGormEntity.datasetName} Validation Task", validationPasses: []) - validationTask.addToValidationPasses(recordCollection: recordCollectionGormEntity) - validationTask.save(flush:true) - return validationTask - } - + @Transactional ValidationTask addRecordCollectionToValidationTask(RecordCollectionGormEntity recordCollectionGormEntity, Long validationTaskId) { ValidationTask validationTask = validationTaskGormService.getValidationTask(validationTaskId) - validationTask.addToValidationPasses(recordCollection: recordCollectionGormEntity) - validationTask.save(flush: true) + if (validationTask != null) { + validationTask.addToValidationPasses(recordCollection: recordCollectionGormEntity) + validationTaskGormService.save(validationTask) + } return validationTask } } diff --git a/grails-wrapper.jar b/grails-wrapper.jar index bc85146..2cb6777 100644 Binary files a/grails-wrapper.jar and b/grails-wrapper.jar differ diff --git a/src/integration-test/groovy/monitor/CsvImportServiceIntegrationSpec.groovy b/src/integration-test/groovy/monitor/CsvImportServiceIntegrationSpec.groovy index 1ad98cc..9332cd7 100644 --- a/src/integration-test/groovy/monitor/CsvImportServiceIntegrationSpec.groovy +++ b/src/integration-test/groovy/monitor/CsvImportServiceIntegrationSpec.groovy @@ -2,6 +2,7 @@ package uk.co.metadataconsulting.monitor import grails.testing.mixin.integration.Integration import org.springframework.security.core.context.SecurityContextHolder +import spock.lang.IgnoreIf import spock.lang.Specification import spock.util.concurrent.PollingConditions @@ -14,6 +15,7 @@ class CsvImportServiceIntegrationSpec extends Specification implements LoginAs { RecordPortionGormService recordPortionGormService def conditions = new PollingConditions(timeout: 30) + @IgnoreIf({ !env['S3_REGION']}) def "save processes an CSV file and imports a record collection"() { given: def authentication = SecurityContextHolder.context.authentication @@ -37,7 +39,7 @@ class CsvImportServiceIntegrationSpec extends Specification implements LoginAs { expectedNumberOfRows when: - final String datasetName = "DIDS_XMLExample_20" + String datasetName = "DIDS_XMLExample_20" final RecordCollectionMetadata recordCollectionMetadata = new RecordCollectionMetadataImpl(datasetName: datasetName) RecordCollectionGormEntity recordCollectionEntity = recordCollectionGormService.save(recordCollectionMetadata) csvImportService.save(f.newInputStream(), 50, recordCollectionEntity) diff --git a/src/integration-test/groovy/monitor/RecordCollectionControllerIntegrationSpec.groovy b/src/integration-test/groovy/monitor/RecordCollectionControllerIntegrationSpec.groovy index 449f709..f1f1bb8 100644 --- a/src/integration-test/groovy/monitor/RecordCollectionControllerIntegrationSpec.groovy +++ b/src/integration-test/groovy/monitor/RecordCollectionControllerIntegrationSpec.groovy @@ -31,7 +31,7 @@ class RecordCollectionControllerIntegrationSpec extends GebSpec implements Login def authentication = SecurityContextHolder.context.authentication loginAs('supervisor', 'supervisor') - final String gormUrl = 'gorm://org.modelcatalogue.core.DataElement:53' + String gormUrl = 'gorm://org.modelcatalogue.core.DataElement:53' ErsatzServer ersatz = new ErsatzServer() String creds = Credentials.basic('supervisor', 'supervisor') ersatz.expectations { diff --git a/src/integration-test/groovy/monitor/RecordControllerIntegrationSpec.groovy b/src/integration-test/groovy/monitor/RecordControllerIntegrationSpec.groovy index 906ef33..6515ed8 100644 --- a/src/integration-test/groovy/monitor/RecordControllerIntegrationSpec.groovy +++ b/src/integration-test/groovy/monitor/RecordControllerIntegrationSpec.groovy @@ -28,7 +28,7 @@ class RecordControllerIntegrationSpec extends GebSpec implements LoginAs { def authentication = SecurityContextHolder.context.authentication loginAs('supervisor', 'supervisor') - final String gormUrl = 'gorm://org.modelcatalogue.core.DataElement:53' + String gormUrl = 'gorm://org.modelcatalogue.core.DataElement:53' ErsatzServer ersatz = new ErsatzServer() String creds = Credentials.basic('supervisor', 'supervisor') ersatz.expectations { diff --git a/src/main/groovy/org/modelcatalogue/core/scripting/SecuredRuleExecutor.groovy b/src/main/groovy/org/modelcatalogue/core/scripting/SecuredRuleExecutor.groovy index 066acc8..a3f0c53 100644 --- a/src/main/groovy/org/modelcatalogue/core/scripting/SecuredRuleExecutor.groovy +++ b/src/main/groovy/org/modelcatalogue/core/scripting/SecuredRuleExecutor.groovy @@ -105,7 +105,7 @@ class SecuredRuleExecutor { secureASTCustomizer.addExpressionCheckers(new SecureASTCustomizer.ExpressionChecker() { - Set names = new HashSet(binding.variables.keySet()) + Set names = binding.variables.keySet() as Set @Override boolean isAuthorized(Expression expression) { if (expression instanceof BinaryExpression && expression.operation.meaning == Types.ASSIGN) { diff --git a/src/test/groovy/uk/co/metadataconsulting/monitor/UrlMappingsSpec.groovy b/src/test/groovy/uk/co/metadataconsulting/monitor/UrlMappingsSpec.groovy index 1d5d06c..a791c5d 100644 --- a/src/test/groovy/uk/co/metadataconsulting/monitor/UrlMappingsSpec.groovy +++ b/src/test/groovy/uk/co/metadataconsulting/monitor/UrlMappingsSpec.groovy @@ -2,16 +2,20 @@ package uk.co.metadataconsulting.monitor import grails.testing.web.UrlMappingsUnitTest import spock.lang.Specification +import uk.co.metadataconsulting.monitor.validationTask.ValidationTask +import uk.co.metadataconsulting.monitor.validationTask.ValidationTaskController class UrlMappingsSpec extends Specification implements UrlMappingsUnitTest { void setup() { mockController(RecordCollectionController) mockController(RecordController) + mockController(ValidationTaskController) + } void "test forward mappings"() { expect: - verifyForwardUrlMapping("/", controller: 'recordCollection', action: 'index') + verifyForwardUrlMapping("/", controller: 'validationTask', action: 'index') verifyForwardUrlMapping("/recordCollection/export", controller: 'recordCollection', action: 'export') verifyForwardUrlMapping("/recordCollection/cloneMapping", controller: 'recordCollection', action: 'cloneMapping') verifyForwardUrlMapping("/recordCollection/validate", controller: 'recordCollection', action: 'validate')