Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Initial zerod configuration

  • Loading branch information...
commit a953d38f9609dd626f36fc54a9da680ff74e5f99 0 parents
zerod authored

Showing 69 changed files with 3,400 additions and 0 deletions. Show diff stats Hide diff stats

  1. +14 0 grails/.classpath
  2. +19 0 grails/.project
  3. +3 0  grails/.settings/org.codehaus.groovy.eclipse.preferences.prefs
  4. +4 0 grails/README.md
  5. +4 0 grails/application.properties
  6. +5 0 grails/grails-app/conf/ApplicationResources.groovy
  7. +25 0 grails/grails-app/conf/BootStrap.groovy
  8. +63 0 grails/grails-app/conf/BuildConfig.groovy
  9. +127 0 grails/grails-app/conf/Config.groovy
  10. +71 0 grails/grails-app/conf/DataSource.groovy
  11. +14 0 grails/grails-app/conf/UrlMappings.groovy
  12. +3 0  grails/grails-app/conf/spring/resources.groovy
  13. +9 0 grails/grails-app/controllers/HomeController.groovy
  14. +134 0 grails/grails-app/controllers/LoginController.groovy
  15. +12 0 grails/grails-app/controllers/LogoutController.groovy
  16. +14 0 grails/grails-app/domain/com/yourapp/Role.groovy
  17. +40 0 grails/grails-app/domain/com/yourapp/User.groovy
  18. +57 0 grails/grails-app/domain/com/yourapp/UserRole.groovy
  19. +55 0 grails/grails-app/i18n/messages.properties
  20. +55 0 grails/grails-app/i18n/messages_cs_CZ.properties
  21. +56 0 grails/grails-app/i18n/messages_da.properties
  22. +55 0 grails/grails-app/i18n/messages_de.properties
  23. +55 0 grails/grails-app/i18n/messages_es.properties
  24. +19 0 grails/grails-app/i18n/messages_fr.properties
  25. +55 0 grails/grails-app/i18n/messages_it.properties
  26. +55 0 grails/grails-app/i18n/messages_ja.properties
  27. +55 0 grails/grails-app/i18n/messages_nl.properties
  28. +59 0 grails/grails-app/i18n/messages_pl.properties
  29. +59 0 grails/grails-app/i18n/messages_pt_BR.properties
  30. +34 0 grails/grails-app/i18n/messages_pt_PT.properties
  31. +31 0 grails/grails-app/i18n/messages_ru.properties
  32. +55 0 grails/grails-app/i18n/messages_sv.properties
  33. +55 0 grails/grails-app/i18n/messages_th.properties
  34. +18 0 grails/grails-app/i18n/messages_zh_CN.properties
  35. +11 0 grails/grails-app/views/error.gsp
  36. +122 0 grails/grails-app/views/home/index.gsp
  37. +28 0 grails/grails-app/views/layouts/main.gsp
  38. +126 0 grails/grails-app/views/login/auth.gsp
  39. +10 0 grails/grails-app/views/login/denied.gsp
  40. +10 0 grails/test/unit/HomeControllerTests.groovy
  41. +33 0 grails/web-app/WEB-INF/applicationContext.xml
  42. +14 0 grails/web-app/WEB-INF/sitemesh.xml
  43. +550 0 grails/web-app/WEB-INF/tld/grails.tld
  44. +311 0 grails/web-app/WEB-INF/tld/spring.tld
  45. +109 0 grails/web-app/css/errors.css
  46. +596 0 grails/web-app/css/main.css
  47. +82 0 grails/web-app/css/mobile.css
  48. BIN  grails/web-app/images/apple-touch-icon-retina.png
  49. BIN  grails/web-app/images/apple-touch-icon.png
  50. BIN  grails/web-app/images/favicon.ico
  51. BIN  grails/web-app/images/grails_logo.jpg
  52. BIN  grails/web-app/images/grails_logo.png
  53. BIN  grails/web-app/images/leftnav_btm.png
  54. BIN  grails/web-app/images/leftnav_midstretch.png
  55. BIN  grails/web-app/images/leftnav_top.png
  56. BIN  grails/web-app/images/skin/database_add.png
  57. BIN  grails/web-app/images/skin/database_delete.png
  58. BIN  grails/web-app/images/skin/database_edit.png
  59. BIN  grails/web-app/images/skin/database_save.png
  60. BIN  grails/web-app/images/skin/database_table.png
  61. BIN  grails/web-app/images/skin/exclamation.png
  62. BIN  grails/web-app/images/skin/house.png
  63. BIN  grails/web-app/images/skin/information.png
  64. BIN  grails/web-app/images/skin/shadow.jpg
  65. BIN  grails/web-app/images/skin/sorted_asc.gif
  66. BIN  grails/web-app/images/skin/sorted_desc.gif
  67. BIN  grails/web-app/images/spinner.gif
  68. BIN  grails/web-app/images/springsource.png
  69. +9 0 grails/web-app/js/application.js
14 grails/.classpath
... ... @@ -0,0 +1,14 @@
  1 +<classpath>
  2 + <classpathentry kind="src" path="src/java"/>
  3 + <classpathentry kind="src" path="src/groovy"/>
  4 + <classpathentry kind="src" path="grails-app/conf"/>
  5 + <classpathentry kind="src" path="grails-app/controllers"/>
  6 + <classpathentry kind="src" path="grails-app/domain"/>
  7 + <classpathentry kind="src" path="grails-app/services"/>
  8 + <classpathentry kind="src" path="grails-app/taglib"/>
  9 + <classpathentry kind="src" path="test/integration"/>
  10 + <classpathentry kind="src" path="test/unit"/>
  11 + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
  12 + <classpathentry kind="con" path="com.springsource.sts.grails.core.CLASSPATH_CONTAINER"/>
  13 + <classpathentry kind="output" path="web-app/WEB-INF/classes"/>
  14 +</classpath>
19 grails/.project
... ... @@ -0,0 +1,19 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<projectDescription>
  3 + <name>zerodGrailsTemplate</name>
  4 + <comment></comment>
  5 + <projects>
  6 + </projects>
  7 + <buildSpec>
  8 + <buildCommand>
  9 + <name>org.eclipse.jdt.core.javabuilder</name>
  10 + <arguments>
  11 + </arguments>
  12 + </buildCommand>
  13 + </buildSpec>
  14 + <natures>
  15 + <nature>com.springsource.sts.grails.core.nature</nature>
  16 + <nature>org.eclipse.jdt.groovy.core.groovyNature</nature>
  17 + <nature>org.eclipse.jdt.core.javanature</nature>
  18 + </natures>
  19 +</projectDescription>
