Sample-groovy-in-Z2 » History » Version 29
Henning Blohm, 07.09.2021 19:14
| 1 | 2 | Udo Offermann | h1. Sample Groovy in Z2 |
|---|---|---|---|
| 2 | 3 | Udo Offermann | |
| 3 | 28 | Henning Blohm | This sample shows how to use the Groovy support, as implemented by the [[Groovy_Add-on|Groovy Add-on]]. |
| 4 | 13 | Henning Blohm | |
| 5 | 28 | Henning Blohm | This sample is stored in the repository "z2-samples-groovy":https://redmine.z2-environment.net/projects/z2-samples/repository/z2-samples-groovy<notextile></notextile>. |
| 6 | 21 | Henning Blohm | |
| 7 | 29 | Henning Blohm | *NOTE:* This sample has been discontinued as of v2.9. |
| 8 | |||
| 9 | 3 | Udo Offermann | h2. Prerequisites |
| 10 | |||
| 11 | 20 | Henning Blohm | {{include(Java_Version_Requirements)}} |
| 12 | 17 | Henning Blohm | |
| 13 | 3 | Udo Offermann | h2. Setting up the sample |
| 14 | |||
| 15 | 1 | Udo Offermann | Here's the really fast version: |
| 16 | |||
| 17 | 29 | Henning Blohm | <pre><code class="ruby"> |
| 18 | mkdir install |
||
| 19 | cd install |
||
| 20 | </code></pre> |
||
| 21 | |||
| 22 | {{include(Install z2-base-v28)}} |
||
| 23 | 3 | Udo Offermann | |
| 24 | 28 | Henning Blohm | <pre><code> |
| 25 | git clone -b v2.8 https://www.z2-environment.net/git/z2-samples.groovy |
||
| 26 | 3 | Udo Offermann | </code></pre> |
| 27 | 23 | Henning Blohm | |
| 28 | {{include(Install_sample_postfix)}} |
||
| 29 | 4 | Udo Offermann | |
| 30 | 14 | Henning Blohm | The first time you launch the sample, it will take a while to download all required resources. |
| 31 | |||
| 32 | This sample highlights three things |
||
| 33 | |||
| 34 | h2. Using Groovy or Java or any mix of the two |
||
| 35 | |||
| 36 | 16 | Henning Blohm | When declaring to use the groovy compiler as in "/com.zfabrik.samples.groovy_and_java.web/java/z.properties":https://redmine.z2-environment.net/projects/z2-samples/repository/z2-samples-groovy/revisions/master/entry/com.zfabrik.samples.groovy_and_java.web/java/z.properties you can mix Java and Groovy as you like. The Groovy compiler support will figure out whether a Java component (which may then be not Java only anymore - strictly speaking) contains only Java sources, only Groovy sources, or a mix of both. |
| 37 | 14 | Henning Blohm | |
| 38 | 1 | Udo Offermann | <pre> |
| 39 | 14 | Henning Blohm | com.zfabrik.component.type=com.zfabrik.java |
| 40 | 1 | Udo Offermann | |
| 41 | 14 | Henning Blohm | java.privateReferences=\ |
| 42 | 28 | Henning Blohm | com.zfabrik.servletjsp,\ |
| 43 | com.zfabrik.groovy |
||
| 44 | |||
| 45 | 14 | Henning Blohm | java.compile.order = groovy |
| 46 | 1 | Udo Offermann | </pre> |
| 47 | 28 | Henning Blohm | |
| 48 | 14 | Henning Blohm | As in the sample, it is mandatory to reference *com.zfabrik.groovy* (a module providing groovy-all and some more) for any part that contains groovy sources. |
| 49 | 1 | Udo Offermann | |
| 50 | 28 | Henning Blohm | The sample apps just print the HTTP request header - the http://localhost:8080/plain-groovy-sample is using plain Groovy (see project @com.zfabrik.samples.groovy.web@ ) and the http://localhost:8080/groovy-java-sample/ is using a mixture of Groovy and Java sources (see project @com.zfabrik.samples.groovy_and_java.web@ ). Note that while the former project is compiled using the plain Groovy compiler the latter is compiled using the Joint Groovy/Java Compiler. |
| 51 | 1 | Udo Offermann | |
| 52 | 28 | Henning Blohm | If you want to inspect the code using Eclipse, please create a workspace in install (i.e. @install/workspace@ ) and import the Git repositories and the following projects into your workspace: _core_ from z2-base.core, _environment_ and _com.zfabrik.samples.groovy.web_ from z2-samples.groovy (see also [[Step_3_-_First_steps_with_Z2_on_Git|First steps]]). |
| 53 | 1 | Udo Offermann | |
| 54 | 18 | Henning Blohm | Make sure to have "Groovy support":https://github.com/groovy/groovy-eclipse/wiki installed with Eclipse (otherwise you will not have much fun with Groovy sources)! |
| 55 | 1 | Udo Offermann | |
| 56 | 28 | Henning Blohm | Check [[Groovy_Add-on#Trouble-Shooting|Groovy_Add-on]], if you have trouble running code in Eclipse. |
| 57 | 19 | Henning Blohm | |
| 58 | 14 | Henning Blohm | h2. Using Groovlets and Groovy Template Pages |
| 59 | |||
| 60 | 28 | Henning Blohm | Generally, the mere fact that groovy-all is available implies that generally speaking all features described in |
| 61 | 14 | Henning Blohm | |
| 62 | 28 | Henning Blohm | * http://docs.groovy-lang.org/latest/html/documentation/servlet-userguide.html and |
| 63 | * http://docs.groovy-lang.org/latest/html/documentation/template-engines.html |
||
| 64 | 14 | Henning Blohm | |
| 65 | 28 | Henning Blohm | work. Groovlets are groovy scripts that are turned into Servlets on the fly. The same header list as above is created by the "headers.groovy":https://redmine.z2-environment.net/projects/z2-samples/repository/z2-samples-groovy/revisions/master/entry/com.zfabrik.samples.groovy.web/web/WebContent/headers.groovy script. Go to http://localhost:8080/plain-groovy-sample/headers.groovy to see it running. |
| 66 | 14 | Henning Blohm | |
| 67 | 28 | Henning Blohm | Similarly, the Groovy equivalent of Java server pages, Groovy Template Pages are supported. The author has not looked deeply into this. But check out "index.gsp":https://redmine.z2-environment.net/projects/z2-samples/repository/z2-samples-groovy/revisions/master/entry/com.zfabrik.samples.groovy.web/web/WebContent/index.gsp for a trivial sample. Go http://localhost:8080/plain-groovy-sample/index.gsp to see it running. |
| 68 | 14 | Henning Blohm | |
| 69 | To turn on support for Groovlets and GSPs, corresponding servlets and resource mappings have to be defined in the web app's "web.xml:https://redmine.z2-environment.net/projects/z2-samples/repository/z2-samples-groovy/revisions/master/entry/com.zfabrik.samples.groovy.web/web/WebContent/WEB-INF/web.xml : |
||
| 70 | |||
| 71 | 28 | Henning Blohm | <pre> |
| 72 | 14 | Henning Blohm | <servlet> |
| 73 | 1 | Udo Offermann | <servlet-name>Groovy</servlet-name> |
| 74 | 14 | Henning Blohm | <servlet-class>com.zfabrik.groovy.servlet.ContextAwareGroovyServlet</servlet-class> |
| 75 | </servlet> |
||
| 76 | 1 | Udo Offermann | <servlet> |
| 77 | <servlet-name>GroovyTemplate</servlet-name> |
||
| 78 | 14 | Henning Blohm | <servlet-class>groovy.servlet.TemplateServlet</servlet-class> |
| 79 | </servlet> |
||
| 80 | 1 | Udo Offermann | <servlet-mapping> |
| 81 | 14 | Henning Blohm | <servlet-name>Groovy</servlet-name> |
| 82 | <url-pattern>*.groovy</url-pattern> |
||
| 83 | </servlet-mapping> |
||
| 84 | 1 | Udo Offermann | <servlet-mapping> |
| 85 | 14 | Henning Blohm | <servlet-name>GroovyTemplate</servlet-name> |
| 86 | <url-pattern>*.gsp</url-pattern> |
||
| 87 | </servlet-mapping> |
||
| 88 | </pre> |
||
| 89 | |||
| 90 | 28 | Henning Blohm | *Note:* Instead of using the standard Groovy Servlet (implementing Groovlets support), we use a specialized version that is part of the @com.zfabrik.groovy@ module. This is so that application types will be found correctly. Inquiry with the Groovy community in under way (see also #1042 ) |
| 91 | 14 | Henning Blohm | |
| 92 | h2. Using Spock Tests |
||
| 93 | |||
| 94 | 28 | Henning Blohm | The "Spock Test Specification framework":http://code.google.com/p/spock/ provides an elegant way to specify and implement test cases over - in the end - the JUnit framework that is well integrated in virtually any Java capable development environment. Z2 integrates with JUnit via z2Unit (see [[How_to_z2Unit|How to z2Unit]]) to allow server-side unit tests. |
| 95 | 14 | Henning Blohm | |
| 96 | 28 | Henning Blohm | Quite elegantly, the only declaration that differentiates a Spock test from any old JUnit test is the mentioning of Spock's JUnit runner called Sputnik. When you write a local Spock tests, this is implicitly applied via the Spock test super class @Specification@ . Now z2Unit uses a JUnit runner itself to shift test execution from the invoking VM to the Z2 VM. The solution to that seeming conflict is indeed straight-forward: Declare the z2Unit test runner to have execution handed over, and tell z2Unit to use Sputnik when executing a test class within Z2. |
| 97 | 14 | Henning Blohm | |
| 98 | The sample module @com.zfabrik.samples.spock@ contains a test class "HelloSpockZ2":https://redmine.z2-environment.net/projects/z2-samples/repository/z2-samples-groovy/revisions/master/entry/com.zfabrik.samples.spock/java/src.test/com/zfabrik/samples/spock/tests/HelloSpockZ2.groovy that illustrates this combination: |
||
| 99 | |||
| 100 | 28 | Henning Blohm | <pre> |
| 101 | 14 | Henning Blohm | @RunWith(Z2UnitTestRunner.class) |
| 102 | @Z2UnitTest(componentName="com.zfabrik.samples.spock", runWith=Sputnik.class) |
||
| 103 | class HelloSpockZ2 extends Specification { |
||
| 104 | |||
| 105 | 28 | Henning Blohm | def "A first test that should pass"() { |
| 106 | setup: |
||
| 107 | def x = new ArrayList<String>(); |
||
| 108 | when: |
||
| 109 | x.add("Hello") |
||
| 110 | then: |
||
| 111 | x.size() == 1 |
||
| 112 | } |
||
| 113 | 14 | Henning Blohm | |
| 114 | 28 | Henning Blohm | def "a second test that should fail"() { |
| 115 | setup: |
||
| 116 | def x = new ArrayList<String>(); |
||
| 117 | when: |
||
| 118 | x.add("Hello") |
||
| 119 | then: |
||
| 120 | x.size() == 2 |
||
| 121 | } |
||
| 122 | 14 | Henning Blohm | } |
| 123 | </pre> |
||
| 124 | |||
| 125 | If you have an Eclipse setup for this sample, as outlined above, you can run these tests directly from your IDE. |
