Skip to content
Browse files

Initial version with domain and service

  • Loading branch information...
0 parents commit 49ba22f262bba45c539a437304b2ac906813dfe1 Michael J Salera committed Dec 3, 2012
14 .classpath
@@ -0,0 +1,14 @@
+<classpath>
+ <classpathentry kind="src" path="src/java"/>
+ <classpathentry kind="src" path="src/groovy"/>
+ <classpathentry kind="src" path="grails-app/conf"/>
+ <classpathentry kind="src" path="grails-app/controllers"/>
+ <classpathentry kind="src" path="grails-app/domain"/>
+ <classpathentry kind="src" path="grails-app/services"/>
+ <classpathentry kind="src" path="grails-app/taglib"/>
+ <classpathentry kind="src" path="test/integration"/>
+ <classpathentry kind="src" path="test/unit"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="com.springsource.sts.grails.core.CLASSPATH_CONTAINER"/>
+ <classpathentry kind="output" path="web-app/WEB-INF/classes"/>
+</classpath>
45 .gitignore
@@ -0,0 +1,45 @@
+# Mac OS X Finder and whatnot
+.DS_Store
+
+
+# Sparkle distribution Private Key (Don't check me in!)
+dsa_priv.pem
+
+
+# XCode (and ancestors) per-user config (very noisy, and not relevant)
+*.mode1
+*.mode1v3
+*.mode2v3
+*.perspective
+*.perspectivev3
+*.pbxuser
+
+
+# Generated files
+VersionX-revision.h
+
+
+# build products
+build/
+target/
+*.[oa]
+
+
+# Other source repository archive directories (protects when importing)
+.hg
+.svn
+CVS
+
+
+# automatic backup files
+*~.nib
+*.swp
+*~
+*.groovy~
+*(Autosaved).rtfd/
+Backup[ ]of[ ]*.pages/
+Backup[ ]of[ ]*.key/
+Backup[ ]of[ ]*.numbers/
+web-app/WEB-INF/tld/c.tld
+web-app/WEB-INF/tld/fmt.tld
+stacktrace.log
19 .project
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>bates</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.springsource.sts.grails.core.nature</nature>
+ <nature>org.eclipse.jdt.groovy.core.groovyNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
3 .settings/org.codehaus.groovy.eclipse.preferences.prefs
@@ -0,0 +1,3 @@
+#Created by grails
+eclipse.preferences.version=1
+groovy.dont.generate.class.files=true
89 BatesGrailsPlugin.groovy
@@ -0,0 +1,89 @@
+class BatesGrailsPlugin {
+ // the plugin version
+ def version = "0.8"
+
+ // the version or versions of Grails the plugin is designed for
+ def grailsVersion = "2.1 > *"
+
+ // the other plugins this plugin depends on
+ def dependsOn = [mongodbMorphia: "0.8.2"]
+// executor: "0.3"]
+
+ // resources that are excluded from plugin packaging
+ def pluginExcludes = [
+ "grails-app/views/error.gsp"
+ ]
+
+ // TODO Fill in these fields
+ def title = "Business Audit Trail Events System (BATES) Plugin" // Headline display name of the plugin
+ def author = "Michael Salera"
+ def authorEmail = "mikesalera@mac.com"
+ def description = '''\
+Business Audit Trail Events System (BATES) is designed to take the load off the primary relational database (GORM dataSource) and allow fine-grained log events,
+that is, changes to the records or documents themselves, and create these logs in MongoDB. It is intended to be used across the enterprise, esp. if your
+Mongo cluster is setup supporting sharding by Department or Application area/domain.
+
+Primary reason for writing Bates was not only to use the MongoDB backend, but also to provide similar features to Shawn Hartsock's excellent audit-logging plug-in,
+which was not upgraded to work with Grails 2.0 or above. Though this may be done in a future release....
+
+Bates's job is to make audit trail simple, unobtrusive, yet powerful enough to be able to reconstruct should things go awry or front-end developers would like to
+build an Admin style front end to view and filter thru all log documents, for example.
+
+(c) 2012 Mike Salera / FRC
+'''
+
+ // URL to the plugin's documentation
+ def documentation = "http://grails.org/plugin/bates"
+
+ // Extra (optional) plugin metadata
+
+ // License: one of 'APACHE', 'GPL2', 'GPL3'
+ def license = "APACHE"
+
+ // Details of company behind the plugin (if there is one)
+ def organization = [ name: "Free Range Consultants", url: "http://www.freerangeconsultants.com/" ]
+
+ // Any additional developers beyond the author specified above.
+// def developers = [ [ name: "Johanan Lancaon", email: "javageek@gmail.com" ]]
+
+ // Location of the plugin's issue tracker.
+// def issueManagement = [ system: "JIRA", url: "http://jira.grails.org/browse/GPMYPLUGIN" ]
+
+ // Online location of the plugin's browseable source code.
+// def scm = [ url: "http://svn.codehaus.org/grails-plugins/" ]
+
+
+//METHODS
+ def doWithWebDescriptor = { xml ->
+ // TODO Implement additions to web.xml (optional), this event occurs before
+ }
+
+ def doWithSpring = {
+ businessAuditLogService(com.freerangeconsultants.plugins.bates.core.BusinessAuditLogService)
+ }
+
+ def doWithDynamicMethods = { ctx ->
+ // TODO Implement registering dynamic methods to classes (optional)
+ }
+
+ def doWithApplicationContext = { applicationContext ->
+ application.mainContext.eventTriggeringInterceptor.datastores.each { k, datastore ->
+ applicationContext.addApplicationListener(new com.freerangeconsultants.plugins.bates.listeners.BusinessAuditLogListener(datastore))
+ }
+ }
+
+ def onChange = { event ->
+ // TODO Implement code that is executed when any artefact that this plugin is
+ // watching is modified and reloaded. The event contains: event.source,
+ // event.application, event.manager, event.ctx, and event.plugin.
+ }
+
+ def onConfigChange = { event ->
+ // TODO Implement code that is executed when the project configuration changes.
+ // The event is the same as for 'onChange'.
+ }
+
+ def onShutdown = { event ->
+ // TODO Implement code that is executed when the application shuts down (optional)
+ }
+}
5 application.properties
@@ -0,0 +1,5 @@
+#Grails Metadata file
+#Sun Dec 02 18:43:39 PST 2012
+app.grails.version=2.1.1
+app.name=bates
+plugins.mongodb-morphia=0.8.2
38 grails-app/conf/BuildConfig.groovy
@@ -0,0 +1,38 @@
+grails.project.class.dir = "target/classes"
+grails.project.test.class.dir = "target/test-classes"
+grails.project.test.reports.dir = "target/test-reports"
+
+grails.project.dependency.resolution = {
+ // inherit Grails' default dependencies
+ inherits("global") {
+ // uncomment to disable ehcache
+ // excludes 'ehcache'
+ }
+
+ log "info" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
+
+ repositories {
+ grailsCentral()
+ // uncomment the below to enable remote dependency resolution
+ // from public Maven repositories
+ //mavenLocal()
+ //mavenCentral()
+ //mavenRepo "http://snapshots.repository.codehaus.org"
+ //mavenRepo "http://repository.codehaus.org"
+ //mavenRepo "http://download.java.net/maven/2/"
+ //mavenRepo "http://repository.jboss.com/maven2/"
+ }
+
+ dependencies {
+ // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.
+ build "org.codehaus.gpars:gpars:1.0-beta-3"
+ }
+
+ plugins {
+ build(":tomcat:$grailsVersion",
+ ":release:2.0.3",
+ ":rest-client-builder:1.0.2") {
+ export = false
+ }
+ }
+}
24 grails-app/conf/Config.groovy
@@ -0,0 +1,24 @@
+// configuration for plugin testing - will not be included in the plugin zip
+
+log4j = {
+ // Example of changing the log pattern for the default console
+ // appender:
+ //
+ //appenders {
+ // console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
+ //}
+
+ error 'org.codehaus.groovy.grails.web.servlet', // controllers
+ 'org.codehaus.groovy.grails.web.pages', // GSP
+ 'org.codehaus.groovy.grails.web.sitemesh', // layouts
+ 'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
+ 'org.codehaus.groovy.grails.web.mapping', // URL mapping
+ 'org.codehaus.groovy.grails.commons', // core / classloading
+ 'org.codehaus.groovy.grails.plugins', // plugins
+ 'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
+ 'org.springframework',
+ 'org.hibernate',
+ 'net.sf.ehcache.hibernate'
+
+ warn 'org.mortbay.log'
+}
49 grails-app/conf/DataSource.groovy
@@ -0,0 +1,49 @@
+dataSource {
+ pooled = true
+ driverClassName = "org.h2.Driver"
+ username = "sa"
+ password = ""
+}
+hibernate {
+ cache.use_second_level_cache = true
+ cache.use_query_cache = false
+ cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
+}
+// environment specific settings
+environments {
+ development {
+ dataSource {
+ dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
+ url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
+ }
+ }
+ test {
+ dataSource {
+ dbCreate = "update"
+ url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
+ }
+ }
+ production {
+ dataSource {
+ dbCreate = "update"
+ url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
+ pooled = true
+ properties {
+ maxActive = -1
+ minEvictableIdleTimeMillis=1800000
+ timeBetweenEvictionRunsMillis=1800000
+ numTestsPerEvictionRun=3
+ testOnBorrow=true
+ testWhileIdle=true
+ testOnReturn=true
+ validationQuery="SELECT 1"
+ }
+ }
+ }
+}
+
+mongodb {
+ host = 'localhost'
+ port = 27017
+ databaseName = 'auditDb'
+}
13 grails-app/conf/UrlMappings.groovy
@@ -0,0 +1,13 @@
+class UrlMappings {
+
+ static mappings = {
+ "/$controller/$action?/$id?"{
+ constraints {
+ // apply constraints here
+ }
+ }
+
+ "/"(view:"/index")
+ "500"(view:'/error')
+ }
+}
40 grails-app/mongo/com/freerangeconsultants/plugins/bates/domain/AuditLogEvent.groovy
@@ -0,0 +1,40 @@
+package com.freerangeconsultants.plugins.bates.domain
+
+import groovy.transform.ToString
+
+/**
+ * Audit Log Event
+ * One of these documents is stored in MongoDB shard for each record-level change detected
+ * these can be from PostInsert, PostUpdate, or PostDelete Grails system events.
+ *
+ * Developed custom for the B.A.T.E.S. business audit trail plugin for Grails 2.1.x or above
+ * @version 1.0
+ * @author Mike Salera
+ */
+
+@ToString
+class AuditLogEvent implements Serializable, Comparable {
+
+ String eventName
+ String className
+ String persistedObjectId
+ Map<String, String> oldState
+ Map<String, String> newState
+ Date dateCreated = new Date()
+
+
+ //METHODS
+ def getDiffMap() {
+ def ignoreList = ['version', 'lastUpdated']
+ StringBuilder sb = new StringBuilder();
+ if (newState && oldState) {
+ newState.each { key, value ->
+ if (value && value != oldState[key] && !(key in ignoreList))
+ sb.append("${key} = ${value}, was, ${key} = ${oldState[key]} ")
+ }
+ }
+ sb.toString()
+ }
+
+ int compareTo(java.lang.Object anObject) { return id.compareTo(anObject.id) }
+}
52 ...s-app/services/com/freerangeconsultants/plugins/bates/core/BusinessAuditLogService.groovy
@@ -0,0 +1,52 @@
+package com.freerangeconsultants.plugins.bates.core
+
+import com.freerangeconsultants.plugins.bates.domain.AuditLogEvent
+
+
+/**
+ * Log audit events from any persistence object to MongoDB sharded cluster
+ *
+ * @version 1.0
+ * @author Mike Salera
+ */
+class BusinessAuditLogService {
+
+ static transactional = false
+
+
+ //METHODS
+
+ /**
+ * Use this method to return a list of the History of the given object id
+ *
+ * @param clazz Class object for example of the Invoice.class
+ * @param persistedObjectId id of the object caller is looking for
+ * @return
+ */
+ def findAllLogEventsByClassAndId(Class clazz, persistedObjectId) {
+ return []
+ }
+
+ /**
+ * This method used transparently from the audit( ) method injected into Domain classes
+ * where their static auditable = true
+ *
+ * This method sends an instance of AuditLogEvent to MongoDB
+ *
+ * @param eventType
+ * @param className this.class.simpleName
+ * @param persistedObjectId id of the Entity being saved
+ * @param oldeState former state of the object (EventType.PreUpdate events only)
+ * @param newState new or current state of the object
+ * @return true on success
+ */
+ def recordLogEvent(String eventType, String className, persistedObjectId, oldeState, newState) {
+ //magic of the dataStore
+ def auditEvent = new AuditLogEvent(eventName: eventType.toString(), className: className, persistedObjectId: persistedObjectId as String)
+ if (oldeState) { auditEvent.oldState = oldeState }
+ if (newState) { auditEvent.newState = newState }
+ auditEvent.save(flush: true)
+ print('.')
+ true
+ }
+}
11 grails-app/views/error.gsp
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Grails Runtime Exception</title>
+ <meta name="layout" content="main">
+ <link rel="stylesheet" href="${resource(dir: 'css', file: 'errors.css')}" type="text/css">
+ </head>
+ <body>
+ <g:renderException exception="${exception}" />
+ </body>
+</html>
BIN grails-bates-0.8.zip
Binary file not shown.
38 plugin.xml
@@ -0,0 +1,38 @@
+<plugin name='bates' version='0.8' grailsVersion='2.1 &gt; *'>
+ <author>Michael Salera</author>
+ <authorEmail>mikesalera@mac.com</authorEmail>
+ <title>Business Audit Trail Events System (BATES) Plugin</title>
+ <description>Business Audit Trail Events System (BATES) is designed to take the load off the primary relational database (GORM dataSource) and allow fine-grained log events,
+that is, changes to the records or documents themselves, and create these logs in MongoDB. It is intended to be used across the enterprise, esp. if your
+Mongo cluster is setup supporting sharding by Department or Application area/domain.
+
+Primary reason for writing Bates was not only to use the MongoDB backend, but also to provide similar features to Shawn Hartsock's excellent audit-logging plug-in,
+which was not upgraded to work with Grails 2.0 or above. Though this may be done in a future release....
+
+Bates's job is to make audit trail simple, unobtrusive, yet powerful enough to be able to reconstruct should things go awry or front-end developers would like to
+build an Admin style front end to view and filter thru all log documents, for example.
+
+(c) 2012 Mike Salera / FRC
+</description>
+ <documentation>http://grails.org/plugin/bates</documentation>
+ <type>BatesGrailsPlugin</type>
+ <resources>
+ <resource>com.freerangeconsultants.plugins.bates.domain.AuditLogEvent</resource>
+ <resource>com.freerangeconsultants.plugins.bates.core.BusinessAuditLogService</resource>
+ </resources>
+ <repositories>
+ <repository name='grailsCentral' url='http://grails.org/plugins' />
+ <repository name='http://repo.grails.org/grails/core' url='http://repo.grails.org/grails/core/' />
+ <repository name='mavenCentral' url='http://repo1.maven.org/maven2/' />
+ </repositories>
+ <dependencies>
+ <build>
+ <dependency group='org.codehaus.gpars' name='gpars' version='1.0-beta-3' />
+ </build>
+ </dependencies>
+ <plugins />
+ <runtimePluginRequirements>
+ <plugin name='mongodbMorphia' version='0.8.2' />
+ </runtimePluginRequirements>
+ <behavior />
+</plugin>
10 scripts/_Install.groovy
@@ -0,0 +1,10 @@
+//
+// This script is executed by Grails after plugin was installed to project.
+// This script is a Gant script so you can use all special variables provided
+// by Gant (such as 'baseDir' which points on project base dir). You can
+// use 'ant' to access a global instance of AntBuilder
+//
+// For example you can create directory under project tree:
+//
+// ant.mkdir(dir:"${basedir}/grails-app/jobs")
+//
5 scripts/_Uninstall.groovy
@@ -0,0 +1,5 @@
+//
+// This script is executed by Grails when the plugin is uninstalled from project.
+// Use this script if you intend to do any additional clean-up on uninstall, but
+// beware of messing up SVN directories!
+//
10 scripts/_Upgrade.groovy
@@ -0,0 +1,10 @@
+//
+// This script is executed by Grails during application upgrade ('grails upgrade'
+// command). This script is a Gant script so you can use all special variables
+// provided by Gant (such as 'baseDir' which points on project base dir). You can
+// use 'ant' to access a global instance of AntBuilder
+//
+// For example you can create directory under project tree:
+//
+// ant.mkdir(dir:"${basedir}/grails-app/jobs")
+//
133 src/groovy/com/freerangeconsultants/plugins/bates/listeners/BusinessAuditLogListener.groovy
@@ -0,0 +1,133 @@
+package com.freerangeconsultants.plugins.bates.listeners
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory
+import org.codehaus.groovy.grails.commons.GrailsApplication
+import org.grails.datastore.mapping.core.Datastore
+import org.grails.datastore.mapping.engine.EntityAccess;
+import org.grails.datastore.mapping.engine.event.*;
+import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent
+import org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener
+import org.grails.datastore.mapping.model.PersistentEntity;
+import org.springframework.context.ApplicationEvent
+
+import com.freerangeconsultants.plugins.bates.core.BusinessAuditLogService
+
+
+/**
+ * As of Grails 2.0 there is a new API for plugins and applications to register and listen for persistence events.
+ * This API is not tied to Hibernate and also works for other persistence plugins such as
+ * the MongoDB plugin for GORM.
+ *
+ * To use this API you need to subclass and implement a single method called onPersistenceEvent.
+ *
+ * @author Mike Salera
+ * @version 1.0
+ */
+class BusinessAuditLogListener extends AbstractPersistenceEventListener {
+
+// BusinessAuditLogService businessAuditLogService
+ Log LOG = LogFactory.getLog(BusinessAuditLogListener.class)
+
+
+ public BusinessAuditLogListener(final Datastore dataStore) {
+ super(dataStore)
+ println this.class.name
+ println "Running on: " + dataStore.class.name
+
+ }
+
+ @Override
+ public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
+ return true
+ }
+
+@Override
+protected void onPersistenceEvent(final AbstractPersistenceEvent event) {
+// handleEvent(event)
+ switch(event.eventType) {
+ case EventType.PostInsert:
+ println ''
+ println this.class.name + " Got a Persistence event!"
+ println "POST INSERT ${event.entityObject}"
+ break
+
+ case EventType.PreUpdate:
+ println ''
+ println this.class.name + " Got a Persistence event!"
+ println "POST UPDATE ${event.entityObject}"
+ break;
+
+ case EventType.PreDelete:
+ println ''
+ println this.class.name + " Got a Persistence event!"
+ println "POST DELETE ${event.entityObject}"
+
+ }
+}
+
+ def handleEvent(final AbstractPersistenceEvent event) {
+ def businessAuditLogService = getBeanFromApplicationContext("businessAuditLogService")
+
+ def String className = null
+ def Object persistedObjectId = null
+ def oldState = null // for UPDATES
+ def newState = null
+
+ //skip if test mode
+ if (!GrailsUtil.getEnvironment().equals(GrailsApplication.ENV_TEST) && isAuditableEntity(event?.entityObject)) {
+ className = event?.entityObject?.class.name
+ persistedObjectId = event?.entityObject?.id?.toString()
+
+// switch event.eventType
+ if (eventName == 'onPostInsert') {
+ newState = getStateMap(event?.persister?.propertyNames, event?.getState())
+ businessAuditLogService.recordLogEvent('insert', className, persistedObjectId, null, newState)
+ }
+ else if (eventName == 'onPreUpdate') {
+ oldState = getStateMap(event?.persister?.propertyNames, event?.getOldState())
+ newState = getStateMap(event?.persister?.propertyNames, event?.getState())
+ businessAuditLogService.recordLogEvent('update', className, persistedObjectId, oldState, newState)
+ }
+ else if (eventName == 'onPreDelete') {
+ oldState = getStateMap(event?.persister?.propertyNames, event?.getDeletedState())
+ businessAuditLogService.recordLogEvent('delete', className, persistedObjectId, oldState, null)
+ }
+ else {
+ throw new IllegalArgumentException("Cannot support event: ${eventName}")
+ }
+ }
+ }
+
+
+ Boolean isAuditableEntity(entity) {
+ entity?.metaClass.hasProperty(entity, 'auditable') && entity.auditable == Boolean.TRUE
+ }
+
+
+ private def getStateMap(String[] names, Object[] state) {
+ def map = [:]
+ for (int i = 0; i < names.length; i++) {
+ if (names[i]) {
+ map[names[i]] = state[i]
+ }
+ }
+ sanitizeMap(map)
+ }
+
+
+ // propertyNames may have null values on the above call to put
+ //create Map with no missing teeth
+ private def sanitizeMap(aMap) {
+ def entriesToBeRemoved = []
+ aMap?.each { key, value ->
+ if (key && value) {
+ aMap[key] = value?.toString()
+ }
+ else { entriesToBeRemoved << key }
+ }
+ entriesToBeRemoved.each { key -> aMap.remove(key) }
+ return aMap
+ }
+
+}
21 src/groovy/com/freerangeconsultants/plugins/bates/listeners/ContextUtils.groovy
@@ -0,0 +1,21 @@
+
+import org.codehaus.groovy.grails.commons.ApplicationHolder
+import org.springframework.context.ApplicationContext
+import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
+import org.springframework.web.context.request.RequestContextHolder
+import org.codehaus.groovy.grails.commons.GrailsApplication
+import javax.servlet.http.HttpServletRequest
+
+class ContextUtils {
+
+ def static getBeanFromApplicationContext(String beanName){
+ ApplicationContext ctx = (ApplicationContext)ApplicationHolder.getApplication().getMainContext()
+ def bean
+ try{
+ bean = ctx.getBean(beanName)
+ } catch (org.springframework.beans.factory.NoSuchBeanDefinitionException ex){
+ //do nothing. this just means the requested bean doesn't exist and the method will return null
+ }
+ return bean
+ }
+}
26 test/integration/com/freerangeconsultants/plugins/bates/domain/AuditLogEventTests.groovy
@@ -0,0 +1,26 @@
+package com.freerangeconsultants.plugins.bates.domain
+
+import static org.junit.Assert.*
+
+import grails.test.mixin.*
+import grails.test.mixin.support.*
+import org.junit.*
+
+/**
+ * See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions
+ */
+@TestMixin(GrailsUnitTestMixin)
+class AuditLogEventTests {
+
+ void setUp() {
+ // Setup logic here
+ }
+
+ void tearDown() {
+ // Tear down logic here
+ }
+
+ void testSomething() {
+ fail "Implement me"
+ }
+}
17 test/unit/com/freerangeconsultants/plugins/bates/core/BusinessAuditLogServiceTests.groovy
@@ -0,0 +1,17 @@
+package com.freerangeconsultants.plugins.bates.core
+
+
+
+import grails.test.mixin.*
+import org.junit.*
+
+/**
+ * See the API for {@link grails.test.mixin.services.ServiceUnitTestMixin} for usage instructions
+ */
+@TestFor(BusinessAuditLogService)
+class BusinessAuditLogServiceTests {
+
+ void testSomething() {
+ fail "Implement me"
+ }
+}
33 web-app/WEB-INF/applicationContext.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+ <bean id="grailsApplication" class="org.codehaus.groovy.grails.commons.GrailsApplicationFactoryBean">
+ <description>Grails application factory bean</description>
+ <property name="grailsDescriptor" value="/WEB-INF/grails.xml" />
+ <property name="grailsResourceLoader" ref="grailsResourceLoader" />
+ </bean>
+
+ <bean id="pluginManager" class="org.codehaus.groovy.grails.plugins.GrailsPluginManagerFactoryBean">
+ <description>A bean that manages Grails plugins</description>
+ <property name="grailsDescriptor" value="/WEB-INF/grails.xml" />
+ <property name="application" ref="grailsApplication" />
+ </bean>
+
+ <bean id="grailsConfigurator" class="org.codehaus.groovy.grails.commons.spring.GrailsRuntimeConfigurator">
+ <constructor-arg>
+ <ref bean="grailsApplication" />
+ </constructor-arg>
+ <property name="pluginManager" ref="pluginManager" />
+ </bean>
+
+ <bean id="grailsResourceLoader" class="org.codehaus.groovy.grails.commons.GrailsResourceLoaderFactoryBean" />
+
+ <bean id="characterEncodingFilter" class="org.springframework.web.filter.CharacterEncodingFilter">
+ <property name="encoding">
+ <value>utf-8</value>
+ </property>
+ </bean>
+</beans>
14 web-app/WEB-INF/sitemesh.xml
@@ -0,0 +1,14 @@
+<sitemesh>
+ <page-parsers>
+ <parser content-type="text/html"
+ class="org.codehaus.groovy.grails.web.sitemesh.GrailsHTMLPageParser" />
+ <parser content-type="text/html;charset=ISO-8859-1"
+ class="org.codehaus.groovy.grails.web.sitemesh.GrailsHTMLPageParser" />
+ <parser content-type="text/html;charset=UTF-8"
+ class="org.codehaus.groovy.grails.web.sitemesh.GrailsHTMLPageParser" />
+ </page-parsers>
+
+ <decorator-mappers>
+ <mapper class="org.codehaus.groovy.grails.web.sitemesh.GrailsLayoutDecoratorMapper" />
+ </decorator-mappers>
+</sitemesh>
550 web-app/WEB-INF/tld/grails.tld
@@ -0,0 +1,550 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
+ http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
+ version="2.0">
+ <description>The Grails custom tag library</description>
+ <tlib-version>0.2</tlib-version>
+ <short-name>grails</short-name>
+ <uri>http://grails.codehaus.org/tags</uri>
+
+ <tag>
+ <name>link</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspLinkTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <name>action</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>controller</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>id</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>url</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>params</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>form</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspFormTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <name>action</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>controller</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>id</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>url</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>method</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>select</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspSelectTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>value</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>optionKey</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>optionValue</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>datePicker</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspDatePickerTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>value</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>precision</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>false</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>currencySelect</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspCurrencySelectTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>value</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>localeSelect</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspLocaleSelectTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>value</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>timeZoneSelect</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspTimeZoneSelectTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>value</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>checkBox</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspCheckboxTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>value</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>hasErrors</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspHasErrorsTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <name>model</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>bean</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>field</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>false</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>eachError</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspEachErrorTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <name>model</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>bean</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>field</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>false</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>renderErrors</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspEachErrorTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <name>model</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>bean</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>field</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>as</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>false</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>message</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspMessageTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <name>code</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>error</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>default</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>false</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>remoteFunction</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspRemoteFunctionTag</tag-class>
+ <body-content>empty</body-content>
+ <attribute>
+ <name>before</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>after</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>action</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>controller</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>id</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>url</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>params</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>asynchronous</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>method</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>update</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onSuccess</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onFailure</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onComplete</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onLoading</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onLoaded</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onInteractive</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>remoteLink</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspRemoteLinkTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <name>before</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>after</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>action</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>controller</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>id</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>url</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>params</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>asynchronous</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>method</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>update</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onSuccess</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onFailure</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onComplete</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onLoading</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onLoaded</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onInteractive</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>formRemote</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspFormRemoteTag</tag-class>
+ <body-content>JSP</body-content>
+ <attribute>
+ <name>before</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>after</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>action</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>controller</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>id</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>url</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>params</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>asynchronous</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>method</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>update</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onSuccess</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onFailure</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onComplete</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onLoading</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onLoaded</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <attribute>
+ <name>onInteractive</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+ <tag>
+ <name>invokeTag</name>
+ <tag-class>org.codehaus.groovy.grails.web.taglib.jsp.JspInvokeGrailsTagLibTag</tag-class>
+ <body-content>JSP</body-content>
+ <variable>
+ <name-given>it</name-given>
+ <variable-class>java.lang.Object</variable-class>
+ <declare>true</declare>
+ <scope>NESTED</scope>
+ </variable>
+ <attribute>
+ <name>tagName</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+ <dynamic-attributes>true</dynamic-attributes>
+ </tag>
+</taglib>
+
311 web-app/WEB-INF/tld/spring.tld
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+
+<taglib>
+
+ <tlib-version>1.1.1</tlib-version>
+
+ <jsp-version>1.2</jsp-version>
+
+ <short-name>Spring</short-name>
+
+ <uri>http://www.springframework.org/tags</uri>
+
+ <description>Spring Framework JSP Tag Library. Authors: Rod Johnson, Juergen Hoeller</description>
+
+
+ <tag>
+
+ <name>htmlEscape</name>
+ <tag-class>org.springframework.web.servlet.tags.HtmlEscapeTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <description>
+ Sets default HTML escape value for the current page.
+ Overrides a "defaultHtmlEscape" context-param in web.xml, if any.
+ </description>
+
+ <attribute>
+ <name>defaultHtmlEscape</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+
+ <name>escapeBody</name>
+ <tag-class>org.springframework.web.servlet.tags.EscapeBodyTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <description>
+ Escapes its enclosed body content, applying HTML escaping and/or JavaScript escaping.
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+ </description>
+
+ <attribute>
+ <name>htmlEscape</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>javaScriptEscape</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+
+ <name>message</name>
+ <tag-class>org.springframework.web.servlet.tags.MessageTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <description>
+ Retrieves the message with the given code, or text if code isn't resolvable.
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+ </description>
+
+ <attribute>
+ <name>code</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>arguments</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>text</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>var</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>scope</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>htmlEscape</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>javaScriptEscape</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+
+ <name>theme</name>
+ <tag-class>org.springframework.web.servlet.tags.ThemeTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <description>
+ Retrieves the theme message with the given code, or text if code isn't resolvable.
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+ </description>
+
+ <attribute>
+ <name>code</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>arguments</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>text</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>var</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>scope</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>htmlEscape</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>javaScriptEscape</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+
+ <name>hasBindErrors</name>
+ <tag-class>org.springframework.web.servlet.tags.BindErrorsTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <description>
+ Provides Errors instance in case of bind errors.
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+ </description>
+
+ <variable>
+ <name-given>errors</name-given>
+ <variable-class>org.springframework.validation.Errors</variable-class>
+ </variable>
+
+ <attribute>
+ <name>name</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>htmlEscape</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+
+ <name>nestedPath</name>
+ <tag-class>org.springframework.web.servlet.tags.NestedPathTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <description>
+ Sets a nested path to be used by the bind tag's path.
+ </description>
+
+ <variable>
+ <name-given>nestedPath</name-given>
+ <variable-class>java.lang.String</variable-class>
+ </variable>
+
+ <attribute>
+ <name>path</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+
+ <name>bind</name>
+ <tag-class>org.springframework.web.servlet.tags.BindTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <description>
+ Provides BindStatus object for the given bind path.
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+ </description>
+
+ <variable>
+ <name-given>status</name-given>
+ <variable-class>org.springframework.web.servlet.support.BindStatus</variable-class>
+ </variable>
+
+ <attribute>
+ <name>path</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>ignoreNestedPath</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>htmlEscape</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ </tag>
+
+
+ <tag>
+
+ <name>transform</name>
+ <tag-class>org.springframework.web.servlet.tags.TransformTag</tag-class>
+ <body-content>JSP</body-content>
+
+ <description>
+ Provides transformation of variables to Strings, using an appropriate
+ custom PropertyEditor from BindTag (can only be used inside BindTag).
+ The HTML escaping flag participates in a page-wide or application-wide setting
+ (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
+ </description>
+
+ <attribute>
+ <name>value</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>var</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>scope</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ <attribute>
+ <name>htmlEscape</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
+ </tag>
+
+</taglib>

0 comments on commit 49ba22f

Please sign in to comment.
Something went wrong with that request. Please try again.