3  grails/.settings/org.codehaus.groovy.eclipse.preferences.prefs
... ... @@ -0,0 +1,3 @@
  1 +#Created by grails
  2 +eclipse.preferences.version=1
  3 +groovy.dont.generate.class.files=true
4 grails/README.md
Source Rendered
... ... @@ -0,0 +1,4 @@
  1 +zerodGrailsTemplate
  2 +===================
  3 +
  4 +Zerod Grails Template
4 grails/application.properties
... ... @@ -0,0 +1,4 @@
  1 +#Sun Oct 07 18:27:15 EST 2012
  2 +app.version=0.1
  3 +app.grails.version=2.1.0
  4 +app.name=grails
5 grails/grails-app/conf/ApplicationResources.groovy
... ... @@ -0,0 +1,5 @@
  1 +modules = {
  2 + application {
  3 + resource url:'js/application.js'
  4 + }
  5 +}
25 grails/grails-app/conf/BootStrap.groovy
... ... @@ -0,0 +1,25 @@
  1 +import com.yourapp.Role
  2 +import com.yourapp.User
  3 +import com.yourapp.UserRole
  4 +
  5 +class BootStrap {
  6 +
  7 + def init = { servletContext ->
  8 + if(Role.list().size() == 0) {
  9 + new Role(authority: 'ROLE_ADMIN').save(flush: true)
  10 + new Role(authority: 'ROLE_USER').save(flush: true)
  11 + }
  12 +
  13 + if(User.count() == 0){
  14 + def newAdmin = new User(username: 'admin', enabled: true, password: 'zerod').save(flush: true)
  15 + def newUser = new User(username: 'zerod', enabled: true, password: 'zerod').save(flush: true)
  16 +
  17 + UserRole.create newAdmin, Role.findByAuthority('ROLE_ADMIN'), true
  18 + UserRole.create newUser, Role.findByAuthority('ROLE_USER'), true
  19 + }
  20 +
  21 +
  22 + }
  23 + def destroy = {
  24 + }
  25 +}
63 grails/grails-app/conf/BuildConfig.groovy
... ... @@ -0,0 +1,63 @@
  1 +grails.servlet.version = "2.5" // Change depending on target container compliance (2.5 or 3.0)
  2 +grails.project.class.dir = "target/classes"
  3 +grails.project.test.class.dir = "target/test-classes"
  4 +grails.project.test.reports.dir = "target/test-reports"
  5 +grails.project.target.level = 1.6
  6 +grails.project.source.level = 1.6
  7 +grails.project.war.file = "target/${appName}.war"
  8 +//grails.project.war.file = "target/${appName}-${appVersion}.war"
  9 +grails.tomcat.jvmArgs= ["-Xms256m", "-Xmx1024m", "-XX:PermSize=512m", "-XX:MaxPermSize=512m"]
  10 +
  11 +coverage {
  12 + xml = true
  13 +}
  14 +
  15 +grails.project.dependency.resolution = {
  16 + // inherit Grails' default dependencies
  17 + inherits("global") {
  18 + // specify dependency exclusions here; for example, uncomment this to disable ehcache:
  19 + // excludes 'ehcache'
  20 + }
  21 + log "error" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
  22 + checksums true // Whether to verify checksums on resolve
  23 +
  24 + repositories {
  25 + inherits true // Whether to inherit repository definitions from plugins
  26 +
  27 + grailsPlugins()
  28 + grailsHome()
  29 + grailsCentral()
  30 +
  31 + mavenLocal()
  32 + mavenCentral()
  33 +
  34 + // uncomment these (or add new ones) to enable remote dependency resolution from public Maven repositories
  35 + //mavenRepo "http://snapshots.repository.codehaus.org"
  36 + //mavenRepo "http://repository.codehaus.org"
  37 + //mavenRepo "http://download.java.net/maven/2/"
  38 + //mavenRepo "http://repository.jboss.com/maven2/"
  39 + }
  40 + dependencies {
  41 + // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.
  42 + runtime 'mysql:mysql-connector-java:5.1.20'
  43 + runtime 'postgresql:postgresql:9.1-901.jdbc4'
  44 + }
  45 +
  46 + plugins {
  47 + runtime ":hibernate:$grailsVersion"
  48 + runtime ":jquery:1.7.2"
  49 + runtime ":resources:1.1.6"
  50 + runtime ":spring-security-core:1.2.7.1"
  51 +
  52 + // Uncomment these (or add new ones) to enable additional resources capabilities
  53 + //runtime ":zipped-resources:1.0"
  54 + //runtime ":cached-resources:1.0"
  55 + //runtime ":yui-minify-resources:0.1.4"
  56 + test (":code-coverage:1.2.5"){
  57 + excludes: "log4j"
  58 + }
  59 + build ":tomcat:$grailsVersion"
  60 + runtime ":database-migration:1.1"
  61 + compile ':cache:1.0.0'
  62 + }
  63 +}
