Skip to content

Commit

Permalink
issue 125 - first cut to support Comet
Browse files Browse the repository at this point in the history
  • Loading branch information
chanwit committed May 10, 2010
1 parent 527ba7b commit da761f6
Show file tree
Hide file tree
Showing 8 changed files with 168 additions and 6 deletions.
18 changes: 17 additions & 1 deletion ZkGrailsPlugin.groovy
Expand Up @@ -60,25 +60,41 @@ this plugin adds ZK Ajax framework (www.zkoss.org) support to Grails application
boolean enableReload = env.isReloadEnabled() || application.config.grails.gsp.enable.reload == true || (developmentMode && env == Environment.DEVELOPMENT)
boolean warDeployedWithReload = application.warDeployed && enableReload

//
// Registering Composer Beans
//
application.composerClasses.each { composerClass ->
def composerBeanName = composerClass.propertyName
if(composerClass.packageName) {
composerBeanName = composerClass.packageName + "." + composerBeanName
}

"${composerBeanName}"(composerClass.clazz) { bean ->
bean.scope = "prototype"
bean.autowire = "byName"
}

}

//
// Registering Facade Beans
//
application.facadeClasses.each { facadeClass ->
"${facadeClass.propertyName}"(facadeClass.clazz) { bean ->
bean.scope = "session"
bean.autowire = "byName"
}
}

//
// Registering Comet classes
//
application.cometClasses.each { cometClass ->
"${cometClass.propertyName}"(cometClass.clazz) { bean ->
bean.scope = "prototype"
bean.autowire = "none"
}
}

if(!parentCtx?.containsBean("zkgrailsScaffoldingTemplate")) {
zkgrailsScaffoldingTemplate(DefaultScaffoldingTemplate.class) { bean ->
bean.scope = "prototype"
Expand Down
15 changes: 15 additions & 0 deletions grails-app/comets/zk/MyComet.groovy
@@ -0,0 +1,15 @@
package zk

import org.zkoss.zkgrails.*

class MyComet extends GrailsComet {

int i

static trigger = [startDelay: 3000L, delay: 1000L]

def execute = { desktop, page ->
i++
lblTest.value = "time : ${i}"
}
}
18 changes: 18 additions & 0 deletions grails-app/composers/zk/MyComposer.groovy
@@ -0,0 +1,18 @@
package zk

import org.zkoss.zkgrails.GrailsComposer;

class MyComposer extends GrailsComposer {

def lblTest
def myComet

def afterCompose = {
myComet.start()
}

def onClick_btnStop() {
myComet.stop()
}

}
57 changes: 57 additions & 0 deletions src/groovy/org/zkoss/zkgrails/GrailsComet.groovy
@@ -0,0 +1,57 @@
package org.zkoss.zkgrails;

import org.codehaus.groovy.grails.commons.GrailsClassUtils;
import org.codehaus.groovy.grails.commons.spring.DefaultBeanConfiguration;
import org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.zkoss.zk.ui.Executions;

class GrailsComet {

GrailsComposer grailsComposer
Thread th
Boolean stop = false

public void start() {
final desktop = grailsComposer.desktop
final page = grailsComposer.page

def trigger = GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(this, "trigger")

final Long startDelay
final Long delay

if(trigger instanceof Number) {
startDelay = 0L
delay = (Number)trigger
} else if(trigger instanceof Map) {
startDelay = trigger['startDelay']
delay = trigger['delay']
}
if (desktop.isServerPushEnabled() == false) {
desktop.enableServerPush(true)
}
final executeClosure = GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(this, "execute")
executeClosure.delegate = grailsComposer
executeClosure.resolveStrategy = Closure.DELEGATE_FIRST

th = Thread.start {
Thread.sleep(startDelay)
while(!stop) {
Executions.activate(desktop)
executeClosure.call(desktop, page)
Executions.deactivate(desktop)
Thread.sleep(delay)
}
}
}

public void stop() {
stop = true
final desktop = grailsComposer.desktop
desktop.enableServerPush(false)
}

}
28 changes: 25 additions & 3 deletions src/java/org/zkoss/zkgrails/GrailsComposer.java
Expand Up @@ -20,6 +20,7 @@ of the License, or (at your option) any later version.

import groovy.lang.Closure;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.codehaus.groovy.grails.commons.GrailsApplication;
Expand All @@ -29,6 +30,8 @@ of the License, or (at your option) any later version.
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Desktop;
import org.zkoss.zk.ui.Page;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.ForwardEvent;
import org.zkoss.zk.ui.sys.ComponentsCtrl;
Expand All @@ -37,20 +40,39 @@ of the License, or (at your option) any later version.

public class GrailsComposer extends org.zkoss.zk.ui.util.GenericForwardComposer {

private static final long serialVersionUID = -5307023773234300419L;
private static final long serialVersionUID = -5307023773234300419L;

public GrailsComposer() {
public GrailsComposer() {
super('_');
}


public Desktop getDesktop() {
return this.desktop;
}

public Page getPage() {
return this.page;
}

public ZkBuilder getBuild() {
ZkBuilder builder = new ZkBuilder();
builder.setPage(page);
return builder;
}

public void injectComet() throws Exception {
Field[] fields = this.getClass().getDeclaredFields();
for(Field f: fields) {
if(f.getName().endsWith("Comet")) {
GrailsComet gc = (GrailsComet)InvokerHelper.getProperty(this, f.getName());
gc.setGrailsComposer(this);
}
}
}

public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
injectComet();

try {
Object c = GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(this, "afterCompose");
Expand Down
@@ -1,8 +1,8 @@
package org.zkoss.zkgrails.artefacts;

import org.codehaus.groovy.grails.commons.AbstractInjectableGrailsClass;
import org.codehaus.groovy.grails.commons.AbstractGrailsClass;

public class DefaultGrailsCometClass extends AbstractInjectableGrailsClass
public class DefaultGrailsCometClass extends AbstractGrailsClass
implements GrailsCometClass {

public static final String COMET = "Comet";
Expand Down
21 changes: 21 additions & 0 deletions test/integration/zk/ComposerComentInstatiationTests.groovy
@@ -0,0 +1,21 @@
package zk;

import org.codehaus.groovy.grails.commons.DefaultGrailsApplication;
import org.codehaus.groovy.grails.commons.GrailsApplication;

import groovy.util.GroovyTestCase;

class ComposerComentInstatiationTests extends GroovyTestCase {

GrailsApplication grailsApplication

void testWiring() {
def appCtx = grailsApplication.getMainContext()
def myComposer = appCtx.getBean("zk.myComposer")
myComposer.injectComet()
assert myComposer != null
assert myComposer.myComet != null
assert myComposer.myComet.grailsComposer != null
}

}
13 changes: 13 additions & 0 deletions web-app/zk/issue_125_test_comet.zul
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>

<zk xmlns="http://www.zkoss.org/2005/zul"
xmlns:h="http://www.w3.org/1999/xhtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd" >

<window id="wndMain" apply="zk.myComposer">
<button id="btnStop" label="Stop"/>
<label id="lblTest">Ready</label>
</window>

</zk>

0 comments on commit da761f6

Please sign in to comment.