ISIS-1335: recreating simpleapp archetype
Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/58eb2cd5 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/58eb2cd5 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/58eb2cd5 Branch: refs/heads/release-1.13.0-RC1 Commit: 58eb2cd51bf4700d762c705eaf6621113106d695 Parents: e63aa87 Author: Dan Haywood <d...@haywood-associates.co.uk> Authored: Fri Jul 8 06:19:40 2016 +0100 Committer: Dan Haywood <d...@haywood-associates.co.uk> Committed: Fri Jul 8 06:32:50 2016 +0100 ---------------------------------------------------------------------- example/archetype/simpleapp/pom.xml | 6 +- .../META-INF/maven/archetype-metadata.xml | 29 ++ .../services/homepage/HomePageViewModel.java | 6 +- .../archetype-resources/dom/.gitignore | 3 + .../archetype-resources/dom/build.gradle | 72 ++++ .../dom/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53556 bytes .../gradle/wrapper/gradle-wrapper.properties | 9 + .../resources/archetype-resources/dom/gradlew | 164 ++++++++ .../archetype-resources/dom/gradlew.bat | 90 +++++ .../archetype-resources/dom/layouts.gradle | 49 +++ .../archetype-resources/dom/liveReload.gradle | 56 +++ .../domainapp/dom/DomainAppDomManifest.java | 2 +- .../java/domainapp/dom/simple/SimpleObject.java | 95 +++-- .../dom/simple/SimpleObject.layout.xml | 5 +- .../domainapp/dom/simple/SimpleObjectMenu.java | 80 ++++ .../dom/simple/SimpleObjectRepository.java | 61 +++ .../domainapp/dom/simple/SimpleObjects.java | 115 ------ .../dom/simple/SimpleObjectRepositoryTest.java | 128 ++++++ .../domainapp/dom/simple/SimpleObjectsTest.java | 107 ----- .../fixture/dom/simple/SimpleObjectCreate.java | 6 +- .../scenarios/RecreateSimpleObjects.java | 2 + .../bootstrap/DomainAppSystemInitializer.java | 17 +- .../modules/simple/SimpleObjectGlue.java | 6 +- .../modules/simple/SimpleObjectIntegTest.java | 142 ------- .../simple/SimpleObjectMenu_IntegTest.java | 149 +++++++ .../modules/simple/SimpleObject_IntegTest.java | 156 ++++++++ .../modules/simple/SimpleObjectsIntegTest.java | 146 ------- .../main/resources/archetype-resources/pom.xml | 2 +- .../archetype-resources/webapp/pom.xml | 21 +- .../WEB-INF/authentication_shiro.properties | 28 ++ .../src/main/webapp/WEB-INF/isis.properties | 36 +- .../src/main/webapp/WEB-INF/logging.properties | 23 +- .../WEB-INF/persistor_datanucleus.properties | 3 +- .../src/main/webapp/WEB-INF/translations-en.po | 391 +++++++++++------- .../src/main/webapp/WEB-INF/translations-es.po | 399 ++++++++++++------- .../src/main/webapp/WEB-INF/translations-nl.po | 398 +++++++++++------- .../src/main/webapp/WEB-INF/translations.po | 391 +++++++++++------- .../webapp/WEB-INF/viewer_wicket.properties | 38 +- .../webapp/src/main/webapp/WEB-INF/web.xml | 41 +- .../projects/basic/archetype.properties | 2 +- 40 files changed, 2329 insertions(+), 1145 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/pom.xml ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/pom.xml b/example/archetype/simpleapp/pom.xml index 2195a60..5a9a05c 100644 --- a/example/archetype/simpleapp/pom.xml +++ b/example/archetype/simpleapp/pom.xml @@ -29,14 +29,14 @@ <extension> <groupId>org.apache.maven.archetype</groupId> <artifactId>archetype-packaging</artifactId> - <version>2.4</version> + <version>2.2</version> </extension> </extensions> <pluginManagement> <plugins> <plugin> <artifactId>maven-archetype-plugin</artifactId> - <version>2.4</version> + <version>2.2</version> </plugin> </plugins> </pluginManagement> @@ -44,7 +44,7 @@ <parent> <groupId>org.apache.isis.core</groupId> <artifactId>isis</artifactId> - <version>1.13.0-SNAPSHOT</version> + <version>1.13.0</version> <relativePath>../../../core/pom.xml</relativePath> </parent> </project> http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/META-INF/maven/archetype-metadata.xml ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/META-INF/maven/archetype-metadata.xml b/example/archetype/simpleapp/src/main/resources/META-INF/maven/archetype-metadata.xml index ef9a445..a13adb7 100644 --- a/example/archetype/simpleapp/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/example/archetype/simpleapp/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -61,17 +61,46 @@ </includes> </fileSet> <fileSet filtered="true" encoding="UTF-8"> + <directory>src/main/resources</directory> + <includes> + <include>**/*.xml</include> + </includes> + </fileSet> + <fileSet filtered="true" encoding="UTF-8"> <directory>src/test/java</directory> <includes> <include>**/*.java</include> </includes> </fileSet> <fileSet filtered="true" encoding="UTF-8"> + <directory>gradle/wrapper</directory> + <includes> + <include>**/*.properties</include> + </includes> + </fileSet> + <fileSet encoding="UTF-8"> + <directory>gradle/wrapper</directory> + <includes> + <include>**/*.jar</include> + </includes> + </fileSet> + <fileSet filtered="true" encoding="UTF-8"> <directory/> <includes> <include>log4j.properties</include> </includes> </fileSet> + <fileSet encoding="UTF-8"> + <directory/> + <includes> + <include>.gitignore</include> + <include>build.gradle</include> + <include>gradlew</include> + <include>gradlew.bat</include> + <include>layouts.gradle</include> + <include>liveReload.gradle</include> + </includes> + </fileSet> </fileSets> </module> <module name="${rootArtifactId}-fixture" id="${rootArtifactId}-fixture" dir="fixture"> http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/app/src/main/java/domainapp/app/services/homepage/HomePageViewModel.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/app/src/main/java/domainapp/app/services/homepage/HomePageViewModel.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/app/src/main/java/domainapp/app/services/homepage/HomePageViewModel.java index 5072ea8..2f0b045 100644 --- a/example/archetype/simpleapp/src/main/resources/archetype-resources/app/src/main/java/domainapp/app/services/homepage/HomePageViewModel.java +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/app/src/main/java/domainapp/app/services/homepage/HomePageViewModel.java @@ -27,7 +27,7 @@ import org.apache.isis.applib.annotation.ViewModel; import org.apache.isis.applib.services.i18n.TranslatableString; import domainapp.dom.simple.SimpleObject; -import domainapp.dom.simple.SimpleObjects; +import domainapp.dom.simple.SimpleObjectRepository; @ViewModel public class HomePageViewModel { @@ -41,14 +41,14 @@ public class HomePageViewModel { //region > object (collection) @org.apache.isis.applib.annotation.HomePage public List<SimpleObject> getObjects() { - return simpleObjects.listAll(); + return simpleObjectRepository.listAll(); } //endregion //region > injected services @javax.inject.Inject - SimpleObjects simpleObjects; + SimpleObjectRepository simpleObjectRepository; //endregion } http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/.gitignore ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/.gitignore b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/.gitignore new file mode 100644 index 0000000..cc3e383 --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/.gitignore @@ -0,0 +1,3 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/build.gradle ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/build.gradle b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/build.gradle new file mode 100644 index 0000000..bc75138 --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/build.gradle @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// this gradle script compiles and enhances the dom classes. +// +// The script is intended to be used in conjunction with IntelliJ IDEA, to remove the necessity to run the DataNucleus +// enhancer immediately before running the app, and therefore reduce the turn-around time. The script is run as +// in the background as a daemon while editing/developing; whenever a change is made to any source code, gradle will +// automatically compile *and* enhance the code. +// +// To use, just type: +// +// gradle -t --offline & +// +// It is also necessary to disable the IntelliJ's automatic building of the 'dom' project. This is done using: +// +// File > Settings > Build, Execution, Deployment > Compiler > Excludes +// +// and then exclude the .../dom/src/main/java directory +// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +defaultTasks 'compileJava', 'copyClasses' + +apply plugin: 'java' +apply plugin: 'tangram.tools' + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 +version = (new XmlParser()).parse('pom.xml').parent.version.text() + +buildscript { + repositories { + maven { url "http://oss.jfrog.org/artifactory/oss-snapshot-local" } + jcenter() + } + dependencies { + classpath 'tangram:gradle-plugin:1.1.2' + } +} +repositories { + mavenLocal() + maven { url "http://oss.jfrog.org/artifactory/oss-snapshot-local" } + jcenter() +} +dependencies { + compile group: 'org.apache.isis.core', name: 'isis-core-applib', version: '1.13.0-SNAPSHOT' +} +task copyClasses << { + copy { + from 'build/classes/main' + into 'target/classes' + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradle/wrapper/gradle-wrapper.jar ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradle/wrapper/gradle-wrapper.jar b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..ca78035 Binary files /dev/null and b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradle/wrapper/gradle-wrapper.jar differ http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradle/wrapper/gradle-wrapper.properties ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradle/wrapper/gradle-wrapper.properties b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..cdeb422 --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,9 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +${symbol_pound}Tue May 24 23:14:46 BST 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https${symbol_escape}://services.gradle.org/distributions/gradle-2.13-bin.zip http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradlew ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradlew b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradlew new file mode 100644 index 0000000..27309d9 --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# 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="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +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 + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +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 + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +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 + 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 + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((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" ;; + 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=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradlew.bat ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradlew.bat b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradlew.bat new file mode 100644 index 0000000..832fdb6 --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/gradlew.bat @@ -0,0 +1,90 @@ +@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 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= + +@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 Windows 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 http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/layouts.gradle ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/layouts.gradle b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/layouts.gradle new file mode 100644 index 0000000..f5fa30d --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/layouts.gradle @@ -0,0 +1,49 @@ +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// This gradle script copies over .layout.xml files from src to target directory. +// +// This script is intended to be used while the app is running (in prototype mode), reducing the turn-around time +// when updating the layout. +// +// The framework will automatically notice any changes to .layout.xml files, but these are read from the classpath +// (under target/classes), not the source path. Using IntelliJ (say) these can be copied over manually by invoking +// Run > Reload Changed Classes, and then refreshing the browser. +// +// This script instead is intended to be run in the background as a daemon; whenever a change +// is made to any .layout.xml file, gradle will automatically copy over the file to the target directory. +// +// The script is run using: +// +// gradle -t -b layouts.gradle --offline & +// +// To reduce turn-around time further, also use the liveReload.gradle script (to automatically refresh the browser). +// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +defaultTasks 'copyLayouts' + +task copyLayouts(type:Copy) { + from 'src/main/java' + into 'target/classes' + include '**/*.layout.xml' +} + http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/liveReload.gradle ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/liveReload.gradle b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/liveReload.gradle new file mode 100644 index 0000000..adb0ab1 --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/liveReload.gradle @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// This gradle script sets up livereload, configured so that any updates to the dom module's classpath will +// trigger the browser to reload the page. In particular, this relates to the .layout.xml files which define the +// grid layout of domain objects. +// +// As a prerequisite, the app needs to configured to load the livereload.js script. This can be done by adding the +// following configuration property (to viewer_wicket.properties, isis.properties or the AppManifest, as you prefer): +// +// isis.viewer.wicket.liveReloadUrl=http://localhost:35729/livereload.js?snipver=1 +// +// This gradle script is run using: +// +// gradle -t -b livereload.gradle --offline & +// +// To reduce turn-around time further, also use the layouts.gradle script (to automatically copy over the layout.xml +// files to the classpath). +// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +defaultTasks 'liveReload' + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'org.kordamp.gradle:livereload-gradle-plugin:0.2.1' + } +} + +apply plugin: 'org.kordamp.gradle.livereload' + +liveReload { + docRoot new File('target/classes').canonicalPath +} + http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/DomainAppDomManifest.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/DomainAppDomManifest.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/DomainAppDomManifest.java index 5bc404b..4e840da 100644 --- a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/DomainAppDomManifest.java +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/DomainAppDomManifest.java @@ -36,7 +36,7 @@ public class DomainAppDomManifest implements AppManifest { @Override public List<Class<?>> getModules() { - return Arrays.asList( + return Arrays.<Class<?>>asList( DomainAppDomainModule.class // domain (entities and repositories) ); } http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObject.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObject.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObject.java index 8c4b31c..4d5658f 100644 --- a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObject.java +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObject.java @@ -25,9 +25,10 @@ import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.VersionStrategy; import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.Auditing; import org.apache.isis.applib.annotation.CommandReification; import org.apache.isis.applib.annotation.DomainObject; -import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.Editing; import org.apache.isis.applib.annotation.ParameterLayout; import org.apache.isis.applib.annotation.Property; import org.apache.isis.applib.annotation.Publishing; @@ -35,27 +36,23 @@ import org.apache.isis.applib.annotation.SemanticsOf; import org.apache.isis.applib.services.eventbus.ActionDomainEvent; import org.apache.isis.applib.services.eventbus.PropertyDomainEvent; import org.apache.isis.applib.services.i18n.TranslatableString; +import org.apache.isis.applib.services.message.MessageService; import org.apache.isis.applib.services.repository.RepositoryService; +import org.apache.isis.applib.services.title.TitleService; import org.apache.isis.applib.util.ObjectContracts; @javax.jdo.annotations.PersistenceCapable( identityType=IdentityType.DATASTORE, - schema = "simple", - table = "SimpleObject" + schema = "simple" ) @javax.jdo.annotations.DatastoreIdentity( strategy=javax.jdo.annotations.IdGeneratorStrategy.IDENTITY, column="id") @javax.jdo.annotations.Version( -// strategy=VersionStrategy.VERSION_NUMBER, strategy= VersionStrategy.DATE_TIME, column="version") @javax.jdo.annotations.Queries({ @javax.jdo.annotations.Query( - name = "find", language = "JDOQL", - value = "SELECT " - + "FROM domainapp.dom.simple.SimpleObject "), - @javax.jdo.annotations.Query( name = "findByName", language = "JDOQL", value = "SELECT " + "FROM domainapp.dom.simple.SimpleObject " @@ -63,43 +60,40 @@ import org.apache.isis.applib.util.ObjectContracts; }) @javax.jdo.annotations.Unique(name="SimpleObject_name_UNQ", members = {"name"}) @DomainObject( - publishing = Publishing.ENABLED + publishing = Publishing.ENABLED, + auditing = Auditing.ENABLED ) public class SimpleObject implements Comparable<SimpleObject> { - public static final int NAME_LENGTH = 40; - - + //region > title public TranslatableString title() { return TranslatableString.tr("Object: {name}", "name", getName()); } + //endregion + //region > constructor + public SimpleObject(final String name) { + setName(name); + } + //endregion + //region > name (read-only property) + public static final int NAME_LENGTH = 40; - public static class NameDomainEvent extends PropertyDomainEvent<SimpleObject,String> {} - @javax.jdo.annotations.Column( - allowsNull="false", - length = NAME_LENGTH - ) + @javax.jdo.annotations.Column(allowsNull = "false", length = NAME_LENGTH) + private String name; @Property( - command = CommandReification.ENABLED, - publishing = Publishing.ENABLED, - domainEvent = NameDomainEvent.class + editing = Editing.DISABLED ) - private String name; public String getName() { return name; } public void setName(final String name) { this.name = name; } + //endregion - public TranslatableString validateName(final String name) { - return name != null && name.contains("!")? TranslatableString.tr("Exclamation mark is not allowed"): null; - } - - - + //region > updateName (action) public static class UpdateNameDomainEvent extends ActionDomainEvent<SimpleObject> {} @Action( command = CommandReification.ENABLED, @@ -107,7 +101,6 @@ public class SimpleObject implements Comparable<SimpleObject> { semantics = SemanticsOf.IDEMPOTENT, domainEvent = UpdateNameDomainEvent.class ) - @MemberOrder(name="name", sequence = "1") // associate with 'name' property public SimpleObject updateName(@ParameterLayout(named="Name") final String name) { setName(name); return this; @@ -116,30 +109,56 @@ public class SimpleObject implements Comparable<SimpleObject> { return getName(); } public TranslatableString validate0UpdateName(final String name) { - return validateName(name); + return name != null && name.contains("!")? TranslatableString.tr("Exclamation mark is not allowed"): null; } + //endregion + //region > notes (editable property) + public static final int NOTES_LENGTH = 4000; - - public static class DeleteDomainEvent extends ActionDomainEvent<SimpleObject> {} - @Action( - domainEvent = DeleteDomainEvent.class, - semantics = SemanticsOf.NON_IDEMPOTENT_ARE_YOU_SURE + public static class NotesDomainEvent extends PropertyDomainEvent<SimpleObject,String> {} + @javax.jdo.annotations.Column( + allowsNull="true", + length = NOTES_LENGTH + ) + private String notes; + @Property( + command = CommandReification.ENABLED, + publishing = Publishing.ENABLED, + domainEvent = NotesDomainEvent.class ) - public void delete() { - repositoryService.remove(this); + public String getNotes() { + return notes; } + public void setNotes(final String notes) { + this.notes = notes; + } + //endregion - - + //region > toString, compareTo + @Override + public String toString() { + return ObjectContracts.toString(this, "name"); + } @Override public int compareTo(final SimpleObject other) { return ObjectContracts.compare(this, other, "name"); } + //endregion + + //region > injected dependencies @javax.inject.Inject RepositoryService repositoryService; + @javax.inject.Inject + TitleService titleService; + + @javax.inject.Inject + MessageService messageService; + + //endregion + } http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml index 7dd3383..963c3e3 100644 --- a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml @@ -35,7 +35,10 @@ <bs3:col span="12"> <c:fieldSet name="Name"> <c:action id="delete"/> - <c:property id="name" namedEscaped="true"/> + <c:property id="name" namedEscaped="true"> + <c:action id="updateName"/> + </c:property> + <c:property id="notes" namedEscaped="true" multiLine="10" hidden="ALL_TABLES"/> </c:fieldSet> </bs3:col> </bs3:row> http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjectMenu.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjectMenu.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjectMenu.java new file mode 100644 index 0000000..b582cab --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjectMenu.java @@ -0,0 +1,80 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package domainapp.dom.simple; + +import java.util.List; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.BookmarkPolicy; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.DomainServiceLayout; +import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.NatureOfService; +import org.apache.isis.applib.annotation.ParameterLayout; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.services.eventbus.ActionDomainEvent; + +@DomainService( + nature = NatureOfService.VIEW_MENU_ONLY, + repositoryFor = SimpleObject.class +) +@DomainServiceLayout( + named = "Simple Objects", + menuOrder = "10" +) +public class SimpleObjectMenu { + + + @Action(semantics = SemanticsOf.SAFE) + @ActionLayout(bookmarking = BookmarkPolicy.AS_ROOT) + @MemberOrder(sequence = "1") + public List<SimpleObject> listAll() { + return simpleObjectRepository.listAll(); + } + + + @Action(semantics = SemanticsOf.SAFE) + @ActionLayout(bookmarking = BookmarkPolicy.AS_ROOT) + @MemberOrder(sequence = "2") + public List<SimpleObject> findByName( + @ParameterLayout(named="Name") + final String name + ) { + return simpleObjectRepository.findByName(name); + } + + + public static class CreateDomainEvent extends ActionDomainEvent<SimpleObjectMenu> {} + @Action(domainEvent = CreateDomainEvent.class) + @MemberOrder(sequence = "3") + public SimpleObject create( + @ParameterLayout(named="Name") + final String name) { + return simpleObjectRepository.create(name); + } + + + @javax.inject.Inject + SimpleObjectRepository simpleObjectRepository; + +} http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjectRepository.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjectRepository.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjectRepository.java new file mode 100644 index 0000000..a3978e4 --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjectRepository.java @@ -0,0 +1,61 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package domainapp.dom.simple; + +import java.util.List; + +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.NatureOfService; +import org.apache.isis.applib.query.QueryDefault; +import org.apache.isis.applib.services.registry.ServiceRegistry2; +import org.apache.isis.applib.services.repository.RepositoryService; + +@DomainService( + nature = NatureOfService.DOMAIN, + repositoryFor = SimpleObject.class +) +public class SimpleObjectRepository { + + public List<SimpleObject> listAll() { + return repositoryService.allInstances(SimpleObject.class); + } + + public List<SimpleObject> findByName(final String name) { + return repositoryService.allMatches( + new QueryDefault<>( + SimpleObject.class, + "findByName", + "name", name)); + } + + public SimpleObject create(final String name) { + final SimpleObject object = new SimpleObject(name); + serviceRegistry.injectServicesInto(object); + repositoryService.persist(object); + return object; + } + + @javax.inject.Inject + RepositoryService repositoryService; + @javax.inject.Inject + ServiceRegistry2 serviceRegistry; +} http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjects.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjects.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjects.java deleted file mode 100644 index e7f2725..0000000 --- a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/main/java/domainapp/dom/simple/SimpleObjects.java +++ /dev/null @@ -1,115 +0,0 @@ -#set( $symbol_pound = '#' ) -#set( $symbol_dollar = '$' ) -#set( $symbol_escape = '\' ) -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package domainapp.dom.simple; - -import java.util.List; - -import org.apache.isis.applib.annotation.Action; -import org.apache.isis.applib.annotation.ActionLayout; -import org.apache.isis.applib.annotation.BookmarkPolicy; -import org.apache.isis.applib.annotation.DomainService; -import org.apache.isis.applib.annotation.DomainServiceLayout; -import org.apache.isis.applib.annotation.MemberOrder; -import org.apache.isis.applib.annotation.NatureOfService; -import org.apache.isis.applib.annotation.ParameterLayout; -import org.apache.isis.applib.annotation.SemanticsOf; -import org.apache.isis.applib.query.QueryDefault; -import org.apache.isis.applib.services.eventbus.ActionDomainEvent; -import org.apache.isis.applib.services.i18n.TranslatableString; -import org.apache.isis.applib.services.repository.RepositoryService; - -@DomainService( - nature = NatureOfService.VIEW, - repositoryFor = SimpleObject.class -) -@DomainServiceLayout( - menuOrder = "10" -) -public class SimpleObjects { - - //region > title - public TranslatableString title() { - return TranslatableString.tr("Simple Objects"); - } - //endregion - - //region > listAll (action) - public static class ListAllEvent extends ActionDomainEvent<SimpleObjects> {} - @Action( - semantics = SemanticsOf.SAFE, - domainEvent = ListAllEvent.class - ) - @ActionLayout( - bookmarking = BookmarkPolicy.AS_ROOT - ) - @MemberOrder(sequence = "1") - public List<SimpleObject> listAll() { - return repositoryService.allInstances(SimpleObject.class); - } - //endregion - - //region > findByName (action) - public static class FindByNameEvent extends ActionDomainEvent<SimpleObjects> {} - @Action( - semantics = SemanticsOf.SAFE, - domainEvent = FindByNameEvent.class - ) - @ActionLayout( - bookmarking = BookmarkPolicy.AS_ROOT - ) - @MemberOrder(sequence = "2") - public List<SimpleObject> findByName( - @ParameterLayout(named="Name") - final String name - ) { - return repositoryService.allMatches( - new QueryDefault<>( - SimpleObject.class, - "findByName", - "name", name)); - } - //endregion - - //region > create (action) - public static class CreateDomainEvent extends ActionDomainEvent<SimpleObjects> {} - @Action( - domainEvent = CreateDomainEvent.class - ) - @MemberOrder(sequence = "3") - public SimpleObject create( - @ParameterLayout(named="Name") - final String name) { - final SimpleObject obj = repositoryService.instantiate(SimpleObject.class); - obj.setName(name); - repositoryService.persist(obj); - return obj; - } - - //endregion - - //region > injected services - - @javax.inject.Inject - RepositoryService repositoryService; - - //endregion -} http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/test/java/domainapp/dom/simple/SimpleObjectRepositoryTest.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/test/java/domainapp/dom/simple/SimpleObjectRepositoryTest.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/test/java/domainapp/dom/simple/SimpleObjectRepositoryTest.java new file mode 100644 index 0000000..0cfe9e1 --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/test/java/domainapp/dom/simple/SimpleObjectRepositoryTest.java @@ -0,0 +1,128 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package domainapp.dom.simple; + +import java.util.List; + +import com.google.common.collect.Lists; + +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; +import org.jmock.Expectations; +import org.jmock.Sequence; +import org.jmock.auto.Mock; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import org.apache.isis.applib.services.registry.ServiceRegistry2; +import org.apache.isis.applib.services.repository.RepositoryService; +import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2; +import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SimpleObjectRepositoryTest { + + @Rule + public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES); + + @Mock + ServiceRegistry2 mockServiceRegistry; + + @Mock + RepositoryService mockRepositoryService; + + SimpleObjectRepository simpleObjectRepository; + + @Before + public void setUp() throws Exception { + simpleObjectRepository = new SimpleObjectRepository(); + simpleObjectRepository.repositoryService = mockRepositoryService; + simpleObjectRepository.serviceRegistry = mockServiceRegistry; + } + + public static class Create extends SimpleObjectRepositoryTest { + + @Test + public void happyCase() throws Exception { + + final String someName = "Foobar"; + + // given + final Sequence seq = context.sequence("create"); + context.checking(new Expectations() { + { + oneOf(mockServiceRegistry).injectServicesInto(with(any(SimpleObject.class))); + inSequence(seq); + + oneOf(mockRepositoryService).persist(with(nameOf(someName))); + inSequence(seq); + } + + }); + + // when + final SimpleObject obj = simpleObjectRepository.create(someName); + + // then + assertThat(obj).isNotNull(); + assertThat(obj.getName()).isEqualTo(someName); + } + + private static Matcher<SimpleObject> nameOf(final String name) { + return new TypeSafeMatcher<SimpleObject>() { + @Override + protected boolean matchesSafely(final SimpleObject item) { + return name.equals(item.getName()); + } + + @Override + public void describeTo(final Description description) { + description.appendText("has name of '" + name + "'"); + } + }; + } + } + + public static class ListAll extends SimpleObjectRepositoryTest { + + @Test + public void happyCase() throws Exception { + + // given + final List<SimpleObject> all = Lists.newArrayList(); + + context.checking(new Expectations() { + { + oneOf(mockRepositoryService).allInstances(SimpleObject.class); + will(returnValue(all)); + } + }); + + // when + final List<SimpleObject> list = simpleObjectRepository.listAll(); + + // then + assertThat(list).isEqualTo(all); + } + } +} http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/test/java/domainapp/dom/simple/SimpleObjectsTest.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/test/java/domainapp/dom/simple/SimpleObjectsTest.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/test/java/domainapp/dom/simple/SimpleObjectsTest.java deleted file mode 100644 index 692029e..0000000 --- a/example/archetype/simpleapp/src/main/resources/archetype-resources/dom/src/test/java/domainapp/dom/simple/SimpleObjectsTest.java +++ /dev/null @@ -1,107 +0,0 @@ -#set( $symbol_pound = '#' ) -#set( $symbol_dollar = '$' ) -#set( $symbol_escape = '\' ) -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package domainapp.dom.simple; - -import java.util.List; - -import com.google.common.collect.Lists; - -import org.jmock.Expectations; -import org.jmock.Sequence; -import org.jmock.auto.Mock; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; - -import org.apache.isis.applib.services.repository.RepositoryService; -import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2; -import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode; - -import static org.assertj.core.api.Assertions.assertThat; - -public class SimpleObjectsTest { - - @Rule - public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES); - - @Mock - RepositoryService mockRepositoryService; - - SimpleObjects simpleObjects; - - @Before - public void setUp() throws Exception { - simpleObjects = new SimpleObjects(); - simpleObjects.repositoryService = mockRepositoryService; - } - - public static class Create extends SimpleObjectsTest { - - @Test - public void happyCase() throws Exception { - - // given - final SimpleObject simpleObject = new SimpleObject(); - - final Sequence seq = context.sequence("create"); - context.checking(new Expectations() { - { - oneOf(mockRepositoryService).instantiate(SimpleObject.class); - inSequence(seq); - will(returnValue(simpleObject)); - - oneOf(mockRepositoryService).persist(simpleObject); - inSequence(seq); - } - }); - - // when - final SimpleObject obj = simpleObjects.create("Foobar"); - - // then - assertThat(obj).isEqualTo(simpleObject); - assertThat(obj.getName()).isEqualTo("Foobar"); - } - - } - - public static class ListAll extends SimpleObjectsTest { - - @Test - public void happyCase() throws Exception { - - // given - final List<SimpleObject> all = Lists.newArrayList(); - - context.checking(new Expectations() { - { - oneOf(mockRepositoryService).allInstances(SimpleObject.class); - will(returnValue(all)); - } - }); - - // when - final List<SimpleObject> list = simpleObjects.listAll(); - - // then - assertThat(list).isEqualTo(all); - } - } -} http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/fixture/src/main/java/domainapp/fixture/dom/simple/SimpleObjectCreate.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/fixture/src/main/java/domainapp/fixture/dom/simple/SimpleObjectCreate.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/fixture/src/main/java/domainapp/fixture/dom/simple/SimpleObjectCreate.java index 7db9a63..fa18669 100644 --- a/example/archetype/simpleapp/src/main/resources/archetype-resources/fixture/src/main/java/domainapp/fixture/dom/simple/SimpleObjectCreate.java +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/fixture/src/main/java/domainapp/fixture/dom/simple/SimpleObjectCreate.java @@ -25,7 +25,7 @@ package domainapp.fixture.dom.simple; import org.apache.isis.applib.fixturescripts.FixtureScript; import domainapp.dom.simple.SimpleObject; -import domainapp.dom.simple.SimpleObjects; +import domainapp.dom.simple.SimpleObjectMenu; public class SimpleObjectCreate extends FixtureScript { @@ -62,13 +62,13 @@ public class SimpleObjectCreate extends FixtureScript { String name = checkParam("name", ec, String.class); - this.simpleObject = wrap(simpleObjects).create(name); + this.simpleObject = wrap(simpleObjectMenu).create(name); // also make available to UI ec.addResult(this, simpleObject); } @javax.inject.Inject - private SimpleObjects simpleObjects; + private SimpleObjectMenu simpleObjectMenu; } http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/fixture/src/main/java/domainapp/fixture/scenarios/RecreateSimpleObjects.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/fixture/src/main/java/domainapp/fixture/scenarios/RecreateSimpleObjects.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/fixture/src/main/java/domainapp/fixture/scenarios/RecreateSimpleObjects.java index f653a0d..7ef8da1 100644 --- a/example/archetype/simpleapp/src/main/resources/archetype-resources/fixture/src/main/java/domainapp/fixture/scenarios/RecreateSimpleObjects.java +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/fixture/src/main/java/domainapp/fixture/scenarios/RecreateSimpleObjects.java @@ -28,6 +28,7 @@ import java.util.List; import com.google.common.collect.Lists; +import org.apache.isis.applib.annotation.Programmatic; import org.apache.isis.applib.fixturescripts.FixtureScript; import domainapp.dom.simple.SimpleObject; @@ -65,6 +66,7 @@ public class RecreateSimpleObjects extends FixtureScript { /** * The simpleobjects created by this fixture (output). */ + @Programmatic public List<SimpleObject> getSimpleObjects() { return simpleObjects; } http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/bootstrap/DomainAppSystemInitializer.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/bootstrap/DomainAppSystemInitializer.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/bootstrap/DomainAppSystemInitializer.java index 620be6a..c4ca09f 100644 --- a/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/bootstrap/DomainAppSystemInitializer.java +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/bootstrap/DomainAppSystemInitializer.java @@ -21,8 +21,11 @@ */ package domainapp.integtests.bootstrap; +import java.util.Map; + +import com.google.common.collect.Maps; + import org.apache.isis.core.integtestsupport.IsisSystemForTest; -import org.apache.isis.objectstore.jdo.datanucleus.IsisConfigurationForJdoIntegTests; import domainapp.app.DomainAppAppManifest; @@ -33,8 +36,16 @@ public class DomainAppSystemInitializer { if(isft == null) { isft = new IsisSystemForTest.Builder() .withLoggingAt(org.apache.log4j.Level.INFO) - .with(new DomainAppAppManifest()) - .with(new IsisConfigurationForJdoIntegTests()) + .with(new DomainAppAppManifest() { + @Override + public Map<String, String> getConfigurationProperties() { + final Map<String, String> map = Maps.newHashMap(); + Util.withJavaxJdoRunInMemoryProperties(map); + Util.withDataNucleusProperties(map); + Util.withIsisIntegTestProperties(map); + return map; + } + }) .build(); isft.setUpSystem(); IsisSystemForTest.set(isft); http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/specglue/modules/simple/SimpleObjectGlue.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/specglue/modules/simple/SimpleObjectGlue.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/specglue/modules/simple/SimpleObjectGlue.java index 0e8afa4..85ad8bc 100644 --- a/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/specglue/modules/simple/SimpleObjectGlue.java +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/specglue/modules/simple/SimpleObjectGlue.java @@ -27,7 +27,7 @@ import org.apache.isis.core.specsupport.specs.CukeGlueAbstract; import cucumber.api.java.en.Given; import cucumber.api.java.en.When; import domainapp.dom.simple.SimpleObject; -import domainapp.dom.simple.SimpleObjects; +import domainapp.dom.simple.SimpleObjectMenu; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -36,7 +36,7 @@ public class SimpleObjectGlue extends CukeGlueAbstract { @Given("^there are.* (${symbol_escape}${symbol_escape}d+) simple objects${symbol_dollar}") public void there_are_N_simple_objects(int n) throws Throwable { try { - final List<SimpleObject> findAll = service(SimpleObjects.class).listAll(); + final List<SimpleObject> findAll = service(SimpleObjectMenu.class).listAll(); assertThat(findAll.size(), is(n)); putVar("list", "all", findAll); @@ -47,7 +47,7 @@ public class SimpleObjectGlue extends CukeGlueAbstract { @When("^I create a new simple object${symbol_dollar}") public void I_create_a_new_simple_object() throws Throwable { - service(SimpleObjects.class).create(UUID.randomUUID().toString()); + service(SimpleObjectMenu.class).create(UUID.randomUUID().toString()); } } http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectIntegTest.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectIntegTest.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectIntegTest.java deleted file mode 100644 index 9f02af6..0000000 --- a/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectIntegTest.java +++ /dev/null @@ -1,142 +0,0 @@ -#set( $symbol_pound = '#' ) -#set( $symbol_dollar = '$' ) -#set( $symbol_escape = '\' ) -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package domainapp.integtests.tests.modules.simple; - -import java.sql.Timestamp; - -import javax.inject.Inject; - -import org.junit.Before; -import org.junit.Test; - -import org.apache.isis.applib.DomainObjectContainer; -import org.apache.isis.applib.fixturescripts.FixtureScripts; -import org.apache.isis.applib.services.wrapper.InvalidException; -import org.apache.isis.core.metamodel.services.jdosupport.Persistable_datanucleusIdLong; -import org.apache.isis.core.metamodel.services.jdosupport.Persistable_datanucleusVersionTimestamp; - -import domainapp.dom.simple.SimpleObject; -import domainapp.fixture.scenarios.RecreateSimpleObjects; -import domainapp.integtests.tests.DomainAppIntegTest; -import static org.assertj.core.api.Assertions.assertThat; - -public class SimpleObjectIntegTest extends DomainAppIntegTest { - - @Inject - FixtureScripts fixtureScripts; - - RecreateSimpleObjects fs; - SimpleObject simpleObjectPojo; - SimpleObject simpleObjectWrapped; - - @Before - public void setUp() throws Exception { - // given - fs = new RecreateSimpleObjects().setNumber(1); - fixtureScripts.runFixtureScript(fs, null); - - simpleObjectPojo = fs.getSimpleObjects().get(0); - - assertThat(simpleObjectPojo).isNotNull(); - simpleObjectWrapped = wrap(simpleObjectPojo); - } - - public static class Name extends SimpleObjectIntegTest { - - @Test - public void accessible() throws Exception { - // when - final String name = simpleObjectWrapped.getName(); - // then - assertThat(name).isEqualTo(fs.NAMES.get(0)); - } - - } - - public static class UpdateName extends SimpleObjectIntegTest { - - @Test - public void canBeUpdatedDirectly() throws Exception { - - // when - simpleObjectWrapped.setName("new name"); - - // then - assertThat(simpleObjectWrapped.getName()).isEqualTo("new name"); - } - - @Test - public void failsValidation() throws Exception { - - // expect - expectedExceptions.expect(InvalidException.class); - expectedExceptions.expectMessage("Exclamation mark is not allowed"); - - // when - simpleObjectWrapped.setName("new name!"); - } - } - - - public static class Title extends SimpleObjectIntegTest { - - @Inject - DomainObjectContainer container; - - @Test - public void interpolatesName() throws Exception { - - // given - final String name = simpleObjectWrapped.getName(); - - // when - final String title = container.titleOf(simpleObjectWrapped); - - // then - assertThat(title).isEqualTo("Object: " + name); - } - } - - public static class DataNucleusId extends SimpleObjectIntegTest { - - @Test - public void shouldBePopulated() throws Exception { - // when - final Long id = mixin(Persistable_datanucleusIdLong.class, simpleObjectPojo).${symbol_dollar}${symbol_dollar}(); - // then - assertThat(id).isGreaterThanOrEqualTo(0); - } - } - - public static class DataNucleusVersionTimestamp extends SimpleObjectIntegTest { - - @Test - public void shouldBePopulated() throws Exception { - // when - final Timestamp timestamp = mixin(Persistable_datanucleusVersionTimestamp.class, simpleObjectPojo).${symbol_dollar}${symbol_dollar}(); - // then - assertThat(timestamp).isNotNull(); - } - } - - -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectMenu_IntegTest.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectMenu_IntegTest.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectMenu_IntegTest.java new file mode 100644 index 0000000..6be30ff --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObjectMenu_IntegTest.java @@ -0,0 +1,149 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package domainapp.integtests.tests.modules.simple; + +import java.sql.SQLIntegrityConstraintViolationException; +import java.util.List; + +import javax.inject.Inject; + +import com.google.common.base.Throwables; + +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; +import org.junit.Test; + +import org.apache.isis.applib.fixturescripts.FixtureScript; +import org.apache.isis.applib.fixturescripts.FixtureScripts; +import org.apache.isis.applib.services.xactn.TransactionService; + +import domainapp.dom.simple.SimpleObject; +import domainapp.dom.simple.SimpleObjectMenu; +import domainapp.fixture.dom.simple.SimpleObjectsTearDown; +import domainapp.fixture.scenarios.RecreateSimpleObjects; +import domainapp.integtests.tests.DomainAppIntegTest; +import static org.assertj.core.api.Assertions.assertThat; + +public class SimpleObjectMenu_IntegTest extends DomainAppIntegTest { + + @Inject + FixtureScripts fixtureScripts; + @Inject + TransactionService transactionService; + @Inject + SimpleObjectMenu menu; + + public static class ListAll extends SimpleObjectMenu_IntegTest { + + @Test + public void happyCase() throws Exception { + + // given + RecreateSimpleObjects fs = new RecreateSimpleObjects(); + fixtureScripts.runFixtureScript(fs, null); + transactionService.nextTransaction(); + + // when + final List<SimpleObject> all = wrap(menu).listAll(); + + // then + assertThat(all).hasSize(fs.getSimpleObjects().size()); + + SimpleObject simpleObject = wrap(all.get(0)); + assertThat(simpleObject.getName()).isEqualTo(fs.getSimpleObjects().get(0).getName()); + } + + @Test + public void whenNone() throws Exception { + + // given + FixtureScript fs = new SimpleObjectsTearDown(); + fixtureScripts.runFixtureScript(fs, null); + transactionService.nextTransaction(); + + // when + final List<SimpleObject> all = wrap(menu).listAll(); + + // then + assertThat(all).hasSize(0); + } + } + + public static class Create extends SimpleObjectMenu_IntegTest { + + @Test + public void happyCase() throws Exception { + + // given + FixtureScript fs = new SimpleObjectsTearDown(); + fixtureScripts.runFixtureScript(fs, null); + transactionService.nextTransaction(); + + // when + wrap(menu).create("Faz"); + + // then + final List<SimpleObject> all = wrap(menu).listAll(); + assertThat(all).hasSize(1); + } + + @Test + public void whenAlreadyExists() throws Exception { + + // given + FixtureScript fs = new SimpleObjectsTearDown(); + fixtureScripts.runFixtureScript(fs, null); + transactionService.nextTransaction(); + wrap(menu).create("Faz"); + transactionService.nextTransaction(); + + // then + expectedExceptions.expectCause(causalChainContains(SQLIntegrityConstraintViolationException.class)); + + // when + wrap(menu).create("Faz"); + transactionService.nextTransaction(); + } + + private static Matcher<? extends Throwable> causalChainContains(final Class<?> cls) { + return new TypeSafeMatcher<Throwable>() { + @Override + protected boolean matchesSafely(Throwable item) { + final List<Throwable> causalChain = Throwables.getCausalChain(item); + for (Throwable throwable : causalChain) { + if(cls.isAssignableFrom(throwable.getClass())){ + return true; + } + } + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("exception with causal chain containing " + cls.getSimpleName()); + } + }; + } + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/58eb2cd5/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObject_IntegTest.java ---------------------------------------------------------------------- diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObject_IntegTest.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObject_IntegTest.java new file mode 100644 index 0000000..26d83ab --- /dev/null +++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/integtests/src/test/java/domainapp/integtests/tests/modules/simple/SimpleObject_IntegTest.java @@ -0,0 +1,156 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package domainapp.integtests.tests.modules.simple; + +import java.sql.Timestamp; + +import javax.inject.Inject; + +import org.junit.Before; +import org.junit.Test; + +import org.apache.isis.applib.fixturescripts.FixtureScripts; +import org.apache.isis.applib.services.title.TitleService; +import org.apache.isis.applib.services.wrapper.DisabledException; +import org.apache.isis.applib.services.wrapper.InvalidException; +import org.apache.isis.applib.services.xactn.TransactionService; +import org.apache.isis.core.metamodel.services.jdosupport.Persistable_datanucleusIdLong; +import org.apache.isis.core.metamodel.services.jdosupport.Persistable_datanucleusVersionTimestamp; + +import domainapp.dom.simple.SimpleObject; +import domainapp.fixture.scenarios.RecreateSimpleObjects; +import domainapp.integtests.tests.DomainAppIntegTest; +import static org.assertj.core.api.Assertions.assertThat; + +public class SimpleObject_IntegTest extends DomainAppIntegTest { + + @Inject + FixtureScripts fixtureScripts; + @Inject + TransactionService transactionService; + + SimpleObject simpleObject; + + @Before + public void setUp() throws Exception { + // given + RecreateSimpleObjects fs = new RecreateSimpleObjects().setNumber(1); + fixtureScripts.runFixtureScript(fs, null); + transactionService.nextTransaction(); + + simpleObject = fs.getSimpleObjects().get(0); + + assertThat(simpleObject).isNotNull(); + } + + public static class Name extends SimpleObject_IntegTest { + + @Test + public void accessible() throws Exception { + // when + final String name = wrap(simpleObject).getName(); + + // then + assertThat(name).isEqualTo(simpleObject.getName()); + } + + @Test + public void not_editable() throws Exception { + // expect + expectedExceptions.expect(DisabledException.class); + + // when + wrap(simpleObject).setName("new name"); + } + + } + + public static class UpdateName extends SimpleObject_IntegTest { + + @Test + public void can_be_updated_directly() throws Exception { + + // when + wrap(simpleObject).updateName("new name"); + transactionService.nextTransaction(); + + // then + assertThat(wrap(simpleObject).getName()).isEqualTo("new name"); + } + + @Test + public void failsValidation() throws Exception { + + // expect + expectedExceptions.expect(InvalidException.class); + expectedExceptions.expectMessage("Exclamation mark is not allowed"); + + // when + wrap(simpleObject).updateName("new name!"); + } + } + + + public static class Title extends SimpleObject_IntegTest { + + @Inject + TitleService titleService; + + @Test + public void interpolatesName() throws Exception { + + // given + final String name = wrap(simpleObject).getName(); + + // when + final String title = titleService.titleOf(simpleObject); + + // then + assertThat(title).isEqualTo("Object: " + name); + } + } + + public static class DataNucleusId extends SimpleObject_IntegTest { + + @Test + public void should_be_populated() throws Exception { + // when + final Long id = mixin(Persistable_datanucleusIdLong.class, simpleObject).${symbol_dollar}${symbol_dollar}(); + + // then + assertThat(id).isGreaterThanOrEqualTo(0); + } + } + + public static class DataNucleusVersionTimestamp extends SimpleObject_IntegTest { + + @Test + public void should_be_populated() throws Exception { + // when + final Timestamp timestamp = mixin(Persistable_datanucleusVersionTimestamp.class, simpleObject).${symbol_dollar}${symbol_dollar}(); + // then + assertThat(timestamp).isNotNull(); + } + } + + +} \ No newline at end of file