127 grails/grails-app/conf/Config.groovy
... ... @@ -0,0 +1,127 @@
  1 +import org.apache.log4j.DailyRollingFileAppender
  2 +import grails.util.Environment
  3 +// locations to search for config files that get merged into the main config;
  4 +// config files can be ConfigSlurper scripts, Java properties files, or classes
  5 +// in the classpath in ConfigSlurper format
  6 +
  7 +// grails.config.locations = [ "classpath:${appName}-config.properties",
  8 +// "classpath:${appName}-config.groovy",
  9 +// "file:${userHome}/.grails/${appName}-config.properties",
  10 +// "file:${userHome}/.grails/${appName}-config.groovy"]
  11 +
  12 +// if (System.properties["${appName}.config.location"]) {
  13 +// grails.config.locations << "file:" + System.properties["${appName}.config.location"]
  14 +// }
  15 +
  16 +grails.project.groupId = appName // change this to alter the default package name and Maven publishing destination
  17 +grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format
  18 +grails.mime.use.accept.header = false
  19 +grails.mime.types = [
  20 + all: '*/*',
  21 + atom: 'application/atom+xml',
  22 + css: 'text/css',
  23 + csv: 'text/csv',
  24 + form: 'application/x-www-form-urlencoded',
  25 + html: ['text/html','application/xhtml+xml'],
  26 + js: 'text/javascript',
  27 + json: ['application/json', 'text/json'],
  28 + multipartForm: 'multipart/form-data',
  29 + rss: 'application/rss+xml',
  30 + text: 'text/plain',
  31 + xml: ['text/xml', 'application/xml']
  32 +]
  33 +
  34 +// URL Mapping Cache Max Size, defaults to 5000
  35 +//grails.urlmapping.cache.maxsize = 1000
  36 +
  37 +// What URL patterns should be processed by the resources plugin
  38 +grails.resources.adhoc.patterns = ['/images/*', '/css/*', '/js/*', '/plugins/*']
  39 +
  40 +// The default codec used to encode data with ${}
  41 +grails.views.default.codec = "none" // none, html, base64
  42 +grails.views.gsp.encoding = "UTF-8"
  43 +grails.converters.encoding = "UTF-8"
  44 +// enable Sitemesh preprocessing of GSP pages
  45 +grails.views.gsp.sitemesh.preprocess = true
  46 +// scaffolding templates configuration
  47 +grails.scaffolding.templates.domainSuffix = 'Instance'
  48 +
  49 +// Set to false to use the new Grails 1.2 JSONBuilder in the render method
  50 +grails.json.legacy.builder = false
  51 +// enabled native2ascii conversion of i18n properties files
  52 +grails.enable.native2ascii = true
  53 +// packages to include in Spring bean scanning
  54 +grails.spring.bean.packages = []
  55 +// whether to disable processing of multi part requests
  56 +grails.web.disable.multipart=false
  57 +
  58 +// request parameters to mask when logging exceptions
  59 +grails.exceptionresolver.params.exclude = ['password']
  60 +
  61 +// configure auto-caching of queries by default (if false you can cache individual queries with 'cache: true')
  62 +grails.hibernate.cache.queries = false
  63 +
  64 +coverage {
  65 + xml = true
  66 +}
  67 +
  68 +environments {
  69 + development {
  70 + grails.logging.jul.usebridge = false
  71 + }
  72 + production {
  73 + grails.logging.jul.usebridge = false
  74 + // TODO: grails.serverURL = "http://www.changeme.com"
  75 + }
  76 +}
  77 +
  78 +String logDir="/usr/${appName}/logs"
  79 +
  80 +// log4j configuration
  81 +log4j = {
  82 + // Example of changing the log pattern for the default console appender:
  83 + //
  84 + //appenders {
  85 + // console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
  86 + //}
  87 +
  88 + if (Environment.current == Environment.PRODUCTION){
  89 + appender new DailyRollingFileAppender(name:"stdout",
  90 + layout: pattern(conversionPattern:'%d{ISO8601}|[%t]|%-5p |%c{1}| %x | %m%n'),
  91 + fileName:"${logDir}/log.log")
  92 + appender new DailyRollingFileAppender(name:"stacktrace",
  93 + layout: pattern(conversionPattern:'%d{ISO8601}|[%t]|%-5p |%c{1}| %x | %m%n'),
  94 + fileName:"${logDir}/stacktrace.log")
  95 + }
  96 + else{
  97 + appenders {
  98 + console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
  99 + }
  100 + }
  101 + error stdout: "StackTrace"
  102 +
  103 + error 'org.codehaus.groovy.grails.web.servlet', // controllers
  104 + 'org.codehaus.groovy.grails.web.pages', // GSP
  105 + 'org.codehaus.groovy.grails.web.sitemesh', // layouts
  106 + 'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
  107 + 'org.codehaus.groovy.grails.web.mapping', // URL mapping
  108 + 'org.codehaus.groovy.grails.commons', // core / classloading
  109 + 'org.codehaus.groovy.grails.plugins', // plugins
  110 + 'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
  111 + 'org.springframework',
  112 + 'org.hibernate',
  113 + 'net.sf.ehcache.hibernate'
  114 + root {
  115 + if(Environment.current == Environment.PRODUCTION) {
  116 + info 'stdout'
  117 + additivity = true
  118 + }
  119 + }
  120 +}
  121 +
  122 +
  123 +// Added by the Spring Security Core plugin:
  124 +grails.plugins.springsecurity.userLookup.userDomainClassName = 'com.yourapp.User'
  125 +grails.plugins.springsecurity.userLookup.authorityJoinClassName = 'com.yourapp.UserRole'
  126 +grails.plugins.springsecurity.authority.className = 'com.yourapp.Role'
  127 +grails.plugins.springsecurity.securityConfigType = "Annotation"
71 grails/grails-app/conf/DataSource.groovy
... ... @@ -0,0 +1,71 @@
  1 +dataSource {
  2 + pooled = true
  3 +}
  4 +hibernate {
  5 + cache.use_second_level_cache = true
  6 + cache.use_query_cache = false
  7 + cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
  8 +}
  9 +// environment specific settings
  10 +environments {
  11 + development {
  12 + dataSource {
  13 + driverClassName='org.h2.Driver'
  14 + username='sa'
  15 + password=''
  16 + dbCreate='create-drop'
  17 + url='jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000'
  18 + }
  19 +}
  20 +test {
  21 + dataSource {
  22 + pooled=true
  23 + dbCreate='update'
  24 + url='jdbc:mysql://localhost:3306/zeroddbname?useUnicode=yes&characterEncoding=UTF-8'
  25 + driverClassName='com.mysql.jdbc.Driver'
  26 + dialect='org.hibernate.dialect.MySQL5InnoDBDialect'
  27 + username='zerodusername'
  28 + password='zerodpassword'
  29 + properties {
  30 + maxActive=5
  31 + maxIdle=3
  32 + minIdle=1
  33 + initialSize=1
  34 + removeAbandoned=true
  35 + minEvictableIdleTimeMillis=60000
  36 + timeBetweenEvictionRunsMillis=60000
  37 + maxWait=10000
  38 + validationQuery='SELECT 1'
  39 + testOnBorrow=true
  40 + testOnReturn=true
  41 + testWhileIdle=true
  42 + }
  43 + }
  44 +}
  45 +production {
  46 + dataSource {
  47 + pooled=true
  48 + dbCreate='update'
  49 + url='jdbc:mysql://localhost:3306/zeroddbname?useUnicode=yes&characterEncoding=UTF-8'
  50 + driverClassName='com.mysql.jdbc.Driver'
  51 + dialect='org.hibernate.dialect.MySQL5InnoDBDialect'
  52 + username='zerodusername'
  53 + password='zerodpassword'
  54 + properties {
  55 + maxActive=50
  56 + maxIdle=25
  57 + minIdle=5
  58 + initialSize=5
  59 + removeAbandoned=true
  60 + minEvictableIdleTimeMillis=60000
  61 + timeBetweenEvictionRunsMillis=60000
  62 + maxWait=10000
  63 + validationQuery='SELECT 1'
  64 + testOnBorrow=true
  65 + testOnReturn=true
  66 + testWhileIdle=true
  67 + }
  68 + }
  69 +}
  70 +
  71 +}
