├── .gitignore ├── CompanyGradle ├── .gitignore ├── company-gradle │ ├── build.gradle │ └── src │ │ └── scripts │ │ └── init.d │ │ └── sample.gradle └── simple-project │ ├── build.gradle │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ └── gradlew.bat ├── ContinuousIntegration ├── .gitignore └── GrailsSample │ ├── .classpath │ ├── .project │ ├── .settings │ └── org.codehaus.groovy.eclipse.preferences.prefs │ ├── application.properties │ ├── grails-app │ ├── conf │ │ ├── BootStrap.groovy │ │ ├── BuildConfig.groovy │ │ ├── Config.groovy │ │ ├── DataSource.groovy │ │ ├── UrlMappings.groovy │ │ └── spring │ │ │ └── resources.groovy │ ├── controllers │ │ └── com │ │ │ └── mrhaki │ │ │ └── ci │ │ │ └── sample │ │ │ └── HelloController.groovy │ ├── i18n │ │ ├── messages.properties │ │ ├── messages_da.properties │ │ ├── messages_de.properties │ │ ├── messages_es.properties │ │ ├── messages_fr.properties │ │ ├── messages_it.properties │ │ ├── messages_ja.properties │ │ ├── messages_nl.properties │ │ ├── messages_pt_BR.properties │ │ ├── messages_pt_PT.properties │ │ ├── messages_ru.properties │ │ ├── messages_th.properties │ │ └── messages_zh_CN.properties │ ├── services │ │ └── com │ │ │ └── mrhaki │ │ │ └── ci │ │ │ └── sample │ │ │ └── GreetingService.groovy │ └── views │ │ ├── error.gsp │ │ ├── hello │ │ └── hello.gsp │ │ ├── index.gsp │ │ └── layouts │ │ └── main.gsp │ ├── scripts │ └── _Events.groovy │ ├── test │ └── unit │ │ └── com │ │ └── mrhaki │ │ └── ci │ │ └── sample │ │ ├── GreetingServiceSpec.groovy │ │ └── HelloControllerSpec.groovy │ └── web-app │ ├── WEB-INF │ ├── applicationContext.xml │ ├── sitemesh.xml │ └── tld │ │ ├── c.tld │ │ ├── fmt.tld │ │ ├── grails.tld │ │ └── spring.tld │ ├── css │ └── main.css │ ├── favicon.ico │ ├── images │ ├── favicon.ico │ ├── grails_logo.jpg │ ├── grails_logo.png │ ├── leftnav_btm.png │ ├── leftnav_midstretch.png │ ├── leftnav_top.png │ ├── skin │ │ ├── database_add.png │ │ ├── database_delete.png │ │ ├── database_edit.png │ │ ├── database_save.png │ │ ├── database_table.png │ │ ├── exclamation.png │ │ ├── house.png │ │ ├── information.png │ │ ├── shadow.jpg │ │ ├── sorted_asc.gif │ │ └── sorted_desc.gif │ ├── spinner.gif │ └── springsource.png │ └── js │ ├── application.js │ └── prototype │ ├── animation.js │ ├── builder.js │ ├── controls.js │ ├── dragdrop.js │ ├── effects.js │ ├── prototype.js │ ├── rico.js │ ├── scriptaculous.js │ ├── slider.js │ ├── sound.js │ └── unittest.js ├── GrailsEnvironments ├── sample │ ├── .gitignore │ ├── application.properties │ ├── grails-app │ │ ├── conf │ │ │ ├── BootStrap.groovy │ │ │ ├── BuildConfig.groovy │ │ │ ├── Config.groovy │ │ │ ├── DataSource.groovy │ │ │ ├── UrlMappings.groovy │ │ │ └── spring │ │ │ │ └── resources.groovy │ │ ├── i18n │ │ │ ├── messages.properties │ │ │ ├── messages_da.properties │ │ │ ├── messages_de.properties │ │ │ ├── messages_es.properties │ │ │ ├── messages_fr.properties │ │ │ ├── messages_it.properties │ │ │ ├── messages_ja.properties │ │ │ ├── messages_nl.properties │ │ │ ├── messages_pt_BR.properties │ │ │ ├── messages_pt_PT.properties │ │ │ ├── messages_ru.properties │ │ │ ├── messages_th.properties │ │ │ └── messages_zh_CN.properties │ │ └── views │ │ │ ├── error.gsp │ │ │ ├── index.gsp │ │ │ └── layouts │ │ │ └── main.gsp │ ├── scripts │ │ └── _Events.groovy │ ├── src │ │ └── templates │ │ │ ├── artifacts │ │ │ ├── Controller.groovy │ │ │ ├── DomainClass.groovy │ │ │ ├── Filters.groovy │ │ │ ├── Script.groovy │ │ │ ├── Service.groovy │ │ │ ├── TagLib.groovy │ │ │ ├── Tests.groovy │ │ │ ├── WebTest.groovy │ │ │ └── hibernate.cfg.xml │ │ │ ├── scaffolding │ │ │ ├── Controller.groovy │ │ │ ├── create.gsp │ │ │ ├── edit.gsp │ │ │ ├── list.gsp │ │ │ ├── renderEditor.template │ │ │ └── show.gsp │ │ │ └── war │ │ │ └── web.xml │ └── web-app │ │ ├── WEB-INF │ │ ├── applicationContext.xml │ │ ├── sitemesh.xml │ │ └── tld │ │ │ ├── c.tld │ │ │ ├── fmt.tld │ │ │ ├── grails.tld │ │ │ └── spring.tld │ │ ├── css │ │ └── main.css │ │ ├── images │ │ ├── favicon.ico │ │ ├── grails_logo.jpg │ │ ├── grails_logo.png │ │ ├── leftnav_btm.png │ │ ├── leftnav_midstretch.png │ │ ├── leftnav_top.png │ │ ├── skin │ │ │ ├── database_add.png │ │ │ ├── database_delete.png │ │ │ ├── database_edit.png │ │ │ ├── database_save.png │ │ │ ├── database_table.png │ │ │ ├── exclamation.png │ │ │ ├── house.png │ │ │ ├── information.png │ │ │ ├── shadow.jpg │ │ │ ├── sorted_asc.gif │ │ │ └── sorted_desc.gif │ │ ├── spinner.gif │ │ └── springsource.png │ │ └── js │ │ ├── application.js │ │ └── prototype │ │ ├── animation.js │ │ ├── builder.js │ │ ├── controls.js │ │ ├── dragdrop.js │ │ ├── effects.js │ │ ├── prototype.js │ │ ├── rico.js │ │ ├── scriptaculous.js │ │ ├── slider.js │ │ ├── sound.js │ │ └── unittest.js └── tomcat-instances │ ├── production │ ├── conf │ │ ├── server.xml │ │ └── web.xml │ └── logs │ │ ├── catalina.log │ │ ├── host-manager.log │ │ ├── localhost.log │ │ └── manager.log │ ├── system-test │ ├── bin │ │ └── setenv.sh │ └── conf │ │ ├── server.xml │ │ └── web.xml │ └── user-acceptance-test │ ├── bin │ └── setenv.sh │ └── conf │ ├── server.xml │ └── web.xml ├── JavaProjectWithSpock ├── user-service-spock │ ├── .classpath │ ├── .project │ ├── .settings │ │ ├── org.eclipse.jdt.core.prefs │ │ └── org.maven.ide.eclipse.prefs │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── mrhaki │ │ │ └── app │ │ │ ├── domain │ │ │ └── User.java │ │ │ └── services │ │ │ ├── UserService.java │ │ │ └── UserServiceImpl.java │ │ └── test │ │ └── groovy │ │ └── com │ │ └── mrhaki │ │ └── app │ │ └── services │ │ └── UserServiceImplSpec.groovy └── user-service │ ├── .classpath │ ├── .project │ ├── .settings │ ├── org.eclipse.jdt.core.prefs │ └── org.maven.ide.eclipse.prefs │ ├── pom.xml │ └── src │ └── main │ └── java │ └── com │ └── mrhaki │ └── app │ ├── domain │ └── User.java │ └── services │ ├── UserService.java │ └── UserServiceImpl.java ├── README ├── SpringTestInjection ├── .gitignore ├── build.gradle └── src │ ├── main │ └── java │ │ └── com │ │ └── mrhaki │ │ └── spring │ │ ├── MessageService.java │ │ └── MyService.java │ └── test │ └── java │ └── com │ └── mrhaki │ └── spring │ └── MyServiceTest.java ├── icon.png ├── layout-demo ├── .gitignore ├── application.properties ├── grails-app │ ├── conf │ │ ├── BootStrap.groovy │ │ ├── BuildConfig.groovy │ │ ├── Config.groovy │ │ ├── DataSource.groovy │ │ ├── UrlMappings.groovy │ │ └── spring │ │ │ └── resources.groovy │ ├── controllers │ │ └── com │ │ │ └── mrhaki │ │ │ └── layout │ │ │ └── controller │ │ │ ├── PageController.groovy │ │ │ └── ProductController.groovy │ ├── domain │ │ └── com │ │ │ └── mrhaki │ │ │ └── layout │ │ │ └── domain │ │ │ └── Product.groovy │ ├── i18n │ │ ├── messages.properties │ │ ├── messages_da.properties │ │ ├── messages_de.properties │ │ ├── messages_es.properties │ │ ├── messages_fr.properties │ │ ├── messages_it.properties │ │ ├── messages_ja.properties │ │ ├── messages_nl.properties │ │ ├── messages_pt_BR.properties │ │ ├── messages_pt_PT.properties │ │ ├── messages_ru.properties │ │ ├── messages_th.properties │ │ ├── messages_zh_CN.properties │ │ └── view.properties │ └── views │ │ ├── error.gsp │ │ ├── index.gsp │ │ ├── layouts │ │ ├── fiveblocks.gsp │ │ ├── oneblock.gsp │ │ ├── page.gsp │ │ └── twoblocks.gsp │ │ └── templates │ │ ├── homepage.gsp │ │ ├── productlist.gsp │ │ └── productview.gsp └── web-app │ ├── WEB-INF │ ├── applicationContext.xml │ ├── sitemesh.xml │ └── tld │ │ ├── c.tld │ │ ├── fmt.tld │ │ ├── grails.tld │ │ └── spring.tld │ ├── css │ ├── fonts.css │ ├── layout.css │ └── main.css │ ├── images │ ├── favicon.ico │ ├── grails_logo.jpg │ ├── grails_logo.png │ ├── leftnav_btm.png │ ├── leftnav_midstretch.png │ ├── leftnav_top.png │ ├── logo.png │ ├── product-image.jpg │ ├── skin │ │ ├── database_add.png │ │ ├── database_delete.png │ │ ├── database_edit.png │ │ ├── database_save.png │ │ ├── database_table.png │ │ ├── exclamation.png │ │ ├── house.png │ │ ├── information.png │ │ ├── shadow.jpg │ │ ├── sorted_asc.gif │ │ └── sorted_desc.gif │ ├── spinner.gif │ └── springsource.png │ └── js │ ├── application.js │ └── prototype │ ├── animation.js │ ├── builder.js │ ├── controls.js │ ├── dragdrop.js │ ├── effects.js │ ├── prototype.js │ ├── rico.js │ ├── scriptaculous.js │ ├── slider.js │ ├── sound.js │ └── unittest.js └── layout-demo2 ├── .gitignore ├── application.properties ├── grails-app ├── conf │ ├── BootStrap.groovy │ ├── BuildConfig.groovy │ ├── Config.groovy │ ├── DataSource.groovy │ ├── UrlMappings.groovy │ └── spring │ │ └── resources.groovy ├── controllers │ └── com │ │ └── mrhaki │ │ └── layout │ │ └── controller │ │ ├── PageController.groovy │ │ └── ProductController.groovy ├── domain │ └── com │ │ └── mrhaki │ │ └── layout │ │ └── domain │ │ └── Product.groovy ├── i18n │ ├── messages.properties │ ├── messages_da.properties │ ├── messages_de.properties │ ├── messages_es.properties │ ├── messages_fr.properties │ ├── messages_it.properties │ ├── messages_ja.properties │ ├── messages_nl.properties │ ├── messages_pt_BR.properties │ ├── messages_pt_PT.properties │ ├── messages_ru.properties │ ├── messages_th.properties │ ├── messages_zh_CN.properties │ └── view.properties └── views │ ├── error.gsp │ ├── index.gsp │ ├── layouts │ ├── fiveblocks.gsp │ ├── oneblock.gsp │ ├── page.gsp │ └── twoblocks.gsp │ └── templates │ ├── homepage.gsp │ ├── productlist.gsp │ └── productview.gsp └── web-app ├── WEB-INF ├── applicationContext.xml ├── sitemesh.xml └── tld │ ├── c.tld │ ├── fmt.tld │ ├── grails.tld │ └── spring.tld ├── css ├── fonts.css ├── layout.css └── main.css ├── images ├── favicon.ico ├── grails_logo.jpg ├── grails_logo.png ├── leftnav_btm.png ├── leftnav_midstretch.png ├── leftnav_top.png ├── logo.png ├── product-image.jpg ├── skin │ ├── database_add.png │ ├── database_delete.png │ ├── database_edit.png │ ├── database_save.png │ ├── database_table.png │ ├── exclamation.png │ ├── house.png │ ├── information.png │ ├── shadow.jpg │ ├── sorted_asc.gif │ └── sorted_desc.gif ├── spinner.gif └── springsource.png └── js ├── application.js └── prototype ├── animation.js ├── builder.js ├── controls.js ├── dragdrop.js ├── effects.js ├── prototype.js ├── rico.js ├── scriptaculous.js ├── slider.js ├── sound.js └── unittest.js /.gitignore: -------------------------------------------------------------------------------- 1 | **/**/.idea 2 | **/**/out 3 | **/**/target 4 | /ContinuousIntegration/GrailsSample/cobertura.ser 5 | /ContinuousIntegration/GrailsSample/CodeNarcReport.html 6 | /ContinuousIntegration/GrailsSample/GrailsSample-grailsPlugins.iml 7 | /ContinuousIntegration/GrailsSample/GrailsSample.iml 8 | .DS_Store 9 | -------------------------------------------------------------------------------- /CompanyGradle/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | repo 3 | .gradle 4 | -------------------------------------------------------------------------------- /CompanyGradle/company-gradle/src/scripts/init.d/sample.gradle: -------------------------------------------------------------------------------- 1 | // File: src/scripts/init.d/sample.gradle 2 | println "You are running the build with the Company Gradle" -------------------------------------------------------------------------------- /CompanyGradle/simple-project/build.gradle: -------------------------------------------------------------------------------- 1 | task wrapper(type:Wrapper) { 2 | distributionUrl = uri('../repo/company-gradle-1.0.1-bin.zip') 3 | } -------------------------------------------------------------------------------- /CompanyGradle/simple-project/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/CompanyGradle/simple-project/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /CompanyGradle/simple-project/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Oct 26 07:45:59 CEST 2012 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=http://intranet/tools/company-gradle-1.0.2-bin.zip 7 | -------------------------------------------------------------------------------- /CompanyGradle/simple-project/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /ContinuousIntegration/.gitignore: -------------------------------------------------------------------------------- 1 | Hudson 2 | TeamCity6 3 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | GrailsSample 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | com.springsource.sts.grails.core.nature 16 | org.eclipse.jdt.groovy.core.groovyNature 17 | org.eclipse.jdt.core.javanature 18 | 19 | 20 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/.settings/org.codehaus.groovy.eclipse.preferences.prefs: -------------------------------------------------------------------------------- 1 | #Created by grails 2 | eclipse.preferences.version=1 3 | groovy.dont.generate.class.files=true 4 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/application.properties: -------------------------------------------------------------------------------- 1 | #Grails Metadata file 2 | #Wed Dec 22 09:20:52 CET 2010 3 | app.grails.version=1.3.6 4 | app.name=GrailsSample 5 | app.servlet.version=2.4 6 | app.version=0.1 7 | plugins.code-coverage=1.2 8 | plugins.codenarc=0.8 9 | plugins.gmetrics=0.3 10 | plugins.hibernate=1.3.6 11 | plugins.spock=0.5-groovy-1.7 12 | plugins.tomcat=1.3.6 13 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/conf/BootStrap.groovy: -------------------------------------------------------------------------------- 1 | class BootStrap { 2 | 3 | def init = { servletContext -> 4 | } 5 | def destroy = { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/conf/BuildConfig.groovy: -------------------------------------------------------------------------------- 1 | grails.project.class.dir = "target/classes" 2 | grails.project.test.class.dir = "target/test-classes" 3 | grails.project.test.reports.dir = "target/test-reports" 4 | //grails.project.war.file = "target/${appName}-${appVersion}.war" 5 | grails.project.dependency.resolution = { 6 | // inherit Grails' default dependencies 7 | inherits("global") { 8 | // uncomment to disable ehcache 9 | // excludes 'ehcache' 10 | } 11 | log "warn" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose' 12 | repositories { 13 | grailsPlugins() 14 | grailsHome() 15 | grailsCentral() 16 | 17 | // uncomment the below to enable remote dependency resolution 18 | // from public Maven repositories 19 | //mavenLocal() 20 | //mavenCentral() 21 | //mavenRepo "http://snapshots.repository.codehaus.org" 22 | //mavenRepo "http://repository.codehaus.org" 23 | //mavenRepo "http://download.java.net/maven/2/" 24 | //mavenRepo "http://repository.jboss.com/maven2/" 25 | } 26 | dependencies { 27 | // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg. 28 | 29 | // runtime 'mysql:mysql-connector-java:5.1.13' 30 | } 31 | } 32 | 33 | coverage { 34 | nopost = false 35 | xml = true 36 | } 37 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/conf/DataSource.groovy: -------------------------------------------------------------------------------- 1 | dataSource { 2 | pooled = true 3 | driverClassName = "org.hsqldb.jdbcDriver" 4 | username = "sa" 5 | password = "" 6 | } 7 | hibernate { 8 | cache.use_second_level_cache = true 9 | cache.use_query_cache = true 10 | cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider' 11 | } 12 | // environment specific settings 13 | environments { 14 | development { 15 | dataSource { 16 | dbCreate = "create-drop" // one of 'create', 'create-drop','update' 17 | url = "jdbc:hsqldb:mem:devDB" 18 | } 19 | } 20 | test { 21 | dataSource { 22 | dbCreate = "update" 23 | url = "jdbc:hsqldb:mem:testDb" 24 | } 25 | } 26 | production { 27 | dataSource { 28 | dbCreate = "update" 29 | url = "jdbc:hsqldb:file:prodDb;shutdown=true" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/conf/UrlMappings.groovy: -------------------------------------------------------------------------------- 1 | class UrlMappings { 2 | 3 | static mappings = { 4 | "/$controller/$action?/$id?"{ 5 | constraints { 6 | // apply constraints here 7 | } 8 | } 9 | 10 | "/"(view:"/index") 11 | "500"(view:'/error') 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/conf/spring/resources.groovy: -------------------------------------------------------------------------------- 1 | // Place your Spring DSL code here 2 | beans = { 3 | } 4 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/controllers/com/mrhaki/ci/sample/HelloController.groovy: -------------------------------------------------------------------------------- 1 | package com.mrhaki.ci.sample 2 | 3 | class HelloController { 4 | 5 | static defaultAction = 'hello' 6 | 7 | def greetingService 8 | 9 | def hello = { 10 | def name = params.name 11 | [message: name ? greetingService.hello(name) : greetingService.hello()] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/i18n/messages_da.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/grails-app/i18n/messages_da.properties -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/i18n/messages_es.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no corresponde al patrón [{3}] 2 | default.invalid.url.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una URL válida 3 | default.invalid.creditCard.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es un número de tarjeta de crédito válida 4 | default.invalid.email.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una dirección de correo electrónico válida 5 | default.invalid.range.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el rango válido de [{3}] a [{4}] 6 | default.invalid.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el tamaño válido de [{3}] a [{4}] 7 | default.invalid.max.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el valor máximo [{3}] 8 | default.invalid.min.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menos que el valor mínimo [{3}] 9 | default.invalid.max.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el tamaño máximo de [{3}] 10 | default.invalid.min.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menor que el tamaño mínimo de [{3}] 11 | default.invalid.validator.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es válido 12 | default.not.inlist.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no esta contenido dentro de la lista [{3}] 13 | default.blank.message=La propiedad [{0}] de la clase [{1}] no puede ser vacía 14 | default.not.equal.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no puede igualar a [{3}] 15 | default.null.message=La propiedad [{0}] de la clase [{1}] no puede ser nulo 16 | default.not.unique.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] debe ser única 17 | 18 | default.paginate.prev=Anterior 19 | default.paginate.next=Siguiente 20 | 21 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 22 | typeMismatch.java.net.URL=La propiedad {0} debe ser una URL válida 23 | typeMismatch.java.net.URI=La propiedad {0} debe ser una URI válida 24 | typeMismatch.java.util.Date=La propiedad {0} debe ser una fecha válida 25 | typeMismatch.java.lang.Double=La propiedad {0} debe ser un número válido 26 | typeMismatch.java.lang.Integer=La propiedad {0} debe ser un número válido 27 | typeMismatch.java.lang.Long=La propiedad {0} debe ser un número válido 28 | typeMismatch.java.lang.Short=La propiedad {0} debe ser un número válido 29 | typeMismatch.java.math.BigDecimal=La propiedad {0} debe ser un número válido 30 | typeMismatch.java.math.BigInteger=La propiedad {0} debe ser un número válido -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/i18n/messages_fr.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}] 2 | default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide 3 | default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide 4 | default.invalid.email.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une adresse e-mail valide 5 | default.invalid.range.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 6 | default.invalid.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 7 | default.invalid.max.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 8 | default.invalid.min.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 9 | default.invalid.max.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 10 | default.invalid.min.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 11 | default.invalid.validator.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas valide 12 | default.not.inlist.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne fait pas partie de la liste [{3}] 13 | default.blank.message=La propriété [{0}] de la classe [{1}] ne peut pas être vide 14 | default.not.equal.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne peut pas être égale à [{3}] 15 | default.null.message=La propriété [{0}] de la classe [{1}] ne peut pas être nulle 16 | default.not.unique.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] doit être unique 17 | 18 | default.paginate.prev=Précédent 19 | default.paginate.next=Suivant 20 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/i18n/messages_it.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non corrisponde al pattern [{3}] 2 | default.invalid.url.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un URL valido 3 | default.invalid.creditCard.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un numero di carta di credito valido 4 | default.invalid.email.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un indirizzo email valido 5 | default.invalid.range.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo valido da [{3}] a [{4}] 6 | default.invalid.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo di dimensioni valide da [{3}] a [{4}] 7 | default.invalid.max.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 8 | default.invalid.min.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 9 | default.invalid.max.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 10 | default.invalid.min.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 11 | default.invalid.validator.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è valida 12 | default.not.inlist.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è contenuta nella lista [{3}] 13 | default.blank.message=La proprietà [{0}] della classe [{1}] non può essere vuota 14 | default.not.equal.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non può essere uguale a [{3}] 15 | default.null.message=La proprietà [{0}] della classe [{1}] non può essere null 16 | default.not.unique.message=La proprietà [{0}] della classe [{1}] con valore [{2}] deve essere unica 17 | 18 | default.paginate.prev=Precedente 19 | default.paginate.next=Successivo -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/i18n/messages_ja.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]パターンと一致していません。 2 | default.invalid.url.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、URLではありません。 3 | default.invalid.creditCard.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、正当なクレジットカード番号ではありません。 4 | default.invalid.email.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、メールアドレスではありません。 5 | default.invalid.range.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]範囲内を指定してください。 6 | default.invalid.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]以内を指定してください。 7 | default.invalid.max.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 8 | default.invalid.min.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 9 | default.invalid.max.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 10 | default.invalid.min.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 11 | default.invalid.validator.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、カスタムバリデーションを通過できません。 12 | default.not.inlist.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]リスト内に存在しません。 13 | default.blank.message=[{1}]クラスのプロパティ[{0}]の空白は許可されません。 14 | default.not.equal.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]と同等ではありません。 15 | default.null.message=[{1}]クラスのプロパティ[{0}]にnullは許可されません。 16 | default.not.unique.message=クラス[{1}]プロパティ[{0}]の値[{2}]は既に使用されています。 17 | 18 | default.paginate.prev=戻る 19 | default.paginate.next=次へ 20 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/i18n/messages_pt_BR.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Translated by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atende ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é uma URL válida 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está entre a faixa de valores válida de [{3}] até [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está na faixa de tamanho válida de [{3}] até [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapass o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um valor dentre os permitidos na lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ficar em branco 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazia 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | 25 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para customizar (eg typeMismatch.Book.author) 26 | typeMismatch.java.net.URL=O campo {0} deve ser uma URL válida. 27 | typeMismatch.java.net.URI=O campo {0} deve ser uma URI válida. 28 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 29 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 30 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 31 | typeMismatch.java.lang.Long=O campo {0} deve ser um número válido. 32 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 33 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 34 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/i18n/messages_pt_PT.properties: -------------------------------------------------------------------------------- 1 | # 2 | # translation by miguel.ping@gmail.com, based on pt_BR translation by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não corresponde ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um URL válido 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está dentro dos limites de valores válidos de [{3}] a [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] está fora dos limites de tamanho válido de [{3}] a [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não se encontra nos valores permitidos da lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ser vazio 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | 25 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para personalizar(eg typeMismatch.Book.author) 26 | typeMismatch.java.net.URL=O campo {0} deve ser um URL válido. 27 | typeMismatch.java.net.URI=O campo {0} deve ser um URI válido. 28 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 29 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 30 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 31 | typeMismatch.java.lang.Long=O campo {0} deve ser um número valido. 32 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 33 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 34 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. 35 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/i18n/messages_ru.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Значение [{2}] поля [{0}] класса [{1}] не соответствует образцу [{3}] 2 | default.invalid.url.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым URL-адресом 3 | default.invalid.creditCard.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым номером кредитной карты 4 | default.invalid.email.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым e-mail адресом 5 | default.invalid.range.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в допустимый интервал от [{3}] до [{4}] 6 | default.invalid.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) не попадает в допустимый интервал от [{3}] до [{4}] 7 | default.invalid.max.message=Значение [{2}] поля [{0}] класса [{1}] больше чем максимально допустимое значение [{3}] 8 | default.invalid.min.message=Значение [{2}] поля [{0}] класса [{1}] меньше чем минимально допустимое значение [{3}] 9 | default.invalid.max.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) больше чем максимально допустимый размер [{3}] 10 | default.invalid.min.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) меньше чем минимально допустимый размер [{3}] 11 | default.invalid.validator.message=Значение [{2}] поля [{0}] класса [{1}] не допустимо 12 | default.not.inlist.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в список допустимых значений [{3}] 13 | default.blank.message=Поле [{0}] класса [{1}] не может быть пустым 14 | default.not.equal.message=Значение [{2}] поля [{0}] класса [{1}] не может быть равно [{3}] 15 | default.null.message=Поле [{0}] класса [{1}] не может иметь значение null 16 | default.not.unique.message=Значение [{2}] поля [{0}] класса [{1}] должно быть уникальным 17 | 18 | default.paginate.prev=Предыдушая страница 19 | default.paginate.next=Следующая страница 20 | 21 | # Ошибки при присвоении данных. Для точной настройки для полей классов используйте 22 | # формат "typeMismatch.$className.$propertyName" (например, typeMismatch.Book.author) 23 | typeMismatch.java.net.URL=Значение поля {0} не является допустимым URL 24 | typeMismatch.java.net.URI=Значение поля {0} не является допустимым URI 25 | typeMismatch.java.util.Date=Значение поля {0} не является допустимой датой 26 | typeMismatch.java.lang.Double=Значение поля {0} не является допустимым числом 27 | typeMismatch.java.lang.Integer=Значение поля {0} не является допустимым числом 28 | typeMismatch.java.lang.Long=Значение поля {0} не является допустимым числом 29 | typeMismatch.java.lang.Short=Значение поля {0} не является допустимым числом 30 | typeMismatch.java.math.BigDecimal=Значение поля {0} не является допустимым числом 31 | typeMismatch.java.math.BigInteger=Значение поля {0} не является допустимым числом 32 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/i18n/messages_zh_CN.properties: -------------------------------------------------------------------------------- 1 | default.blank.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3A\u7A7A 2 | default.doesnt.match.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E\u5B9A\u4E49\u7684\u6A21\u5F0F [{3}]\u4E0D\u5339\u914D 3 | default.invalid.creditCard.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u4FE1\u7528\u5361\u53F7 4 | default.invalid.email.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684\u7535\u5B50\u90AE\u4EF6\u5730\u5740 5 | default.invalid.max.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 6 | default.invalid.max.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 7 | default.invalid.min.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 8 | default.invalid.min.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 9 | default.invalid.range.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 10 | default.invalid.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 11 | default.invalid.url.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684URL 12 | default.invalid.validator.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u672A\u80FD\u901A\u8FC7\u81EA\u5B9A\u4E49\u7684\u9A8C\u8BC1 13 | default.not.equal.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E[{3}]\u4E0D\u76F8\u7B49 14 | default.not.inlist.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5217\u8868\u7684\u53D6\u503C\u8303\u56F4\u5185 15 | default.not.unique.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u5FC5\u987B\u662F\u552F\u4E00\u7684 16 | default.null.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3Anull 17 | default.paginate.next=\u4E0B\u9875 18 | default.paginate.prev=\u4E0A\u9875 19 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/services/com/mrhaki/ci/sample/GreetingService.groovy: -------------------------------------------------------------------------------- 1 | package com.mrhaki.ci.sample 2 | 3 | class GreetingService { 4 | 5 | static transactional = true 6 | 7 | def hello(name = 'world') { 8 | "Hello $name!" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/views/error.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Grails Runtime Exception 4 | 24 | 25 | 26 | 27 |

