Bug 492167 - Adds Virgo recipe "Serving Web Content with Spring MVC"
diff --git a/recipe-serving-web-content/.gitignore b/recipe-serving-web-content/.gitignore
new file mode 100644
index 0000000..5fb40ad
--- /dev/null
+++ b/recipe-serving-web-content/.gitignore
@@ -0,0 +1 @@
+**/META-INF/MANIFEST.MF
diff --git a/recipe-serving-web-content/build-slides.gradle b/recipe-serving-web-content/build-slides.gradle
new file mode 100644
index 0000000..c70f6ed
--- /dev/null
+++ b/recipe-serving-web-content/build-slides.gradle
@@ -0,0 +1,106 @@
+buildscript {
+ dependencies {
+ classpath 'org.ysb33r.gradle:vfs-gradle-plugin:1.0-beta8'
+ classpath 'commons-httpclient:commons-httpclient:3.1'
+ }
+}
+
+plugins {
+ id 'org.asciidoctor.convert' version '1.5.3'
+ id 'com.github.jruby-gradle.base' version '1.2.1'
+}
+
+apply plugin: 'com.github.jruby-gradle.base'
+apply plugin: 'org.ysb33r.vfs'
+apply plugin: 'java'
+apply plugin: 'org.asciidoctor.convert'
+
+version = '1.0.0-SNAPSHOT'
+
+ext {
+ revealjsVersion = '3.2.0'
+ asciidoctorBackendVersion = 'master'
+ downloadDir = new File(buildDir,'download')
+ templateDir = new File(downloadDir,'templates')
+ revealjsDir = new File(downloadDir,'reveal.js')
+}
+
+repositories {
+ jcenter()
+}
+
+dependencies {
+ gems 'rubygems:slim:3.0.6'
+ gems 'rubygems:thread_safe:0.3.5'
+}
+
+task download << {
+ mkdir downloadDir
+ vfs {
+ cp "zip:https://github.com/asciidoctor/asciidoctor-reveal.js/archive/${asciidoctorBackendVersion}.zip!asciidoctor-reveal.js-${asciidoctorBackendVersion}",
+ templateDir, recursive:true, overwrite:true
+ cp "zip:https://github.com/hakimel/reveal.js/archive/${revealjsVersion}.zip!reveal.js-${revealjsVersion}",
+ revealjsDir, recursive:true, overwrite:true
+ }
+}
+
+download {
+ description "Download extra revealjs resources"
+ outputs.dir templateDir
+ outputs.dir revealjsDir
+}
+
+asciidoctorj {
+ version = '1.5.4'
+}
+
+task('mergeClassesAndResources', type: Copy, dependsOn: 'compileJava') {
+ ext.bundlorInputPath = new File(buildDir, 'asciidoc-sourcedir')
+ inputs.file sourceSets.main.output.classesDir
+ inputs.file sourceSets.main.resources
+ outputs.dir ext.bundlorInputPath
+ from sourceSets.main.output.classesDir
+ from sourceSets.main.resources
+ into ext.bundlorInputPath
+}
+
+asciidoctor {
+
+ dependsOn jrubyPrepare
+
+ sources {
+ include 'recipe-serving-web-content.adoc'
+ }
+
+ resources {
+ from (sourceDir) {
+ include 'images/**'
+ }
+ from (downloadDir) {
+ include 'reveal.js/**'
+ }
+ }
+
+ backends 'revealjs'
+
+ attributes 'build-gradle': file('build-slides.gradle'),
+ 'sourcedir': new File(buildDir, 'asciidoc-sourcedir'),
+ 'endpoint-url': 'http://example.org',
+ 'source-highlighter': 'coderay',
+ 'imagesdir': './images',
+ 'toc': 'left',
+ 'icons': 'font',
+ 'setanchors': '',
+ 'idprefix': '',
+ 'idseparator': '-',
+ 'docinfo1': '',
+ 'revealjs_theme': 'solarized',
+ 'revealjs_transition': 'linear',
+ 'revealjs_history': 'true',
+ 'revealjs_slideNumber': 'true'
+
+ options template_dirs : [new File(templateDir,'templates/slim').absolutePath ]
+
+ dependsOn download
+ dependsOn mergeClassesAndResources
+}
diff --git a/recipe-serving-web-content/build.gradle b/recipe-serving-web-content/build.gradle
new file mode 100644
index 0000000..cf1189b
--- /dev/null
+++ b/recipe-serving-web-content/build.gradle
@@ -0,0 +1,172 @@
+buildscript {
+ repositories {
+ mavenCentral()
+ jcenter()
+ maven {
+ url "https://plugins.gradle.org/m2/"
+ }
+ }
+ dependencies {
+ classpath "gradle.plugin.org.eclipse.virgo.bundlor:bundlor-plugin:0.2"
+ classpath "gradle.plugin.com.eclipsesource.dockerizor:dockerizor:0.6.2"
+ classpath 'org.asciidoctor:asciidoctor-gradle-plugin:1.5.3'
+ }
+}
+
+apply plugin: 'org.asciidoctor.convert'
+
+ext.virgoProjects = [
+ project(':org.eclipse.virgo.samples.recipe.web'),
+]
+
+ext.dockerProjects = [
+ project(':recipe-serving-web-content-runtime'),
+ project(':recipe-serving-web-content-app'),
+]
+
+configure(virgoProjects + dockerProjects) {
+ repositories {
+ mavenLocal()
+ mavenCentral()
+ ivy {
+ url "http://build.eclipse.org/rt/virgo/ivy/bundles/release/"
+ layout "pattern", { artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" }
+ }
+ }
+}
+
+configure(virgoProjects) {
+ apply plugin: 'java'
+ apply plugin: 'eclipse'
+ apply plugin: 'eclipse-wtp'
+
+ version = '0.1.0.BUILD-SNAPSHOT'
+
+ compileJava {
+ options.encoding = 'utf-8'
+ options.fork = true
+ doFirst {
+ options.forkOptions.with {
+ executable = 'java'
+ jvmArgs = [
+ '-cp',
+ configurations.ecj.asPath,
+ 'org.eclipse.jdt.internal.compiler.batch.Main',
+ '-source',
+ '1.8',
+ '-target',
+ '1.8',
+ '-warn:-unused'
+ ]
+ }
+ }
+ }
+
+ compileTestJava {
+ options.encoding = 'utf-8'
+ options.fork = true
+ doFirst {
+ options.forkOptions.with {
+ executable = 'java'
+ jvmArgs = [
+ '-cp',
+ configurations.ecj.asPath,
+ 'org.eclipse.jdt.internal.compiler.batch.Main',
+ '-source',
+ '1.8',
+ '-target',
+ '1.8',
+ '-warn:-unused'
+ ]
+ }
+ }
+ }
+
+ eclipse {
+ jdt {
+ sourceCompatibility = 1.8
+ targetCompatibility = 1.8
+ }
+
+ project {
+ natures 'org.eclipse.virgo.ide.facet.core.bundlenature', 'org.eclipse.wst.common.project.facet.core.nature'
+ }
+
+ wtp {
+ facet {
+ facets = []
+ facet name: 'jst.java', version: '1.8'
+ facet name: 'org.eclipse.virgo.server.bundle', version: '1.0'
+ }
+ }
+ }
+
+ configurations { ecj { } }
+
+ dependencies {
+ ecj group: "org.eclipse.jdt.core.compiler", name: "ecj", version: "4.4.2"
+ }
+}
+
+configure(virgoProjects) {
+ apply plugin: 'org.eclipse.virgo.bundlor'
+
+ task('addProjectVersionToGradlePropertiesTask', type: Copy) {
+ ext.outputDir = new File(buildDir, 'bundlor-properties')
+ inputs.file project.rootProject.file('gradle.properties')
+ outputs.dir ext.outputDir
+ from project.rootProject.file('gradle.properties')
+ into ext.outputDir
+ }
+
+ task('mergeClassesAndResources', type: Copy, dependsOn: 'compileJava') {
+ ext.bundlorInputPath = new File(buildDir, 'bundlor-inputPath')
+ inputs.file sourceSets.main.output.classesDir
+ inputs.file sourceSets.main.resources
+ outputs.dir ext.bundlorInputPath
+ from sourceSets.main.output.classesDir
+ from sourceSets.main.resources
+ into ext.bundlorInputPath
+ }
+
+ project.tasks.'bundlor'.dependsOn('addProjectVersionToGradlePropertiesTask', 'mergeClassesAndResources')
+
+ bundlor {
+ ext.bundlorInputPath = new File(buildDir, 'bundlor-inputPath')
+ project.tasks['bundlor'].inputs.file ext.bundlorInputPath
+ manifestTemplatePath = "template.mf"
+ propertiesPath = new File("${project.buildDir}/bundlor-properties/gradle.properties")
+ inputPath = ext.bundlorInputPath
+ failOnWarnings = false
+ }
+}
+
+configure(dockerProjects) {
+ // add the build task 'clean'
+ apply plugin: 'base'
+
+ // add the build task 'dockerize'
+ apply plugin: 'com.eclipsesource.dockerizor'
+
+ dockerizor {
+ maintainer = 'Florian Waibel <fwaibel@eclipsesource.com>'
+
+ javaImage = 'java:openjdk-8u72-jre'
+
+ virgoVersion = 'latest'
+ hudsonJobName = 'gradle-build'
+
+ createLocalCopy = System.properties['local.build'] == 'true'
+ removeAdminConsole = System.properties['local.build'] != 'true'
+
+ virgoFlavour = 'VTS'
+ virgoVersion = 'latest'
+ }
+
+ dockerize.dependsOn configurations.repositoryExt
+ dockerize.dependsOn configurations.repositoryUsr
+}
+
+task wrapper(type: Wrapper) {
+ gradleVersion = '2.10'
+}
diff --git a/recipe-serving-web-content/create-slides.sh b/recipe-serving-web-content/create-slides.sh
new file mode 100755
index 0000000..de58700
--- /dev/null
+++ b/recipe-serving-web-content/create-slides.sh
@@ -0,0 +1 @@
+./gradlew -b build-slides.gradle asciidoc && open -a "Google Chrome" build/asciidoc/revealjs/recipe-serving-web-content.html
diff --git a/recipe-serving-web-content/gradle.properties b/recipe-serving-web-content/gradle.properties
new file mode 100644
index 0000000..8f2ffa0
--- /dev/null
+++ b/recipe-serving-web-content/gradle.properties
@@ -0,0 +1,6 @@
+springframeworkVersion = 4.2.4.RELEASE
+
+javassistVersion = 3.20.0-GA
+ognlVersion = 3.1.2
+unbescapeVersion = 1.1.2.RELEASE
+thymeleafVersion = 2.1.4.VIRGO
diff --git a/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.jar b/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..2c6137b
--- /dev/null
+++ b/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.properties b/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..53a030c
--- /dev/null
+++ b/recipe-serving-web-content/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 13 11:28:18 CEST 2016
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-bin.zip
diff --git a/recipe-serving-web-content/gradlew b/recipe-serving-web-content/gradlew
new file mode 100755
index 0000000..9d82f78
--- /dev/null
+++ b/recipe-serving-web-content/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# 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
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=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
+ # 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" ] ; 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 "$@"
diff --git a/recipe-serving-web-content/gradlew.bat b/recipe-serving-web-content/gradlew.bat
new file mode 100644
index 0000000..5f19212
--- /dev/null
+++ b/recipe-serving-web-content/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
+
+@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 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
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/build.gradle b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/build.gradle
new file mode 100644
index 0000000..badae20
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/build.gradle
@@ -0,0 +1,11 @@
+dependencies {
+ ecj group: "org.eclipse.jdt.core.compiler", name: "ecj", version: "4.4.2"
+
+ compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion
+ compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.context", version: springframeworkVersion
+ compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.beans", version: springframeworkVersion
+ compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.web", version: springframeworkVersion
+
+ compile group: "org.thymeleaf", name: "thymeleaf", version: thymeleafVersion
+ compile group: "org.thymeleaf", name: "thymeleaf-spring4", version: thymeleafVersion
+}
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/java/org/eclipse/virgo/recipies/web/GreetingController.java b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/java/org/eclipse/virgo/recipies/web/GreetingController.java
new file mode 100644
index 0000000..18a767a
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/java/org/eclipse/virgo/recipies/web/GreetingController.java
@@ -0,0 +1,17 @@
+package org.eclipse.virgo.recipies.web;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Controller
+public class GreetingController {
+
+ @RequestMapping("/")
+ public String greeting(@RequestParam(value="name", required=false, defaultValue="Thymleaf") String name, Model model) {
+ model.addAttribute("name", name);
+ return "greeting";
+ }
+
+}
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/appServlet/servlet-context.xml b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/appServlet/servlet-context.xml
new file mode 100644
index 0000000..1f4894a
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/appServlet/servlet-context.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
+ xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
+
+ <!-- Enables the Spring MVC @Controller programming model -->
+ <mvc:annotation-driven />
+
+ <context:component-scan base-package="org.eclipse.virgo.recipies.web" />
+
+ <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
+ <property name="basename" value="Messages" />
+ </bean>
+
+ <!-- **************************************************************** -->
+ <!-- THYMELEAF-SPECIFIC ARTIFACTS -->
+ <!-- TemplateResolver <- TemplateEngine <- ViewResolver -->
+ <!-- **************************************************************** -->
+
+ <bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
+ <property name="prefix" value="/templates/" />
+ <property name="suffix" value=".html" />
+ <property name="templateMode" value="HTML5" />
+ </bean>
+
+ <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
+ <property name="templateResolver" ref="templateResolver" />
+ </bean>
+
+ <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
+ <property name="order" value="1" />
+ <property name="templateEngine" ref="templateEngine" />
+ </bean>
+
+</beans>
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/root-context.xml b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/root-context.xml
new file mode 100644
index 0000000..8c901ca
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/spring/root-context.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
+
+ <!-- Root Context: defines shared resources visible to all other web components -->
+
+</beans>
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/web.xml b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/web.xml
new file mode 100644
index 0000000..15129c3
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/web.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ version="2.5">
+
+ <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
+ <context-param>
+ <param-name>contextConfigLocation</param-name>
+ <param-value>/WEB-INF/spring/root-context.xml</param-value>
+ </context-param>
+
+ <context-param>
+ <param-name>contextClass</param-name>
+ <param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value>
+ </context-param>
+
+ <!-- Creates the Spring Container shared by all Servlets and Filters -->
+ <listener>
+ <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+ </listener>
+
+ <!-- Processes application requests -->
+ <servlet>
+ <servlet-name>appServlet</servlet-name>
+ <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+ <init-param>
+ <param-name>contextConfigLocation</param-name>
+ <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>appServlet</servlet-name>
+ <url-pattern>/</url-pattern>
+ </servlet-mapping>
+</web-app>
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/templates/greeting.html b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/templates/greeting.html
new file mode 100644
index 0000000..f9465f5
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/src/main/resources/templates/greeting.html
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+ <title>Getting Started: Serving Web Content</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+</head>
+<body>
+ <p th:text="'Hello, ' + ${name} + '!'"></p>
+
+ <p>Please add ?name=<name> to override the default <b>thymeleaf</b></p>
+</body>
+</html>
diff --git a/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/template.mf b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/template.mf
new file mode 100644
index 0000000..a84ac07
--- /dev/null
+++ b/recipe-serving-web-content/org.eclipse.virgo.samples.recipe.web/template.mf
@@ -0,0 +1,31 @@
+Bundle-Version: 0.1
+Bundle-Name: Virgo Recipe Serving Web Content
+Bundle-SymbolicName: org.eclipse.virgo.samples.recipe.web
+Web-ContextPath: /thymeleaf
+Bundle-ClassPath: .
+Import-Package: org.eclipse.virgo.web.dm,
+ org.springframework.web.servlet.config,
+ javax.servlet,
+ javax.servlet.http,
+ org.thymeleaf,
+ org.thymeleaf.templateresolver,
+ org.thymeleaf.spring4,
+ org.thymeleaf.spring4.context,
+ org.thymeleaf.spring4.dialect,
+ org.thymeleaf.spring4.expression,
+ org.thymeleaf.spring4.messageresolver,
+ org.thymeleaf.spring4.naming,
+ org.thymeleaf.spring4.processor.attr,
+ org.thymeleaf.spring4.requestdata,
+ org.thymeleaf.spring4.resourceresolver,
+ org.thymeleaf.spring4.templateresolver,
+ org.thymeleaf.spring4.util,
+ org.thymeleaf.spring4.view
+Import-Bundle: org.springframework.aop,
+ org.springframework.beans,
+ org.springframework.core,
+ org.springframework.context,
+ org.springframework.context.support,
+ org.springframework.expression,
+ org.springframework.web,
+ org.springframework.webmvc
diff --git a/recipe-serving-web-content/recipe-serving-web-content-app/build.gradle b/recipe-serving-web-content/recipe-serving-web-content-app/build.gradle
new file mode 100644
index 0000000..bd035ba
--- /dev/null
+++ b/recipe-serving-web-content/recipe-serving-web-content-app/build.gradle
@@ -0,0 +1,31 @@
+// add the build task 'clean'
+apply plugin: 'base'
+
+// add the build task 'dockerize'
+apply plugin: "com.eclipsesource.dockerizor"
+
+dockerize.dependsOn ':org.eclipse.virgo.samples.recipe.web:build'
+
+dockerizor {
+ repository = 'virgo-recipe/web'
+ description = 'Virgo Recipe Serving Web Content created with Gradle Plugin: com.eclipsesource.dockerizor'
+
+ pickupFiles = ['recipe-serving-web-content.plan']
+
+ virgoHome = '/home/virgo/virgo-recipe-serving-web-content'
+}
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ repositoryExt group: "org.thymeleaf", name: "thymeleaf", version: thymeleafVersion
+ repositoryExt group: "org.thymeleaf", name: "thymeleaf-spring4", version: thymeleafVersion
+
+ repositoryExt group: "org.javassist", name: "javassist", version: javassistVersion
+ repositoryExt group: "org.eclipse.virgo.mirrored", name: "ognl", version: ognlVersion
+ repositoryExt group: "org.unbescape", name: "unbescape", version: unbescapeVersion
+
+ repositoryUsr project(':org.eclipse.virgo.samples.recipe.web')
+}
diff --git a/recipe-serving-web-content/recipe-serving-web-content-app/recipe-serving-web-content.plan b/recipe-serving-web-content/recipe-serving-web-content-app/recipe-serving-web-content.plan
new file mode 100644
index 0000000..01bd0d4
--- /dev/null
+++ b/recipe-serving-web-content/recipe-serving-web-content-app/recipe-serving-web-content.plan
@@ -0,0 +1,9 @@
+<plan name="recipe-serving-web-content" version="0.1" scoped="false" atomic="true"
+ xmlns="http://www.eclipse.org/virgo/schema/plan"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.eclipse.org/virgo/schema/plan
+ http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+ <artifact type="bundle" name="org.eclipse.virgo.samples.recipe.web" version="[0.1, 1)" />
+</plan>
diff --git a/recipe-serving-web-content/recipe-serving-web-content-runtime/build.gradle b/recipe-serving-web-content/recipe-serving-web-content-runtime/build.gradle
new file mode 100644
index 0000000..7c05080
--- /dev/null
+++ b/recipe-serving-web-content/recipe-serving-web-content-runtime/build.gradle
@@ -0,0 +1,25 @@
+// add the build task 'clean'
+apply plugin: 'base'
+
+// add the build task 'dockerize'
+apply plugin: "com.eclipsesource.dockerizor"
+
+dockerizor {
+ repository = 'virgo-recipe/web-runtime'
+ description = 'Virgo Recipe Serving Web Content (runtime-only) created with Gradle Plugin: com.eclipsesource.dockerizor'
+
+ virgoHome = '/home/virgo/virgo-recipe-serving-web-content-runtime'
+}
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ repositoryExt group: "org.thymeleaf", name: "thymeleaf", version: thymeleafVersion
+ repositoryExt group: "org.thymeleaf", name: "thymeleaf-spring4", version: thymeleafVersion
+
+ repositoryExt group: "org.javassist", name: "javassist", version: javassistVersion
+ repositoryExt group: "org.eclipse.virgo.mirrored", name: "ognl", version: ognlVersion
+ repositoryExt group: "org.unbescape", name: "unbescape", version: unbescapeVersion
+}
diff --git a/recipe-serving-web-content/settings.gradle b/recipe-serving-web-content/settings.gradle
new file mode 100644
index 0000000..cd6ed9c
--- /dev/null
+++ b/recipe-serving-web-content/settings.gradle
@@ -0,0 +1 @@
+include 'org.eclipse.virgo.samples.recipe.web', 'recipe-serving-web-content-runtime', 'recipe-serving-web-content-app'
diff --git a/recipe-serving-web-content/src/docs/asciidoc/recipe-serving-web-content.adoc b/recipe-serving-web-content/src/docs/asciidoc/recipe-serving-web-content.adoc
new file mode 100644
index 0000000..96f6456
--- /dev/null
+++ b/recipe-serving-web-content/src/docs/asciidoc/recipe-serving-web-content.adoc
@@ -0,0 +1,102 @@
+:virgo-homepage: https://eclipse.org/virgo
+:guide-short-name: serving-web-content
+:recipe-name: Serving Web Content with Spring MVC
+:recipe-short-name: recipe-{guide-short-name}
+:experimental: true
+
+include::../../../../recipe-template/src/docs/asciidoc/00_title.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/01_acknowledgements.adoc[]
+
+== {recipe-name}
+
+The original guide uses https://projects.spring.io/spring-boot/[Spring Boot] to bootstrap the demo application. This guide shows what needs to be done to serve web content with Virgo.
+
+include::../../../../recipe-template/src/docs/asciidoc/03_shopping-list.adoc[]
+
+include::../../../../recipe-template/src/docs/asciidoc/04_ingredients.adoc[]
+* Spring configuration
+* Web application configuration
+* OSGi manifest
+
+== Preparations
+
+include::../../../../recipe-template/src/docs/asciidoc/051_get-the-code.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/052_create-recipe-runtime.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/053_create-eclipse-project-metadata.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/054_prepare-virgo-tooling.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/055_import-the-code.adoc[]
+include::../../../../recipe-template/src/docs/asciidoc/056_create-new-virgo-server.adoc[]
+
+== Directions
+
+Virgo has no support for Spring's `@EnableAutoConfiguration`, so you have to be more explicit than in the Spring Boot version of this guide - after all, Virgo is an OSGi runtime and every bundle needs to declare its needs in the `META-INF/MANIFEST.MF`.
+
+Basically, you have to specify necessary dependencies (via `Import-Package` or `Import-Bundle` headers) and the `Web-ContextPath` the REST service application wants to be published on.
+
+=== The Manifest template
+
+.template.mf
+[source,txt]
+----
+include::../../../org.eclipse.virgo.samples.recipe.web/template.mf[]
+----
+
+You can mix and match the Virgo specific header `Import-Bundle` and OSGi standard header `Import-Package`.
+
+=== Compatibility
+
+In the sample the fine-tuning of the `MANIFEST.MF` is done within the `template.mf`.
+
+[NOTE]
+--
+If you intend to run your bundles in different OSGi containers you have to limit yourself to the OSGi standard headers.
+--
+
+=== The web.xml configuration
+
+Next step is to configure the servlet container via
+
+.WEB-INF/web.xml
+[source,xml]
+----
+include::../../../org.eclipse.virgo.samples.recipe.web/src/main/resources/WEB-INF/web.xml[]
+----
+
+=== closer look at web.xml
+
+[CAUTION]
+--
+The most important parameter is the `contextClass`
+--
+
+It's *not* the default from the Spring Framework, but Virgo's `ServerOsgiBundleXmlWebApplicationContext`.
+
+[source,xml]
+----
+<context-param>
+ <param-name>contextClass</param-name>
+ <param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value>
+</context-param>
+----
+
+== Let's taste
+
+Start the Virgo server inside the Springsource Tool Suite to appreciate what you build.
+With `curl` and the command line simply run the following command within the project's directory:
+
+[source,sh]
+----
+$ curl -i 'http://localhost:8080/thymeleaf/?name=Virgo'
+----
+
+You should see an output like:
+
+....
+<body>
+ <p>Hello, Virgo!</p>
+</body>
+....
+
+or point your favorite browser to http://localhost:8080/thymeleaf/
+
+include::../../../../recipe-template/src/docs/asciidoc/08_dockerize_recipe.adoc[]
diff --git a/recipe-serving-web-content/start-live-server.sh b/recipe-serving-web-content/start-live-server.sh
new file mode 100755
index 0000000..ac02c90
--- /dev/null
+++ b/recipe-serving-web-content/start-live-server.sh
@@ -0,0 +1,6 @@
+#/bin/bash
+
+# install live-server globally
+# npm install -g live-server
+
+${HOME}/npm-global/lib/node_modules/live-server/live-server.js --port=9000 build/asciidoc/revealjs/
diff --git a/recipe-template/src/docs/asciidoc/00_title.adoc b/recipe-template/src/docs/asciidoc/00_title.adoc
index 66cc120..885bcaf 100644
--- a/recipe-template/src/docs/asciidoc/00_title.adoc
+++ b/recipe-template/src/docs/asciidoc/00_title.adoc
@@ -1,3 +1,3 @@
-= Virgo recipe for "{recipe-name}"
+== Virgo recipe "{recipe-name}"
image:{virgo-homepage}/images/virgo-logo.png["Virgo Homepage"]
diff --git a/recipe-template/src/docs/asciidoc/01_acknowledgements.adoc b/recipe-template/src/docs/asciidoc/01_acknowledgements.adoc
index c9a1b32..6687711 100644
--- a/recipe-template/src/docs/asciidoc/01_acknowledgements.adoc
+++ b/recipe-template/src/docs/asciidoc/01_acknowledgements.adoc
@@ -1,4 +1,4 @@
-== Acknowledgements
+=== Acknowledgements
This guide is inspired by https://spring.io/guides/gs/{guide-short-name}/["{recipe-name}"] from the https://spring.io/[Spring] https://spring.io/guides/[Guides].
diff --git a/recipe-template/src/docs/asciidoc/03_shopping-list.adoc b/recipe-template/src/docs/asciidoc/03_shopping-list.adoc
index 110040f..49894c4 100644
--- a/recipe-template/src/docs/asciidoc/03_shopping-list.adoc
+++ b/recipe-template/src/docs/asciidoc/03_shopping-list.adoc
@@ -5,4 +5,7 @@
* https://wiki.eclipse.org/Virgo/Source#Virgo_git_Repositories[Sample Git repository]
* https://eclipse.org/downloads/[Eclipse IDE]
-NOTE: Only Virgo Server for Apache Tomcat and Virgo Jetty Server are supported by the Virgo Tooling.
+[NOTE]
+--
+Only Virgo Server for Apache Tomcat and Virgo Jetty Server are supported by the Virgo Tooling.
+--
diff --git a/recipe-template/src/docs/asciidoc/051_get-the-code.adoc b/recipe-template/src/docs/asciidoc/051_get-the-code.adoc
index 3a5c9ff..a5a6c17 100644
--- a/recipe-template/src/docs/asciidoc/051_get-the-code.adoc
+++ b/recipe-template/src/docs/asciidoc/051_get-the-code.adoc
@@ -3,11 +3,12 @@
Clone the code from the Git repository: http://wiki.eclipse.org/Virgo/Source#Virgo_git_Repositories[Sample Git repository]:
-[source,sh]
+[source,sh,subs="attributes"]
----
$ cd ~/MyAwesomeProjectDirectory/
$ git clone git://git.eclipse.org/gitroot/virgo/org.eclipse.virgo.samples.git
$ cd org.eclipse.virgo.samples
+$ cd {recipe-short-name}
----
-Change into the directory containing the source of this recipe: +{recipe-short-name}+ and your are good to go.
+Once inside the source directory of this recipe - your are good to go.
diff --git a/recipe-template/src/docs/asciidoc/052_create-recipe-runtime.adoc b/recipe-template/src/docs/asciidoc/052_create-recipe-runtime.adoc
index 271cb9c..cec2c36 100644
--- a/recipe-template/src/docs/asciidoc/052_create-recipe-runtime.adoc
+++ b/recipe-template/src/docs/asciidoc/052_create-recipe-runtime.adoc
@@ -1,9 +1,18 @@
=== Create the Custom Virgo Runtime
-Create your own Virgo runtime with http://gradle.org/[Gradle] and https://github.com/eclipsesource/dockerizor[Dockerizor]
-and https://www.docker.com/[Docker]: +$ ./gradlew :{recipe-short-name}-runtime:dockerize+
+Create your own Virgo runtime with http://gradle.org/[Gradle] and https://github.com/eclipsesource/dockerizor[Dockerizor]:
-NOTE: You'll need a Docker daemon running in order to create your custom Virgo runtime. For more information please refer to the https://github.com/eclipsesource/dockerizor/blob/master/README.md[Dockerizor documentation].
+[source,sh,subs="attributes"]
+----
+$ ./gradlew :{recipe-short-name}-runtime dockerize
+----
-Extract the `tar` archive of the custom Virgo runtime available from the runtime build directory: +{recipe-short-name}-runtime/build+ into some directory - let's say into `VIRGO_HOME`.
+The custom Virgo Runtime is packaged as `tar` archive and available from the runtime build directory.
+Extract the runtime into some directory - let's say into `VIRGO_HOME`.
+
+[CAUTION]
+--
+You'll need a https://www.docker.com/[Docker] daemon running in order to create your custom Virgo runtime.
+For more information please refer to the https://github.com/eclipsesource/dockerizor/blob/master/README.md[Dockerizor documentation].
+--
diff --git a/recipe-template/src/docs/asciidoc/054_prepare-virgo-tooling.adoc b/recipe-template/src/docs/asciidoc/054_prepare-virgo-tooling.adoc
index 8478737..b64e395 100644
--- a/recipe-template/src/docs/asciidoc/054_prepare-virgo-tooling.adoc
+++ b/recipe-template/src/docs/asciidoc/054_prepare-virgo-tooling.adoc
@@ -5,8 +5,8 @@
Start your Eclipse IDE and add the http://wiki.eclipse.org/Virgo/Tooling[Virgo Tooling] to your Eclipse IDE.
-NOTE: For the impatient: This is the http://download.eclipse.org/virgo/release/tooling/[Virgo Tooling update site] URL: http://download.eclipse.org/virgo/release/tooling.
+NOTE: http://download.eclipse.org/virgo/release/tooling/[Virgo Tooling update site]: http://download.eclipse.org/virgo/release/tooling/
Optionally add the https://wiki.eclipse.org/Linux_Tools_Project/Docker_Tooling[Docker Tooling] to your Eclipse IDE.
-NOTE: For the impatient: This is the http://download.eclipse.org/linuxtools/updates-docker-nightly/[Docker Tooling update site] URL: http://download.eclipse.org/linuxtools/updates-docker-nightly/.
+NOTE: http://download.eclipse.org/linuxtools/updates-docker-nightly/[Docker Tooling update site]: http://download.eclipse.org/linuxtools/updates-docker-nightly/
diff --git a/recipe-template/src/docs/asciidoc/055_import-the-code.adoc b/recipe-template/src/docs/asciidoc/055_import-the-code.adoc
index a450b75..75397c2 100644
--- a/recipe-template/src/docs/asciidoc/055_import-the-code.adoc
+++ b/recipe-template/src/docs/asciidoc/055_import-the-code.adoc
@@ -1,6 +1,11 @@
=== Import the code into your Eclipse IDE
-Now you can run +Import... Gradle -> Gradle Project+ to get the source into your IDE. The project folder is called +{recipe-short-name}+ and lies directly in the "Sample Applications" folder you created previously with the Git clone command. (`org.eclipse.virgo.samples`).
+Now you can menu:Import[Gradle > Gradle Project] into your IDE.
+The project folder is called `{recipe-short-name}` and lies directly in the "Sample Applications" folder you created previously with the Git clone command. (`org.eclipse.virgo.samples`).
-NOTE: Before you can drag'n'drop the project onto your freshly created Virgo Server you might have to execute +Virgo -> Run Generation of META-INF/MANIFEST.MF File+ (via a right click on the project) within your Eclipse IDE.
+[NOTE]
+--
+Before you can drag'n'drop the project onto your freshly created Virgo Server you might have to execute
+menu:Virgo[Run Generation] of +META-INF/MANIFEST.MF+ (via a right click on the project) within your Eclipse IDE.
+--
diff --git a/recipe-template/src/docs/asciidoc/056_create-new-virgo-server.adoc b/recipe-template/src/docs/asciidoc/056_create-new-virgo-server.adoc
index c361c8a..85bc009 100644
--- a/recipe-template/src/docs/asciidoc/056_create-new-virgo-server.adoc
+++ b/recipe-template/src/docs/asciidoc/056_create-new-virgo-server.adoc
@@ -1,4 +1,5 @@
=== Create new Virgo Server Runtime
-"Define a new server" within the IDE +New -> Server -> EclipseRT -> Virgo Runtime+ and choose the directory of the previously installed Virgo server `VIRGO_HOME`.
+Define a new server::
+ Within the IDE menu:New[Server > EclipseRT > Virgo Runtime] and choose the directory of the previously installed Virgo server `VIRGO_HOME`.
diff --git a/recipe-template/src/docs/asciidoc/08_dockerize_recipe.adoc b/recipe-template/src/docs/asciidoc/08_dockerize_recipe.adoc
index 338fded..89f64ad 100644
--- a/recipe-template/src/docs/asciidoc/08_dockerize_recipe.adoc
+++ b/recipe-template/src/docs/asciidoc/08_dockerize_recipe.adoc
@@ -1,7 +1,8 @@
== Dockerise the Application ==
-We use Gradle and Dockerizor to build the application: Instead of running the sample within the Eclipse IDE you can build a https://www.docker.com/[Docker] image:
+We use Gradle and Dockerizor to build the application.
+Instead of running the sample within the Eclipse IDE you can build a https://www.docker.com/[Docker] image:
[source,sh]
----