14 grails/grails-app/conf/UrlMappings.groovy
... ... @@ -0,0 +1,14 @@
  1 +class UrlMappings {
  2 +
  3 + static mappings = {
  4 + "/$controller/$action?/$id?"{
  5 + constraints {
  6 + // apply constraints here
  7 + }
  8 + }
  9 + "/login/$action?"(controller: "login")
  10 + "/logout/$action?"(controller: "logout")
  11 + "/"(controller:"home")
  12 + "500"(view:'/error')
  13 + }
  14 +}
3  grails/grails-app/conf/spring/resources.groovy
... ... @@ -0,0 +1,3 @@
  1 +// Place your Spring DSL code here
  2 +beans = {
  3 +}
9 grails/grails-app/controllers/HomeController.groovy
... ... @@ -0,0 +1,9 @@
  1 +import grails.plugins.springsecurity.Secured
  2 +
  3 +class HomeController {
  4 +
  5 + @Secured(['isFullyAuthenticated()'])
  6 + def index() {
  7 + render(view: 'index')
  8 + }
  9 +}
134 grails/grails-app/controllers/LoginController.groovy
... ... @@ -0,0 +1,134 @@
  1 +import grails.converters.JSON
  2 +
  3 +import javax.servlet.http.HttpServletResponse
  4 +
  5 +import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
  6 +
  7 +import org.springframework.security.authentication.AccountExpiredException
  8 +import org.springframework.security.authentication.CredentialsExpiredException
  9 +import org.springframework.security.authentication.DisabledException
  10 +import org.springframework.security.authentication.LockedException
  11 +import org.springframework.security.core.context.SecurityContextHolder as SCH
  12 +import org.springframework.security.web.WebAttributes
  13 +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
  14 +
  15 +class LoginController {
  16 +
  17 + /**
  18 + * Dependency injection for the authenticationTrustResolver.
  19 + */
  20 + def authenticationTrustResolver
  21 +
  22 + /**
  23 + * Dependency injection for the springSecurityService.
  24 + */
  25 + def springSecurityService
  26 +
  27 + /**
  28 + * Default action; redirects to 'defaultTargetUrl' if logged in, /login/auth otherwise.
  29 + */
  30 + def index = {
  31 + if (springSecurityService.isLoggedIn()) {
  32 + redirect uri: SpringSecurityUtils.securityConfig.successHandler.defaultTargetUrl
  33 + }
  34 + else {
  35 + redirect action: 'auth', params: params
  36 + }
  37 + }
  38 +
  39 + /**
  40 + * Show the login page.
  41 + */
  42 + def auth = {
  43 +
  44 + def config = SpringSecurityUtils.securityConfig
  45 +
  46 + if (springSecurityService.isLoggedIn()) {
  47 + redirect uri: config.successHandler.defaultTargetUrl
  48 + return
  49 + }
  50 +
  51 + String view = 'auth'
  52 + String postUrl = "${request.contextPath}${config.apf.filterProcessesUrl}"
  53 + render view: view, model: [postUrl: postUrl,
  54 + rememberMeParameter: config.rememberMe.parameter]
  55 + }
  56 +
  57 + /**
  58 + * The redirect action for Ajax requests.
  59 + */
  60 + def authAjax = {
  61 + response.setHeader 'Location', SpringSecurityUtils.securityConfig.auth.ajaxLoginFormUrl
  62 + response.sendError HttpServletResponse.SC_UNAUTHORIZED
  63 + }
  64 +
  65 + /**
  66 + * Show denied page.
  67 + */
  68 + def denied = {
  69 + if (springSecurityService.isLoggedIn() &&
  70 + authenticationTrustResolver.isRememberMe(SCH.context?.authentication)) {
  71 + // have cookie but the page is guarded with IS_AUTHENTICATED_FULLY
  72 + redirect action: 'full', params: params
  73 + }
  74 + }
  75 +
  76 + /**
  77 + * Login page for users with a remember-me cookie but accessing a IS_AUTHENTICATED_FULLY page.
  78 + */
  79 + def full = {
  80 + def config = SpringSecurityUtils.securityConfig
  81 + render view: 'auth', params: params,
  82 + model: [hasCookie: authenticationTrustResolver.isRememberMe(SCH.context?.authentication),
  83 + postUrl: "${request.contextPath}${config.apf.filterProcessesUrl}"]
  84 + }
  85 +
  86 + /**
  87 + * Callback after a failed login. Redirects to the auth page with a warning message.
  88 + */
  89 + def authfail = {
  90 +
  91 + def username = session[UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY]
  92 + String msg = ''
  93 + def exception = session[WebAttributes.AUTHENTICATION_EXCEPTION]
  94 + if (exception) {
  95 + if (exception instanceof AccountExpiredException) {
  96 + msg = g.message(code: "springSecurity.errors.login.expired")
  97 + }
  98 + else if (exception instanceof CredentialsExpiredException) {
  99 + msg = g.message(code: "springSecurity.errors.login.passwordExpired")
  100 + }
  101 + else if (exception instanceof DisabledException) {
  102 + msg = g.message(code: "springSecurity.errors.login.disabled")
  103 + }
  104 + else if (exception instanceof LockedException) {
  105 + msg = g.message(code: "springSecurity.errors.login.locked")
  106 + }
  107 + else {
  108 + msg = g.message(code: "springSecurity.errors.login.fail")
  109 + }
  110 + }
  111 +
  112 + if (springSecurityService.isAjax(request)) {
  113 + render([error: msg] as JSON)
  114 + }
  115 + else {
  116 + flash.message = msg
  117 + redirect action: 'auth', params: params
  118 + }
  119 + }
  120 +
  121 + /**
  122 + * The Ajax success redirect url.
  123 + */
  124 + def ajaxSuccess = {
  125 + render([success: true, username: springSecurityService.authentication.name] as JSON)
  126 + }
  127 +
  128 + /**
  129 + * The Ajax denied redirect url.
  130 + */
  131 + def ajaxDenied = {
  132 + render([error: 'access denied'] as JSON)
  133 + }
  134 +}