Grails Runtime Exception

28 |

Error Details

29 | 30 |
31 | Error ${request.'javax.servlet.error.status_code'}: ${request.'javax.servlet.error.message'.encodeAsHTML()}
32 | Servlet: ${request.'javax.servlet.error.servlet_name'}
33 | URI: ${request.'javax.servlet.error.request_uri'}
34 | 35 | Exception Message: ${exception.message?.encodeAsHTML()}
36 | Caused by: ${exception.cause?.message?.encodeAsHTML()}
37 | Class: ${exception.className}
38 | At Line: [${exception.lineNumber}]
39 | Code Snippet:
40 |
41 | 42 | ${cs?.encodeAsHTML()}
43 |
44 |
45 |
46 |
47 | 48 |

Stack Trace

49 |
50 |
${it.encodeAsHTML()}
51 |
52 |
53 | 54 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/views/hello/hello.gsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" %> 2 | 3 | 4 | Grails Sample App 5 | 6 | 7 |

Grails Sample App

8 |

9 | Result from GreetingService.hello(): ${message}. 10 |

11 | 12 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/grails-app/views/layouts/main.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <g:layoutTitle default="Grails" /> 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/scripts/_Events.groovy: -------------------------------------------------------------------------------- 1 | import groovy.xml.MarkupBuilder 2 | 3 | eventTestPhasesStart = { 4 | println "Starting TEST phase." 5 | println "Coverage enabled: ${isCoverageEnabled()}" 6 | } 7 | 8 | eventStatusFinal = { 9 | def writer = new FileWriter('../../teamcity-info.xml') 10 | def info = new MarkupBuilder(writer) 11 | info.build { 12 | statisticValue(key: 'CodeCoverageB', value: 100) 13 | statisticValue(key: 'CodeCoverageL', value: 21) 14 | statisticValue(key: 'CodeCoverageAbsLCovered', value: 5) 15 | statisticValue(key: 'CodeCoverageAbsLTotal', value: 5) 16 | } 17 | } 18 | 19 | boolean isCoverageEnabled() { 20 | if (argsMap.containsKey('nocoverage')) { 21 | return false 22 | } else if (argsMap.containsKey('coverage')) { 23 | return true 24 | } else { 25 | return buildConfig.coverage.enabledByDefault 26 | } 27 | } -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/test/unit/com/mrhaki/ci/sample/GreetingServiceSpec.groovy: -------------------------------------------------------------------------------- 1 | package com.mrhaki.ci.sample 2 | 3 | import grails.plugin.spock.UnitSpec 4 | import spock.lang.Shared 5 | 6 | class GreetingServiceSpec extends UnitSpec { 7 | @Shared 8 | def greetingService = new GreetingService() 9 | 10 | def "hello() must return 'Hello mrhaki!' if parameter value is 'mrhaki'"() { 11 | expect: 12 | greetingService.hello('mrhaki') == 'Hello mrhaki!' 13 | } 14 | 15 | def "hello() must return 'Hello world!' if parameter is empty"() { 16 | expect: 17 | greetingService.hello() == 'Hello world!' 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/test/unit/com/mrhaki/ci/sample/HelloControllerSpec.groovy: -------------------------------------------------------------------------------- 1 | package com.mrhaki.ci.sample 2 | 3 | import grails.plugin.spock.ControllerSpec 4 | 5 | class HelloControllerSpec extends ControllerSpec { 6 | def greetingService 7 | 8 | def setup() { 9 | greetingService = Mock(GreetingService) 10 | controller.greetingService = greetingService 11 | } 12 | 13 | def "hello() must invoke GreetingService with parameters values from request parameters"() { 14 | when: 15 | controller.params.name = 'mrhaki' 16 | controller.hello() 17 | then: 18 | 1 * greetingService.hello('mrhaki') >> '' 19 | } 20 | 21 | def "hello() must invoke GreetingService with no argument if no request parameters"() { 22 | when: 23 | controller.hello() 24 | then: 25 | 1 * greetingService.hello() >> '' 26 | } 27 | 28 | def "hello() must return result from GreetingService in a map with the key 'message'"() { 29 | given: 30 | greetingService.hello() >> 'Hello world!' 31 | expect: 32 | controller.hello() == [message: 'Hello world!'] 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/WEB-INF/applicationContext.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | Grails application factory bean 9 | 10 | 11 | 12 | 13 | 14 | A bean that manages Grails plugins 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | classpath*:**/grails-app/**/*.groovy 33 | 34 | 35 | 36 | 38 | 39 | utf-8 40 | 41 | 42 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/WEB-INF/sitemesh.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/favicon.ico -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/favicon.ico -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/grails_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/grails_logo.jpg -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/grails_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/grails_logo.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/leftnav_btm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/leftnav_btm.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/leftnav_midstretch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/leftnav_midstretch.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/leftnav_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/leftnav_top.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/skin/database_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/skin/database_add.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/skin/database_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/skin/database_delete.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/skin/database_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/skin/database_edit.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/skin/database_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/skin/database_save.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/skin/database_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/skin/database_table.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/skin/exclamation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/skin/exclamation.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/skin/house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/skin/house.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/skin/information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/skin/information.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/skin/shadow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/skin/shadow.jpg -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/skin/sorted_asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/skin/sorted_asc.gif -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/skin/sorted_desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/skin/sorted_desc.gif -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/spinner.gif -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/images/springsource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/ContinuousIntegration/GrailsSample/web-app/images/springsource.png -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/js/application.js: -------------------------------------------------------------------------------- 1 | var Ajax; 2 | if (Ajax && (Ajax != null)) { 3 | Ajax.Responders.register({ 4 | onCreate: function() { 5 | if($('spinner') && Ajax.activeRequestCount>0) 6 | Effect.Appear('spinner',{duration:0.5,queue:'end'}); 7 | }, 8 | onComplete: function() { 9 | if($('spinner') && Ajax.activeRequestCount==0) 10 | Effect.Fade('spinner',{duration:0.5,queue:'end'}); 11 | } 12 | }); 13 | } 14 | -------------------------------------------------------------------------------- /ContinuousIntegration/GrailsSample/web-app/js/prototype/sound.js: -------------------------------------------------------------------------------- 1 | // script.aculo.us sound.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 2 | 3 | // Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 4 | // 5 | // Based on code created by Jules Gravinese (http://www.webveteran.com/) 6 | // 7 | // script.aculo.us is freely distributable under the terms of an MIT-style license. 8 | // For details, see the script.aculo.us web site: http://script.aculo.us/ 9 | 10 | Sound = { 11 | tracks: {}, 12 | _enabled: true, 13 | template: 14 | new Template(''), 15 | enable: function(){ 16 | Sound._enabled = true; 17 | }, 18 | disable: function(){ 19 | Sound._enabled = false; 20 | }, 21 | play: function(url){ 22 | if(!Sound._enabled) return; 23 | var options = Object.extend({ 24 | track: 'global', url: url, replace: false 25 | }, arguments[1] || {}); 26 | 27 | if(options.replace && this.tracks[options.track]) { 28 | $R(0, this.tracks[options.track].id).each(function(id){ 29 | var sound = $('sound_'+options.track+'_'+id); 30 | sound.Stop && sound.Stop(); 31 | sound.remove(); 32 | }); 33 | this.tracks[options.track] = null; 34 | } 35 | 36 | if(!this.tracks[options.track]) 37 | this.tracks[options.track] = { id: 0 }; 38 | else 39 | this.tracks[options.track].id++; 40 | 41 | options.id = this.tracks[options.track].id; 42 | $$('body')[0].insert( 43 | Prototype.Browser.IE ? new Element('bgsound',{ 44 | id: 'sound_'+options.track+'_'+options.id, 45 | src: options.url, loop: 1, autostart: true 46 | }) : Sound.template.evaluate(options)); 47 | } 48 | }; 49 | 50 | if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){ 51 | if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 })) 52 | Sound.template = new Template(''); 53 | else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('Windows Media') != -1 })) 54 | Sound.template = new Template(''); 55 | else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('RealPlayer') != -1 })) 56 | Sound.template = new Template(''); 57 | else 58 | Sound.play = function(){}; 59 | } -------------------------------------------------------------------------------- /GrailsEnvironments/sample/.gitignore: -------------------------------------------------------------------------------- 1 | .classpath 2 | .project 3 | .settings 4 | *.log 5 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/application.properties: -------------------------------------------------------------------------------- 1 | #Grails Metadata file 2 | #Thu Feb 03 21:22:28 CET 2011 3 | app.grails.version=1.3.6 4 | app.name=sample 5 | app.servlet.version=2.4 6 | app.version=0.1 7 | plugins.hibernate=1.3.6 8 | plugins.tomcat=1.3.6 9 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/conf/BootStrap.groovy: -------------------------------------------------------------------------------- 1 | class BootStrap { 2 | 3 | def init = { servletContext -> 4 | } 5 | def destroy = { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/conf/BuildConfig.groovy: -------------------------------------------------------------------------------- 1 | grails.project.class.dir = "target/classes" 2 | grails.project.test.class.dir = "target/test-classes" 3 | grails.project.test.reports.dir = "target/test-reports" 4 | //grails.project.war.file = "target/${appName}-${appVersion}.war" 5 | 6 | grails.project.dependency.resolution = { 7 | // inherit Grails' default dependencies 8 | inherits("global") { 9 | // uncomment to disable ehcache 10 | // excludes 'ehcache' 11 | } 12 | log "warn" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose' 13 | repositories { 14 | grailsPlugins() 15 | grailsHome() 16 | grailsCentral() 17 | 18 | // uncomment the below to enable remote dependency resolution 19 | // from public Maven repositories 20 | //mavenLocal() 21 | //mavenCentral() 22 | //mavenRepo "http://snapshots.repository.codehaus.org" 23 | //mavenRepo "http://repository.codehaus.org" 24 | //mavenRepo "http://download.java.net/maven/2/" 25 | //mavenRepo "http://repository.jboss.com/maven2/" 26 | } 27 | dependencies { 28 | // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg. 29 | 30 | // runtime 'mysql:mysql-connector-java:5.1.13' 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/conf/Config.groovy: -------------------------------------------------------------------------------- 1 | def CONFIG_LOCATION_SYS_PROPERTY = 'sample.app.config.file' 2 | if (System.properties[CONFIG_LOCATION_SYS_PROPERTY]) { 3 | grails.config.locations = ["file:" + System.properties[CONFIG_LOCATION_SYS_PROPERTY]] 4 | } 5 | 6 | grails.project.groupId = sample // change this to alter the default package name and Maven publishing destination 7 | grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format 8 | grails.mime.use.accept.header = false 9 | grails.mime.types = [ html: ['text/html','application/xhtml+xml'], 10 | xml: ['text/xml', 'application/xml'], 11 | text: 'text/plain', 12 | js: 'text/javascript', 13 | rss: 'application/rss+xml', 14 | atom: 'application/atom+xml', 15 | css: 'text/css', 16 | csv: 'text/csv', 17 | all: '*/*', 18 | json: ['application/json','text/json'], 19 | form: 'application/x-www-form-urlencoded', 20 | multipartForm: 'multipart/form-data' 21 | ] 22 | 23 | grails.views.default.codec = "none" // none, html, base64 24 | grails.views.gsp.encoding = "UTF-8" 25 | grails.converters.encoding = "UTF-8" 26 | grails.views.gsp.sitemesh.preprocess = true 27 | grails.scaffolding.templates.domainSuffix = 'Instance' 28 | 29 | grails.json.legacy.builder = false 30 | grails.enable.native2ascii = true 31 | grails.logging.jul.usebridge = true 32 | grails.spring.bean.packages = [] 33 | 34 | environments { 35 | production { 36 | runningMode = 'LIVE' 37 | } 38 | development { 39 | runningMode = 'DEV' 40 | } 41 | test { 42 | runningMode = 'INTEGRATION TEST' 43 | } 44 | systemTest { 45 | runningMode = 'SYSTEM TEST' 46 | } 47 | userAcceptanceTest { 48 | runningMode = 'USER ACCEPTANCE TEST' 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/conf/DataSource.groovy: -------------------------------------------------------------------------------- 1 | dataSource { 2 | pooled = true 3 | driverClassName = "org.hsqldb.jdbcDriver" 4 | username = "sa" 5 | password = "" 6 | } 7 | hibernate { 8 | cache.use_second_level_cache = true 9 | cache.use_query_cache = true 10 | cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider' 11 | } 12 | // environment specific settings 13 | environments { 14 | development { 15 | dataSource { 16 | dbCreate = "create-drop" // one of 'create', 'create-drop','update' 17 | url = "jdbc:hsqldb:mem:devDB" 18 | } 19 | } 20 | test { 21 | dataSource { 22 | dbCreate = "update" 23 | url = "jdbc:hsqldb:mem:testDb" 24 | } 25 | } 26 | production { 27 | dataSource { 28 | dbCreate = "update" 29 | url = "jdbc:hsqldb:file:prodDb;shutdown=true" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/conf/UrlMappings.groovy: -------------------------------------------------------------------------------- 1 | class UrlMappings { 2 | 3 | static mappings = { 4 | "/$controller/$action?/$id?"{ 5 | constraints { 6 | // apply constraints here 7 | } 8 | } 9 | 10 | "/"(view:"/index") 11 | "500"(view:'/error') 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/conf/spring/resources.groovy: -------------------------------------------------------------------------------- 1 | // Place your Spring DSL code here 2 | beans = { 3 | } 4 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/i18n/messages_da.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/grails-app/i18n/messages_da.properties -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/i18n/messages_es.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no corresponde al patrón [{3}] 2 | default.invalid.url.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una URL válida 3 | default.invalid.creditCard.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es un número de tarjeta de crédito válida 4 | default.invalid.email.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una dirección de correo electrónico válida 5 | default.invalid.range.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el rango válido de [{3}] a [{4}] 6 | default.invalid.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el tamaño válido de [{3}] a [{4}] 7 | default.invalid.max.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el valor máximo [{3}] 8 | default.invalid.min.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menos que el valor mínimo [{3}] 9 | default.invalid.max.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el tamaño máximo de [{3}] 10 | default.invalid.min.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menor que el tamaño mínimo de [{3}] 11 | default.invalid.validator.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es válido 12 | default.not.inlist.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no esta contenido dentro de la lista [{3}] 13 | default.blank.message=La propiedad [{0}] de la clase [{1}] no puede ser vacía 14 | default.not.equal.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no puede igualar a [{3}] 15 | default.null.message=La propiedad [{0}] de la clase [{1}] no puede ser nulo 16 | default.not.unique.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] debe ser única 17 | 18 | default.paginate.prev=Anterior 19 | default.paginate.next=Siguiente 20 | 21 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 22 | typeMismatch.java.net.URL=La propiedad {0} debe ser una URL válida 23 | typeMismatch.java.net.URI=La propiedad {0} debe ser una URI válida 24 | typeMismatch.java.util.Date=La propiedad {0} debe ser una fecha válida 25 | typeMismatch.java.lang.Double=La propiedad {0} debe ser un número válido 26 | typeMismatch.java.lang.Integer=La propiedad {0} debe ser un número válido 27 | typeMismatch.java.lang.Long=La propiedad {0} debe ser un número válido 28 | typeMismatch.java.lang.Short=La propiedad {0} debe ser un número válido 29 | typeMismatch.java.math.BigDecimal=La propiedad {0} debe ser un número válido 30 | typeMismatch.java.math.BigInteger=La propiedad {0} debe ser un número válido -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/i18n/messages_fr.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}] 2 | default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide 3 | default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide 4 | default.invalid.email.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une adresse e-mail valide 5 | default.invalid.range.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 6 | default.invalid.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 7 | default.invalid.max.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 8 | default.invalid.min.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 9 | default.invalid.max.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 10 | default.invalid.min.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 11 | default.invalid.validator.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas valide 12 | default.not.inlist.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne fait pas partie de la liste [{3}] 13 | default.blank.message=La propriété [{0}] de la classe [{1}] ne peut pas être vide 14 | default.not.equal.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne peut pas être égale à [{3}] 15 | default.null.message=La propriété [{0}] de la classe [{1}] ne peut pas être nulle 16 | default.not.unique.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] doit être unique 17 | 18 | default.paginate.prev=Précédent 19 | default.paginate.next=Suivant 20 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/i18n/messages_it.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non corrisponde al pattern [{3}] 2 | default.invalid.url.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un URL valido 3 | default.invalid.creditCard.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un numero di carta di credito valido 4 | default.invalid.email.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un indirizzo email valido 5 | default.invalid.range.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo valido da [{3}] a [{4}] 6 | default.invalid.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo di dimensioni valide da [{3}] a [{4}] 7 | default.invalid.max.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 8 | default.invalid.min.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 9 | default.invalid.max.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 10 | default.invalid.min.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 11 | default.invalid.validator.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è valida 12 | default.not.inlist.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è contenuta nella lista [{3}] 13 | default.blank.message=La proprietà [{0}] della classe [{1}] non può essere vuota 14 | default.not.equal.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non può essere uguale a [{3}] 15 | default.null.message=La proprietà [{0}] della classe [{1}] non può essere null 16 | default.not.unique.message=La proprietà [{0}] della classe [{1}] con valore [{2}] deve essere unica 17 | 18 | default.paginate.prev=Precedente 19 | default.paginate.next=Successivo -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/i18n/messages_ja.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]パターンと一致していません。 2 | default.invalid.url.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、URLではありません。 3 | default.invalid.creditCard.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、正当なクレジットカード番号ではありません。 4 | default.invalid.email.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、メールアドレスではありません。 5 | default.invalid.range.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]範囲内を指定してください。 6 | default.invalid.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]以内を指定してください。 7 | default.invalid.max.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 8 | default.invalid.min.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 9 | default.invalid.max.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 10 | default.invalid.min.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 11 | default.invalid.validator.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、カスタムバリデーションを通過できません。 12 | default.not.inlist.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]リスト内に存在しません。 13 | default.blank.message=[{1}]クラスのプロパティ[{0}]の空白は許可されません。 14 | default.not.equal.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]と同等ではありません。 15 | default.null.message=[{1}]クラスのプロパティ[{0}]にnullは許可されません。 16 | default.not.unique.message=クラス[{1}]プロパティ[{0}]の値[{2}]は既に使用されています。 17 | 18 | default.paginate.prev=戻る 19 | default.paginate.next=次へ 20 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/i18n/messages_pt_BR.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Translated by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atende ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é uma URL válida 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está entre a faixa de valores válida de [{3}] até [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está na faixa de tamanho válida de [{3}] até [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapass o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um valor dentre os permitidos na lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ficar em branco 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazia 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | 25 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para customizar (eg typeMismatch.Book.author) 26 | typeMismatch.java.net.URL=O campo {0} deve ser uma URL válida. 27 | typeMismatch.java.net.URI=O campo {0} deve ser uma URI válida. 28 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 29 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 30 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 31 | typeMismatch.java.lang.Long=O campo {0} deve ser um número válido. 32 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 33 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 34 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/i18n/messages_pt_PT.properties: -------------------------------------------------------------------------------- 1 | # 2 | # translation by miguel.ping@gmail.com, based on pt_BR translation by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não corresponde ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um URL válido 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está dentro dos limites de valores válidos de [{3}] a [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] está fora dos limites de tamanho válido de [{3}] a [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não se encontra nos valores permitidos da lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ser vazio 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | 25 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para personalizar(eg typeMismatch.Book.author) 26 | typeMismatch.java.net.URL=O campo {0} deve ser um URL válido. 27 | typeMismatch.java.net.URI=O campo {0} deve ser um URI válido. 28 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 29 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 30 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 31 | typeMismatch.java.lang.Long=O campo {0} deve ser um número valido. 32 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 33 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 34 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. 35 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/i18n/messages_ru.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Значение [{2}] поля [{0}] класса [{1}] не соответствует образцу [{3}] 2 | default.invalid.url.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым URL-адресом 3 | default.invalid.creditCard.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым номером кредитной карты 4 | default.invalid.email.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым e-mail адресом 5 | default.invalid.range.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в допустимый интервал от [{3}] до [{4}] 6 | default.invalid.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) не попадает в допустимый интервал от [{3}] до [{4}] 7 | default.invalid.max.message=Значение [{2}] поля [{0}] класса [{1}] больше чем максимально допустимое значение [{3}] 8 | default.invalid.min.message=Значение [{2}] поля [{0}] класса [{1}] меньше чем минимально допустимое значение [{3}] 9 | default.invalid.max.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) больше чем максимально допустимый размер [{3}] 10 | default.invalid.min.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) меньше чем минимально допустимый размер [{3}] 11 | default.invalid.validator.message=Значение [{2}] поля [{0}] класса [{1}] не допустимо 12 | default.not.inlist.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в список допустимых значений [{3}] 13 | default.blank.message=Поле [{0}] класса [{1}] не может быть пустым 14 | default.not.equal.message=Значение [{2}] поля [{0}] класса [{1}] не может быть равно [{3}] 15 | default.null.message=Поле [{0}] класса [{1}] не может иметь значение null 16 | default.not.unique.message=Значение [{2}] поля [{0}] класса [{1}] должно быть уникальным 17 | 18 | default.paginate.prev=Предыдушая страница 19 | default.paginate.next=Следующая страница 20 | 21 | # Ошибки при присвоении данных. Для точной настройки для полей классов используйте 22 | # формат "typeMismatch.$className.$propertyName" (например, typeMismatch.Book.author) 23 | typeMismatch.java.net.URL=Значение поля {0} не является допустимым URL 24 | typeMismatch.java.net.URI=Значение поля {0} не является допустимым URI 25 | typeMismatch.java.util.Date=Значение поля {0} не является допустимой датой 26 | typeMismatch.java.lang.Double=Значение поля {0} не является допустимым числом 27 | typeMismatch.java.lang.Integer=Значение поля {0} не является допустимым числом 28 | typeMismatch.java.lang.Long=Значение поля {0} не является допустимым числом 29 | typeMismatch.java.lang.Short=Значение поля {0} не является допустимым числом 30 | typeMismatch.java.math.BigDecimal=Значение поля {0} не является допустимым числом 31 | typeMismatch.java.math.BigInteger=Значение поля {0} не является допустимым числом 32 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/i18n/messages_zh_CN.properties: -------------------------------------------------------------------------------- 1 | default.blank.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3A\u7A7A 2 | default.doesnt.match.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E\u5B9A\u4E49\u7684\u6A21\u5F0F [{3}]\u4E0D\u5339\u914D 3 | default.invalid.creditCard.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u4FE1\u7528\u5361\u53F7 4 | default.invalid.email.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684\u7535\u5B50\u90AE\u4EF6\u5730\u5740 5 | default.invalid.max.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 6 | default.invalid.max.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 7 | default.invalid.min.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 8 | default.invalid.min.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 9 | default.invalid.range.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 10 | default.invalid.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 11 | default.invalid.url.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684URL 12 | default.invalid.validator.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u672A\u80FD\u901A\u8FC7\u81EA\u5B9A\u4E49\u7684\u9A8C\u8BC1 13 | default.not.equal.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E[{3}]\u4E0D\u76F8\u7B49 14 | default.not.inlist.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5217\u8868\u7684\u53D6\u503C\u8303\u56F4\u5185 15 | default.not.unique.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u5FC5\u987B\u662F\u552F\u4E00\u7684 16 | default.null.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3Anull 17 | default.paginate.next=\u4E0B\u9875 18 | default.paginate.prev=\u4E0A\u9875 19 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/views/error.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Grails Runtime Exception 4 | 24 | 25 | 26 | 27 |

Grails Runtime Exception

28 |

Error Details

29 | 30 |
31 | Error ${request.'javax.servlet.error.status_code'}: ${request.'javax.servlet.error.message'.encodeAsHTML()}
32 | Servlet: ${request.'javax.servlet.error.servlet_name'}
33 | URI: ${request.'javax.servlet.error.request_uri'}
34 | 35 | Exception Message: ${exception.message?.encodeAsHTML()}
36 | Caused by: ${exception.cause?.message?.encodeAsHTML()}
37 | Class: ${exception.className}
38 | At Line: [${exception.lineNumber}]
39 | Code Snippet:
40 |
41 | 42 | ${cs?.encodeAsHTML()}
43 |
44 |
45 |
46 |
47 | 48 |

Stack Trace

49 |
50 |
${it.encodeAsHTML()}
51 |
52 |
53 | 54 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/grails-app/views/layouts/main.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <g:layoutTitle default="Grails" /> 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/scripts/_Events.groovy: -------------------------------------------------------------------------------- 1 | eventWebXmlStart = { webXmlFile -> 2 | ant.echo message: "Change display-name for web.xml" 3 | def tmpWebXmlFile = new File(projectWorkDir, webXmlFile) 4 | ant.replace(file: tmpWebXmlFile, token: "@grails.app.name.version@", 5 | value: "${grailsAppName}-${grailsAppVersion}") 6 | } -------------------------------------------------------------------------------- /GrailsEnvironments/sample/src/templates/artifacts/Controller.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@class @artifact.name@ { 2 | 3 | def index = { } 4 | } 5 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/src/templates/artifacts/DomainClass.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@class @artifact.name@ { 2 | 3 | static constraints = { 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/src/templates/artifacts/Filters.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@class @artifact.name@ { 2 | 3 | def filters = { 4 | all(controller:'*', action:'*') { 5 | before = { 6 | 7 | } 8 | after = { 9 | 10 | } 11 | afterView = { 12 | 13 | } 14 | } 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/src/templates/artifacts/Script.groovy: -------------------------------------------------------------------------------- 1 | includeTargets << grailsScript("Init") 2 | 3 | target(main: "The description of the script goes here!") { 4 | // TODO: Implement script here 5 | } 6 | 7 | setDefaultTarget(main) 8 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/src/templates/artifacts/Service.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@class @artifact.name@ { 2 | 3 | static transactional = true 4 | 5 | def serviceMethod() { 6 | 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/src/templates/artifacts/TagLib.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@class @artifact.name@ { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/src/templates/artifacts/Tests.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@import grails.test.* 2 | 3 | class @artifact.name@ extends @artifact.superclass@ { 4 | protected void setUp() { 5 | super.setUp() 6 | } 7 | 8 | protected void tearDown() { 9 | super.tearDown() 10 | } 11 | 12 | void testSomething() { 13 | 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/src/templates/artifacts/WebTest.groovy: -------------------------------------------------------------------------------- 1 | class @webtest.name.caps@Test extends grails.util.WebTest { 2 | 3 | // Unlike unit tests, functional tests are often sequence dependent. 4 | // Specify that sequence here. 5 | void suite() { 6 | test@webtest.name.caps@ListNewDelete() 7 | // add tests for more operations here 8 | } 9 | 10 | def test@webtest.name.caps@ListNewDelete() { 11 | webtest('@webtest.name.caps@ basic operations: view list, create new entry, view, edit, delete, view') { 12 | invoke(url:'@webtest.name.lower@') 13 | verifyText(text:'Home') 14 | 15 | verifyListPage(0) 16 | 17 | clickLink(label:'New @webtest.name.caps@') 18 | verifyText(text:'Create @webtest.name.caps@') 19 | clickButton(label:'Create') 20 | verifyText(text:'Show @webtest.name.caps@', description:'Detail page') 21 | clickLink(label:'List', description:'Back to list view') 22 | 23 | verifyListPage(1) 24 | 25 | group(description:'edit the one element') { 26 | clickLink(label:'Show', description:'go to detail view') 27 | clickButton(label:'Edit') 28 | verifyText(text:'Edit @webtest.name.caps@') 29 | clickButton(label:'Update') 30 | verifyText(text:'Show @webtest.name.caps@') 31 | clickLink(label:'List', description:'Back to list view') 32 | } 33 | 34 | verifyListPage(1) 35 | 36 | group(description:'delete the only element') { 37 | clickLink(label:'Show', description:'go to detail view') 38 | clickButton(label:'Delete') 39 | verifyXPath(xpath:"//div[@class='message']", text:/@webtest.name.caps@.*deleted./, regex:true) 40 | } 41 | 42 | verifyListPage(0) 43 | } 44 | } 45 | 46 | String ROW_COUNT_XPATH = "count(//td[@class='actionButtons']/..)" 47 | 48 | def verifyListPage(int count) { 49 | ant.group(description:"verify @webtest.name.caps@ list view with $count row(s)") { 50 | verifyText(text:'@webtest.name.caps@ List') 51 | verifyXPath(xpath:ROW_COUNT_XPATH, text:count, description:"$count row(s) of data expected") 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /GrailsEnvironments/sample/src/templates/artifacts/hibernate.cfg.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/WEB-INF/applicationContext.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | Grails application factory bean 9 | 10 | 11 | 12 | 13 | 14 | A bean that manages Grails plugins 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | classpath*:**/grails-app/**/*.groovy 33 | 34 | 35 | 36 | 38 | 39 | utf-8 40 | 41 | 42 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/WEB-INF/sitemesh.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/favicon.ico -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/grails_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/grails_logo.jpg -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/grails_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/grails_logo.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/leftnav_btm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/leftnav_btm.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/leftnav_midstretch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/leftnav_midstretch.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/leftnav_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/leftnav_top.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/skin/database_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/skin/database_add.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/skin/database_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/skin/database_delete.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/skin/database_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/skin/database_edit.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/skin/database_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/skin/database_save.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/skin/database_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/skin/database_table.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/skin/exclamation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/skin/exclamation.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/skin/house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/skin/house.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/skin/information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/skin/information.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/skin/shadow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/skin/shadow.jpg -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/skin/sorted_asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/skin/sorted_asc.gif -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/skin/sorted_desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/skin/sorted_desc.gif -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/spinner.gif -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/images/springsource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/sample/web-app/images/springsource.png -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/js/application.js: -------------------------------------------------------------------------------- 1 | var Ajax; 2 | if (Ajax && (Ajax != null)) { 3 | Ajax.Responders.register({ 4 | onCreate: function() { 5 | if($('spinner') && Ajax.activeRequestCount>0) 6 | Effect.Appear('spinner',{duration:0.5,queue:'end'}); 7 | }, 8 | onComplete: function() { 9 | if($('spinner') && Ajax.activeRequestCount==0) 10 | Effect.Fade('spinner',{duration:0.5,queue:'end'}); 11 | } 12 | }); 13 | } 14 | -------------------------------------------------------------------------------- /GrailsEnvironments/sample/web-app/js/prototype/sound.js: -------------------------------------------------------------------------------- 1 | // script.aculo.us sound.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 2 | 3 | // Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 4 | // 5 | // Based on code created by Jules Gravinese (http://www.webveteran.com/) 6 | // 7 | // script.aculo.us is freely distributable under the terms of an MIT-style license. 8 | // For details, see the script.aculo.us web site: http://script.aculo.us/ 9 | 10 | Sound = { 11 | tracks: {}, 12 | _enabled: true, 13 | template: 14 | new Template(''), 15 | enable: function(){ 16 | Sound._enabled = true; 17 | }, 18 | disable: function(){ 19 | Sound._enabled = false; 20 | }, 21 | play: function(url){ 22 | if(!Sound._enabled) return; 23 | var options = Object.extend({ 24 | track: 'global', url: url, replace: false 25 | }, arguments[1] || {}); 26 | 27 | if(options.replace && this.tracks[options.track]) { 28 | $R(0, this.tracks[options.track].id).each(function(id){ 29 | var sound = $('sound_'+options.track+'_'+id); 30 | sound.Stop && sound.Stop(); 31 | sound.remove(); 32 | }); 33 | this.tracks[options.track] = null; 34 | } 35 | 36 | if(!this.tracks[options.track]) 37 | this.tracks[options.track] = { id: 0 }; 38 | else 39 | this.tracks[options.track].id++; 40 | 41 | options.id = this.tracks[options.track].id; 42 | $$('body')[0].insert( 43 | Prototype.Browser.IE ? new Element('bgsound',{ 44 | id: 'sound_'+options.track+'_'+options.id, 45 | src: options.url, loop: 1, autostart: true 46 | }) : Sound.template.evaluate(options)); 47 | } 48 | }; 49 | 50 | if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){ 51 | if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 })) 52 | Sound.template = new Template(''); 53 | else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('Windows Media') != -1 })) 54 | Sound.template = new Template(''); 55 | else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('RealPlayer') != -1 })) 56 | Sound.template = new Template(''); 57 | else 58 | Sound.play = function(){}; 59 | } -------------------------------------------------------------------------------- /GrailsEnvironments/tomcat-instances/production/logs/catalina.log: -------------------------------------------------------------------------------- 1 | 2011-02-06 09:53:51,048 [main] INFO org.apache.catalina.core.AprLifecycleListener - Loaded APR based Apache Tomcat Native library 1.1.20. 2 | 2011-02-06 09:53:51,049 [main] INFO org.apache.catalina.core.AprLifecycleListener - APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true]. 3 | 2011-02-06 09:53:51,337 [main] INFO org.apache.coyote.http11.Http11AprProtocol - Initializing Coyote HTTP/1.1 on http-9082 4 | 2011-02-06 09:53:51,338 [main] INFO org.apache.coyote.ajp.AjpAprProtocol - Initializing Coyote AJP/1.3 on ajp-9011 5 | 2011-02-06 09:53:51,338 [main] INFO org.apache.catalina.startup.Catalina - Initialization processed in 842 ms 6 | 2011-02-06 09:53:51,378 [main] INFO org.apache.catalina.core.StandardService - Starting service Catalina 7 | 2011-02-06 09:53:51,379 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet Engine: Apache Tomcat/6.0.32 8 | 2011-02-06 09:53:51,754 [main] INFO org.apache.catalina.startup.HostConfig - Deploying configuration descriptor manager.xml 9 | 2011-02-06 09:53:52,107 [main] INFO org.apache.coyote.http11.Http11AprProtocol - Starting Coyote HTTP/1.1 on http-9082 10 | 2011-02-06 09:53:52,122 [main] INFO org.apache.coyote.ajp.AjpAprProtocol - Starting Coyote AJP/1.3 on ajp-9011 11 | 2011-02-06 09:53:52,123 [main] INFO org.apache.catalina.startup.Catalina - Server startup in 785 ms 12 | 2011-02-06 09:53:59,804 [Thread-9] INFO org.apache.coyote.http11.Http11AprProtocol - Pausing Coyote HTTP/1.1 on http-9082 13 | 2011-02-06 09:53:59,804 [Thread-9] INFO org.apache.coyote.ajp.AjpAprProtocol - Pausing Coyote AJP/1.3 on ajp-9011 14 | 2011-02-06 09:54:00,805 [Thread-9] INFO org.apache.catalina.core.StandardService - Stopping service Catalina 15 | 2011-02-06 09:54:00,825 [Thread-9] INFO org.apache.coyote.http11.Http11AprProtocol - Stopping Coyote HTTP/1.1 on http-9082 16 | 2011-02-06 09:54:00,826 [Thread-9] INFO org.apache.coyote.ajp.AjpAprProtocol - Stopping Coyote AJP/1.3 on ajp-9011 17 | -------------------------------------------------------------------------------- /GrailsEnvironments/tomcat-instances/production/logs/host-manager.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/tomcat-instances/production/logs/host-manager.log -------------------------------------------------------------------------------- /GrailsEnvironments/tomcat-instances/production/logs/localhost.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/tomcat-instances/production/logs/localhost.log -------------------------------------------------------------------------------- /GrailsEnvironments/tomcat-instances/production/logs/manager.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/tomcat-instances/production/logs/manager.log -------------------------------------------------------------------------------- /GrailsEnvironments/tomcat-instances/system-test/bin/setenv.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/tomcat-instances/system-test/bin/setenv.sh -------------------------------------------------------------------------------- /GrailsEnvironments/tomcat-instances/user-acceptance-test/bin/setenv.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/GrailsEnvironments/tomcat-instances/user-acceptance-test/bin/setenv.sh -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service-spock/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service-spock/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | user-service 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | org.maven.ide.eclipse.maven2Builder 15 | 16 | 17 | 18 | 19 | 20 | org.eclipse.jdt.groovy.core.groovyNature 21 | org.eclipse.jdt.core.javanature 22 | org.maven.ide.eclipse.maven2Nature 23 | 24 | 25 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service-spock/.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | #Tue Jan 25 07:42:56 CET 2011 2 | eclipse.preferences.version=1 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 4 | org.eclipse.jdt.core.compiler.compliance=1.5 5 | org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning 6 | org.eclipse.jdt.core.compiler.source=1.5 7 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service-spock/.settings/org.maven.ide.eclipse.prefs: -------------------------------------------------------------------------------- 1 | #Tue Jan 25 07:42:56 CET 2011 2 | activeProfiles= 3 | eclipse.preferences.version=1 4 | fullBuildGoals=process-test-resources 5 | resolveWorkspaceProjects=true 6 | resourceFilterGoals=process-resources resources\:testResources 7 | skipCompilerPlugin=true 8 | version=1 9 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service-spock/src/main/java/com/mrhaki/app/domain/User.java: -------------------------------------------------------------------------------- 1 | package com.mrhaki.app.domain; 2 | 3 | public class User { 4 | private String name; 5 | private String username; 6 | 7 | public User() { 8 | } 9 | 10 | public User(String name, String username) { 11 | this.name = name; 12 | this.username = username; 13 | } 14 | 15 | public String getName() { 16 | return name; 17 | } 18 | 19 | public void setName(String name) { 20 | this.name = name; 21 | } 22 | 23 | public String getUsername() { 24 | return username; 25 | } 26 | 27 | public void setUsername(String username) { 28 | this.username = username; 29 | } 30 | 31 | public String toString() { 32 | return "[User:name='" + name + "'," + "username='" + username + "']"; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service-spock/src/main/java/com/mrhaki/app/services/UserService.java: -------------------------------------------------------------------------------- 1 | package com.mrhaki.app.services; 2 | 3 | public interface UserService { 4 | /** 5 | * Find username for given name. 6 | * 7 | * @param name 8 | * Name of the user. 9 | * @return Found username or empty if not found. 10 | */ 11 | public String findUsername(String name); 12 | } 13 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service-spock/src/main/java/com/mrhaki/app/services/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.mrhaki.app.services; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.mrhaki.app.domain.User; 7 | 8 | public class UserServiceImpl implements UserService { 9 | 10 | public String findUsername(String name) { 11 | List users = new ArrayList(); 12 | users.add(new User("Hubert A. Klein Ikkink", "mrhaki")); 13 | 14 | String foundUsername = ""; 15 | for (User user: users) { 16 | if (user.getName().equals(name)) { 17 | foundUsername = user.getUsername(); 18 | break; 19 | } 20 | } 21 | 22 | return foundUsername; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service-spock/src/test/groovy/com/mrhaki/app/services/UserServiceImplSpec.groovy: -------------------------------------------------------------------------------- 1 | package com.mrhaki.app.services 2 | 3 | import spock.lang.Specification 4 | 5 | class UserServiceImplSpec extends Specification { 6 | 7 | UserServiceImpl userService = new UserServiceImpl(); 8 | 9 | def "Search for existing name must return correct username"() { 10 | expect: 11 | userService.findUsername("Hubert A. Klein Ikkink") == 'mrhaki' 12 | } 13 | 14 | def "Search for non-existing name must return an empty String"() { 15 | expect: 16 | userService.findUsername('non-existing name') == '' 17 | } 18 | 19 | def "Search with null value for name must return an empty String"() { 20 | expect: 21 | userService.findUsername(null) == '' 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | user-service 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | org.maven.ide.eclipse.maven2Builder 15 | 16 | 17 | 18 | 19 | 20 | org.eclipse.jdt.core.javanature 21 | org.maven.ide.eclipse.maven2Nature 22 | 23 | 24 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service/.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | #Tue Jan 25 08:21:53 CET 2011 2 | eclipse.preferences.version=1 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 4 | org.eclipse.jdt.core.compiler.compliance=1.5 5 | org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning 6 | org.eclipse.jdt.core.compiler.source=1.5 7 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service/.settings/org.maven.ide.eclipse.prefs: -------------------------------------------------------------------------------- 1 | #Tue Jan 25 08:21:53 CET 2011 2 | activeProfiles= 3 | eclipse.preferences.version=1 4 | fullBuildGoals=process-test-resources 5 | resolveWorkspaceProjects=true 6 | resourceFilterGoals=process-resources resources\:testResources 7 | skipCompilerPlugin=true 8 | version=1 9 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | com.mrhaki.app.services 9 | user-service 10 | jar 11 | 12 | User Service 13 | Service to work with users 14 | 15 | 1.2 16 | 17 | 18 | 19 | 20 | org.apache.maven.plugins 21 | maven-compiler-plugin 22 | 23 | 1.6 24 | 1.6 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service/src/main/java/com/mrhaki/app/domain/User.java: -------------------------------------------------------------------------------- 1 | package com.mrhaki.app.domain; 2 | 3 | public class User { 4 | private String name; 5 | private String username; 6 | 7 | public User() { 8 | } 9 | 10 | public User(String name, String username) { 11 | this.name = name; 12 | this.username = username; 13 | } 14 | 15 | public String getName() { 16 | return name; 17 | } 18 | 19 | public void setName(String name) { 20 | this.name = name; 21 | } 22 | 23 | public String getUsername() { 24 | return username; 25 | } 26 | 27 | public void setUsername(String username) { 28 | this.username = username; 29 | } 30 | 31 | public String toString() { 32 | return "[User:name='" + name + "'," + "username='" + username + "']"; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service/src/main/java/com/mrhaki/app/services/UserService.java: -------------------------------------------------------------------------------- 1 | package com.mrhaki.app.services; 2 | 3 | public interface UserService { 4 | /** 5 | * Find username for given name. 6 | * 7 | * @param name 8 | * Name of the user. 9 | * @return Found username or empty if not found. 10 | */ 11 | public String findUsername(String name); 12 | } 13 | -------------------------------------------------------------------------------- /JavaProjectWithSpock/user-service/src/main/java/com/mrhaki/app/services/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.mrhaki.app.services; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.mrhaki.app.domain.User; 7 | 8 | public class UserServiceImpl implements UserService { 9 | 10 | public String findUsername(String name) { 11 | List users = new ArrayList(); 12 | users.add(new User("Hubert A. Klein Ikkink", "mrhaki")); 13 | 14 | String foundUsername = ""; 15 | for (User user: users) { 16 | if (user.getName().equals(name)) { 17 | foundUsername = user.getUsername(); 18 | break; 19 | } 20 | } 21 | 22 | return foundUsername; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/README -------------------------------------------------------------------------------- /SpringTestInjection/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build 3 | -------------------------------------------------------------------------------- /SpringTestInjection/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | repositories { 4 | mavenCentral() 5 | } 6 | 7 | dependencies { 8 | compile 'org.springframework:spring-context:3.0.4.RELEASE' 9 | testCompile 'junit:junit:4.8.1', 'org.mockito:mockito-all:1.8.5', 'org.springframework:spring-test:3.0.4.RELEASE' 10 | } 11 | -------------------------------------------------------------------------------- /SpringTestInjection/src/main/java/com/mrhaki/spring/MessageService.java: -------------------------------------------------------------------------------- 1 | // Support class used in MyService: src/main/java/com/mrhaki/spring/MessageService.java 2 | package com.mrhaki.spring; 3 | 4 | import org.springframework.stereotype.Component; 5 | 6 | @Component 7 | public class MessageService { 8 | public String getMessage() { 9 | return "Hello, "; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /SpringTestInjection/src/main/java/com/mrhaki/spring/MyService.java: -------------------------------------------------------------------------------- 1 | // Class to test: src/main/java/com/mrhaki/spring/MyService.java 2 | package com.mrhaki.spring; 3 | 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.stereotype.Component; 6 | 7 | @Component 8 | public class MyService { 9 | @Autowired 10 | MessageService messageService; 11 | 12 | public String say(String name) { 13 | return messageService.getMessage() + name; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SpringTestInjection/src/test/java/com/mrhaki/spring/MyServiceTest.java: -------------------------------------------------------------------------------- 1 | // Test class for testing MyService: src/test/java/com/mrhaki/spring/MyServiceTest.java 2 | package com.mrhaki.spring; 3 | 4 | import org.junit.Test; 5 | import org.springframework.test.util.ReflectionTestUtils; 6 | 7 | import static org.junit.Assert.assertEquals; 8 | import static org.mockito.Mockito.mock; 9 | import static org.mockito.Mockito.when; 10 | 11 | public class MyServiceTest { 12 | @Test 13 | public void sayHi() { 14 | MessageService messageService = mock(MessageService.class); 15 | when(messageService.getMessage()).thenReturn("Hi, "); 16 | 17 | MyService myService = new MyService(); 18 | // Inject mock into private field: 19 | ReflectionTestUtils.setField(myService, "messageService", messageService); 20 | 21 | assertEquals("Hi, mrhaki", myService.say("mrhaki")); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/icon.png -------------------------------------------------------------------------------- /layout-demo/.gitignore: -------------------------------------------------------------------------------- 1 | .classpath 2 | .settings 3 | .project 4 | *.im? 5 | *.ipr 6 | *.iws 7 | target 8 | -------------------------------------------------------------------------------- /layout-demo/application.properties: -------------------------------------------------------------------------------- 1 | #Grails Metadata file 2 | #Mon Mar 21 10:51:37 CET 2011 3 | app.grails.version=1.3.7 4 | app.name=layout-demo 5 | app.servlet.version=2.4 6 | app.version=0.1 7 | plugins.hibernate=1.3.7 8 | plugins.tomcat=1.3.7 9 | -------------------------------------------------------------------------------- /layout-demo/grails-app/conf/BootStrap.groovy: -------------------------------------------------------------------------------- 1 | import com.mrhaki.layout.domain.Product 2 | 3 | class BootStrap { 4 | 5 | def init = { servletContext -> 6 | setupProducts() 7 | } 8 | 9 | def destroy = { 10 | } 11 | 12 | private void setupProducts() { 13 | new Product(title: 'Product 1', description: 'Aenean facilisis quam ut sapien rhoncus bibendum. Phasellus viverra leo eu turpis semper nec fermentum nulla pretium. Sed ac nunc cras amet.').save(flush: true) 14 | new Product(title: 'Product 2', description: 'Vestibulum tristique, nunc sed sodales porta, metus tellus vestibulum lacus, vel egestas leo mauris ut risus. Phasellus ultrices massa nunc.').save() 15 | new Product(title: 'Product 3', description: 'Mauris blandit diam ut magna feugiat convallis. Donec condimentum eros eros. Suspendisse fermentum lobortis ipsum. Sed faucibus commodo sed').save() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /layout-demo/grails-app/conf/BuildConfig.groovy: -------------------------------------------------------------------------------- 1 | grails.project.class.dir = "target/classes" 2 | grails.project.test.class.dir = "target/test-classes" 3 | grails.project.test.reports.dir = "target/test-reports" 4 | //grails.project.war.file = "target/${appName}-${appVersion}.war" 5 | grails.project.dependency.resolution = { 6 | // inherit Grails' default dependencies 7 | inherits("global") { 8 | // uncomment to disable ehcache 9 | // excludes 'ehcache' 10 | } 11 | log "warn" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose' 12 | repositories { 13 | grailsPlugins() 14 | grailsHome() 15 | grailsCentral() 16 | 17 | // uncomment the below to enable remote dependency resolution 18 | // from public Maven repositories 19 | //mavenLocal() 20 | //mavenCentral() 21 | //mavenRepo "http://snapshots.repository.codehaus.org" 22 | //mavenRepo "http://repository.codehaus.org" 23 | //mavenRepo "http://download.java.net/maven/2/" 24 | //mavenRepo "http://repository.jboss.com/maven2/" 25 | } 26 | dependencies { 27 | // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg. 28 | 29 | // runtime 'mysql:mysql-connector-java:5.1.13' 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /layout-demo/grails-app/conf/DataSource.groovy: -------------------------------------------------------------------------------- 1 | dataSource { 2 | pooled = true 3 | driverClassName = "org.hsqldb.jdbcDriver" 4 | username = "sa" 5 | password = "" 6 | } 7 | hibernate { 8 | cache.use_second_level_cache = true 9 | cache.use_query_cache = true 10 | cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider' 11 | } 12 | // environment specific settings 13 | environments { 14 | development { 15 | dataSource { 16 | dbCreate = "create-drop" // one of 'create', 'create-drop','update' 17 | url = "jdbc:hsqldb:mem:devDB" 18 | } 19 | } 20 | test { 21 | dataSource { 22 | dbCreate = "update" 23 | url = "jdbc:hsqldb:mem:testDb" 24 | } 25 | } 26 | production { 27 | dataSource { 28 | dbCreate = "update" 29 | url = "jdbc:hsqldb:file:prodDb;shutdown=true" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /layout-demo/grails-app/conf/UrlMappings.groovy: -------------------------------------------------------------------------------- 1 | class UrlMappings { 2 | 3 | static mappings = { 4 | "/$controller/$action?/$id?" { 5 | constraints { 6 | // apply constraints here 7 | } 8 | } 9 | 10 | "/" controller: 'page' 11 | "500"(view: '/error') 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /layout-demo/grails-app/conf/spring/resources.groovy: -------------------------------------------------------------------------------- 1 | // Place your Spring DSL code here 2 | beans = { 3 | } 4 | -------------------------------------------------------------------------------- /layout-demo/grails-app/controllers/com/mrhaki/layout/controller/PageController.groovy: -------------------------------------------------------------------------------- 1 | package com.mrhaki.layout.controller 2 | 3 | import com.mrhaki.layout.domain.Product 4 | 5 | class PageController { 6 | 7 | def index = { 8 | def productList = Product.list() 9 | render view: '/templates/homepage', model: [productList: productList] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /layout-demo/grails-app/controllers/com/mrhaki/layout/controller/ProductController.groovy: -------------------------------------------------------------------------------- 1 | package com.mrhaki.layout.controller 2 | 3 | import com.mrhaki.layout.domain.Product 4 | 5 | class ProductController { 6 | 7 | static defaultAction = 'list' 8 | 9 | def list = { 10 | def productList = Product.list() 11 | render view: '/templates/productlist', model: [productList: productList] 12 | } 13 | 14 | def view = { 15 | def productId = params.id 16 | def product = Product.read(productId) 17 | def productList = Product.list() 18 | render view: '/templates/productview', model: [product: product, productList: productList] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /layout-demo/grails-app/domain/com/mrhaki/layout/domain/Product.groovy: -------------------------------------------------------------------------------- 1 | package com.mrhaki.layout.domain 2 | 3 | class Product { 4 | 5 | String title 6 | String description 7 | 8 | static constraints = { 9 | } 10 | 11 | String toString() { 12 | title 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /layout-demo/grails-app/i18n/messages_da.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/grails-app/i18n/messages_da.properties -------------------------------------------------------------------------------- /layout-demo/grails-app/i18n/messages_es.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no corresponde al patrón [{3}] 2 | default.invalid.url.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una URL válida 3 | default.invalid.creditCard.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es un número de tarjeta de crédito válida 4 | default.invalid.email.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una dirección de correo electrónico válida 5 | default.invalid.range.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el rango válido de [{3}] a [{4}] 6 | default.invalid.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el tamaño válido de [{3}] a [{4}] 7 | default.invalid.max.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el valor máximo [{3}] 8 | default.invalid.min.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menos que el valor mínimo [{3}] 9 | default.invalid.max.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el tamaño máximo de [{3}] 10 | default.invalid.min.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menor que el tamaño mínimo de [{3}] 11 | default.invalid.validator.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es válido 12 | default.not.inlist.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no esta contenido dentro de la lista [{3}] 13 | default.blank.message=La propiedad [{0}] de la clase [{1}] no puede ser vacía 14 | default.not.equal.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no puede igualar a [{3}] 15 | default.null.message=La propiedad [{0}] de la clase [{1}] no puede ser nulo 16 | default.not.unique.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] debe ser única 17 | 18 | default.paginate.prev=Anterior 19 | default.paginate.next=Siguiente 20 | 21 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 22 | typeMismatch.java.net.URL=La propiedad {0} debe ser una URL válida 23 | typeMismatch.java.net.URI=La propiedad {0} debe ser una URI válida 24 | typeMismatch.java.util.Date=La propiedad {0} debe ser una fecha válida 25 | typeMismatch.java.lang.Double=La propiedad {0} debe ser un número válido 26 | typeMismatch.java.lang.Integer=La propiedad {0} debe ser un número válido 27 | typeMismatch.java.lang.Long=La propiedad {0} debe ser un número válido 28 | typeMismatch.java.lang.Short=La propiedad {0} debe ser un número válido 29 | typeMismatch.java.math.BigDecimal=La propiedad {0} debe ser un número válido 30 | typeMismatch.java.math.BigInteger=La propiedad {0} debe ser un número válido -------------------------------------------------------------------------------- /layout-demo/grails-app/i18n/messages_fr.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}] 2 | default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide 3 | default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide 4 | default.invalid.email.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une adresse e-mail valide 5 | default.invalid.range.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 6 | default.invalid.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 7 | default.invalid.max.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 8 | default.invalid.min.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 9 | default.invalid.max.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 10 | default.invalid.min.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 11 | default.invalid.validator.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas valide 12 | default.not.inlist.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne fait pas partie de la liste [{3}] 13 | default.blank.message=La propriété [{0}] de la classe [{1}] ne peut pas être vide 14 | default.not.equal.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne peut pas être égale à [{3}] 15 | default.null.message=La propriété [{0}] de la classe [{1}] ne peut pas être nulle 16 | default.not.unique.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] doit être unique 17 | 18 | default.paginate.prev=Précédent 19 | default.paginate.next=Suivant 20 | -------------------------------------------------------------------------------- /layout-demo/grails-app/i18n/messages_it.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non corrisponde al pattern [{3}] 2 | default.invalid.url.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un URL valido 3 | default.invalid.creditCard.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un numero di carta di credito valido 4 | default.invalid.email.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un indirizzo email valido 5 | default.invalid.range.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo valido da [{3}] a [{4}] 6 | default.invalid.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo di dimensioni valide da [{3}] a [{4}] 7 | default.invalid.max.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 8 | default.invalid.min.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 9 | default.invalid.max.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 10 | default.invalid.min.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 11 | default.invalid.validator.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è valida 12 | default.not.inlist.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è contenuta nella lista [{3}] 13 | default.blank.message=La proprietà [{0}] della classe [{1}] non può essere vuota 14 | default.not.equal.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non può essere uguale a [{3}] 15 | default.null.message=La proprietà [{0}] della classe [{1}] non può essere null 16 | default.not.unique.message=La proprietà [{0}] della classe [{1}] con valore [{2}] deve essere unica 17 | 18 | default.paginate.prev=Precedente 19 | default.paginate.next=Successivo -------------------------------------------------------------------------------- /layout-demo/grails-app/i18n/messages_ja.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]パターンと一致していません。 2 | default.invalid.url.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、URLではありません。 3 | default.invalid.creditCard.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、正当なクレジットカード番号ではありません。 4 | default.invalid.email.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、メールアドレスではありません。 5 | default.invalid.range.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]範囲内を指定してください。 6 | default.invalid.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]以内を指定してください。 7 | default.invalid.max.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 8 | default.invalid.min.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 9 | default.invalid.max.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 10 | default.invalid.min.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 11 | default.invalid.validator.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、カスタムバリデーションを通過できません。 12 | default.not.inlist.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]リスト内に存在しません。 13 | default.blank.message=[{1}]クラスのプロパティ[{0}]の空白は許可されません。 14 | default.not.equal.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]と同等ではありません。 15 | default.null.message=[{1}]クラスのプロパティ[{0}]にnullは許可されません。 16 | default.not.unique.message=クラス[{1}]プロパティ[{0}]の値[{2}]は既に使用されています。 17 | 18 | default.paginate.prev=戻る 19 | default.paginate.next=次へ 20 | -------------------------------------------------------------------------------- /layout-demo/grails-app/i18n/messages_pt_BR.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Translated by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atende ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é uma URL válida 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está entre a faixa de valores válida de [{3}] até [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está na faixa de tamanho válida de [{3}] até [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapass o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um valor dentre os permitidos na lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ficar em branco 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazia 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | 25 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para customizar (eg typeMismatch.Book.author) 26 | typeMismatch.java.net.URL=O campo {0} deve ser uma URL válida. 27 | typeMismatch.java.net.URI=O campo {0} deve ser uma URI válida. 28 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 29 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 30 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 31 | typeMismatch.java.lang.Long=O campo {0} deve ser um número válido. 32 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 33 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 34 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. -------------------------------------------------------------------------------- /layout-demo/grails-app/i18n/messages_pt_PT.properties: -------------------------------------------------------------------------------- 1 | # 2 | # translation by miguel.ping@gmail.com, based on pt_BR translation by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não corresponde ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um URL válido 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está dentro dos limites de valores válidos de [{3}] a [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] está fora dos limites de tamanho válido de [{3}] a [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não se encontra nos valores permitidos da lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ser vazio 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | 25 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para personalizar(eg typeMismatch.Book.author) 26 | typeMismatch.java.net.URL=O campo {0} deve ser um URL válido. 27 | typeMismatch.java.net.URI=O campo {0} deve ser um URI válido. 28 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 29 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 30 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 31 | typeMismatch.java.lang.Long=O campo {0} deve ser um número valido. 32 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 33 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 34 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. 35 | -------------------------------------------------------------------------------- /layout-demo/grails-app/i18n/messages_ru.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Значение [{2}] поля [{0}] класса [{1}] не соответствует образцу [{3}] 2 | default.invalid.url.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым URL-адресом 3 | default.invalid.creditCard.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым номером кредитной карты 4 | default.invalid.email.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым e-mail адресом 5 | default.invalid.range.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в допустимый интервал от [{3}] до [{4}] 6 | default.invalid.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) не попадает в допустимый интервал от [{3}] до [{4}] 7 | default.invalid.max.message=Значение [{2}] поля [{0}] класса [{1}] больше чем максимально допустимое значение [{3}] 8 | default.invalid.min.message=Значение [{2}] поля [{0}] класса [{1}] меньше чем минимально допустимое значение [{3}] 9 | default.invalid.max.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) больше чем максимально допустимый размер [{3}] 10 | default.invalid.min.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) меньше чем минимально допустимый размер [{3}] 11 | default.invalid.validator.message=Значение [{2}] поля [{0}] класса [{1}] не допустимо 12 | default.not.inlist.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в список допустимых значений [{3}] 13 | default.blank.message=Поле [{0}] класса [{1}] не может быть пустым 14 | default.not.equal.message=Значение [{2}] поля [{0}] класса [{1}] не может быть равно [{3}] 15 | default.null.message=Поле [{0}] класса [{1}] не может иметь значение null 16 | default.not.unique.message=Значение [{2}] поля [{0}] класса [{1}] должно быть уникальным 17 | 18 | default.paginate.prev=Предыдушая страница 19 | default.paginate.next=Следующая страница 20 | 21 | # Ошибки при присвоении данных. Для точной настройки для полей классов используйте 22 | # формат "typeMismatch.$className.$propertyName" (например, typeMismatch.Book.author) 23 | typeMismatch.java.net.URL=Значение поля {0} не является допустимым URL 24 | typeMismatch.java.net.URI=Значение поля {0} не является допустимым URI 25 | typeMismatch.java.util.Date=Значение поля {0} не является допустимой датой 26 | typeMismatch.java.lang.Double=Значение поля {0} не является допустимым числом 27 | typeMismatch.java.lang.Integer=Значение поля {0} не является допустимым числом 28 | typeMismatch.java.lang.Long=Значение поля {0} не является допустимым числом 29 | typeMismatch.java.lang.Short=Значение поля {0} не является допустимым числом 30 | typeMismatch.java.math.BigDecimal=Значение поля {0} не является допустимым числом 31 | typeMismatch.java.math.BigInteger=Значение поля {0} не является допустимым числом 32 | -------------------------------------------------------------------------------- /layout-demo/grails-app/i18n/messages_zh_CN.properties: -------------------------------------------------------------------------------- 1 | default.blank.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3A\u7A7A 2 | default.doesnt.match.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E\u5B9A\u4E49\u7684\u6A21\u5F0F [{3}]\u4E0D\u5339\u914D 3 | default.invalid.creditCard.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u4FE1\u7528\u5361\u53F7 4 | default.invalid.email.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684\u7535\u5B50\u90AE\u4EF6\u5730\u5740 5 | default.invalid.max.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 6 | default.invalid.max.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 7 | default.invalid.min.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 8 | default.invalid.min.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 9 | default.invalid.range.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 10 | default.invalid.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 11 | default.invalid.url.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684URL 12 | default.invalid.validator.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u672A\u80FD\u901A\u8FC7\u81EA\u5B9A\u4E49\u7684\u9A8C\u8BC1 13 | default.not.equal.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E[{3}]\u4E0D\u76F8\u7B49 14 | default.not.inlist.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5217\u8868\u7684\u53D6\u503C\u8303\u56F4\u5185 15 | default.not.unique.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u5FC5\u987B\u662F\u552F\u4E00\u7684 16 | default.null.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3Anull 17 | default.paginate.next=\u4E0B\u9875 18 | default.paginate.prev=\u4E0A\u9875 19 | -------------------------------------------------------------------------------- /layout-demo/grails-app/i18n/view.properties: -------------------------------------------------------------------------------- 1 | nav.home=Home 2 | nav.products=Products 3 | 4 | search.box.search=Search for product 5 | search.box.submit=Search 6 | 7 | products.list.newest=Newest Products 8 | products.list=Products 9 | 10 | title.homepage=Homepage 11 | title.website=Layouts in Grails 12 | title.product.list=Products -------------------------------------------------------------------------------- /layout-demo/grails-app/views/error.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Grails Runtime Exception 4 | 24 | 25 | 26 | 27 |

Grails Runtime Exception

28 |

Error Details

29 | 30 |
31 | Error ${request.'javax.servlet.error.status_code'}: ${request.'javax.servlet.error.message'.encodeAsHTML()}
32 | Servlet: ${request.'javax.servlet.error.servlet_name'}
33 | URI: ${request.'javax.servlet.error.request_uri'}
34 | 35 | Exception Message: ${exception.message?.encodeAsHTML()}
36 | Caused by: ${exception.cause?.message?.encodeAsHTML()}
37 | Class: ${exception.className}
38 | At Line: [${exception.lineNumber}]
39 | Code Snippet:
40 |
41 | 42 | ${cs?.encodeAsHTML()}
43 |
44 |
45 |
46 |
47 | 48 |

Stack Trace

49 |
50 |
${it.encodeAsHTML()}
51 |
52 |
53 | 54 | -------------------------------------------------------------------------------- /layout-demo/grails-app/views/layouts/fiveblocks.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/layouts/fiveblocks.gsp --%> 2 | 3 | 4 | 5 | <g:layoutTitle/> 6 | 7 | 8 | 9 | 12 | 13 |
14 | 15 | 16 | 17 | 18 |
19 | 20 |
21 | 22 |
23 | 24 |
25 |
26 | 27 | 32 | 33 | -------------------------------------------------------------------------------- /layout-demo/grails-app/views/layouts/oneblock.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/layout/oneblock.gsp --%> 2 | 3 | 4 | 5 | <g:layoutTitle/> 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 |
14 | 15 | -------------------------------------------------------------------------------- /layout-demo/grails-app/views/layouts/page.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/layout/page.gsp --%> 2 | 3 | 4 | 5 | <g:layoutTitle default="Grails"/> 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 35 | 36 | 37 | 38 | 41 | 42 | -------------------------------------------------------------------------------- /layout-demo/grails-app/views/layouts/twoblocks.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/layout/twoblocks.gsp --%> 2 | 3 | 4 | 5 | <g:layoutTitle/> 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 |
14 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /layout-demo/grails-app/views/templates/homepage.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/templates/homepage.gsp --%> 2 | 3 | 4 | <g:message code="title.homepage"/> 5 | 6 | 7 | 8 |

Welcome to Grails Layout Demo

9 |
10 | 11 | 12 |

Vestibulum ipsum velit, vestibulum in elementum vel, pellentesque at nisl. Mauris id rutrum eros. In hac habitasse platea dictumst. Nunc mollis euismod diam at ultrices. Aenean sit amet euismod ipsum. Quisque vitae sapien quis orci luctus gravida. Etiam aliquet tempor diam ut rutrum. Vestibulum felis velit, dictum luctus consequat et, lobortis id orci. Ut vulputate pharetra quam, id scelerisque nulla consequat eu. Ut varius neque in magna viverra ut mattis dolor convallis. Nulla blandit ipsum id eros porta sit amet porta augue bibendum. Nullam magna diam, facilisis id malesuada id, hendrerit condimentum enim. Etiam ornare purus at sapien iaculis venenatis. Morbi id semper felis. Curabitur id dapibus nulla.

13 |
14 | 15 | 16 |

Donec pharetra adipiscing velit, et dignissim neque dignissim vel. Sed sagittis congue vehicula. Integer vel ipsum ipsum. Nulla non risus vel dui tincidunt egestas. In sodales turpis at purus lacinia nec gravida arcu posuere. Proin a gravida massa. Sed urna erat, consectetur a iaculis sit amet, gravida quis sapien. Proin vel lorem libero, nec facilisis massa. Cras consequat rutrum tortor.

17 |
18 | 19 | 20 |

Vestibulum neque orci, malesuada quis suscipit eu, rhoncus ut ipsum. Maecenas dictum, lectus in ultrices viverra, sapien augue sagittis mauris, ut consequat odio purus nec urna. Suspendisse in magna purus, a gravida mi. Sed vel semper turpis. Proin elementum dolor a dolor pharetra eu eleifend neque ullamcorper. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus.

21 |
22 | 23 | 24 |
25 |

26 |
    27 | 28 |
  • 29 | ${product.title} 30 |
  • 31 |
    32 |
33 |
34 |
35 |
-------------------------------------------------------------------------------- /layout-demo/grails-app/views/templates/productlist.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/templates/productlist.gsp --%> 2 | 3 | 4 | <g:message code="title.product.list"/> 5 | 6 | 7 | 8 |

9 |
    10 | 11 |
  • 12 | 13 | 14 | 15 | 16 |

    ${product.title}

    17 |

    18 | ${product.description} 19 |

    20 |
    21 |
  • 22 |
    23 |
24 |
25 |
-------------------------------------------------------------------------------- /layout-demo/grails-app/views/templates/productview.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/templates/productview.gsp --%> 2 | 3 | 4 | ${product.title} 5 | 6 | 7 | 8 |

${product.title}

9 | 10 |

11 | 12 | 13 | ${product.description} 14 |

15 |
16 | 17 | 18 |
19 |

20 |
    21 | 22 |
  • 23 |

    24 | ${product.title} 25 |

    26 |
  • 27 |
    28 |
29 |
30 |
31 |
-------------------------------------------------------------------------------- /layout-demo/web-app/WEB-INF/applicationContext.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | Grails application factory bean 9 | 10 | 11 | 12 | 13 | 14 | A bean that manages Grails plugins 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | classpath*:**/grails-app/**/*.groovy 33 | 34 | 35 | 36 | 38 | 39 | utf-8 40 | 41 | 42 | -------------------------------------------------------------------------------- /layout-demo/web-app/WEB-INF/sitemesh.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /layout-demo/web-app/css/fonts.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Arial, Helvetica, serif; 3 | font-size: 13px; 4 | } 5 | 6 | h1 { 7 | color: #48802c; 8 | font-size: 24px; 9 | font-weight: bold; 10 | margin-top: 0; 11 | } 12 | 13 | h2 { color: #48802c; font-size: 16px; } 14 | 15 | a:hover { color: #48802c; } -------------------------------------------------------------------------------- /layout-demo/web-app/css/layout.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 20px auto; 3 | width: 960px; 4 | position: relative; 5 | } 6 | 7 | #banner { 8 | margin-top: 21px; 9 | } 10 | 11 | #left, #right { 12 | float: left; 13 | margin-top: 21px; 14 | } 15 | 16 | #left { 17 | width: 627px; 18 | margin-right: 14px; 19 | } 20 | 21 | #right { 22 | width: 319px; 23 | } 24 | 25 | #box-left, #box-right { 26 | float: left; 27 | margin-top: 10px; 28 | } 29 | 30 | #box-left { 31 | margin-right: 26px; 32 | width: 284px; 33 | background-color: #ccff99; 34 | padding: 5px; 35 | } 36 | 37 | #box-right { 38 | width: 297px; 39 | background-color: #ccc; 40 | padding: 5px; 41 | } 42 | 43 | #main { 44 | float: left; 45 | width: 960px; 46 | margin-top: 21px; 47 | } 48 | 49 | #main ul { 50 | padding: 0; 51 | margin: 0; 52 | } 53 | 54 | #main ul li { 55 | display: block; 56 | margin: 0; 57 | padding: 5px 0; 58 | } 59 | 60 | #header { 61 | width: 960px; 62 | border-bottom: 1px solid #ccc; 63 | } 64 | 65 | #footer { 66 | float: left; 67 | height: 70px; 68 | margin-top: 15px; 69 | padding-top: 15px; 70 | width: 960px; 71 | border-top: 1px solid #ccc; 72 | } 73 | 74 | #logo { 75 | position: relative; 76 | float: left; 77 | width: 300px; 78 | margin: 0 0 10px 0; 79 | } 80 | 81 | #logo p { 82 | position: absolute; 83 | top: 16px; 84 | left: 56px; 85 | font-size: 16px; 86 | font-weight: bold; 87 | } 88 | 89 | #logo a { 90 | background: url('../images/logo.png') no-repeat; 91 | display: block; 92 | height: 62px; 93 | text-indent: -9000px; 94 | width: 285px; 95 | } 96 | 97 | #searchform { 98 | clear: right; 99 | float: right; 100 | width: 292px; 101 | margin: 4px 0 0 0; 102 | text-align: right; 103 | } 104 | 105 | #navmenu { 106 | float: left; 107 | width: 100%; 108 | height: 40px; 109 | margin: -20px 0 0 0; 110 | } 111 | 112 | #navmenu ul { 113 | list-style-type: none; 114 | margin: 10px 0 10px 0px; 115 | padding: 0; 116 | } 117 | 118 | #navmenu ul li { 119 | display: inline; 120 | position: relative; 121 | float: left; 122 | } 123 | 124 | #navmenu ul li a { 125 | display: block; 126 | padding: 0 18px 10px 0px; 127 | } 128 | 129 | #list-products ul { 130 | border-bottom: 1px solid #ccc; 131 | padding: 0; 132 | margin: 10px 0 0 0; 133 | } 134 | 135 | #list-products ul li { 136 | display: block; 137 | padding: 5px; 138 | border-top: 1px solid #ccc; 139 | border-left: 1px solid #ccc; 140 | border-right: 1px solid #ccc; 141 | } 142 | -------------------------------------------------------------------------------- /layout-demo/web-app/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/favicon.ico -------------------------------------------------------------------------------- /layout-demo/web-app/images/grails_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/grails_logo.jpg -------------------------------------------------------------------------------- /layout-demo/web-app/images/grails_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/grails_logo.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/leftnav_btm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/leftnav_btm.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/leftnav_midstretch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/leftnav_midstretch.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/leftnav_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/leftnav_top.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/logo.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/product-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/product-image.jpg -------------------------------------------------------------------------------- /layout-demo/web-app/images/skin/database_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/skin/database_add.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/skin/database_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/skin/database_delete.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/skin/database_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/skin/database_edit.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/skin/database_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/skin/database_save.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/skin/database_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/skin/database_table.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/skin/exclamation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/skin/exclamation.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/skin/house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/skin/house.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/skin/information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/skin/information.png -------------------------------------------------------------------------------- /layout-demo/web-app/images/skin/shadow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/skin/shadow.jpg -------------------------------------------------------------------------------- /layout-demo/web-app/images/skin/sorted_asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/skin/sorted_asc.gif -------------------------------------------------------------------------------- /layout-demo/web-app/images/skin/sorted_desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/skin/sorted_desc.gif -------------------------------------------------------------------------------- /layout-demo/web-app/images/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/spinner.gif -------------------------------------------------------------------------------- /layout-demo/web-app/images/springsource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo/web-app/images/springsource.png -------------------------------------------------------------------------------- /layout-demo/web-app/js/application.js: -------------------------------------------------------------------------------- 1 | var Ajax; 2 | if (Ajax && (Ajax != null)) { 3 | Ajax.Responders.register({ 4 | onCreate: function() { 5 | if($('spinner') && Ajax.activeRequestCount>0) 6 | Effect.Appear('spinner',{duration:0.5,queue:'end'}); 7 | }, 8 | onComplete: function() { 9 | if($('spinner') && Ajax.activeRequestCount==0) 10 | Effect.Fade('spinner',{duration:0.5,queue:'end'}); 11 | } 12 | }); 13 | } 14 | -------------------------------------------------------------------------------- /layout-demo/web-app/js/prototype/sound.js: -------------------------------------------------------------------------------- 1 | // script.aculo.us sound.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 2 | 3 | // Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 4 | // 5 | // Based on code created by Jules Gravinese (http://www.webveteran.com/) 6 | // 7 | // script.aculo.us is freely distributable under the terms of an MIT-style license. 8 | // For details, see the script.aculo.us web site: http://script.aculo.us/ 9 | 10 | Sound = { 11 | tracks: {}, 12 | _enabled: true, 13 | template: 14 | new Template(''), 15 | enable: function(){ 16 | Sound._enabled = true; 17 | }, 18 | disable: function(){ 19 | Sound._enabled = false; 20 | }, 21 | play: function(url){ 22 | if(!Sound._enabled) return; 23 | var options = Object.extend({ 24 | track: 'global', url: url, replace: false 25 | }, arguments[1] || {}); 26 | 27 | if(options.replace && this.tracks[options.track]) { 28 | $R(0, this.tracks[options.track].id).each(function(id){ 29 | var sound = $('sound_'+options.track+'_'+id); 30 | sound.Stop && sound.Stop(); 31 | sound.remove(); 32 | }); 33 | this.tracks[options.track] = null; 34 | } 35 | 36 | if(!this.tracks[options.track]) 37 | this.tracks[options.track] = { id: 0 }; 38 | else 39 | this.tracks[options.track].id++; 40 | 41 | options.id = this.tracks[options.track].id; 42 | $$('body')[0].insert( 43 | Prototype.Browser.IE ? new Element('bgsound',{ 44 | id: 'sound_'+options.track+'_'+options.id, 45 | src: options.url, loop: 1, autostart: true 46 | }) : Sound.template.evaluate(options)); 47 | } 48 | }; 49 | 50 | if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){ 51 | if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 })) 52 | Sound.template = new Template(''); 53 | else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('Windows Media') != -1 })) 54 | Sound.template = new Template(''); 55 | else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('RealPlayer') != -1 })) 56 | Sound.template = new Template(''); 57 | else 58 | Sound.play = function(){}; 59 | } -------------------------------------------------------------------------------- /layout-demo2/.gitignore: -------------------------------------------------------------------------------- 1 | .classpath 2 | .settings 3 | .project 4 | *.im? 5 | *.ipr 6 | *.iws 7 | target 8 | -------------------------------------------------------------------------------- /layout-demo2/application.properties: -------------------------------------------------------------------------------- 1 | #Grails Metadata file 2 | #Mon Mar 21 10:51:37 CET 2011 3 | app.grails.version=1.3.7 4 | app.name=layout-demo2 5 | app.servlet.version=2.4 6 | app.version=0.1 7 | plugins.hibernate=1.3.7 8 | plugins.tomcat=1.3.7 9 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/conf/BootStrap.groovy: -------------------------------------------------------------------------------- 1 | import com.mrhaki.layout.domain.Product 2 | 3 | class BootStrap { 4 | 5 | def init = { servletContext -> 6 | setupProducts() 7 | } 8 | 9 | def destroy = { 10 | } 11 | 12 | private void setupProducts() { 13 | new Product(title: 'Product 1', description: 'Aenean facilisis quam ut sapien rhoncus bibendum. Phasellus viverra leo eu turpis semper nec fermentum nulla pretium. Sed ac nunc cras amet.').save(flush: true) 14 | new Product(title: 'Product 2', description: 'Vestibulum tristique, nunc sed sodales porta, metus tellus vestibulum lacus, vel egestas leo mauris ut risus. Phasellus ultrices massa nunc.').save() 15 | new Product(title: 'Product 3', description: 'Mauris blandit diam ut magna feugiat convallis. Donec condimentum eros eros. Suspendisse fermentum lobortis ipsum. Sed faucibus commodo sed').save() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/conf/BuildConfig.groovy: -------------------------------------------------------------------------------- 1 | grails.project.class.dir = "target/classes" 2 | grails.project.test.class.dir = "target/test-classes" 3 | grails.project.test.reports.dir = "target/test-reports" 4 | //grails.project.war.file = "target/${appName}-${appVersion}.war" 5 | grails.project.dependency.resolution = { 6 | // inherit Grails' default dependencies 7 | inherits("global") { 8 | // uncomment to disable ehcache 9 | // excludes 'ehcache' 10 | } 11 | log "warn" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose' 12 | repositories { 13 | grailsPlugins() 14 | grailsHome() 15 | grailsCentral() 16 | 17 | // uncomment the below to enable remote dependency resolution 18 | // from public Maven repositories 19 | //mavenLocal() 20 | //mavenCentral() 21 | //mavenRepo "http://snapshots.repository.codehaus.org" 22 | //mavenRepo "http://repository.codehaus.org" 23 | //mavenRepo "http://download.java.net/maven/2/" 24 | //mavenRepo "http://repository.jboss.com/maven2/" 25 | } 26 | dependencies { 27 | // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg. 28 | 29 | // runtime 'mysql:mysql-connector-java:5.1.13' 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/conf/DataSource.groovy: -------------------------------------------------------------------------------- 1 | dataSource { 2 | pooled = true 3 | driverClassName = "org.hsqldb.jdbcDriver" 4 | username = "sa" 5 | password = "" 6 | } 7 | hibernate { 8 | cache.use_second_level_cache = true 9 | cache.use_query_cache = true 10 | cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider' 11 | } 12 | // environment specific settings 13 | environments { 14 | development { 15 | dataSource { 16 | dbCreate = "create-drop" // one of 'create', 'create-drop','update' 17 | url = "jdbc:hsqldb:mem:devDB" 18 | } 19 | } 20 | test { 21 | dataSource { 22 | dbCreate = "update" 23 | url = "jdbc:hsqldb:mem:testDb" 24 | } 25 | } 26 | production { 27 | dataSource { 28 | dbCreate = "update" 29 | url = "jdbc:hsqldb:file:prodDb;shutdown=true" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/conf/UrlMappings.groovy: -------------------------------------------------------------------------------- 1 | class UrlMappings { 2 | 3 | static mappings = { 4 | "/$controller/$action?/$id?" { 5 | constraints { 6 | // apply constraints here 7 | } 8 | } 9 | 10 | "/" controller: 'page' 11 | "500"(view: '/error') 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/conf/spring/resources.groovy: -------------------------------------------------------------------------------- 1 | // Place your Spring DSL code here 2 | beans = { 3 | } 4 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/controllers/com/mrhaki/layout/controller/PageController.groovy: -------------------------------------------------------------------------------- 1 | package com.mrhaki.layout.controller 2 | 3 | import com.mrhaki.layout.domain.Product 4 | 5 | class PageController { 6 | 7 | def index = { 8 | def productList = Product.list() 9 | render view: '/templates/homepage', model: [productList: productList] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/controllers/com/mrhaki/layout/controller/ProductController.groovy: -------------------------------------------------------------------------------- 1 | package com.mrhaki.layout.controller 2 | 3 | import com.mrhaki.layout.domain.Product 4 | 5 | class ProductController { 6 | 7 | static defaultAction = 'list' 8 | 9 | def list = { 10 | def productList = Product.list() 11 | render view: '/templates/productlist', model: [productList: productList] 12 | } 13 | 14 | def view = { 15 | def productId = params.id 16 | def product = Product.read(productId) 17 | def productList = Product.list() 18 | render view: '/templates/productview', model: [product: product, productList: productList] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/domain/com/mrhaki/layout/domain/Product.groovy: -------------------------------------------------------------------------------- 1 | package com.mrhaki.layout.domain 2 | 3 | class Product { 4 | 5 | String title 6 | String description 7 | 8 | static constraints = { 9 | } 10 | 11 | String toString() { 12 | title 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/i18n/messages_da.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/grails-app/i18n/messages_da.properties -------------------------------------------------------------------------------- /layout-demo2/grails-app/i18n/messages_es.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no corresponde al patrón [{3}] 2 | default.invalid.url.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una URL válida 3 | default.invalid.creditCard.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es un número de tarjeta de crédito válida 4 | default.invalid.email.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una dirección de correo electrónico válida 5 | default.invalid.range.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el rango válido de [{3}] a [{4}] 6 | default.invalid.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el tamaño válido de [{3}] a [{4}] 7 | default.invalid.max.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el valor máximo [{3}] 8 | default.invalid.min.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menos que el valor mínimo [{3}] 9 | default.invalid.max.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el tamaño máximo de [{3}] 10 | default.invalid.min.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menor que el tamaño mínimo de [{3}] 11 | default.invalid.validator.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es válido 12 | default.not.inlist.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no esta contenido dentro de la lista [{3}] 13 | default.blank.message=La propiedad [{0}] de la clase [{1}] no puede ser vacía 14 | default.not.equal.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no puede igualar a [{3}] 15 | default.null.message=La propiedad [{0}] de la clase [{1}] no puede ser nulo 16 | default.not.unique.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] debe ser única 17 | 18 | default.paginate.prev=Anterior 19 | default.paginate.next=Siguiente 20 | 21 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 22 | typeMismatch.java.net.URL=La propiedad {0} debe ser una URL válida 23 | typeMismatch.java.net.URI=La propiedad {0} debe ser una URI válida 24 | typeMismatch.java.util.Date=La propiedad {0} debe ser una fecha válida 25 | typeMismatch.java.lang.Double=La propiedad {0} debe ser un número válido 26 | typeMismatch.java.lang.Integer=La propiedad {0} debe ser un número válido 27 | typeMismatch.java.lang.Long=La propiedad {0} debe ser un número válido 28 | typeMismatch.java.lang.Short=La propiedad {0} debe ser un número válido 29 | typeMismatch.java.math.BigDecimal=La propiedad {0} debe ser un número válido 30 | typeMismatch.java.math.BigInteger=La propiedad {0} debe ser un número válido -------------------------------------------------------------------------------- /layout-demo2/grails-app/i18n/messages_fr.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}] 2 | default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide 3 | default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide 4 | default.invalid.email.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une adresse e-mail valide 5 | default.invalid.range.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 6 | default.invalid.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 7 | default.invalid.max.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 8 | default.invalid.min.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 9 | default.invalid.max.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 10 | default.invalid.min.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 11 | default.invalid.validator.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas valide 12 | default.not.inlist.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne fait pas partie de la liste [{3}] 13 | default.blank.message=La propriété [{0}] de la classe [{1}] ne peut pas être vide 14 | default.not.equal.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne peut pas être égale à [{3}] 15 | default.null.message=La propriété [{0}] de la classe [{1}] ne peut pas être nulle 16 | default.not.unique.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] doit être unique 17 | 18 | default.paginate.prev=Précédent 19 | default.paginate.next=Suivant 20 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/i18n/messages_it.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non corrisponde al pattern [{3}] 2 | default.invalid.url.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un URL valido 3 | default.invalid.creditCard.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un numero di carta di credito valido 4 | default.invalid.email.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un indirizzo email valido 5 | default.invalid.range.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo valido da [{3}] a [{4}] 6 | default.invalid.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo di dimensioni valide da [{3}] a [{4}] 7 | default.invalid.max.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 8 | default.invalid.min.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 9 | default.invalid.max.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 10 | default.invalid.min.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 11 | default.invalid.validator.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è valida 12 | default.not.inlist.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è contenuta nella lista [{3}] 13 | default.blank.message=La proprietà [{0}] della classe [{1}] non può essere vuota 14 | default.not.equal.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non può essere uguale a [{3}] 15 | default.null.message=La proprietà [{0}] della classe [{1}] non può essere null 16 | default.not.unique.message=La proprietà [{0}] della classe [{1}] con valore [{2}] deve essere unica 17 | 18 | default.paginate.prev=Precedente 19 | default.paginate.next=Successivo -------------------------------------------------------------------------------- /layout-demo2/grails-app/i18n/messages_ja.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]パターンと一致していません。 2 | default.invalid.url.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、URLではありません。 3 | default.invalid.creditCard.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、正当なクレジットカード番号ではありません。 4 | default.invalid.email.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、メールアドレスではありません。 5 | default.invalid.range.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]範囲内を指定してください。 6 | default.invalid.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]以内を指定してください。 7 | default.invalid.max.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 8 | default.invalid.min.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 9 | default.invalid.max.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 10 | default.invalid.min.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 11 | default.invalid.validator.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、カスタムバリデーションを通過できません。 12 | default.not.inlist.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]リスト内に存在しません。 13 | default.blank.message=[{1}]クラスのプロパティ[{0}]の空白は許可されません。 14 | default.not.equal.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]と同等ではありません。 15 | default.null.message=[{1}]クラスのプロパティ[{0}]にnullは許可されません。 16 | default.not.unique.message=クラス[{1}]プロパティ[{0}]の値[{2}]は既に使用されています。 17 | 18 | default.paginate.prev=戻る 19 | default.paginate.next=次へ 20 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/i18n/messages_pt_BR.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Translated by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atende ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é uma URL válida 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está entre a faixa de valores válida de [{3}] até [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está na faixa de tamanho válida de [{3}] até [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapass o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um valor dentre os permitidos na lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ficar em branco 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazia 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | 25 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para customizar (eg typeMismatch.Book.author) 26 | typeMismatch.java.net.URL=O campo {0} deve ser uma URL válida. 27 | typeMismatch.java.net.URI=O campo {0} deve ser uma URI válida. 28 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 29 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 30 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 31 | typeMismatch.java.lang.Long=O campo {0} deve ser um número válido. 32 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 33 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 34 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. -------------------------------------------------------------------------------- /layout-demo2/grails-app/i18n/messages_pt_PT.properties: -------------------------------------------------------------------------------- 1 | # 2 | # translation by miguel.ping@gmail.com, based on pt_BR translation by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não corresponde ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um URL válido 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está dentro dos limites de valores válidos de [{3}] a [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] está fora dos limites de tamanho válido de [{3}] a [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não se encontra nos valores permitidos da lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ser vazio 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | 25 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para personalizar(eg typeMismatch.Book.author) 26 | typeMismatch.java.net.URL=O campo {0} deve ser um URL válido. 27 | typeMismatch.java.net.URI=O campo {0} deve ser um URI válido. 28 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 29 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 30 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 31 | typeMismatch.java.lang.Long=O campo {0} deve ser um número valido. 32 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 33 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 34 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. 35 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/i18n/messages_ru.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Значение [{2}] поля [{0}] класса [{1}] не соответствует образцу [{3}] 2 | default.invalid.url.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым URL-адресом 3 | default.invalid.creditCard.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым номером кредитной карты 4 | default.invalid.email.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым e-mail адресом 5 | default.invalid.range.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в допустимый интервал от [{3}] до [{4}] 6 | default.invalid.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) не попадает в допустимый интервал от [{3}] до [{4}] 7 | default.invalid.max.message=Значение [{2}] поля [{0}] класса [{1}] больше чем максимально допустимое значение [{3}] 8 | default.invalid.min.message=Значение [{2}] поля [{0}] класса [{1}] меньше чем минимально допустимое значение [{3}] 9 | default.invalid.max.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) больше чем максимально допустимый размер [{3}] 10 | default.invalid.min.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) меньше чем минимально допустимый размер [{3}] 11 | default.invalid.validator.message=Значение [{2}] поля [{0}] класса [{1}] не допустимо 12 | default.not.inlist.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в список допустимых значений [{3}] 13 | default.blank.message=Поле [{0}] класса [{1}] не может быть пустым 14 | default.not.equal.message=Значение [{2}] поля [{0}] класса [{1}] не может быть равно [{3}] 15 | default.null.message=Поле [{0}] класса [{1}] не может иметь значение null 16 | default.not.unique.message=Значение [{2}] поля [{0}] класса [{1}] должно быть уникальным 17 | 18 | default.paginate.prev=Предыдушая страница 19 | default.paginate.next=Следующая страница 20 | 21 | # Ошибки при присвоении данных. Для точной настройки для полей классов используйте 22 | # формат "typeMismatch.$className.$propertyName" (например, typeMismatch.Book.author) 23 | typeMismatch.java.net.URL=Значение поля {0} не является допустимым URL 24 | typeMismatch.java.net.URI=Значение поля {0} не является допустимым URI 25 | typeMismatch.java.util.Date=Значение поля {0} не является допустимой датой 26 | typeMismatch.java.lang.Double=Значение поля {0} не является допустимым числом 27 | typeMismatch.java.lang.Integer=Значение поля {0} не является допустимым числом 28 | typeMismatch.java.lang.Long=Значение поля {0} не является допустимым числом 29 | typeMismatch.java.lang.Short=Значение поля {0} не является допустимым числом 30 | typeMismatch.java.math.BigDecimal=Значение поля {0} не является допустимым числом 31 | typeMismatch.java.math.BigInteger=Значение поля {0} не является допустимым числом 32 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/i18n/messages_zh_CN.properties: -------------------------------------------------------------------------------- 1 | default.blank.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3A\u7A7A 2 | default.doesnt.match.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E\u5B9A\u4E49\u7684\u6A21\u5F0F [{3}]\u4E0D\u5339\u914D 3 | default.invalid.creditCard.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u4FE1\u7528\u5361\u53F7 4 | default.invalid.email.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684\u7535\u5B50\u90AE\u4EF6\u5730\u5740 5 | default.invalid.max.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 6 | default.invalid.max.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 7 | default.invalid.min.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 8 | default.invalid.min.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 9 | default.invalid.range.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 10 | default.invalid.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 11 | default.invalid.url.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684URL 12 | default.invalid.validator.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u672A\u80FD\u901A\u8FC7\u81EA\u5B9A\u4E49\u7684\u9A8C\u8BC1 13 | default.not.equal.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E[{3}]\u4E0D\u76F8\u7B49 14 | default.not.inlist.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5217\u8868\u7684\u53D6\u503C\u8303\u56F4\u5185 15 | default.not.unique.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u5FC5\u987B\u662F\u552F\u4E00\u7684 16 | default.null.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3Anull 17 | default.paginate.next=\u4E0B\u9875 18 | default.paginate.prev=\u4E0A\u9875 19 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/i18n/view.properties: -------------------------------------------------------------------------------- 1 | nav.home=Home 2 | nav.products=Products 3 | 4 | search.box.search=Search for product 5 | search.box.submit=Search 6 | 7 | products.list.newest=Newest Products 8 | products.list=Products 9 | 10 | title.homepage=Homepage 11 | title.website=Layouts in Grails 12 | title.product.list=Products -------------------------------------------------------------------------------- /layout-demo2/grails-app/views/error.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Grails Runtime Exception 4 | 24 | 25 | 26 | 27 |

Grails Runtime Exception

28 |

Error Details

29 | 30 |
31 | Error ${request.'javax.servlet.error.status_code'}: ${request.'javax.servlet.error.message'.encodeAsHTML()}
32 | Servlet: ${request.'javax.servlet.error.servlet_name'}
33 | URI: ${request.'javax.servlet.error.request_uri'}
34 | 35 | Exception Message: ${exception.message?.encodeAsHTML()}
36 | Caused by: ${exception.cause?.message?.encodeAsHTML()}
37 | Class: ${exception.className}
38 | At Line: [${exception.lineNumber}]
39 | Code Snippet:
40 |
41 | 42 | ${cs?.encodeAsHTML()}
43 |
44 |
45 |
46 |
47 | 48 |

Stack Trace

49 |
50 |
${it.encodeAsHTML()}
51 |
52 |
53 | 54 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/views/layouts/fiveblocks.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/layout/fiveblocks.gsp --%> 2 | 3 | 4 | 5 | <g:layoutTitle/> 6 | 7 | 8 | 9 | 12 | 13 |
14 | 15 | 16 | 17 | 18 |
19 | 20 |
21 | 22 |
23 | 24 |
25 |
26 | 27 | 32 | 33 | 34 |
-------------------------------------------------------------------------------- /layout-demo2/grails-app/views/layouts/oneblock.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/layout/oneblock.gsp --%> 2 | 3 | 4 | 5 | <g:layoutTitle/> 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 |
14 | 15 | 16 |
-------------------------------------------------------------------------------- /layout-demo2/grails-app/views/layouts/page.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/layout/page.gsp --%> 2 | 3 | 4 | 5 | <g:layoutTitle default="Grails"/> 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 35 | 36 | 37 | 38 | 41 | 42 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/views/layouts/twoblocks.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/layout/twoblocks.gsp --%> 2 | 3 | 4 | 5 | <g:layoutTitle/> 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 |
14 | 15 | 20 | 21 | 22 |
-------------------------------------------------------------------------------- /layout-demo2/grails-app/views/templates/homepage.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/templates/homepage.gsp --%> 2 | 3 | 4 | 5 | <g:message code="title.homepage"/> 6 | 7 | 8 | 9 |

Welcome to Grails Layout Demo

10 |
11 | 12 | 13 |

Vestibulum ipsum velit, vestibulum in elementum vel, pellentesque at nisl. Mauris id rutrum eros. In hac habitasse platea dictumst. Nunc mollis euismod diam at ultrices. Aenean sit amet euismod ipsum. Quisque vitae sapien quis orci luctus gravida. Etiam aliquet tempor diam ut rutrum. Vestibulum felis velit, dictum luctus consequat et, lobortis id orci. Ut vulputate pharetra quam, id scelerisque nulla consequat eu. Ut varius neque in magna viverra ut mattis dolor convallis. Nulla blandit ipsum id eros porta sit amet porta augue bibendum. Nullam magna diam, facilisis id malesuada id, hendrerit condimentum enim. Etiam ornare purus at sapien iaculis venenatis. Morbi id semper felis. Curabitur id dapibus nulla.

14 |
15 | 16 | 17 |

Donec pharetra adipiscing velit, et dignissim neque dignissim vel. Sed sagittis congue vehicula. Integer vel ipsum ipsum. Nulla non risus vel dui tincidunt egestas. In sodales turpis at purus lacinia nec gravida arcu posuere. Proin a gravida massa. Sed urna erat, consectetur a iaculis sit amet, gravida quis sapien. Proin vel lorem libero, nec facilisis massa. Cras consequat rutrum tortor.

18 |
19 | 20 | 21 |

Vestibulum neque orci, malesuada quis suscipit eu, rhoncus ut ipsum. Maecenas dictum, lectus in ultrices viverra, sapien augue sagittis mauris, ut consequat odio purus nec urna. Suspendisse in magna purus, a gravida mi. Sed vel semper turpis. Proin elementum dolor a dolor pharetra eu eleifend neque ullamcorper. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus.

22 |
23 | 24 | 25 |
26 |

27 |
    28 | 29 |
  • 30 | ${product.title} 31 |
  • 32 |
    33 |
34 |
35 |
36 | 37 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/views/templates/productlist.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/templates/productlist.gsp --%> 2 | 3 | 4 | 5 | <g:message code="title.product.list"/> 6 | 7 | 8 | 9 |

10 |
    11 | 12 |
  • 13 | 14 | 15 | 16 | 17 |

    ${product.title}

    18 |

    19 | ${product.description} 20 |

    21 |
    22 |
  • 23 |
    24 |
25 |
26 | 27 | -------------------------------------------------------------------------------- /layout-demo2/grails-app/views/templates/productview.gsp: -------------------------------------------------------------------------------- 1 | <%-- File: grails-app/views/templates/productview.gsp --%> 2 | 3 | 4 | 5 | ${product.title} 6 | 7 | 8 | 9 |

${product.title}

10 | 11 |

12 | 13 | 14 | ${product.description} 15 |

16 |
17 | 18 | 19 |
20 |

21 |
    22 | 23 |
  • 24 |

    25 | ${product.title} 26 |

    27 |
  • 28 |
    29 |
30 |
31 |
32 | 33 | -------------------------------------------------------------------------------- /layout-demo2/web-app/WEB-INF/applicationContext.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | Grails application factory bean 9 | 10 | 11 | 12 | 13 | 14 | A bean that manages Grails plugins 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | classpath*:**/grails-app/**/*.groovy 33 | 34 | 35 | 36 | 38 | 39 | utf-8 40 | 41 | 42 | -------------------------------------------------------------------------------- /layout-demo2/web-app/WEB-INF/sitemesh.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /layout-demo2/web-app/css/fonts.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Arial, Helvetica, serif; 3 | font-size: 13px; 4 | } 5 | 6 | h1 { 7 | color: #48802c; 8 | font-size: 24px; 9 | font-weight: bold; 10 | margin-top: 0; 11 | } 12 | 13 | h2 { color: #48802c; font-size: 16px; } 14 | 15 | a:hover { color: #48802c; } -------------------------------------------------------------------------------- /layout-demo2/web-app/css/layout.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 20px auto; 3 | width: 960px; 4 | position: relative; 5 | } 6 | 7 | #banner { 8 | margin-top: 21px; 9 | } 10 | 11 | #left, #right { 12 | float: left; 13 | margin-top: 21px; 14 | } 15 | 16 | #left { 17 | width: 627px; 18 | margin-right: 14px; 19 | } 20 | 21 | #right { 22 | width: 319px; 23 | } 24 | 25 | #box-left, #box-right { 26 | float: left; 27 | margin-top: 10px; 28 | } 29 | 30 | #box-left { 31 | margin-right: 26px; 32 | width: 284px; 33 | background-color: #ccff99; 34 | padding: 5px; 35 | } 36 | 37 | #box-right { 38 | width: 297px; 39 | background-color: #ccc; 40 | padding: 5px; 41 | } 42 | 43 | #main { 44 | float: left; 45 | width: 960px; 46 | margin-top: 21px; 47 | } 48 | 49 | #main ul { 50 | padding: 0; 51 | margin: 0; 52 | } 53 | 54 | #main ul li { 55 | display: block; 56 | margin: 0; 57 | padding: 5px 0; 58 | } 59 | 60 | #header { 61 | width: 960px; 62 | border-bottom: 1px solid #ccc; 63 | } 64 | 65 | #footer { 66 | float: left; 67 | height: 70px; 68 | margin-top: 15px; 69 | padding-top: 15px; 70 | width: 960px; 71 | border-top: 1px solid #ccc; 72 | } 73 | 74 | #logo { 75 | position: relative; 76 | float: left; 77 | width: 300px; 78 | margin: 0 0 10px 0; 79 | } 80 | 81 | #logo p { 82 | position: absolute; 83 | top: 16px; 84 | left: 56px; 85 | font-size: 16px; 86 | font-weight: bold; 87 | } 88 | 89 | #logo a { 90 | background: url('../images/logo.png') no-repeat; 91 | display: block; 92 | height: 62px; 93 | text-indent: -9000px; 94 | width: 285px; 95 | } 96 | 97 | #searchform { 98 | clear: right; 99 | float: right; 100 | width: 292px; 101 | margin: 4px 0 0 0; 102 | text-align: right; 103 | } 104 | 105 | #navmenu { 106 | float: left; 107 | width: 100%; 108 | height: 40px; 109 | margin: -20px 0 0 0; 110 | } 111 | 112 | #navmenu ul { 113 | list-style-type: none; 114 | margin: 10px 0 10px 0px; 115 | padding: 0; 116 | } 117 | 118 | #navmenu ul li { 119 | display: inline; 120 | position: relative; 121 | float: left; 122 | } 123 | 124 | #navmenu ul li a { 125 | display: block; 126 | padding: 0 18px 10px 0px; 127 | } 128 | 129 | #list-products ul { 130 | border-bottom: 1px solid #ccc; 131 | padding: 0; 132 | margin: 10px 0 0 0; 133 | } 134 | 135 | #list-products ul li { 136 | display: block; 137 | padding: 5px; 138 | border-top: 1px solid #ccc; 139 | border-left: 1px solid #ccc; 140 | border-right: 1px solid #ccc; 141 | } 142 | -------------------------------------------------------------------------------- /layout-demo2/web-app/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/favicon.ico -------------------------------------------------------------------------------- /layout-demo2/web-app/images/grails_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/grails_logo.jpg -------------------------------------------------------------------------------- /layout-demo2/web-app/images/grails_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/grails_logo.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/leftnav_btm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/leftnav_btm.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/leftnav_midstretch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/leftnav_midstretch.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/leftnav_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/leftnav_top.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/logo.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/product-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/product-image.jpg -------------------------------------------------------------------------------- /layout-demo2/web-app/images/skin/database_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/skin/database_add.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/skin/database_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/skin/database_delete.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/skin/database_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/skin/database_edit.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/skin/database_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/skin/database_save.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/skin/database_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/skin/database_table.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/skin/exclamation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/skin/exclamation.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/skin/house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/skin/house.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/skin/information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/skin/information.png -------------------------------------------------------------------------------- /layout-demo2/web-app/images/skin/shadow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/skin/shadow.jpg -------------------------------------------------------------------------------- /layout-demo2/web-app/images/skin/sorted_asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/skin/sorted_asc.gif -------------------------------------------------------------------------------- /layout-demo2/web-app/images/skin/sorted_desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/skin/sorted_desc.gif -------------------------------------------------------------------------------- /layout-demo2/web-app/images/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/spinner.gif -------------------------------------------------------------------------------- /layout-demo2/web-app/images/springsource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrhaki/BlogSamples/aef37a24f6e179dcc12420bd61ca318c3b06e903/layout-demo2/web-app/images/springsource.png -------------------------------------------------------------------------------- /layout-demo2/web-app/js/application.js: -------------------------------------------------------------------------------- 1 | var Ajax; 2 | if (Ajax && (Ajax != null)) { 3 | Ajax.Responders.register({ 4 | onCreate: function() { 5 | if($('spinner') && Ajax.activeRequestCount>0) 6 | Effect.Appear('spinner',{duration:0.5,queue:'end'}); 7 | }, 8 | onComplete: function() { 9 | if($('spinner') && Ajax.activeRequestCount==0) 10 | Effect.Fade('spinner',{duration:0.5,queue:'end'}); 11 | } 12 | }); 13 | } 14 | -------------------------------------------------------------------------------- /layout-demo2/web-app/js/prototype/sound.js: -------------------------------------------------------------------------------- 1 | // script.aculo.us sound.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 2 | 3 | // Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 4 | // 5 | // Based on code created by Jules Gravinese (http://www.webveteran.com/) 6 | // 7 | // script.aculo.us is freely distributable under the terms of an MIT-style license. 8 | // For details, see the script.aculo.us web site: http://script.aculo.us/ 9 | 10 | Sound = { 11 | tracks: {}, 12 | _enabled: true, 13 | template: 14 | new Template(''), 15 | enable: function(){ 16 | Sound._enabled = true; 17 | }, 18 | disable: function(){ 19 | Sound._enabled = false; 20 | }, 21 | play: function(url){ 22 | if(!Sound._enabled) return; 23 | var options = Object.extend({ 24 | track: 'global', url: url, replace: false 25 | }, arguments[1] || {}); 26 | 27 | if(options.replace && this.tracks[options.track]) { 28 | $R(0, this.tracks[options.track].id).each(function(id){ 29 | var sound = $('sound_'+options.track+'_'+id); 30 | sound.Stop && sound.Stop(); 31 | sound.remove(); 32 | }); 33 | this.tracks[options.track] = null; 34 | } 35 | 36 | if(!this.tracks[options.track]) 37 | this.tracks[options.track] = { id: 0 }; 38 | else 39 | this.tracks[options.track].id++; 40 | 41 | options.id = this.tracks[options.track].id; 42 | $$('body')[0].insert( 43 | Prototype.Browser.IE ? new Element('bgsound',{ 44 | id: 'sound_'+options.track+'_'+options.id, 45 | src: options.url, loop: 1, autostart: true 46 | }) : Sound.template.evaluate(options)); 47 | } 48 | }; 49 | 50 | if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){ 51 | if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 })) 52 | Sound.template = new Template(''); 53 | else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('Windows Media') != -1 })) 54 | Sound.template = new Template(''); 55 | else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('RealPlayer') != -1 })) 56 | Sound.template = new Template(''); 57 | else 58 | Sound.play = function(){}; 59 | } --------------------------------------------------------------------------------