Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100755 436 lines (386 sloc) 16.746 kb
dbcf59e @chanwit live-model is working
chanwit authored
1 import org.codehaus.groovy.grails.commons.GrailsClassUtils as GCU
7b2f4b2 @chanwit refactor and fix regression
chanwit authored
2
3 import grails.util.Environment
4 import grails.util.GrailsUtil
5
6 import org.zkoss.zk.ui.event.EventListener
7
8 import org.zkoss.zk.grails.ComposerResolver
9 import org.zkoss.zk.grails.DesktopCounter
10 import org.zkoss.zk.grails.ZkBuilder
11 import org.zkoss.zk.grails.livemodels.LiveModelBuilder
12 import org.zkoss.zk.grails.ListboxModelDynamicMethods
13 import org.zkoss.zk.grails.artefacts.CometArtefactHandler
14 import org.zkoss.zk.grails.artefacts.ComposerArtefactHandler
15 import org.zkoss.zk.grails.artefacts.FacadeArtefactHandler
16 import org.zkoss.zk.grails.artefacts.LiveModelArtefactHandler
17
18 import org.zkoss.zk.grails.livemodels.SortingPagingListModel
19 import org.zkoss.zk.grails.ZkConfigHelper
caa90be @chanwit support auto-reloading composers
chanwit authored
20
5ac6cb1 @chanwit init 0.6.1
chanwit authored
21 class ZkGrailsPlugin {
22 // the plugin version
7b2f4b2 @chanwit refactor and fix regression
chanwit authored
23 def version = "1.1.BUILD-SNAPSHOT"
5ac6cb1 @chanwit init 0.6.1
chanwit authored
24 // the version or versions of Grails the plugin is designed for
37e4634 @chanwit bumped version to 1.0.1.
chanwit authored
25 def grailsVersion = "1.2 > *"
5ac6cb1 @chanwit init 0.6.1
chanwit authored
26 // the other plugins this plugin depends on
27 def dependsOn = [:]
7b2f4b2 @chanwit refactor and fix regression
chanwit authored
28 def loadAfter = ['core', 'controllers']
18affcc @chanwit partially added facade support
chanwit authored
29
30 def artefacts = [
7b2f4b2 @chanwit refactor and fix regression
chanwit authored
31 CometArtefactHandler,
32 ComposerArtefactHandler,
33 FacadeArtefactHandler,
34 LiveModelArtefactHandler,
18affcc @chanwit partially added facade support
chanwit authored
35 ]
36
caa90be @chanwit support auto-reloading composers
chanwit authored
37 def watchedResources = ["file:./grails-app/composers/**/*Composer.groovy",
3e3beeb @chanwit fixed spaces
chanwit authored
38 "file:./plugins/*/grails-app/composers/**/*Composer.groovy",
527ba7b @chanwit initially added comet support
chanwit authored
39 "file:./grails-app/comets/**/*Comet.groovy",
40 "file:./plugins/*/grails-app/comets/**/*Comet.groovy",
3758718 @chanwit clean spacing
chanwit authored
41 "file:./grails-app/facade/**/*Facade.groovy",
cfcc766 @chanwit add live-model artefact
chanwit authored
42 "file:./plugins/*/grails-app/facade/**/*Facade.groovy",
dbcf59e @chanwit live-model is working
chanwit authored
43 "file:./grails-app/livemodels/**/*LiveModel.groovy",
44 "file:./plugins/*/grails-app/livemodels/**/*LiveModel.groovy"]
cfcc766 @chanwit add live-model artefact
chanwit authored
45
18affcc @chanwit partially added facade support
chanwit authored
46
5ac6cb1 @chanwit init 0.6.1
chanwit authored
47 // resources that are excluded from plugin packaging
48 def pluginExcludes = [
35ef0bb @chanwit refactored artefact classes
chanwit authored
49 "grails-app/conf/Config.groovy",
3a9e96a @chanwit updated test facility
chanwit authored
50 "grails-app/conf/BuildConfig.groovy",
35ef0bb @chanwit refactored artefact classes
chanwit authored
51 "grails-app/conf/SeleniumConfig.groovy",
1139c08 @chanwit improved exclude
chanwit authored
52 "grails-app/domain/zk/**",
527ba7b @chanwit initially added comet support
chanwit authored
53 "grails-app/comets/**",
cace9a6 @chanwit fixed pluginExcluded
chanwit authored
54 "grails-app/controllers/zk/**",
61d1b69 @chanwit added testing facility
chanwit authored
55 "grails-app/composers/**",
527ba7b @chanwit initially added comet support
chanwit authored
56 "grails-app/facade/**",
dbcf59e @chanwit live-model is working
chanwit authored
57 "grails-app/livemodels/**",
1139c08 @chanwit improved exclude
chanwit authored
58 "grails-app/views/**",
803e3ae @chanwit added a test case for GSP taglib pre-processor
chanwit authored
59 "grails-app/taglib/MyTagLib.groovy",
cace9a6 @chanwit fixed pluginExcluded
chanwit authored
60 "grails-app/i18n/*.properties",
5037eaa @chanwit updated pluginExcludes
chanwit authored
61 "web-app/css/**",
077afa2 @chanwit excluded unused files.
chanwit authored
62 "web-app/issue*",
5037eaa @chanwit updated pluginExcludes
chanwit authored
63 "web-app/js/**",
64 "web-app/META-INF/**",
65 "web-app/test/**",
66 "web-app/WEB-INF/**",
67 "web-app/images/skin/**",
68 "web-app/images/*.ico",
69 "web-app/images/grails_*",
70 "web-app/images/leftnav_*",
71 "web-app/images/sp*",
72 "web-app/*.zul",
61d1b69 @chanwit added testing facility
chanwit authored
73 "test/**"
5ac6cb1 @chanwit init 0.6.1
chanwit authored
74 ]
75
76 // TODO Fill in these fields
77 def author = "chanwit"
78 def authorEmail = "chanwit@gmail.com"
6221a56 @chanwit merged from 0.7.7
chanwit authored
79 def title = "ZKGrails: ZK plugin for Grails"
5ac6cb1 @chanwit init 0.6.1
chanwit authored
80 def description = '''\\
6221a56 @chanwit merged from 0.7.7
chanwit authored
81 Originated from Flyisland ZK Grails Plugin,
82 this plugin adds ZK Ajax framework (www.zkoss.org) support to Grails applications.
5ac6cb1 @chanwit init 0.6.1
chanwit authored
83 '''
84
85 // URL to the plugin's documentation
b4e0972 @chanwit changed document url
chanwit authored
86 def documentation = "http://grails.org/plugin/zk"
5ac6cb1 @chanwit init 0.6.1
chanwit authored
87
88 def doWithSpring = {
b2a5cc4 @chanwit make index.zul welcome page, but still broken
chanwit authored
89
90 boolean developmentMode = !application.warDeployed
91 Environment env = Environment.current
7b2f4b2 @chanwit refactor and fix regression
chanwit authored
92 // boolean enableReload = env.isReloadEnabled() || application.config.grails.gsp.enable.reload || (developmentMode && env == Environment.DEVELOPMENT)
93 // boolean warDeployedWithReload = application.warDeployed && enableReload
b2a5cc4 @chanwit make index.zul welcome page, but still broken
chanwit authored
94
9e862ca @chanwit attemp to fix issue 139
chanwit authored
95 // Registering desktopCounter
96 desktopCounter(DesktopCounter.class) { bean ->
97 bean.scope = "singleton"
98 bean.autowire = "byName"
99 }
100
da761f6 @chanwit issue 125 - first cut to support Comet
chanwit authored
101 //
102 // Registering Composer Beans
103 //
3e3beeb @chanwit fixed spaces
chanwit authored
104 application.composerClasses.each { composerClass ->
6221a56 @chanwit merged from 0.7.7
chanwit authored
105 def composerBeanName = composerClass.propertyName
106 if(composerClass.packageName) {
107 composerBeanName = composerClass.packageName + "." + composerBeanName
108 }
109 "${composerBeanName}"(composerClass.clazz) { bean ->
caa90be @chanwit support auto-reloading composers
chanwit authored
110 bean.scope = "prototype"
111 bean.autowire = "byName"
112 }
da761f6 @chanwit issue 125 - first cut to support Comet
chanwit authored
113
3e3beeb @chanwit fixed spaces
chanwit authored
114 }
3758718 @chanwit clean spacing
chanwit authored
115
da761f6 @chanwit issue 125 - first cut to support Comet
chanwit authored
116 //
117 // Registering Facade Beans
118 //
3e3beeb @chanwit fixed spaces
chanwit authored
119 application.facadeClasses.each { facadeClass ->
18affcc @chanwit partially added facade support
chanwit authored
120 "${facadeClass.propertyName}"(facadeClass.clazz) { bean ->
121 bean.scope = "session"
122 bean.autowire = "byName"
123 }
3e3beeb @chanwit fixed spaces
chanwit authored
124 }
9c05916 @chanwit added basic scaffolding support
chanwit authored
125
da761f6 @chanwit issue 125 - first cut to support Comet
chanwit authored
126 //
127 // Registering Comet classes
128 //
129 application.cometClasses.each { cometClass ->
130 "${cometClass.propertyName}"(cometClass.clazz) { bean ->
131 bean.scope = "prototype"
cbd2db7 @chanwit support auto-reload for comet
chanwit authored
132 bean.autowire = "byName"
da761f6 @chanwit issue 125 - first cut to support Comet
chanwit authored
133 }
134 }
135
cfcc766 @chanwit add live-model artefact
chanwit authored
136 //
137 // Registering UI-Model classes
138 //
139 application.liveModelClasses.each { modelClass ->
dbcf59e @chanwit live-model is working
chanwit authored
140 def cfg = GCU.getStaticPropertyValue(modelClass.clazz, "config")
141 if(cfg) {
142 def lmb = new LiveModelBuilder()
143 cfg.delegate = lmb
144 cfg.resolveStrategy = Closure.DELEGATE_ONLY
145 cfg.call()
146 if (lmb.map['model'] == 'page') {
147 "${modelClass.propertyName}"(SortingPagingListModel.class) { bean ->
148 bean.scope = "prototype"
149 bean.autowire = "byName"
150 bean.initMethod = "init"
151 map = lmb.map.clone()
152 }
153 }
cfcc766 @chanwit add live-model artefact
chanwit authored
154 }
155 }
156
30fa904 @chanwit Issue #92: implemented a custom composer resolver
chanwit authored
157 // composer resolver which directly resolves Spring Beans
7b2f4b2 @chanwit refactor and fix regression
chanwit authored
158 ComposerResolver.init()
5ac6cb1 @chanwit init 0.6.1
chanwit authored
159 }
160
161 def doWithApplicationContext = { applicationContext ->
162 }
163
164 def doWithWebDescriptor = { xml ->
2adffe7 @phaneesh implemented issue #115 - configurable support extensions
phaneesh authored
165 //
166 // e.g. ["zul"]
167 //
168 def supportExts = ZkConfigHelper.supportExtensions
169
170 //
171 // e.g. ["*.zul", "/zkau/*"]
172 //
173 def filterUrls = supportExts.collect{ "*." + it } + ["/zkau/*"]
35ef0bb @chanwit refactored artefact classes
chanwit authored
174
2adffe7 @phaneesh implemented issue #115 - configurable support extensions
phaneesh authored
175 //
176 // e.g. ["*.zul", "*.dsp", "*.zhtml", "*.svg", "*.xml2html"]
177 //
7b2f4b2 @chanwit refactor and fix regression
chanwit authored
178 def urls = supportExts.collect{ "*." + it } + ["*.dsp", "*.zhtml", "*.svg", "*.xml2html"]
3e3beeb @chanwit fixed spaces
chanwit authored
179
47c9500 @chanwit fixed issue #163 - improve page filter for both Grails series.
chanwit authored
180
5ac6cb1 @chanwit init 0.6.1
chanwit authored
181 // quick hack for page filtering
7b2f4b2 @chanwit refactor and fix regression
chanwit authored
182 def pageFilter = xml.filter.find { it.'filter-name'.text() == 'sitemesh' }
183
47c9500 @chanwit fixed issue #163 - improve page filter for both Grails series.
chanwit authored
184 def grailsVersion = GrailsUtil.grailsVersion
7b2f4b2 @chanwit refactor and fix regression
chanwit authored
185
186 // Grails 1.3.x & Grails 2.0.x
187 def pageFilterClass = "org.zkoss.zk.grails.ZKGrailsPageFilter"
188 if (grailsVersion.startsWith("1.2") || grailsVersion.startsWith("1.1")) {
189 pageFilterClass = "org.zkoss.zk.grails.ZKGrailsPageFilter12x"
190 }
191 if(grailsVersion.startsWith("2.0")) {
192 pageFilter.'filter-class'.replaceNode {
193 'filter-class'(pageFilterClass)
194 }
195 } else {
196 pageFilter.'filter-class'.replaceBody(pageFilterClass)
47c9500 @chanwit fixed issue #163 - improve page filter for both Grails series.
chanwit authored
197 }
5ac6cb1 @chanwit init 0.6.1
chanwit authored
198
199 def listenerElements = xml.'listener'[0]
200 listenerElements + {
201 'listener' {
202 'display-name' ("ZK Session Cleaner")
203 'listener-class' ("org.zkoss.zk.ui.http.HttpSessionListener")
204 }
205 }
3758718 @chanwit clean spacing
chanwit authored
206
5ac6cb1 @chanwit init 0.6.1
chanwit authored
207 def servletElements = xml.'servlet'[0]
208 def mappingElements = xml.'servlet-mapping'[0]
209
210 servletElements + {
211 'servlet' {
212 'servlet-name' ("zkLoader")
213 'servlet-class' ("org.zkoss.zk.ui.http.DHtmlLayoutServlet")
214 'init-param' {
215 'param-name' ("update-uri")
216 'param-value' ("/zkau")
217 }
218 'load-on-startup' (0)
219 }
220 }
221
222 urls.each {p ->
223 mappingElements + {
224 'servlet-mapping' {
225 'servlet-name'("zkLoader")
226 'url-pattern'("${p}")
227 }
228 }
229 }
230
231 servletElements + {
232 'servlet' {
233 'servlet-name' ("auEngine")
234 'servlet-class' ("org.zkoss.zk.au.http.DHtmlUpdateServlet")
235 }
236 }
237 mappingElements + {
238 'servlet-mapping' {
239 'servlet-name'("auEngine")
240 'url-pattern'("/zkau/*")
241 }
242 }
243 }
244
18affcc @chanwit partially added facade support
chanwit authored
245 def doWithDynamicMethods = { ctx ->
a61a68f @chanwit resolved #39: added simpler way of add/remove events
chanwit authored
246
35ef0bb @chanwit refactored artefact classes
chanwit authored
247 // Simpler way to add and remove event
a61a68f @chanwit resolved #39: added simpler way of add/remove events
chanwit authored
248 org.zkoss.zk.ui.AbstractComponent.metaClass.propertyMissing = { String name, handler ->
249 if(name.startsWith("on") && handler instanceof Closure) {
250 delegate.addEventListener(name, handler as EventListener)
251 } else {
252 throw new MissingPropertyException(name, delegate.class)
253 }
35ef0bb @chanwit refactored artefact classes
chanwit authored
254 }
255
a61a68f @chanwit resolved #39: added simpler way of add/remove events
chanwit authored
256 // Simpler way to add and remove event
6ce8631 @chanwit working propertyMissing to deal wtih onSelect
chanwit authored
257 org.zkoss.zk.ui.AbstractComponent.metaClass.methodMissing = {String name, args ->
fc27b98 Create methods onZzz, addOnZzz and removeOnZzz using ExpandoMetaClass…
unknown authored
258 // converts OnXxxx to onXxxx
259 name.metaClass.toEventName {return substring(indexOf("On"), length()).replace("On", "on")}
260
261 if(name.startsWith("on") && args[0] instanceof Closure) {
262 // register the new method to avoid methodMissing overhead
263 org.zkoss.zk.ui.AbstractComponent.metaClass."${name}" { Closure listener ->
264 delegate.addEventListener(name, listener as EventListener)
265 }
266 delegate.addEventListener(name, args[0] as EventListener)
267 return
268 } else if (name.startsWith("addOn") && (args[0] instanceof Closure || args[0] instanceof EventListener)) {
269 def eventName = name.toEventName()
270 def listener = args[0] instanceof Closure ? args[0] as EventListener : args[0]
271 org.zkoss.zk.ui.AbstractComponent.metaClass."${name}" { Closure handler ->
272 delegate.addEventListener(eventName, handler as EventListener)
273 handler as EventListener
274 }
275 // an overload version o add an EventListener directly
276 org.zkoss.zk.ui.AbstractComponent.metaClass."${name}" << { EventListener evtListener ->
277 delegate.addEventListener(eventName, evtListener)
278 evtListener
279 }
280 delegate.addEventListener(eventName, listener)
281 return listener
282 } else if (name.startsWith("removeOn") && args[0] instanceof EventListener) {
283 def eventName = name.toEventName()
284 org.zkoss.zk.ui.AbstractComponent.metaClass."${name}" { EventListener listener ->
285 delegate.removeEventListener(eventName, listener)
286 }
287 return delegate.removeEventListener(eventName, args[0])
0973fea @chanwit added a simpler way of handling events
chanwit authored
288 } else {
fc27b98 Create methods onZzz, addOnZzz and removeOnZzz using ExpandoMetaClass…
unknown authored
289 throw new MissingMethodException(name, delegate.class, args)
0973fea @chanwit added a simpler way of handling events
chanwit authored
290 }
3758718 @chanwit clean spacing
chanwit authored
291 }
292
bd45b19 @chanwit add Gabe Hicks' Zk Builder support
chanwit authored
293 org.zkoss.zk.ui.AbstractComponent.metaClass.append = { closure ->
294 closure.delegate = new ZkBuilder(parent: delegate)
2c91cb4 @chanwit fixed the closure passing thru append to be OWNER_FIRST
chanwit authored
295 closure.resolveStrategy = Closure.OWNER_FIRST
de8d908 @chanwit start adding dynamic methods
chanwit authored
296 closure.call()
297 }
18affcc @chanwit partially added facade support
chanwit authored
298
6b25397 @chanwit add clear() for listbox
chanwit authored
299 org.zkoss.zul.Listbox.metaClass.clear = { ->
300 while (delegate.itemCount > 0) {
301 delegate.removeItemAt(0)
302 }
303 }
3758718 @chanwit clean spacing
chanwit authored
304
3e3beeb @chanwit fixed spaces
chanwit authored
305 org.zkoss.zul.Listbox.metaClass.setModel = { list ->
c0a2161 @chanwit changed setModel to delegate to ListboxModelDynamicMethods
chanwit authored
306 ListboxModelDynamicMethods.setModel(delegate, list)
cc74402 @chanwit commented filter, add new dynamic method
chanwit authored
307 }
3758718 @chanwit clean spacing
chanwit authored
308
2edef05 @chanwit fixed getModel
chanwit authored
309 org.zkoss.zul.Listbox.metaClass.getModel = { ->
310 delegate.getModel()
311 }
3758718 @chanwit clean spacing
chanwit authored
312
dfca381 @chanwit corrected getAt for AbstractListModel
chanwit authored
313 org.zkoss.zul.AbstractListModel.metaClass.getAt = { Integer i ->
5b79467 @chanwit added getAt for list.model[0]
chanwit authored
314 return delegate.getElementAt(i)
315 }
6221a56 @chanwit merged from 0.7.7
chanwit authored
316
1076554 @chanwit refix issue #74 again
chanwit authored
317 //
6221a56 @chanwit merged from 0.7.7
chanwit authored
318 // simple session
1076554 @chanwit refix issue #74 again
chanwit authored
319 //
6221a56 @chanwit merged from 0.7.7
chanwit authored
320 org.zkoss.zk.ui.http.SimpleSession.metaClass.getAt = { String name ->
321 delegate.getAttribute(name)
322 }
323 org.zkoss.zk.ui.http.SimpleSession.metaClass.putAt = { String name, value ->
324 delegate.setAttribute(name, value)
325 }
1076554 @chanwit refix issue #74 again
chanwit authored
326 org.zkoss.zk.ui.http.SimpleSession.metaClass.propertyMissing = { String name ->
327 delegate.getAttribute(name)
328 }
329 org.zkoss.zk.ui.http.SimpleSession.metaClass.propertyMissing << { String name, value ->
330 delegate.setAttribute(name, value)
331 }
6221a56 @chanwit merged from 0.7.7
chanwit authored
332
01423a6 @fcy Added loadComponents(List) method to DataBinder using groovy's dynami…
fcy authored
333 // Load specific components. Issue #103
334 org.zkoss.zkplus.databind.DataBinder.metaClass.loadComponents = { List comps ->
335 comps.each {
336 delegate.loadComponent(it)
337 }
338 }
dbcf59e @chanwit live-model is working
chanwit authored
339
5ac6cb1 @chanwit init 0.6.1
chanwit authored
340 }
341
342 def onChange = { event ->
caa90be @chanwit support auto-reloading composers
chanwit authored
343 if (application.isArtefactOfType(ComposerArtefactHandler.TYPE, event.source)) {
344 def context = event.ctx
345 if (!context) {
346 if (log.isDebugEnabled())
347 log.debug("Application context not found. Can't reload")
348 return
349 }
350 def composerClass = application.addArtefact(ComposerArtefactHandler.TYPE, event.source)
6221a56 @chanwit merged from 0.7.7
chanwit authored
351 def composerBeanName = composerClass.propertyName
352 if(composerClass.packageName) {
353 composerBeanName = composerClass.packageName + "." + composerBeanName
354 }
2302abf @chanwit re-enabled package-based composer beans
chanwit authored
355 // composerBeanName = composerBeanName.replace('.', '_')
caa90be @chanwit support auto-reloading composers
chanwit authored
356 def beanDefinitions = beans {
6221a56 @chanwit merged from 0.7.7
chanwit authored
357 "${composerBeanName}"(composerClass.clazz) { bean ->
caa90be @chanwit support auto-reloading composers
chanwit authored
358 bean.scope = "prototype"
359 bean.autowire = "byName"
360 }
361 }
7b2f4b2 @chanwit refactor and fix regression
chanwit authored
362
363 //
caa90be @chanwit support auto-reloading composers
chanwit authored
364 // now that we have a BeanBuilder calling registerBeans and passing the app ctx will
365 // register the necessary beans with the given app ctx
366 beanDefinitions.registerBeans(event.ctx)
367
368 // Add the dynamic methods back to the class (since it's
369 // effectively a completely new class).
370 // event.manager?.getGrailsPlugin("zk")?.doWithDynamicMethods(event.ctx)
18affcc @chanwit partially added facade support
chanwit authored
371 } else if (application.isArtefactOfType(FacadeArtefactHandler.TYPE, event.source)) {
372 def context = event.ctx
373 if (!context) {
374 if (log.isDebugEnabled())
375 log.debug("Application context not found. Can't reload")
376 return
377 }
378 def facadeClass = application.addArtefact(FacadeArtefactHandler.TYPE, event.source)
379 def beanDefinitions = beans {
380 "${facadeClass.propertyName}"(facadeClass.clazz) { bean ->
381 bean.scope = "session"
382 bean.autowire = "byName"
383 }
384 }
385 beanDefinitions.registerBeans(event.ctx)
cbd2db7 @chanwit support auto-reload for comet
chanwit authored
386 } else if (application.isArtefactOfType(CometArtefactHandler.TYPE, event.source)) {
387 def context = event.ctx
388 if (!context) {
389 if (log.isDebugEnabled())
390 log.debug("Application context not found. Can't reload")
391 return
392 }
393 def cometClass = application.addArtefact(CometArtefactHandler.TYPE, event.source)
394 def beanDefinitions = beans {
395 "${cometClass.propertyName}"(cometClass.clazz) { bean ->
396 bean.scope = "prototype"
397 bean.autowire = "byName"
398 }
399 }
400 beanDefinitions.registerBeans(event.ctx)
cfcc766 @chanwit add live-model artefact
chanwit authored
401 } else if (application.isArtefactOfType(LiveModelArtefactHandler.TYPE, event.source)) {
402 def context = event.ctx
403 if (!context) {
404 if (log.isDebugEnabled())
405 log.debug("Application context not found. Can't reload")
406 return
407 }
5fa378c @chanwit make live-model reload
chanwit authored
408 def modelClass = application.addArtefact(LiveModelArtefactHandler.TYPE,
409 event.source)
410 def cfg = GCU.getStaticPropertyValue(modelClass.clazz, "config")
411 if(cfg) {
412 def lmb = new LiveModelBuilder()
413 cfg.delegate = lmb
414 cfg.resolveStrategy = Closure.DELEGATE_ONLY
415 cfg.call()
416 if (lmb.map['model'] == 'page') {
417 def beanDefinitions = beans {
418 "${modelClass.propertyName}"(SortingPagingListModel.class) { bean ->
419 bean.scope = "prototype"
420 bean.autowire = "byName"
421 bean.initMethod = "init"
422 map = lmb.map.clone()
423 }
424 }
425 beanDefinitions.registerBeans(event.ctx)
cfcc766 @chanwit add live-model artefact
chanwit authored
426 }
427 }
18affcc @chanwit partially added facade support
chanwit authored
428 }
5ac6cb1 @chanwit init 0.6.1
chanwit authored
429 }
430
431 def onConfigChange = { event ->
432 // TODO Implement code that is executed when the project configuration changes.
433 // The event is the same as for 'onChange'.
434 }
435 }
Something went wrong with that request. Please try again.