12 grails/grails-app/controllers/LogoutController.groovy
... ... @@ -0,0 +1,12 @@
  1 +import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
  2 +
  3 +class LogoutController {
  4 +
  5 + /**
  6 + * Index action. Redirects to the Spring security logout uri.
  7 + */
  8 + def index = {
  9 + // TODO put any pre-logout code here
  10 + redirect uri: SpringSecurityUtils.securityConfig.logout.filterProcessesUrl // '/j_spring_security_logout'
  11 + }
  12 +}
14 grails/grails-app/domain/com/yourapp/Role.groovy
... ... @@ -0,0 +1,14 @@
  1 +package com.yourapp
  2 +
  3 +class Role {
  4 +
  5 + String authority
  6 +
  7 + static mapping = {
  8 + cache true
  9 + }
  10 +
  11 + static constraints = {
  12 + authority blank: false, unique: true
  13 + }
  14 +}
40 grails/grails-app/domain/com/yourapp/User.groovy
... ... @@ -0,0 +1,40 @@
  1 +package com.yourapp
  2 +
  3 +class User {
  4 +
  5 + transient springSecurityService
  6 +
  7 + String username
  8 + String password
  9 + boolean enabled
  10 + boolean accountExpired
  11 + boolean accountLocked
  12 + boolean passwordExpired
  13 +
  14 + static constraints = {
  15 + username blank: false, unique: true
  16 + password blank: false
  17 + }
  18 +
  19 + static mapping = {
  20 + password column: '`password`'
  21 + }
  22 +
  23 + Set<Role> getAuthorities() {
  24 + UserRole.findAllByUser(this).collect { it.role } as Set
  25 + }
  26 +
  27 + def beforeInsert() {
  28 + encodePassword()
  29 + }
  30 +
  31 + def beforeUpdate() {
  32 + if (isDirty('password')) {
  33 + encodePassword()
  34 + }
  35 + }
  36 +
  37 + protected void encodePassword() {
  38 + password = springSecurityService.encodePassword(password)
  39 + }
  40 +}
57 grails/grails-app/domain/com/yourapp/UserRole.groovy
... ... @@ -0,0 +1,57 @@
  1 +package com.yourapp
  2 +
  3 +import org.apache.commons.lang.builder.HashCodeBuilder
  4 +
  5 +class UserRole implements Serializable {
  6 +
  7 + User user
  8 + Role role
  9 +
  10 + boolean equals(other) {
  11 + if (!(other instanceof UserRole)) {
  12 + return false
  13 + }
  14 +
  15 + other.user?.id == user?.id &&
  16 + other.role?.id == role?.id
  17 + }
  18 +
  19 + int hashCode() {
  20 + def builder = new HashCodeBuilder()
  21 + if (user) builder.append(user.id)
  22 + if (role) builder.append(role.id)
  23 + builder.toHashCode()
  24 + }
  25 +
  26 + static UserRole get(long userId, long roleId) {
  27 + find 'from UserRole where user.id=:userId and role.id=:roleId',
  28 + [userId: userId, roleId: roleId]
  29 + }
  30 +
  31 + static UserRole create(User user, Role role, boolean flush = false) {
  32 + new UserRole(user: user, role: role).save(flush: flush, insert: true)
  33 + }
  34 +
  35 + static boolean remove(User user, Role role, boolean flush = false) {
  36 + UserRole instance = UserRole.findByUserAndRole(user, role)
  37 + if (!instance) {
  38 + return false
  39 + }
  40 +
  41 + instance.delete(flush: flush)
  42 + true
  43 + }
  44 +
  45 + static void removeAll(User user) {
  46 + executeUpdate 'DELETE FROM UserRole WHERE user=:user', [user: user]
  47 + }
  48 +
  49 + static void removeAll(Role role) {
  50 + executeUpdate 'DELETE FROM UserRole WHERE role=:role', [role: role]
  51 + }
  52 +
  53 + static mapping = {
  54 + id composite: ['role', 'user']
  55 + version false
  56 + }
  57 +}
55 grails/grails-app/i18n/messages.properties
... ... @@ -0,0 +1,55 @@
  1 +default.doesnt.match.message=Property [{0}] of class [{1}] with value [{2}] does not match the required pattern [{3}]
  2 +default.invalid.url.message=Property [{0}] of class [{1}] with value [{2}] is not a valid URL
  3 +default.invalid.creditCard.message=Property [{0}] of class [{1}] with value [{2}] is not a valid credit card number
  4 +default.invalid.email.message=Property [{0}] of class [{1}] with value [{2}] is not a valid e-mail address
  5 +default.invalid.range.message=Property [{0}] of class [{1}] with value [{2}] does not fall within the valid range from [{3}] to [{4}]
  6 +default.invalid.size.message=Property [{0}] of class [{1}] with value [{2}] does not fall within the valid size range from [{3}] to [{4}]
  7 +default.invalid.max.message=Property [{0}] of class [{1}] with value [{2}] exceeds maximum value [{3}]
  8 +default.invalid.min.message=Property [{0}] of class [{1}] with value [{2}] is less than minimum value [{3}]
  9 +default.invalid.max.size.message=Property [{0}] of class [{1}] with value [{2}] exceeds the maximum size of [{3}]
  10 +default.invalid.min.size.message=Property [{0}] of class [{1}] with value [{2}] is less than the minimum size of [{3}]
  11 +default.invalid.validator.message=Property [{0}] of class [{1}] with value [{2}] does not pass custom validation
  12 +default.not.inlist.message=Property [{0}] of class [{1}] with value [{2}] is not contained within the list [{3}]
  13 +default.blank.message=Property [{0}] of class [{1}] cannot be blank
  14 +default.not.equal.message=Property [{0}] of class [{1}] with value [{2}] cannot equal [{3}]
  15 +default.null.message=Property [{0}] of class [{1}] cannot be null
  16 +default.not.unique.message=Property [{0}] of class [{1}] with value [{2}] must be unique
  17 +
  18 +default.paginate.prev=Previous
  19 +default.paginate.next=Next
  20 +default.boolean.true=True
  21 +default.boolean.false=False
  22 +default.date.format=yyyy-MM-dd HH:mm:ss z
  23 +default.number.format=0
  24 +
  25 +default.created.message={0} {1} created
  26 +default.updated.message={0} {1} updated
  27 +default.deleted.message={0} {1} deleted
  28 +default.not.deleted.message={0} {1} could not be deleted
  29 +default.not.found.message={0} not found with id {1}
  30 +default.optimistic.locking.failure=Another user has updated this {0} while you were editing
  31 +
  32 +default.home.label=Home
  33 +default.list.label={0} List
  34 +default.add.label=Add {0}
  35 +default.new.label=New {0}
  36 +default.create.label=Create {0}
  37 +default.show.label=Show {0}
  38 +default.edit.label=Edit {0}
  39 +
  40 +default.button.create.label=Create
  41 +default.button.edit.label=Edit
  42 +default.button.update.label=Update
  43 +default.button.delete.label=Delete
  44 +default.button.delete.confirm.message=Are you sure?
  45 +
  46 +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author)
  47 +typeMismatch.java.net.URL=Property {0} must be a valid URL
  48 +typeMismatch.java.net.URI=Property {0} must be a valid URI
  49 +typeMismatch.java.util.Date=Property {0} must be a valid Date
  50 +typeMismatch.java.lang.Double=Property {0} must be a valid number
  51 +typeMismatch.java.lang.Integer=Property {0} must be a valid number
  52 +typeMismatch.java.lang.Long=Property {0} must be a valid number
  53 +typeMismatch.java.lang.Short=Property {0} must be a valid number
  54 +typeMismatch.java.math.BigDecimal=Property {0} must be a valid number
  55 +typeMismatch.java.math.BigInteger=Property {0} must be a valid number
