initial version
Project: http://git-wip-us.apache.org/repos/asf/groovy-examples/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy-examples/commit/3bd1e181 Tree: http://git-wip-us.apache.org/repos/asf/groovy-examples/tree/3bd1e181 Diff: http://git-wip-us.apache.org/repos/asf/groovy-examples/diff/3bd1e181 Branch: refs/heads/master Commit: 3bd1e1811c5306b0d8dbf65c9bde6091596a1307 Parents: 4007783 Author: Paul King <[email protected]> Authored: Sun Aug 12 15:20:11 2018 +1000 Committer: Paul King <[email protected]> Committed: Sun Aug 12 15:20:11 2018 +1000 ---------------------------------------------------------------------- README.md | 5 + build.gradle | 34 + gradle.properties | 5 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54417 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 +++++ gradlew.bat | 84 +++ src/main/groovy/astbuilder/Main.groovy | 38 ++ src/main/groovy/astbuilder/MainExample.groovy | 34 + .../astbuilder/MainIntegrationTest.groovy | 44 ++ .../groovy/astbuilder/MainTransformation.groovy | 80 +++ src/main/groovy/astbuilder/build.xml | 43 ++ src/main/groovy/astbuilder/readme.txt | 42 ++ src/main/groovy/commandLineTools/AntMap.groovy | 84 +++ .../groovy/commandLineTools/BigTests.groovy | 51 ++ .../groovy/commandLineTools/ListFiles.groovy | 43 ++ .../groovy/commandLineTools/Reflections.groovy | 36 ++ .../commandLineTools/SimpleWebServer.groovy | 90 +++ .../groovy/console/MortgageCalculator.groovy | 95 +++ src/main/groovy/console/knowYourTables.groovy | 34 + src/main/groovy/console/thinkOfANumber.groovy | 39 ++ src/main/groovy/groovy/j2ee/CreateData.groovy | 41 ++ src/main/groovy/groovy/j2ee/J2eeConsole.java | 78 +++ src/main/groovy/groovy/model/MvcDemo.groovy | 61 ++ src/main/groovy/groovy/swing/Demo.java | 55 ++ src/main/groovy/groovy/swing/MyTableModel.java | 123 ++++ src/main/groovy/groovy/swing/SwingDemo.groovy | 127 ++++ src/main/groovy/groovy/swing/TableDemo.groovy | 72 +++ .../groovy/groovy/swing/TableLayoutDemo.groovy | 76 +++ .../groovy/groovy2d/paintingByNumbers.groovy | 66 ++ .../groovy/groovyShell/ArithmeticShell.groovy | 157 +++++ .../groovyShell/ArithmeticShellTest.groovy | 108 ++++ .../groovy/groovyShell/BlacklistingShell.groovy | 96 +++ .../groovyShell/BlacklistingShellTest.groovy | 82 +++ .../DefaultGrailsDomainClassInjector.java | 264 ++++++++ .../grails/compiler/injection/DomainClass.java | 38 ++ src/main/groovy/osgi/build.properties | 28 + src/main/groovy/osgi/build.xml | 140 +++++ .../org/codehaus/groovy/osgi/Activator.groovy | 59 ++ .../codehaus/groovy/osgi/GroovyGreeter.groovy | 30 + .../groovy/osgi/GroovyGreeterImpl.groovy | 31 + .../groovy/osgi/harness/HarnessActivator.groovy | 50 ++ src/main/groovy/osgi/readme.txt | 140 +++++ src/main/groovy/searchEngine/Indexer.groovy | 83 +++ src/main/groovy/searchEngine/Searcher.groovy | 61 ++ src/main/groovy/swing/BindingExample.groovy | 63 ++ src/main/groovy/swing/BloglinesClient.groovy | 188 ++++++ src/main/groovy/swing/ModelNodeExample.groovy | 89 +++ src/main/groovy/swing/RegexCoach.groovy | 126 ++++ .../groovy/swing/RegexCoachController.groovy | 107 ++++ src/main/groovy/swing/RegexCoachView.groovy | 55 ++ src/main/groovy/swing/Widgets.groovy | 220 +++++++ .../swing/binding/caricature/Caricature.groovy | 79 +++ .../swing/binding/caricature/JCaricature.java | 220 +++++++ .../binding/caricature/resources/eyes1.gif | Bin 0 -> 1789 bytes .../binding/caricature/resources/eyes2.gif | Bin 0 -> 1925 bytes .../binding/caricature/resources/eyes3.gif | Bin 0 -> 1969 bytes .../binding/caricature/resources/eyes4.gif | Bin 0 -> 2355 bytes .../binding/caricature/resources/eyes5.gif | Bin 0 -> 1829 bytes .../binding/caricature/resources/face1.gif | Bin 0 -> 2548 bytes .../binding/caricature/resources/face2.gif | Bin 0 -> 2395 bytes .../binding/caricature/resources/face3.gif | Bin 0 -> 2707 bytes .../binding/caricature/resources/face4.gif | Bin 0 -> 2324 bytes .../binding/caricature/resources/face5.gif | Bin 0 -> 2445 bytes .../binding/caricature/resources/glasses.gif | Bin 0 -> 2092 bytes .../caricature/resources/glassesWEyes.gif | Bin 0 -> 2209 bytes .../binding/caricature/resources/hair1.gif | Bin 0 -> 3449 bytes .../binding/caricature/resources/hair2.gif | Bin 0 -> 2477 bytes .../binding/caricature/resources/hair3.gif | Bin 0 -> 2409 bytes .../binding/caricature/resources/hair4.gif | Bin 0 -> 2771 bytes .../binding/caricature/resources/hair5.gif | Bin 0 -> 4387 bytes .../binding/caricature/resources/mouth1.gif | Bin 0 -> 971 bytes .../binding/caricature/resources/mouth2.gif | Bin 0 -> 1046 bytes .../binding/caricature/resources/mouth3.gif | Bin 0 -> 1639 bytes .../binding/caricature/resources/mouth4.gif | Bin 0 -> 1014 bytes .../binding/caricature/resources/mouth5.gif | Bin 0 -> 1303 bytes .../binding/caricature/resources/nose1.gif | Bin 0 -> 1230 bytes .../binding/caricature/resources/nose2.gif | Bin 0 -> 1345 bytes .../binding/caricature/resources/nose3.gif | Bin 0 -> 1366 bytes .../binding/caricature/resources/nose4.gif | Bin 0 -> 1200 bytes .../binding/caricature/resources/nose5.gif | Bin 0 -> 1399 bytes src/main/groovy/swing/greet/Greet.groovy | 153 +++++ src/main/groovy/swing/greet/TwitterAPI.groovy | 162 +++++ src/main/groovy/swing/greet/View.groovy | 175 ++++++ .../groovy/swing/timelog/TimeLogMain.groovy | 46 ++ .../groovy/swing/timelog/TimeLogModel.groovy | 62 ++ .../groovy/swing/timelog/TimeLogView.groovy | 67 ++ .../global/CompiledAtASTTransformation.groovy | 66 ++ .../transforms/global/CompiledAtExample.groovy | 33 + .../global/CompiledAtIntegrationTest.groovy | 39 ++ .../global/LoggingASTTransformation.groovy | 73 +++ .../transforms/global/LoggingExample.groovy | 48 ++ ....codehaus.groovy.transform.ASTTransformation | 17 + src/main/groovy/transforms/global/build.xml | 52 ++ src/main/groovy/transforms/global/readme.txt | 48 ++ .../local/LoggingASTTransformation.groovy | 74 +++ .../transforms/local/LoggingExample.groovy | 64 ++ .../groovy/transforms/local/WithLogging.groovy | 37 ++ src/main/groovy/transforms/local/build.xml | 44 ++ src/main/groovy/transforms/local/readme.txt | 40 ++ .../WEB-INF/groovy/Animal.groovy | 23 + .../WEB-INF/groovy/zoo/Fish.groovy | 27 + .../WEB-INF/groovy/zoo/fish/Shark.groovy | 29 + .../WEB-INF/groovy/zoo/fish/Trout.groovy | 27 + .../webapps/groovlet-examples/WEB-INF/web.xml | 89 +++ .../groovlet-examples/codehaus-style.css | 626 +++++++++++++++++++ .../groovlet-examples/hello/hello.groovy | 51 ++ .../webapps/groovlet-examples/images/code.gif | Bin 0 -> 292 bytes .../groovlet-examples/images/execute.gif | Bin 0 -> 1242 bytes .../webapps/groovlet-examples/images/groovy.png | Bin 0 -> 12303 bytes .../webapps/groovlet-examples/images/return.gif | Bin 0 -> 1231 bytes .../webapps/groovlet-examples/index.groovy | 107 ++++ .../groovy/webapps/groovlet-examples/readme.txt | 32 + .../webapps/groovlet-examples/xml/index.xhtml | 58 ++ .../zoo/HommingbergerGepardenforelle.groovy | 27 + .../webapps/groovlet-examples/zoo/visit.groovy | 37 ++ .../webapps/groovlet-examples/zoo/zoo.groovy | 48 ++ src/main/groovy/webapps/gsp-examples/readme.txt | 20 + .../template-examples/3.times.HelloWorld.html | 33 + .../WEB-INF/lib/groovy-all-xyz.jar.placeholder | 18 + .../webapps/template-examples/WEB-INF/web.xml | 46 ++ .../template-examples/javasystemproperties.htm | 42 ++ .../groovy/webapps/template-examples/readme.txt | 32 + 123 files changed, 6943 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/README.md ---------------------------------------------------------------------- diff --git a/README.md b/README.md new file mode 100644 index 0000000..0636388 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +Groovy examples +=============== + +This is a repository of Groovy source files using common (at some point) libraries. +It is expected that all the source files at least compile with the current version of Groovy. http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/build.gradle ---------------------------------------------------------------------- diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..7b54e45 --- /dev/null +++ b/build.gradle @@ -0,0 +1,34 @@ +plugins { +// id 'com.github.spotbugs' version '1.6.2' + id "com.github.ben-manes.versions" version '0.20.0' +} +apply plugin: 'groovy' +apply plugin: 'idea' + +repositories { + mavenCentral() + maven { url 'https://repository.jboss.org/nexus/content/groups/m2-release-proxy/' } + maven { url 'https://oss.jfrog.org/oss-snapshot-local/' } +} + +dependencies { + compile "org.codehaus.groovy:groovy-all:$groovyVersion" + + compile "org.apache.lucene:lucene-core:$luceneVersion" + compile "org.apache.lucene:lucene-analyzers-common:$luceneVersion" + compile "org.apache.lucene:lucene-queryparser:$luceneVersion" + compile "org.eclipse:osgi:$eclipseOsgiVersion" + compile("commons-httpclient:commons-httpclient:$commonsHttpClientVersion") { + exclude(module: 'junit') + exclude(module: 'commons-logging') + exclude(module: 'commons-codec') + } + runtime("openejb:openejb-loader:$openejbVersion") { + exclude(module: 'log4j') + exclude(module: 'openejb-core') + exclude(module: 'geronimo-jta_1.0.1B_spec') + exclude(module: 'geronimo-servlet_2.4_spec') + exclude(module: 'geronimo-ejb_2.1_spec') + exclude(module: 'geronimo-j2ee-connector_1.5_spec') + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/gradle.properties ---------------------------------------------------------------------- diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..0277b23 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,5 @@ +groovyVersion=3.0.0-SNAPSHOT +luceneVersion=7.4.0 +eclipseOsgiVersion=3.10.0-v20140606-1445 +commonsHttpClientVersion=3.1 +openejbVersion=1.0 http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/gradle/wrapper/gradle-wrapper.jar ---------------------------------------------------------------------- diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..758de96 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/gradle/wrapper/gradle-wrapper.properties ---------------------------------------------------------------------- diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..a95009c --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/gradlew ---------------------------------------------------------------------- diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## 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 + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/gradlew.bat ---------------------------------------------------------------------- diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@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 + +: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=%* + +: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/groovy-examples/blob/3bd1e181/src/main/groovy/astbuilder/Main.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/astbuilder/Main.groovy b/src/main/groovy/astbuilder/Main.groovy new file mode 100644 index 0000000..03ffa46 --- /dev/null +++ b/src/main/groovy/astbuilder/Main.groovy @@ -0,0 +1,38 @@ +/* + * 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 astbuilder + +import org.codehaus.groovy.transform.GroovyASTTransformationClass +import java.lang.annotation.ElementType +import java.lang.annotation.Target +import java.lang.annotation.RetentionPolicy +import java.lang.annotation.Retention + +/** + * Marker interface to mark a method as something that should be invokable + * as a main() method. An AST transformation will later wire this together. + * + * @author Hamlet D'Arcy + */ + +@Retention (RetentionPolicy.SOURCE) +@Target ([ElementType.METHOD]) +@GroovyASTTransformationClass (["examples.astbuilder.MainTransformation"]) +public @interface Main { +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/astbuilder/MainExample.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/astbuilder/MainExample.groovy b/src/main/groovy/astbuilder/MainExample.groovy new file mode 100644 index 0000000..2469a2c --- /dev/null +++ b/src/main/groovy/astbuilder/MainExample.groovy @@ -0,0 +1,34 @@ +/* + * 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 astbuilder + +/** + * Exists to test the @Main annotation. At compile time, there will be a main() + * method added to this class that has the same body as the greet() method. + * It can be invoked either by using either Java or Groovy to run the class. + * + * @author Hamlet D'Arcy + */ +class MainExample { + + @Main + public void greet() { + println "Hello from the greet() method!" + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/astbuilder/MainIntegrationTest.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/astbuilder/MainIntegrationTest.groovy b/src/main/groovy/astbuilder/MainIntegrationTest.groovy new file mode 100644 index 0000000..92052e4 --- /dev/null +++ b/src/main/groovy/astbuilder/MainIntegrationTest.groovy @@ -0,0 +1,44 @@ +/* + * 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 astbuilder + +import org.codehaus.groovy.tools.ast.TransformTestHelper +import org.codehaus.groovy.control.CompilePhase + +/** + * + * This TestCase shows how to invoke an AST Transformation from a unit test. + * An IDE will let you step through the AST Transformation using this approach. + * + * @author Hamlet D'Arcy + */ + +class MainIntegrationTest extends GroovyTestCase { + + public void testInvokeUnitTest() { + def invoker = new TransformTestHelper(new MainTransformation(), CompilePhase.CANONICALIZATION) + + def file = new File('./MainExample.groovy') + assert file.exists() + + def clazz = invoker.parse(file) + def tester = clazz.newInstance() + tester.main(null) // main method added with AST transform + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/astbuilder/MainTransformation.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/astbuilder/MainTransformation.groovy b/src/main/groovy/astbuilder/MainTransformation.groovy new file mode 100644 index 0000000..ce07916 --- /dev/null +++ b/src/main/groovy/astbuilder/MainTransformation.groovy @@ -0,0 +1,80 @@ +/* + * 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 astbuilder + +import org.codehaus.groovy.ast.* +import org.codehaus.groovy.control.CompilePhase +import org.codehaus.groovy.transform.GroovyASTTransformation +import org.codehaus.groovy.transform.ASTTransformation +import org.codehaus.groovy.control.SourceUnit +import org.codehaus.groovy.ast.builder.AstBuilder + +/** + * If there is a method in a class with the @Main annotation on it, then this + * transformation adds a real main(String[]) method to the class with the same + * method body as the annotated class. + * + * @author Hamlet D'Arcy + */ +@GroovyASTTransformation(phase = CompilePhase.INSTRUCTION_SELECTION) +public class MainTransformation implements ASTTransformation { + + // normally defined in org.objectweb.asm.Opcodes, but there duplicated + // here to make the build script simpler. + static int PUBLIC = 1 + static int STATIC = 8 + + void visit(ASTNode[] astNodes, SourceUnit sourceUnit) { + + // use guard clauses as a form of defensive programming. + if (!astNodes) return + if (!astNodes[0]) return + if (!astNodes[1]) return + if (!(astNodes[0] instanceof AnnotationNode)) return + if (astNodes[0].classNode?.name != Main.class.name) return + if (!(astNodes[1] instanceof MethodNode)) return + + MethodNode annotatedMethod = astNodes[1] + ClassNode declaringClass = annotatedMethod.declaringClass + MethodNode mainMethod = makeMainMethod(annotatedMethod) + declaringClass.addMethod(mainMethod) + } + + /** + * Uses the AstBuilder to synthesize a main method, and then sets the body of + * the method to that of the source method. Notice how Void.TYPE is used as + * a return value instead of Void.class. This is required so that resulting method + * is void and not Void. + */ + MethodNode makeMainMethod(MethodNode source) { + def className = source.declaringClass.name + def methodName = source.name + + def ast = new AstBuilder().buildFromString(CompilePhase.INSTRUCTION_SELECTION, false, """ + package $source.declaringClass.packageName + + class $source.declaringClass.nameWithoutPackage { + public static void main(String[] args) { + new $className().$methodName() + } + } + """) + ast[1].methods.find { it.name == 'main' } + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/astbuilder/build.xml ---------------------------------------------------------------------- diff --git a/src/main/groovy/astbuilder/build.xml b/src/main/groovy/astbuilder/build.xml new file mode 100644 index 0000000..3f31815 --- /dev/null +++ b/src/main/groovy/astbuilder/build.xml @@ -0,0 +1,43 @@ +<?xml version="1.0"?> +<!-- + + 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. + +--> +<project name="groovy-astbuilder-usage-example" default="compile-transform"> + + <!-- necessary groovy jars are assumed to be on your classpath. --> + <taskdef name="groovyc" classname="org.codehaus.groovy.ant.Groovyc" /> + + <target name="init" description="cleanup old class files"> + <delete dir="examples"/> + </target> + + <target name="compile-transform" depends="init" description="Compiles the AST Transformation"> + + <groovyc destdir="." + srcdir="." + includes="Main.groovy,MainTransformation.groovy" + listfiles="true"> + </groovyc> + + <echo>You can now run "groovy MainExample.groovy", "groovyc MainExample.groovy", or "groovy MainIntegrationTest.groovy" to see that the transformation worked.</echo> + </target> + +</project> + http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/astbuilder/readme.txt ---------------------------------------------------------------------- diff --git a/src/main/groovy/astbuilder/readme.txt b/src/main/groovy/astbuilder/readme.txt new file mode 100644 index 0000000..25f7f99 --- /dev/null +++ b/src/main/groovy/astbuilder/readme.txt @@ -0,0 +1,42 @@ +==== + 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. +==== + +AstBuilder and AST Transformation Example + +This example shows how to use the AstBuilder to add a public static void main(String[]) +method to a class. + +The example requires ant in your path and the Groovy 1.7 (or greater) +Jar in your classpath. + +To build the example run "ant" from the current directory. The default +target will compile the classes needed. The last step of the build +script prints out the command needed to run the example. + +To run the example perform either of the following from the command lines: + groovy MainExample.groovy + groovyc MainExample.groovy (and then invoke with java or view with javap) + +The example should print: + Hello from the greet() method! + +No exceptions should occur. + +The MainIntegrationTest.groovy file shows how to invoke an ASTTransformation +from a unit test. An IDE should be able to debug this. http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/commandLineTools/AntMap.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/commandLineTools/AntMap.groovy b/src/main/groovy/commandLineTools/AntMap.groovy new file mode 100644 index 0000000..741c817 --- /dev/null +++ b/src/main/groovy/commandLineTools/AntMap.groovy @@ -0,0 +1,84 @@ +#!/bin/env groovy +/* + * 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. + */ + +// +// convert an ant build file into a format suitable for http://sf.net/projects/freemind +// +// by Jeremy Rayner - 2 Dec 2004 +// inspired by Sam Newman ( http://www.magpiebrain.com/archives/2004/12/02/antgui ) +// +// usage: groovy AntMap > build.mm + +buildFileName = "build.xml" // default + +// handle command line params +if (args.length > 0) { + buildFileName = args[0] +} + +// header +println "<map version='0.7.1'>" +project = new XmlParser().parse(buildFileName) +name = project['@name'] +println "<node TEXT='${name}'>" +level = 0 + +printChildren(project,level) + + + +def void printChildren(node,level) { + level++ + node.each { + name = huntForName(it) + if (name != null) { + if (level > 1) { + println "<node TEXT='${name}' POSITION='right'>" + } else if (it.name() == 'property' || it.name() == 'path' ) { + if (it.children().size() > 0) { + println "<node TEXT='${name}' POSITION='left' FOLDED='true'>" + } else { + println "<node TEXT='${name}' POSITION='left'>" + } + } else if (it.children().size() > 0) { + println "<node TEXT='${name}' POSITION='right' FOLDED='true'>" + } else { + println "<node TEXT='${name}' POSITION='right'>" + } + } + if (it.children().size() > 0) printChildren(it,level) + if (name!=null) println "</node>" + } +} + +// footer +println "</node></map>" + + +def String huntForName(node) { + preferNodeNames = ["junitreport"] + if (node == null) return null + if (preferNodeNames.contains(node.name())) return node.name() + if (node['@name'] != null) return node['@name'] + if (node['@todir'] != null) return node['@todir'] + if (node['@dir'] != null) return node['@dir'] + if (node['@refid'] != null) return node['@refid'] + return node.name() +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/commandLineTools/BigTests.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/commandLineTools/BigTests.groovy b/src/main/groovy/commandLineTools/BigTests.groovy new file mode 100644 index 0000000..85fa13b --- /dev/null +++ b/src/main/groovy/commandLineTools/BigTests.groovy @@ -0,0 +1,51 @@ +#!/bin/env groovy +/* + * 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. + */ +// +// output tests in a junit xml report that took greater than specified time +// +// by Jeremy Rayner - 15 Dec 2004 +// +// usage: groovy BigTests.groovy <TEST.xml> <time in secs> + +fileName = "" // default +timeCutOff = new Float("1.0") + +if (args.length > 1) { + fileName = args[0] + timeCutOff = new Float(args[1]) +} else { + println "usage: groovy BigTests.groovy <TEST.xml> <time in secs>" +} + +testSuite = new XmlParser().parse(fileName) +name = testSuite['@name'] +println "TestSuite: ${name}" +bigTests = [:] +testSuite.each { + if ("testcase" == it.name()) { + classname = it['@classname'] + name = it['@name'] + time = new Float(it['@time']) + if (time > timeCutOff) { + println " ${time} - ${classname}.${name}()" + } + } +} + http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/commandLineTools/ListFiles.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/commandLineTools/ListFiles.groovy b/src/main/groovy/commandLineTools/ListFiles.groovy new file mode 100644 index 0000000..e3d1f71 --- /dev/null +++ b/src/main/groovy/commandLineTools/ListFiles.groovy @@ -0,0 +1,43 @@ +/* + * 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. + */ +public class ListFilesManualTest { + + static void main(args) { + println("Called main with ${args}") + listFiles(Arrays.asList(args)) + } + + static String getPath(file) { + return file.absolutePath + } + + static void listFiles(dirs) { + println("called with ${dirs}") + + for(dir in dirs) { + println("dir: ${dir}") + + def files = new java.io.File(dir).listFiles() + + for (f in files) { + println(getPath(f)) + } + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/commandLineTools/Reflections.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/commandLineTools/Reflections.groovy b/src/main/groovy/commandLineTools/Reflections.groovy new file mode 100644 index 0000000..4be7551 --- /dev/null +++ b/src/main/groovy/commandLineTools/Reflections.groovy @@ -0,0 +1,36 @@ +/* + * 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. + */ +/** + * Echoes back whatever is thrown at it (with a <br> at end for browsers) ... + * @author <a href="mailto:[email protected]">Jeremy Rayner</a> + * + * invoke using + * groovy -l 80 Reflections.groovy + * + * (where 80 is the port to listen for requests upon) + */ + +// echo, echo, echo... +println "${line} <br>" + +//assume no input means we've finished... +if (line == "") { + // clean up gracefully, closing sockets etc + return "success" +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/commandLineTools/SimpleWebServer.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/commandLineTools/SimpleWebServer.groovy b/src/main/groovy/commandLineTools/SimpleWebServer.groovy new file mode 100644 index 0000000..09835d7 --- /dev/null +++ b/src/main/groovy/commandLineTools/SimpleWebServer.groovy @@ -0,0 +1,90 @@ +/* + * 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. + */ +/** + * Simple web server + * @author <a href="mailto:[email protected]">Jeremy Rayner</a> + * + * invoke using + * groovy -l 80 SimpleWebServer.groovy + * + * (where 80 is the port to listen for requests upon) + */ +if (init) { + headers = [:] + binaryTypes = ["gif","jpg","png"] + mimeTypes = [ + "css" : "text/css", + "gif" : "image/gif", + "htm" : "text/html", + "html": "text/html", + "jpg" : "image/jpeg", + "png" : "image/png" + ] +} + +// parse the request +if (line.toLowerCase().startsWith("get")) { + content = line.tokenize()[1] +} else { + h = line.tokenize(":") + headers[h[0]] = h[1] +} + +// all done, now process request +if (line.size() == 0) { + processRequest() + return "success" +} + +// ------------------------ + +def processRequest() { + if (content.indexOf("..") < 0) { //simplistic security + // simple file browser rooted from current dir + f = new File("." + content) + if (f.isDirectory()) { + printDirectoryListing(f) + } else { + extension = content.substring(content.lastIndexOf(".") + 1) + printHeaders(mimeTypes.get(extension,"text/plain")) + + if (binaryTypes.contains(extension)) { + socket.outputStream.write(f.readBytes()) + } else { + println(f.text) + } + } + } +} + +def printDirectoryListing(f) { + printHeaders("text/html") + println "<html><head></head><body>" + for (i in f.list().toList().sort()) { + if ("/" == content) { content = "" } // special case for root document + println "<a href='${content}/${i}'>${i}</a><br>" + } + println "</body></html>" +} + +def printHeaders(mimeType) { + println "HTTP/1.0 200 OK" + println "Content-Type: ${mimeType}" + println "" +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/console/MortgageCalculator.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/console/MortgageCalculator.groovy b/src/main/groovy/console/MortgageCalculator.groovy new file mode 100644 index 0000000..375e244 --- /dev/null +++ b/src/main/groovy/console/MortgageCalculator.groovy @@ -0,0 +1,95 @@ +/* + * 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. + */ +/** + * Mortgage Calculator + * @author: Jeremy Rayner + * based on algorithms by Jeff Louie, Dr W Carlini and Newton + */ + +println "__..::~~'''~~::..__" +println "Mortgage Calculator" +println "~~~~~~~~~~~~~~~~~~~" +println "Please input 3 of the 4 values in your mortgage calculation" +println "This program will then calculate the value you leave blank" +println "" + +def variables = [ + "Amount of mortgage" : 0.0, + "Annual interest rate (%)" : 0.0, + "Loan duration (months)" : 0.0, + "Monthly payments" : 0.0 +] + +for (entry in variables.entrySet()) { + print("${entry.key}:") + def userInput = System.in.readLine() + if ("" == userInput) { + valueToCalculate = entry.key + } else { + entry.value = userInput.toDouble() + } +} + +println "$valueToCalculate = ${calculateValueOf(valueToCalculate)}" + + + + + +def calculateValueOf(valueToCalculate) { + def result = 0 + def principal = variables["Amount of mortgage"] + def interest = variables["Annual interest rate (%)"] / 1200 + def months = variables["Loan duration (months)"] + def payment = variables["Monthly payments"] + + switch (valueToCalculate) { + case "Amount of mortgage": + result = 1 + interest + result = 1/Math.pow(result,months) + result = ((1-result)/interest) * payment + break + case "Loan duration (months)": + result = (1 - (principal * interest / payment)) + result = Math.log(result) + result = - result / Math.log(1 + interest) + break + case "Monthly payments": + result = 1 + interest + result = 1 / Math.pow(result,months) + result = (principal * interest) / (1 - result) + break + case "Annual interest rate (%)": + result = payment / principal + def diff = 100; def accuracy = 0.00001; def maxIterations = 1000 + def index = 0 + while ((diff > accuracy) && (index < maxIterations)) { + def temp = result + def numerator = (principal * temp / payment) + Math.pow((1 + temp), -months) - 1 + def denominator= (principal / payment) - months * Math.pow((1 + temp), (-months - 1)) + result = temp - (numerator / denominator) + diff = result - temp + diff = Math.abs(diff) + index++ + } + result *= 1200 + break + } + return result +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/console/knowYourTables.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/console/knowYourTables.groovy b/src/main/groovy/console/knowYourTables.groovy new file mode 100644 index 0000000..1343365 --- /dev/null +++ b/src/main/groovy/console/knowYourTables.groovy @@ -0,0 +1,34 @@ +/* + * 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. + */ +/** + * Simple mathematics quiz + * @author: Jeremy Rayner + * based on algorithms from INPUT/Marshall Cavendish/1984 + */ +while (true) { + try { + def n = (int)(Math.random() * 12) + 1 + println "What is $n times 9?" + def a = System.in.readLine().toInteger() + if (a == n * 9) println "Correct" + + } catch (Exception e) { + println "The computer didn't understand your input" + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/console/thinkOfANumber.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/console/thinkOfANumber.groovy b/src/main/groovy/console/thinkOfANumber.groovy new file mode 100644 index 0000000..7a42cf9 --- /dev/null +++ b/src/main/groovy/console/thinkOfANumber.groovy @@ -0,0 +1,39 @@ +/* + * 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. + */ +/** + * Simple game + * @author: Jeremy Rayner + * based on algorithms from INPUT/Marshall Cavendish/1984 + */ +while (true) { + try { + int x = Math.random() * 6 + print "The computer has chosen a number between 0 and 5. Can you guess it?" + + def line = System.in.readLine() + int g = line.toInteger() + if (g == x) { + println "Well done" + } else { + println "Tough luck - you're wrong" + } + } catch (NumberFormatException e) { + println "The computer didn't understand '$line'" + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/groovy/j2ee/CreateData.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/groovy/j2ee/CreateData.groovy b/src/main/groovy/groovy/j2ee/CreateData.groovy new file mode 100644 index 0000000..a0bef2a --- /dev/null +++ b/src/main/groovy/groovy/j2ee/CreateData.groovy @@ -0,0 +1,41 @@ +/* + * 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. + */ +println("Called with context: " + context) + +db = context.lookup("/client/tools/DatabaseHome").create() + +println("About to do queries on: " + db) + +queries = [ + "CREATE TABLE account ( ssn CHAR(11) PRIMARY KEY, first_name CHAR(20), last_name CHAR(20), balance INT)", + "CREATE TABLE entity ( id INT PRIMARY KEY AUTO INCREMENT, first_name CHAR(20), last_name CHAR(20) )" +] + +for (sql in queries) { + println("evaluating: " + sql) + db.execute(sql) +} + +println("creating entity bean") + +context.lookup("/client/tests/entity/bmp/BasicBmpHome").create("Groovy Dain") + +println("Done") + +"OK" \ No newline at end of file http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/groovy/j2ee/J2eeConsole.java ---------------------------------------------------------------------- diff --git a/src/main/groovy/groovy/j2ee/J2eeConsole.java b/src/main/groovy/groovy/j2ee/J2eeConsole.java new file mode 100644 index 0000000..538ebf6 --- /dev/null +++ b/src/main/groovy/groovy/j2ee/J2eeConsole.java @@ -0,0 +1,78 @@ +/* + * 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 groovy.j2ee; + +import groovy.lang.GroovyObject; +import groovy.lang.GroovyShell; +import org.codehaus.groovy.runtime.InvokerHelper; + +import javax.naming.Context; +import javax.naming.InitialContext; +import java.util.Properties; + +/** + * A J2EE console + * + * @author <a href="mailto:[email protected]">James Strachan</a> + */ +public class J2eeConsole { + + public static void main(String[] args) { + if (args.length <= 0) { + System.out.println("Usage: home [configuaration] [localcopy]"); + return; + } + + String home = args[0]; + + Properties p = new Properties(); + System.setProperty("openejb.home", home); + p.put(Context.INITIAL_CONTEXT_FACTORY, "org.openejb.client.LocalInitialContextFactory"); + p.put("openejb.loader", "embed"); + p.put("openejb.home", home); + + if (args.length > 1) { + String conf = args[1]; + System.setProperty("openejb.configuration", conf); + p.put("openejb.configuration", conf); + } + if (args.length > 2) { + String copy = args[2]; + System.setProperty("openejb.localcopy", copy); + p.put("openejb.localcopy", copy); + } + try { + InitialContext ctx = new InitialContext(p); + + GroovyShell shell = new GroovyShell(); + shell.setVariable("context", ctx); + //shell.evaluate("src/test/groovy/j2ee/CreateData.groovy"); + + //shell.evaluate("src/main/groovy/ui/Console.groovy"); + GroovyObject console = (GroovyObject) InvokerHelper.invokeConstructorOf("groovy.ui.Console", null); + console.setProperty("shell", shell); + console.invokeMethod("run", null); + /* + */ + } + catch (Exception e) { + System.out.println("Caught: " + e); + } + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/groovy/model/MvcDemo.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/groovy/model/MvcDemo.groovy b/src/main/groovy/groovy/model/MvcDemo.groovy new file mode 100644 index 0000000..dc31126 --- /dev/null +++ b/src/main/groovy/groovy/model/MvcDemo.groovy @@ -0,0 +1,61 @@ +/* + * 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 groovy.model + +import groovy.swing.SwingBuilder +/** + * + */ +class MvcDemo { + + def frame + def swing + + void run() { + swing = new SwingBuilder() + + def frame = swing.frame(title:'MVC Demo', location:[200,200], size:[300,200]) { + menuBar { + menu(text:'Help') { + menuItem() { + action(name:'About', closure:{ showAbout() }) + } + } + } + panel { + borderLayout() + scrollPane(constraints:CENTER) { + table() { + tableModel(list:[ ['name':'James', 'location':'London'], ['name':'Bob', 'location':'Atlanta'] ]) { + propertyColumn(header:'Name', propertyName:'name') + propertyColumn(header:'Location', propertyName:'location') + } + } + } + } + } + frame.show() + } + + void showAbout() { + def pane = swing.optionPane(message:'This demo shows how you can create UI models from simple MVC models') + def dialog = pane.createDialog(frame, 'About MVC Demo') + dialog.show() + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/groovy/swing/Demo.java ---------------------------------------------------------------------- diff --git a/src/main/groovy/groovy/swing/Demo.java b/src/main/groovy/groovy/swing/Demo.java new file mode 100644 index 0000000..db997ca --- /dev/null +++ b/src/main/groovy/groovy/swing/Demo.java @@ -0,0 +1,55 @@ +/* + * 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 groovy.swing; + +import groovy.lang.GroovyObject; +import groovy.lang.GroovyCodeSource; +import groovy.lang.GroovyClassLoader; +import groovy.util.GroovyTestCase; + +import java.io.File; +import java.security.AccessController; +import java.security.PrivilegedAction; + +/** + * + * @author <a href="mailto:[email protected]">James Strachan</a> + */ +public class Demo extends GroovyTestCase { + ClassLoader parentLoader = getClass().getClassLoader(); + protected GroovyClassLoader loader = + (GroovyClassLoader) AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return new GroovyClassLoader(parentLoader); + } + }); + + public static void main(String[] args) throws Exception { + Demo demo = new Demo(); + GroovyObject object = demo.compile("src/examples/groovy/swing/SwingDemo.groovy"); + object.invokeMethod("run", null); + } + + protected GroovyObject compile(String fileName) throws Exception { + Class groovyClass = loader.parseClass(new GroovyCodeSource(new File(fileName))); + GroovyObject object = (GroovyObject) groovyClass.newInstance(); + assertTrue(object != null); + return object; + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/groovy/swing/MyTableModel.java ---------------------------------------------------------------------- diff --git a/src/main/groovy/groovy/swing/MyTableModel.java b/src/main/groovy/groovy/swing/MyTableModel.java new file mode 100644 index 0000000..fa28bf5 --- /dev/null +++ b/src/main/groovy/groovy/swing/MyTableModel.java @@ -0,0 +1,123 @@ +/* + * 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 groovy.swing; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.swing.table.AbstractTableModel; + +/** + * A sample table model + * + * @author <a href="mailto:[email protected]">James Strachan</a> + */ +public class MyTableModel extends AbstractTableModel { + + private static final Logger log = Logger.getLogger(MyTableModel.class.getName()); + + public MyTableModel() { + } + + final String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian" }; + final Object[][] data = { { "Mary", "Campione", "Snowboarding", Integer.valueOf(5), new Boolean(false)}, { + "Alison", "Huml", "Rowing", Integer.valueOf(3), new Boolean(true) + }, { + "Kathy", "Walrath", "Chasing toddlers", Integer.valueOf(2), new Boolean(false) + }, { + "Mark", "Andrews", "Speed reading", Integer.valueOf(20), new Boolean(true) + }, { + "Angela", "Lih", "Teaching high school", Integer.valueOf(4), new Boolean(false) + } + }; + + public int getColumnCount() { + return columnNames.length; + } + + public int getRowCount() { + return data.length; + } + + public String getColumnName(int col) { + return columnNames[col]; + } + + public Object getValueAt(int row, int col) { + return data[row][col]; + } + + /* + * JTable uses this method to determine the default renderer/ + * editor for each cell. If we didn't implement this method, + * then the last column would contain text ("true"/"false"), + * rather than a check box. + */ + public Class getColumnClass(int c) { + return getValueAt(0, c).getClass(); + } + + /* + * Don't need to implement this method unless your table's + * editable. + */ + public boolean isCellEditable(int row, int col) { + //Note that the data/cell address is constant, + //no matter where the cell appears onscreen. + if (col < 2) { + return false; + } + else { + return true; + } + } + + /* + * Don't need to implement this method unless your table's + * data can change. + */ + public void setValueAt(Object value, int row, int col) { + if (log.isLoggable(Level.FINE)) { + log.fine( + "Setting value at " + row + "," + col + " to " + value + " (an instance of " + value.getClass() + ")"); + } + + if (data[0][col] instanceof Integer && !(value instanceof Integer)) { + //With JFC/Swing 1.1 and JDK 1.2, we need to create + //an Integer from the value; otherwise, the column + //switches to contain Strings. Starting with v 1.3, + //the table automatically converts value to an Integer, + //so you only need the code in the 'else' part of this + //'if' block. + //XXX: See TableEditDemo.java for a better solution!!! + try { + data[row][col] = Integer.valueOf(value.toString()); + fireTableCellUpdated(row, col); + } + catch (NumberFormatException e) { + log.log(Level.SEVERE, "The \"" + getColumnName(col) + "\" column accepts only integer values."); + } + } + else { + data[row][col] = value; + fireTableCellUpdated(row, col); + } + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/groovy/swing/SwingDemo.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/groovy/swing/SwingDemo.groovy b/src/main/groovy/groovy/swing/SwingDemo.groovy new file mode 100644 index 0000000..6158032 --- /dev/null +++ b/src/main/groovy/groovy/swing/SwingDemo.groovy @@ -0,0 +1,127 @@ +/* + * 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 groovy.swing + +import java.awt.BorderLayout +import javax.swing.BorderFactory +import groovy.model.MvcDemo +import groovy.swing.SwingBuilder + +class SwingDemo { + + def swing = new SwingBuilder() + def frame + + static void main(args) { + def demo = new SwingDemo() + demo.run() + } + + void run() { + def frame = swing.frame( + title:'This is a Frame', + location:[100,100], + size:[800,400], + defaultCloseOperation:javax.swing.WindowConstants.EXIT_ON_CLOSE) { + + menuBar { + menu(text:'File') { + menuItem() { + action(name:'New', closure:{ println("clicked on the new menu item!") }) + } + menuItem() { + action(name:'Open', closure:{ println("clicked on the open menu item!") }) + } + separator() + menuItem() { + action(name:'Save', enabled:false, closure:{ println("clicked on the Save menu item!") }) + } + } + menu(text:'Demos') { + menuItem() { + action(name:'Simple TableModel Demo', closure:{ showGroovyTableDemo() }) + } + menuItem() { + action(name:'MVC Demo', closure:{ showMVCDemo() }) + } + menuItem() { + action(name:'TableLayout Demo', closure:{ showTableLayoutDemo() }) + } + } + menu(text:'Help') { + menuItem() { + action(name:'About', closure:{ showAbout() }) + } + } + } + splitPane { + panel(border:BorderFactory.createTitledBorder(BorderFactory.createLoweredBevelBorder(), 'titled border')) { + borderLayout() + vbox(constraints:NORTH) { + panel { + borderLayout() + label(text:'Name', constraints:WEST, toolTipText:'This is the name field') + textField(text:'James', constraints:CENTER, toolTipText:'Enter the name into this field') + } + panel { + borderLayout() + label(text:'Location', constraints:WEST, toolTipText:'This is the location field') + comboBox(items:['Atlanta', 'London', 'New York'], constraints:CENTER, toolTipText:'Choose the location into this field') + } + button(text:'Click Me', actionPerformed:{event -> println("closure fired with event: " + event) }) + } + scrollPane(constraints:CENTER, border:BorderFactory.createRaisedBevelBorder()) { + textArea(text:'Some text goes here', toolTipText:'This is a large text area to type in text') + } + } + scrollPane { + table(model:new MyTableModel()) + } + } + } + frame.show() + } + + void showAbout() { + // this version doesn't auto-size & position the dialog + /* + def dialog = swing.dialog(owner:frame, title:'About GroovySwing') { + optionPane(message:'Welcome to the wonderful world of GroovySwing') + } + */ + def pane = swing.optionPane(message:'Welcome to the wonderful world of GroovySwing') + def dialog = pane.createDialog(frame, 'About GroovySwing') + dialog.show() + } + + void showGroovyTableDemo() { + def demo = new TableDemo() + demo.run() + } + + void showMVCDemo() { + def demo = new MvcDemo() + demo.run() + } + + void showTableLayoutDemo() { + def demo = new TableLayoutDemo() + demo.run() + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/groovy/swing/TableDemo.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/groovy/swing/TableDemo.groovy b/src/main/groovy/groovy/swing/TableDemo.groovy new file mode 100644 index 0000000..abc2659 --- /dev/null +++ b/src/main/groovy/groovy/swing/TableDemo.groovy @@ -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. + */ +package groovy.swing + +import java.awt.BorderLayout +import javax.swing.BorderFactory +import groovy.swing.SwingBuilder + +/** + * Demonstrates the use of the Groovy TableModels for viewing tables of any List of objects + */ +class TableDemo { + + // properties + def frame + def swing + + static void main(args) { + def demo = new TableDemo() + demo.run() + } + + void run() { + swing = new SwingBuilder() + + frame = swing.frame(title:'Groovy TableModel Demo', location:[200,200], size:[300,200]) { + menuBar { + menu(text:'Help') { + menuItem() { + action(name:'About', closure:{ showAbout() }) + } + } + } + panel { + borderLayout() + scrollPane(constraints:CENTER) { + table() { + def model = [['name':'James', 'location':'London'], ['name':'Bob', 'location':'Atlanta'], ['name':'Geir', 'location':'New York']] + + tableModel(list:model) { + closureColumn(header:'Name', read:{row -> return row.name}) + closureColumn(header:'Location', read:{row -> return row.location}) + } + } + } + } + } + frame.show() + } + + void showAbout() { + def pane = swing.optionPane(message:'This demo shows how GroovySwing can use Groovy closures to create simple table models') + def dialog = pane.createDialog(frame, 'About GroovySwing') + dialog.show() + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/groovy/swing/TableLayoutDemo.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/groovy/swing/TableLayoutDemo.groovy b/src/main/groovy/groovy/swing/TableLayoutDemo.groovy new file mode 100644 index 0000000..df2c223 --- /dev/null +++ b/src/main/groovy/groovy/swing/TableLayoutDemo.groovy @@ -0,0 +1,76 @@ +/* + * 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 groovy.swing + +import java.awt.BorderLayout +import javax.swing.BorderFactory +import groovy.swing.SwingBuilder + +/** + * Demonstrates the use of the table layout + */ +class TableLayoutDemo { + + def frame + def swing + + void run() { + swing = new SwingBuilder() + + frame = swing.frame(title:'TableLayout Demo', location:[200,200], size:[300,200]) { + menuBar { + menu(text:'Help') { + menuItem() { + action(name:'About', closure:{ showAbout() }) + } + } + } + tableLayout { + tr { + td { + label(text:'name') + } + td(colfill:true) { + textField(text:'James') + } + } + tr { + td { + label(text:'location') + } + td(colfill:true) { + textField(text:'London') + } + } + tr { + td(colspan:2, align:'center') { + button(text:'OK') + } + } + } + } + frame.show() + } + + void showAbout() { + def pane = swing.optionPane(message:'This demo shows how you can use HTML style table layouts with Swing components') + def dialog = pane.createDialog(frame, 'About TableLayout Demo') + dialog.show() + } +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/groovy2d/paintingByNumbers.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/groovy2d/paintingByNumbers.groovy b/src/main/groovy/groovy2d/paintingByNumbers.groovy new file mode 100644 index 0000000..5a69baf --- /dev/null +++ b/src/main/groovy/groovy2d/paintingByNumbers.groovy @@ -0,0 +1,66 @@ +/* + * 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. + */ +/** + * Simple patchwork graphics demo + * @author: Jeremy Rayner, changes by Dierk Koenig + */ +import javax.swing.WindowConstants as WC +import groovy.swing.SwingBuilder + +def width = 500, height = 400, blockSize = 10 +def g = createGraphics(width, height) + +// main loop +while (true) { + drawBlock(width, height, blockSize, g) +} + +// random integer +def rnd(upperBound){ + (int)(Math.random() * upperBound) +} + +// draw a random coloured square within bounds +def drawBlock(w, h, b, g) { + def row = rnd(h / b) + def column = rnd(w / b) + def colour = new java.awt.Color(rnd(255),rnd(255),rnd(255)) + g.color = colour + g.fillRect(column * b, row * b, b, b) +} + +// create a new frame and clear screen +def createGraphics(w, h) { + def frame = new SwingBuilder().frame( + title:'Painting by numbers', + location:[20,20], + size:[w, h], + defaultCloseOperation:WC.EXIT_ON_CLOSE + ) + frame.show() + + // obtain graphics context + def gfx = frame.graphics + + // clear screen + gfx.color = java.awt.Color.BLACK + gfx.fillRect(0, 0, w, h) + + return gfx +} http://git-wip-us.apache.org/repos/asf/groovy-examples/blob/3bd1e181/src/main/groovy/groovyShell/ArithmeticShell.groovy ---------------------------------------------------------------------- diff --git a/src/main/groovy/groovyShell/ArithmeticShell.groovy b/src/main/groovy/groovyShell/ArithmeticShell.groovy new file mode 100644 index 0000000..d1a5659 --- /dev/null +++ b/src/main/groovy/groovyShell/ArithmeticShell.groovy @@ -0,0 +1,157 @@ +/* + * 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. + */ +import org.codehaus.groovy.control.CompilerConfiguration +import org.codehaus.groovy.control.MultipleCompilationErrorsException +import org.codehaus.groovy.control.customizers.ImportCustomizer +import org.codehaus.groovy.control.customizers.SecureASTCustomizer +import org.codehaus.groovy.control.messages.ExceptionMessage +import static org.codehaus.groovy.syntax.Types.* +import org.codehaus.groovy.ast.stmt.BlockStatement +import org.codehaus.groovy.ast.stmt.ExpressionStatement +import org.codehaus.groovy.ast.expr.BinaryExpression +import org.codehaus.groovy.ast.expr.ConstantExpression +import org.codehaus.groovy.ast.expr.MethodCallExpression +import org.codehaus.groovy.ast.expr.StaticMethodCallExpression +import org.codehaus.groovy.ast.expr.ArgumentListExpression +import org.codehaus.groovy.ast.expr.PropertyExpression +import org.codehaus.groovy.ast.expr.UnaryMinusExpression +import org.codehaus.groovy.ast.expr.UnaryPlusExpression +import org.codehaus.groovy.ast.expr.PrefixExpression +import org.codehaus.groovy.ast.expr.PostfixExpression +import org.codehaus.groovy.ast.expr.TernaryExpression +import org.codehaus.groovy.ast.expr.ElvisOperatorExpression +import org.codehaus.groovy.ast.expr.BooleanExpression +import org.codehaus.groovy.ast.expr.ClassExpression + +/** + * The arithmetic shell is similar to a GroovyShell in that it can evaluate text as + * code and return a result. It is not a subclass of GroovyShell because it does not widen + * the contract of GroovyShell, instead it narrows it. Using one of these shells like a + * GroovyShell would result in many runtime errors. + * + * @author Hamlet D'Arcy ([email protected]) + * @author Guillaume Laforge + */ +class ArithmeticShell { + + /** + * Compiles the text into a Groovy object and then executes it, returning the result. + * @param text + * the script to evaluate typed as a string + * @throws SecurityException + * most likely the script is doing something other than arithmetic + * @throws IllegalStateException + * if the script returns something other than a number + */ + Number evaluate(String text) { + try { + final ImportCustomizer imports = new ImportCustomizer().addStaticStars('java.lang.Math') // add static import of java.lang.Math + final SecureASTCustomizer secure = new SecureASTCustomizer() + secure.with { + closuresAllowed = false + methodDefinitionAllowed = false + + importsWhitelist = [] + staticImportsWhitelist = [] + staticStarImportsWhitelist = ['java.lang.Math'] // only java.lang.Math is allowed + + tokensWhitelist = [ + PLUS, + MINUS, + MULTIPLY, + DIVIDE, + MOD, + POWER, + PLUS_PLUS, + MINUS_MINUS, + COMPARE_EQUAL, + COMPARE_NOT_EQUAL, + COMPARE_LESS_THAN, + COMPARE_LESS_THAN_EQUAL, + COMPARE_GREATER_THAN, + COMPARE_GREATER_THAN_EQUAL, + ].asImmutable() + + constantTypesClassesWhiteList = [ + Integer, + Float, + Long, + Double, + BigDecimal, + Integer.TYPE, + Long.TYPE, + Float.TYPE, + Double.TYPE + ].asImmutable() + + receiversClassesWhiteList = [ + Math, + Integer, + Float, + Double, + Long, + BigDecimal + ].asImmutable() + + statementsWhitelist = [ + BlockStatement, + ExpressionStatement + ].asImmutable() + + expressionsWhitelist = [ + BinaryExpression, + ConstantExpression, + MethodCallExpression, + StaticMethodCallExpression, + ArgumentListExpression, + PropertyExpression, + UnaryMinusExpression, + UnaryPlusExpression, + PrefixExpression, + PostfixExpression, + TernaryExpression, + ElvisOperatorExpression, + BooleanExpression, + // ClassExpression needed for processing of MethodCallExpression, PropertyExpression + // and StaticMethodCallExpression + ClassExpression + ].asImmutable() + + } + CompilerConfiguration config = new CompilerConfiguration() + config.addCompilationCustomizers(imports, secure) + GroovyClassLoader loader = new GroovyClassLoader(this.class.classLoader, config) + Class clazz = loader.parseClass(text) + Script script = (Script) clazz.newInstance(); + Object result = script.run() + if (!(result instanceof Number)) throw new IllegalStateException("Script returned a non-number: $result"); + return (Number) result + } catch (SecurityException ex) { + throw new SecurityException("Could not evaluate script: $text", ex) + } catch (MultipleCompilationErrorsException mce) { + //this allows compilation errors to be seen by the user + mce.errorCollector.errors.each { + if (it instanceof ExceptionMessage && it.cause instanceof SecurityException) { + throw it.cause + } + } + throw mce + } + } +}