55 grails/grails-app/i18n/messages_cs_CZ.properties
... ... @@ -0,0 +1,55 @@
  1 +default.doesnt.match.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neodpovídá požadovanému vzoru [{3}]
  2 +default.invalid.url.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní URL
  3 +default.invalid.creditCard.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní číslo kreditní karty
  4 +default.invalid.email.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní emailová adresa
  5 +default.invalid.range.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}]
  6 +default.invalid.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}]
  7 +default.invalid.max.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální povolenou hodnotu [{3}]
  8 +default.invalid.min.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální povolená hodnota [{3}]
  9 +default.invalid.max.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální velikost [{3}]
  10 +default.invalid.min.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální velikost [{3}]
  11 +default.invalid.validator.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neprošla validací
  12 +default.not.inlist.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není obsažena v seznamu [{3}]
  13 +default.blank.message=Položka [{0}] třídy [{1}] nemůže být prázdná
  14 +default.not.equal.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] nemůže být stejná jako [{3}]
  15 +default.null.message=Položka [{0}] třídy [{1}] nemůže být prázdná
  16 +default.not.unique.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] musí být unikátní
  17 +
  18 +default.paginate.prev=Předcházející
  19 +default.paginate.next=Následující
  20 +default.boolean.true=Pravda
  21 +default.boolean.false=Nepravda
  22 +default.date.format=dd. MM. yyyy HH:mm:ss z
  23 +default.number.format=0
  24 +
  25 +default.created.message={0} {1} vytvořeno
  26 +default.updated.message={0} {1} aktualizováno
  27 +default.deleted.message={0} {1} smazáno
  28 +default.not.deleted.message={0} {1} nelze smazat
  29 +default.not.found.message={0} nenalezen s id {1}
  30 +default.optimistic.locking.failure=Jiný uživatel aktualizoval záznam {0}, právě když byl vámi editován
  31 +
  32 +default.home.label=Domů
  33 +default.list.label={0} Seznam
  34 +default.add.label=Přidat {0}
  35 +default.new.label=Nový {0}
  36 +default.create.label=Vytvořit {0}
  37 +default.show.label=Ukázat {0}
  38 +default.edit.label=Editovat {0}
  39 +
  40 +default.button.create.label=Vytvoř
  41 +default.button.edit.label=Edituj
  42 +default.button.update.label=Aktualizuj
  43 +default.button.delete.label=Smaž
  44 +default.button.delete.confirm.message=Jste si jistý?
  45 +
  46 +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author)
  47 +typeMismatch.java.net.URL=Položka {0} musí být validní URL
  48 +typeMismatch.java.net.URI=Položka {0} musí být validní URI
  49 +typeMismatch.java.util.Date=Položka {0} musí být validní datum
  50 +typeMismatch.java.lang.Double=Položka {0} musí být validní desetinné číslo
  51 +typeMismatch.java.lang.Integer=Položka {0} musí být validní číslo
  52 +typeMismatch.java.lang.Long=Položka {0} musí být validní číslo
  53 +typeMismatch.java.lang.Short=Položka {0} musí být validní číslo
  54 +typeMismatch.java.math.BigDecimal=Položka {0} musí být validní číslo
  55 +typeMismatch.java.math.BigInteger=Položka {0} musí být validní číslo
56 grails/grails-app/i18n/messages_da.properties
... ... @@ -0,0 +1,56 @@
  1 +default.doesnt.match.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke mønsteret [{3}]
  2 +default.invalid.url.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig URL
  3 +default.invalid.creditCard.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke et gyldigt kreditkortnummer
  4 +default.invalid.email.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig e-mail adresse
  5 +default.invalid.range.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for intervallet fra [{3}] til [{4}]
  6 +default.invalid.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for størrelsen fra [{3}] til [{4}]
  7 +default.invalid.max.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale værdi [{3}]
  8 +default.invalid.min.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale værdi [{3}]
  9 +default.invalid.max.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale størrelse på [{3}]
  10 +default.invalid.min.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale størrelse på [{3}]
  11 +default.invalid.validator.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke den brugerdefinerede validering
  12 +default.not.inlist.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] findes ikke i listen [{3}]
  13 +default.blank.message=Feltet [{0}] i klassen [{1}] kan ikke være tom
  14 +default.not.equal.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] må ikke være [{3}]
  15 +default.null.message=Feltet [{0}] i klassen [{1}] kan ikke være null
  16 +default.not.unique.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] skal være unik
  17 +
  18 +default.paginate.prev=Forrige
  19 +default.paginate.next=Næste
  20 +default.boolean.true=Sand
  21 +default.boolean.false=Falsk
  22 +default.date.format=yyyy-MM-dd HH:mm:ss z
  23 +default.number.format=0
  24 +
  25 +default.created.message={0} {1} oprettet
  26 +default.updated.message={0} {1} opdateret
  27 +default.deleted.message={0} {1} slettet
  28 +default.not.deleted.message={0} {1} kunne ikke slettes
  29 +default.not.found.message={0} med id {1} er ikke fundet
  30 +default.optimistic.locking.failure=En anden bruger har opdateret denne {0} imens du har lavet rettelser
  31 +
  32 +default.home.label=Hjem
  33 +default.list.label={0} Liste
  34 +default.add.label=Tilføj {0}
  35 +default.new.label=Ny {0}
  36 +default.create.label=Opret {0}
  37 +default.show.label=Vis {0}
  38 +default.edit.label=Ret {0}
  39 +
  40 +default.button.create.label=Opret
  41 +default.button.edit.label=Ret
  42 +default.button.update.label=Opdater
  43 +default.button.delete.label=Slet
  44 +default.button.delete.confirm.message=Er du sikker?
  45 +
  46 +# Databindingsfejl. Brug "typeMismatch.$className.$propertyName for at passe til en given klasse (f.eks typeMismatch.Book.author)
  47 +typeMismatch.java.net.URL=Feltet {0} skal være en valid URL
  48 +typeMismatch.java.net.URI=Feltet {0} skal være en valid URI
  49 +typeMismatch.java.util.Date=Feltet {0} skal være en valid Dato
  50 +typeMismatch.java.lang.Double=Feltet {0} skal være et valid tal
  51 +typeMismatch.java.lang.Integer=Feltet {0} skal være et valid tal
  52 +typeMismatch.java.lang.Long=Feltet {0} skal være et valid tal
  53 +typeMismatch.java.lang.Short=Feltet {0} skal være et valid tal
  54 +typeMismatch.java.math.BigDecimal=Feltet {0} skal være et valid tal
  55 +typeMismatch.java.math.BigInteger=Feltet {0} skal være et valid tal
  56 +
55 grails/grails-app/i18n/messages_de.properties
... ... @@ -0,0 +1,55 @@
  1 +default.doesnt.match.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] entspricht nicht dem vorgegebenen Muster [{3}]
  2 +default.invalid.url.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige URL
  3 +default.invalid.creditCard.message=Das Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige Kreditkartennummer
  4 +default.invalid.email.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige E-Mail Adresse
  5 +default.invalid.range.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}]
  6 +default.invalid.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}]
  7 +default.invalid.max.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist größer als der Höchstwert von [{3}]
  8 +default.invalid.min.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist kleiner als der Mindestwert von [{3}]
  9 +default.invalid.max.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] übersteigt den Höchstwert von [{3}]
  10 +default.invalid.min.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] unterschreitet den Mindestwert von [{3}]
  11 +default.invalid.validator.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist ungültig
  12 +default.not.inlist.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht in der Liste [{3}] enthalten.
  13 +default.blank.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht leer sein
  14 +default.not.equal.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nicht gleich [{3}] sein
  15 +default.null.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht null sein
  16 +default.not.unique.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nur einmal vorkommen
  17 +
  18 +default.paginate.prev=Vorherige
  19 +default.paginate.next=Nächste
  20 +default.boolean.true=Wahr
  21 +default.boolean.false=Falsch
  22 +default.date.format=dd.MM.yyyy HH:mm:ss z
  23 +default.number.format=0
  24 +
  25 +default.created.message={0} {1} wurde angelegt
  26 +default.updated.message={0} {1} wurde geändert
  27 +default.deleted.message={0} {1} wurde gelöscht
  28 +default.not.deleted.message={0} {1} konnte nicht gelöscht werden
  29 +default.not.found.message={0} mit der id {1} wurde nicht gefunden
  30 +default.optimistic.locking.failure=Ein anderer Benutzer hat das {0} Object geändert während Sie es bearbeitet haben
  31 +
  32 +default.home.label=Home
  33 +default.list.label={0} Liste
  34 +default.add.label={0} hinzufügen
  35 +default.new.label={0} anlegen
  36 +default.create.label={0} anlegen
  37 +default.show.label={0} anzeigen
  38 +default.edit.label={0} bearbeiten
  39 +
  40 +default.button.create.label=Anlegen
  41 +default.button.edit.label=Bearbeiten
  42 +default.button.update.label=Aktualisieren
  43 +default.button.delete.label=Löschen
  44 +default.button.delete.confirm.message=Sind Sie sicher?
  45 +
  46 +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author)
  47 +typeMismatch.java.net.URL=Die Eigenschaft {0} muss eine gültige URL sein
  48 +typeMismatch.java.net.URI=Die Eigenschaft {0} muss eine gültige URI sein
  49 +typeMismatch.java.util.Date=Die Eigenschaft {0} muss ein gültiges Datum sein
  50 +typeMismatch.java.lang.Double=Die Eigenschaft {0} muss eine gültige Zahl sein
  51 +typeMismatch.java.lang.Integer=Die Eigenschaft {0} muss eine gültige Zahl sein
  52 +typeMismatch.java.lang.Long=Die Eigenschaft {0} muss eine gültige Zahl sein
  53 +typeMismatch.java.lang.Short=Die Eigenschaft {0} muss eine gültige Zahl sein
  54 +typeMismatch.java.math.BigDecimal=Die Eigenschaft {0} muss eine gültige Zahl sein
  55 +typeMismatch.java.math.BigInteger=Die Eigenschaft {0} muss eine gültige Zahl sein
55 grails/grails-app/i18n/messages_es.properties
... ... @@ -0,0 +1,55 @@
  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 +default.boolean.true=Verdadero
  21 +default.boolean.false=Falso
  22 +default.date.format=yyyy-MM-dd HH:mm:ss z
  23 +default.number.format=0
  24 +
  25 +default.created.message={0} {1} creado
  26 +default.updated.message={0} {1} actualizado
  27 +default.deleted.message={0} {1} eliminado
  28 +default.not.deleted.message={0} {1} no puede eliminarse
  29 +default.not.found.message=No se encuentra {0} con id {1}
  30 +default.optimistic.locking.failure=Mientras usted editaba, otro usuario ha actualizado su {0}
  31 +
  32 +default.home.label=Principal
  33 +default.list.label={0} Lista
  34 +default.add.label=Agregar {0}
  35 +default.new.label=Nuevo {0}
  36 +default.create.label=Crear {0}
  37 +default.show.label=Mostar {0}
  38 +default.edit.label=Editar {0}
  39 +
  40 +default.button.create.label=Crear
  41 +default.button.edit.label=Editar
  42 +default.button.update.label=Actualizar
  43 +default.button.delete.label=Eliminar
  44 +default.button.delete.confirm.message=¿Está usted seguro?
  45 +
  46 +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author)
  47 +typeMismatch.java.net.URL=La propiedad {0} debe ser una URL válida
  48 +typeMismatch.java.net.URI=La propiedad {0} debe ser una URI válida
  49 +typeMismatch.java.util.Date=La propiedad {0} debe ser una fecha válida
  50 +typeMismatch.java.lang.Double=La propiedad {0} debe ser un número válido
  51 +typeMismatch.java.lang.Integer=La propiedad {0} debe ser un número válido
  52 +typeMismatch.java.lang.Long=La propiedad {0} debe ser un número válido
  53 +typeMismatch.java.lang.Short=La propiedad {0} debe ser un número válido
  54 +typeMismatch.java.math.BigDecimal=La propiedad {0} debe ser un número válido
  55 +typeMismatch.java.math.BigInteger=La propiedad {0} debe ser un número válido
19 grails/grails-app/i18n/messages_fr.properties
... ... @@ -0,0 +1,19 @@
  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
55 grails/grails-app/i18n/messages_it.properties
... ... @@ -0,0 +1,55 @@
  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
  20 +default.boolean.true=Vero
  21 +default.boolean.false=Falso
  22 +default.date.format=dd/MM/yyyy HH:mm:ss z
  23 +default.number.format=0
  24 +
  25 +default.created.message={0} {1} creato
  26 +default.updated.message={0} {1} aggiornato
  27 +default.deleted.message={0} {1} eliminato
  28 +default.not.deleted.message={0} {1} non può essere eliminato
  29 +default.not.found.message={0} non trovato con id {1}
  30 +default.optimistic.locking.failure=Un altro utente ha aggiornato questo {0} mentre si era in modifica
  31 +
  32 +default.home.label=Home
  33 +default.list.label={0} Elenco
  34 +default.add.label=Aggiungi {0}
  35 +default.new.label=Nuovo {0}
  36 +default.create.label=Crea {0}
  37 +default.show.label=Mostra {0}
  38 +default.edit.label=Modifica {0}
  39 +
  40 +default.button.create.label=Crea
  41 +default.button.edit.label=Modifica
  42 +default.button.update.label=Aggiorna
  43 +default.button.delete.label=Elimina
  44 +default.button.delete.confirm.message=Si è sicuri?
  45 +
  46 +# Data binding errors. Usa "typeMismatch.$className.$propertyName per la personalizzazione (es typeMismatch.Book.author)
  47 +typeMismatch.java.net.URL=La proprietà {0} deve essere un URL valido
  48 +typeMismatch.java.net.URI=La proprietà {0} deve essere un URI valido
  49 +typeMismatch.java.util.Date=La proprietà {0} deve essere una data valida
  50 +typeMismatch.java.lang.Double=La proprietà {0} deve essere un numero valido
  51 +typeMismatch.java.lang.Integer=La proprietà {0} deve essere un numero valido
  52 +typeMismatch.java.lang.Long=La proprietà {0} deve essere un numero valido
  53 +typeMismatch.java.lang.Short=La proprietà {0} deve essere un numero valido
  54 +typeMismatch.java.math.BigDecimal=La proprietà {0} deve essere un numero valido
  55 +typeMismatch.java.math.BigInteger=La proprietà {0} deve essere un numero valido
55 grails/grails-app/i18n/messages_ja.properties
... ... @@ -0,0 +1,55 @@
  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 +default.boolean.true=はい
  21 +default.boolean.false=いいえ
  22 +default.date.format=yyyy/MM/dd HH:mm:ss z
  23 +default.number.format=0
  24 +
  25 +default.created.message={0}(id:{1})を作成しました。
  26 +default.updated.message={0}(id:{1})を更新しました。
  27 +default.deleted.message={0}(id:{1})を削除しました。
  28 +default.not.deleted.message={0}(id:{1})は削除できませんでした。
  29 +default.not.found.message={0}(id:{1})は見つかりませんでした。
  30 +default.optimistic.locking.failure=この{0}は編集中に他のユーザによって先に更新されています。
  31 +
  32 +default.home.label=ホーム
  33 +default.list.label={0}リスト
  34 +default.add.label={0}を追加
  35 +default.new.label={0}を新規作成
  36 +default.create.label={0}を作成
  37 +default.show.label={0}詳細
  38 +default.edit.label={0}を編集
  39 +
  40 +default.button.create.label=作成
  41 +default.button.edit.label=編集
  42 +default.button.update.label=更新
  43 +default.button.delete.label=削除
  44 +default.button.delete.confirm.message=本当に削除してよろしいですか?
  45 +
  46 +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author)
  47 +typeMismatch.java.net.URL={0}は有効なURLでなければなりません。
  48 +typeMismatch.java.net.URI={0}は有効なURIでなければなりません。
  49 +typeMismatch.java.util.Date={0}は有効な日付でなければなりません。
  50 +typeMismatch.java.lang.Double={0}は有効な数値でなければなりません。
  51 +typeMismatch.java.lang.Integer={0}は有効な数値でなければなりません。
  52 +typeMismatch.java.lang.Long={0}は有効な数値でなければなりません。
  53 +typeMismatch.java.lang.Short={0}は有効な数値でなければなりません。
  54 +typeMismatch.java.math.BigDecimal={0}は有効な数値でなければなりません。
  55 +typeMismatch.java.math.BigInteger={0}は有効な数値でなければなりません。
55 grails/grails-app/i18n/messages_nl.properties
... ... @@ -0,0 +1,55 @@
  1 +default.doesnt.match.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] komt niet overeen met het vereiste patroon [{3}]
  2 +default.invalid.url.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldige URL
  3 +default.invalid.creditCard.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig credit card nummer
  4 +default.invalid.email.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig e-mailadres
  5 +default.invalid.range.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige waardenreeks van [{3}] tot [{4}]
  6 +default.invalid.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige grootte van [{3}] tot [{4}]
  7 +default.invalid.max.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumwaarde [{3}]
  8 +default.invalid.min.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan de minimumwaarde [{3}]
  9 +default.invalid.max.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumgrootte van [{3}]
  10 +default.invalid.min.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan minimumgrootte van [{3}]