merged in jersey-scala and atmosphere support
This commit is contained in:
commit
4958166e1f
24 changed files with 461 additions and 276 deletions
|
|
@ -15,55 +15,68 @@ mkdir $BASE_DIR/storage/commitlog
|
||||||
mkdir $BASE_DIR/storage/data
|
mkdir $BASE_DIR/storage/data
|
||||||
mkdir $BASE_DIR/storage/system
|
mkdir $BASE_DIR/storage/system
|
||||||
|
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/config
|
LIB_DIR=$BASE_DIR/lib
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/akka-kernel-0.5.jar
|
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/akka-util-java-0.5.jar
|
CLASSPATH=$BASE_DIR/config
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/akka-util-java.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/fscontext.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/antlr-3.1.3.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/providerutil.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/aopalliance-1.0.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/akka-kernel-0.5.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/asm-3.1.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/akka-util-java-0.5.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/aspectwerkz-nodeps-jdk5-2.1.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/akka-util-java.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/camel-core-2.0-SNAPSHOT.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/antlr-3.1.3.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/cassandra-0.4.0-dev.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/aopalliance-1.0.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/cglib-2.2.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/asm-3.1.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/commons-cli-1.1.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/aspectwerkz-nodeps-jdk5-2.1.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/commons-collections-3.2.1.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/camel-core-2.0-SNAPSHOT.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/commons-io-1.3.2.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/cassandra-0.4.0-dev.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/commons-javaflow-1.0-SNAPSHOT.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/cglib-2.2.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/commons-lang-2.4.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/commons-cli-1.1.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/commons-logging-1.0.4.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/commons-collections-3.2.1.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/commons-math-1.1.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/commons-io-1.3.2.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/configgy-1.3.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/commons-javaflow-1.0-SNAPSHOT.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/google-collect-snapshot-20090211.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/commons-lang-2.4.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/grizzly-framework-1.8.6.3.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/commons-logging-1.0.4.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/grizzly-http-1.8.6.3.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/commons-math-1.1.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/grizzly-http-servlet-1.8.6.3.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/configgy-1.3.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/grizzly-http-utils-1.8.6.3.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/google-collect-snapshot-20090211.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/grizzly-servlet-webserver-1.8.6.3.jar
|
#CLASSPATH=$CLASSPATH:$LIB_DIR/grizzly-framework-1.8.6.3.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/guice-core-2.0-SNAPSHOT.jar
|
#CLASSPATH=$CLASSPATH:$LIB_DIR/grizzly-http-1.8.6.3.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/guice-jsr250-2.0-SNAPSHOT.jar
|
#CLASSPATH=$CLASSPATH:$LIB_DIR/grizzly-http-servlet-1.8.6.3.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/high-scale-lib.jar
|
#CLASSPATH=$CLASSPATH:$LIB_DIR/grizzly-http-utils-1.9.1.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/jackson-core-asl-1.1.0.jar
|
#CLASSPATH=$CLASSPATH:$LIB_DIR/grizzly-servlet-webserver-1.8.6.3.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/jackson-mapper-asl-1.1.0.jar
|
#CLASSPATH=$CLASSPATH:$LIB_DIR/grizzly-comet-1.8.6.3.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/jersey-client-1.1.0-ea.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/grizzly-comet-webserver-1.8.6.3.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/jersey-core-1.0.3.jar
|
#CLASSPATH=$CLASSPATH:$LIB_DIR/grizzly-comet-webserver-1.9.17-RC2.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/jersey-json-1.0.3.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/guice-core-2.0-SNAPSHOT.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/jersey-server-1.0.3.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/guice-jsr250-2.0-SNAPSHOT.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/JSAP-2.1.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/high-scale-lib.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/jsr250-api-1.0.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/jackson-core-asl-1.1.0.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/jsr311-api-1.0.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/jackson-mapper-asl-1.1.0.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/libfb303.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/jersey-client-1.1.0-ea.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/libthrift.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/jersey-core-1.0.3.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/log4j-1.2.15.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/jersey-json-1.0.3.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/lucene-core-2.2.0.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/jersey-server-1.0.3.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/netty-3.1.0.CR1.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/jersey-scala-1.1.2-ea-SNAPSHOT.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/protobuf-java-2.1.0.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/atmosphere-core-0.3-SNAPSHOT.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/scala-library-2.7.5.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/atmosphere-portable-runtime-0.3-SNAPSHOT.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/servlet-api-2.5.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/atmosphere-compat-0.3-SNAPSHOT.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/slf4j-api-1.4.3.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/JSAP-2.1.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/slf4j-log4j12-1.4.3.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/jsr250-api-1.0.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/stringtemplate-3.0.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/jsr311-api-1.0.jar
|
||||||
CLASSPATH=$CLASSPATH:$BASE_DIR/lib/zookeeper-3.1.0.jar
|
CLASSPATH=$CLASSPATH:$LIB_DIR/libfb303.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/libthrift.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/lift-webkit-1.1-M3.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/lift-util-1.1-M3.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/log4j-1.2.15.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/lucene-core-2.2.0.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/netty-3.1.0.CR1.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/protobuf-java-2.0.3.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/scala-library-2.7.5.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/servlet-api-2.5.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/slf4j-api-1.4.3.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/slf4j-log4j12-1.4.3.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/stringtemplate-3.0.jar
|
||||||
|
CLASSPATH=$CLASSPATH:$LIB_DIR/zookeeper-3.1.0.jar
|
||||||
|
|
||||||
# Add for debugging: -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 \
|
# Add for debugging: -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 \
|
||||||
# To have Akka dump the generated classes, add the '-Daspectwerkz.transform.dump=*' option and it will dump classes to $BASE_DIR/_dump
|
# To have Akka dump the generated classes, add the '-Daspectwerkz.transform.dump=*' option and it will dump classes to $BASE_DIR/_dump
|
||||||
|
|
@ -81,7 +94,10 @@ JVM_OPTS=" \
|
||||||
-XX:+HeapDumpOnOutOfMemoryError \
|
-XX:+HeapDumpOnOutOfMemoryError \
|
||||||
-Dcom.sun.management.jmxremote.port=8080 \
|
-Dcom.sun.management.jmxremote.port=8080 \
|
||||||
-Dcom.sun.management.jmxremote.ssl=false \
|
-Dcom.sun.management.jmxremote.ssl=false \
|
||||||
|
-Djava.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory \
|
||||||
|
-Dcom.sun.grizzly.cometSupport=true \
|
||||||
-Dcom.sun.management.jmxremote.authenticate=false"
|
-Dcom.sun.management.jmxremote.authenticate=false"
|
||||||
|
|
||||||
|
|
||||||
#$JAVA_HOME/bin/java $JVM_OPTS -cp $CLASSPATH se.scalablesolutions.akka.Boot se.scalablesolutions.akka.kernel.Kernel ${1}
|
#$JAVA_HOME/bin/java $JVM_OPTS -cp $CLASSPATH se.scalablesolutions.akka.Boot se.scalablesolutions.akka.kernel.Kernel ${1}
|
||||||
$JAVA_HOME/bin/java $JVM_OPTS -cp $CLASSPATH se.scalablesolutions.akka.kernel.Kernel ${1}
|
$JAVA_HOME/bin/java $JVM_OPTS -cp $CLASSPATH se.scalablesolutions.akka.kernel.Kernel ${1}
|
||||||
|
|
|
||||||
|
|
@ -17,3 +17,4 @@ log4j.appender.R.layout.ConversionPattern=%5p [%t] %d{ISO8601} %F (line %L) %m%n
|
||||||
# Edit the next line to point to your logs directory
|
# Edit the next line to point to your logs directory
|
||||||
log4j.appender.R.File=./logs/cassandra.log
|
log4j.appender.R.File=./logs/cassandra.log
|
||||||
|
|
||||||
|
log4j.logger.org.atmosphere=DEBUG
|
||||||
|
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
|
|
||||||
<servlet>
|
|
||||||
<servlet-name>Akka Servlet</servlet-name>
|
|
||||||
<servlet-class>se.scalablesolutions.akka.kernel.jersey.AkkaServlet</servlet-class>
|
|
||||||
</servlet>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>Akka Servlet</servlet-name>
|
|
||||||
<url-pattern>/*</url-pattern>
|
|
||||||
</servlet-mapping-->
|
|
||||||
</web-app>
|
|
||||||
BIN
deploy/akka-samples-java-0.5.jar
Normal file
BIN
deploy/akka-samples-java-0.5.jar
Normal file
Binary file not shown.
BIN
deploy/akka-samples-scala-0.5.jar
Normal file
BIN
deploy/akka-samples-scala-0.5.jar
Normal file
Binary file not shown.
10
deploy/root/page.html
Normal file
10
deploy/root/page.html
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<html>
|
||||||
|
<head><title>blah</title></head>
|
||||||
|
<body>
|
||||||
|
<form method="post" enctype="application/x-www-form-urlencoded" action="chat">
|
||||||
|
<input name="action"/>
|
||||||
|
<input name="name"/>
|
||||||
|
<input name="message"/>
|
||||||
|
<input type="submit" value="submit" name="submit"/>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
302
kernel/pom.xml
302
kernel/pom.xml
|
|
@ -89,59 +89,65 @@
|
||||||
<version>1.0</version>
|
<version>1.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- For Cassandra -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.cassandra</groupId>
|
|
||||||
<artifactId>cassandra</artifactId>
|
|
||||||
<version>0.4.0-dev</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.facebook</groupId>
|
|
||||||
<artifactId>thrift</artifactId>
|
|
||||||
<version>1.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.facebook</groupId>
|
|
||||||
<artifactId>fb303</artifactId>
|
|
||||||
<version>1.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>commons-collections</groupId>
|
|
||||||
<artifactId>commons-collections</artifactId>
|
|
||||||
<version>3.2.1</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>high-scale-lib</groupId>
|
|
||||||
<artifactId>high-scale-lib</artifactId>
|
|
||||||
<version>1.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>commons-lang</groupId>
|
|
||||||
<artifactId>commons-lang</artifactId>
|
|
||||||
<version>2.4</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- For Jersey -->
|
<!-- For Jersey -->
|
||||||
<dependency>
|
<!--<dependency>
|
||||||
<groupId>com.sun.grizzly</groupId>
|
<groupId>com.sun.grizzly</groupId>
|
||||||
<artifactId>grizzly-servlet-webserver</artifactId>
|
<artifactId>grizzly-servlet-webserver</artifactId>
|
||||||
<version>1.9.9</version>
|
<version>1.9.9</version>
|
||||||
</dependency>
|
</dependency>-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sun.jersey</groupId>
|
<groupId>com.sun.grizzly</groupId>
|
||||||
<artifactId>jersey-server</artifactId>
|
<artifactId>grizzly-comet-webserver</artifactId>
|
||||||
<version>1.0.3</version>
|
<!--<version>1.9.15b</version>-->
|
||||||
</dependency>
|
<version>1.8.6.3</version>
|
||||||
<dependency>
|
</dependency>
|
||||||
<groupId>com.sun.jersey</groupId>
|
<dependency>
|
||||||
<artifactId>jersey-json</artifactId>
|
<groupId>com.sun.jersey</groupId>
|
||||||
<version>1.0.3</version>
|
<artifactId>jersey-server</artifactId>
|
||||||
</dependency>
|
<version>1.0.3</version>
|
||||||
<dependency>
|
</dependency>
|
||||||
<groupId>javax.ws.rs</groupId>
|
<dependency>
|
||||||
<artifactId>jsr311-api</artifactId>
|
<groupId>com.sun.jersey</groupId>
|
||||||
<version>1.0</version>
|
<artifactId>jersey-json</artifactId>
|
||||||
</dependency>
|
<version>1.0.3</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.ws.rs</groupId>
|
||||||
|
<artifactId>jsr311-api</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.sun.jersey.contribs</groupId>
|
||||||
|
<artifactId>jersey-scala</artifactId>
|
||||||
|
<version>1.1.2-ea-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
<!--<dependency>
|
||||||
|
<groupId>com.sun.jersey.contribs</groupId>
|
||||||
|
<artifactId>jersey-lift</artifactId>
|
||||||
|
<version>1.1.2-ea-SNAPSHOT</version>
|
||||||
|
</dependency>-->
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.atmosphere</groupId>
|
||||||
|
<artifactId>atmosphere-core</artifactId>
|
||||||
|
<version>0.3-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.atmosphere</groupId>
|
||||||
|
<artifactId>atmosphere-portable-runtime</artifactId>
|
||||||
|
<version>0.3-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.atmosphere</groupId>
|
||||||
|
<artifactId>atmosphere-compat</artifactId>
|
||||||
|
<version>0.3-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
<!--<dependency>
|
||||||
|
<groupId>org.atmosphere</groupId>
|
||||||
|
<artifactId>atmosphere-grizzly-adapter</artifactId>
|
||||||
|
<version>0.3-SNAPSHOT<</version>
|
||||||
|
</dependency>-->
|
||||||
|
|
||||||
<!-- For third-party logging -->
|
<!-- For third-party logging -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
@ -191,100 +197,100 @@
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<sourceDirectory>src/main/scala</sourceDirectory>
|
<sourceDirectory>src/main/scala</sourceDirectory>
|
||||||
<testSourceDirectory>src/test/scala</testSourceDirectory>
|
<testSourceDirectory>src/test/scala</testSourceDirectory>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.scala-tools</groupId>
|
<groupId>org.scala-tools</groupId>
|
||||||
<artifactId>maven-scala-plugin</artifactId>
|
<artifactId>maven-scala-plugin</artifactId>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<goals>
|
<goals>
|
||||||
<goal>compile</goal>
|
<goal>compile</goal>
|
||||||
<goal>testCompile</goal>
|
<goal>testCompile</goal>
|
||||||
</goals>
|
</goals>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
<configuration>
|
<configuration>
|
||||||
<args>
|
<args>
|
||||||
<arg>-target:jvm-1.5</arg>
|
<arg>-target:jvm-1.5</arg>
|
||||||
<!--arg>-unchecked</arg-->
|
<!--<arg>-unchecked</arg>-->
|
||||||
</args>
|
</args>
|
||||||
<scalaVersion>${scala.version}</scalaVersion>
|
<scalaVersion>${scala.version}</scalaVersion>
|
||||||
<vscaladocVersion>1.1</vscaladocVersion>
|
<vscaladocVersion>1.1</vscaladocVersion>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-eclipse-plugin</artifactId>
|
<artifactId>maven-eclipse-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
<downloadSources>true</downloadSources>
|
<downloadSources>true</downloadSources>
|
||||||
<buildcommands>
|
<buildcommands>
|
||||||
<buildcommand>
|
<buildcommand>
|
||||||
ch.epfl.lamp.sdt.core.scalabuilder
|
ch.epfl.lamp.sdt.core.scalabuilder
|
||||||
</buildcommand>
|
</buildcommand>
|
||||||
</buildcommands>
|
</buildcommands>
|
||||||
<additionalProjectnatures>
|
<additionalProjectnatures>
|
||||||
<projectnature>
|
<projectnature>
|
||||||
ch.epfl.lamp.sdt.core.scalanature
|
ch.epfl.lamp.sdt.core.scalanature
|
||||||
</projectnature>
|
</projectnature>
|
||||||
</additionalProjectnatures>
|
</additionalProjectnatures>
|
||||||
<classpathContainers>
|
<classpathContainers>
|
||||||
<classpathContainer>
|
<classpathContainer>
|
||||||
org.eclipse.jdt.launching.JRE_CONTAINER
|
org.eclipse.jdt.launching.JRE_CONTAINER
|
||||||
</classpathContainer>
|
</classpathContainer>
|
||||||
<classpathContainer>
|
<classpathContainer>
|
||||||
ch.epfl.lamp.sdt.launching.SCALA_CONTAINER
|
ch.epfl.lamp.sdt.launching.SCALA_CONTAINER
|
||||||
</classpathContainer>
|
</classpathContainer>
|
||||||
</classpathContainers>
|
</classpathContainers>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-antrun-plugin</artifactId>
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<phase>install</phase>
|
<phase>install</phase>
|
||||||
<configuration>
|
<configuration>
|
||||||
<tasks>
|
<tasks>
|
||||||
<copy file="target/akka-kernel-${akka.version}.jar"
|
<copy file="target/akka-kernel-${akka.version}.jar"
|
||||||
tofile="../lib/akka-kernel-${akka.version}.jar"/>
|
tofile="../lib/akka-kernel-${akka.version}.jar"/>
|
||||||
</tasks>
|
</tasks>
|
||||||
</configuration>
|
</configuration>
|
||||||
<goals>
|
<goals>
|
||||||
<goal>run</goal>
|
<goal>run</goal>
|
||||||
</goals>
|
</goals>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
<resources>
|
<resources>
|
||||||
<resource>
|
<resource>
|
||||||
<filtering>false</filtering>
|
<filtering>false</filtering>
|
||||||
<directory>src/main/resources</directory>
|
<directory>src/main/resources</directory>
|
||||||
</resource>
|
</resource>
|
||||||
<resource>
|
<resource>
|
||||||
<filtering>false</filtering>
|
<filtering>false</filtering>
|
||||||
<directory>src/main/scala</directory>
|
<directory>src/main/scala</directory>
|
||||||
<includes>
|
<includes>
|
||||||
<include>**</include>
|
<include>**</include>
|
||||||
</includes>
|
</includes>
|
||||||
<excludes>
|
<excludes>
|
||||||
<exclude>**/*.scala</exclude>
|
<exclude>**/*.scala</exclude>
|
||||||
</excludes>
|
</excludes>
|
||||||
</resource>
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
</build>
|
</build>
|
||||||
<reporting>
|
<reporting>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.scala-tools</groupId>
|
<groupId>org.scala-tools</groupId>
|
||||||
<artifactId>maven-scala-plugin</artifactId>
|
<artifactId>maven-scala-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
<vscaladocVersion>1.1</vscaladocVersion>
|
<vscaladocVersion>1.1</vscaladocVersion>
|
||||||
<scalaVersion>${scala.version}</scalaVersion>
|
<scalaVersion>${scala.version}</scalaVersion>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</reporting>
|
</reporting>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import java.net.URLClassLoader
|
||||||
|
|
||||||
import net.lag.configgy.{Config, Configgy, RuntimeEnvironment}
|
import net.lag.configgy.{Config, Configgy, RuntimeEnvironment}
|
||||||
|
|
||||||
import kernel.jersey.AkkaServlet
|
import kernel.jersey.{AkkaServlet,AkkaCometServlet}
|
||||||
import kernel.nio.RemoteServer
|
import kernel.nio.RemoteServer
|
||||||
import kernel.state.CassandraStorage
|
import kernel.state.CassandraStorage
|
||||||
import kernel.util.Logging
|
import kernel.util.Logging
|
||||||
|
|
@ -37,7 +37,6 @@ object Kernel extends Logging {
|
||||||
val REST_URL = "http://" + REST_HOSTNAME
|
val REST_URL = "http://" + REST_HOSTNAME
|
||||||
val REST_PORT = kernel.Kernel.config.getInt("akka.rest.port", 9998)
|
val REST_PORT = kernel.Kernel.config.getInt("akka.rest.port", 9998)
|
||||||
|
|
||||||
|
|
||||||
// FIXME add API to shut server down gracefully
|
// FIXME add API to shut server down gracefully
|
||||||
private var remoteServer: RemoteServer = _
|
private var remoteServer: RemoteServer = _
|
||||||
private var jerseySelectorThread: SelectorThread = _
|
private var jerseySelectorThread: SelectorThread = _
|
||||||
|
|
@ -90,8 +89,8 @@ object Kernel extends Logging {
|
||||||
|
|
||||||
private[akka] def runApplicationBootClasses = {
|
private[akka] def runApplicationBootClasses = {
|
||||||
val HOME = try { System.getenv("AKKA_HOME") } catch { case e: NullPointerException => throw new IllegalStateException("AKKA_HOME system variable needs to be set. Should point to the root of the Akka distribution.") }
|
val HOME = try { System.getenv("AKKA_HOME") } catch { case e: NullPointerException => throw new IllegalStateException("AKKA_HOME system variable needs to be set. Should point to the root of the Akka distribution.") }
|
||||||
val CLASSES = HOME + "/kernel/target/classes" // FIXME remove for dist
|
//val CLASSES = HOME + "/kernel/target/classes" // FIXME remove for dist
|
||||||
val LIB = HOME + "/lib"
|
//val LIB = HOME + "/lib"
|
||||||
val CONFIG = HOME + "/config"
|
val CONFIG = HOME + "/config"
|
||||||
val DEPLOY = HOME + "/deploy"
|
val DEPLOY = HOME + "/deploy"
|
||||||
val DEPLOY_DIR = new File(DEPLOY)
|
val DEPLOY_DIR = new File(DEPLOY)
|
||||||
|
|
@ -123,19 +122,29 @@ object Kernel extends Logging {
|
||||||
|
|
||||||
private[akka] def startJersey = {
|
private[akka] def startJersey = {
|
||||||
val uri = UriBuilder.fromUri(REST_URL).port(REST_PORT).build()
|
val uri = UriBuilder.fromUri(REST_URL).port(REST_PORT).build()
|
||||||
val adapter = new ServletAdapter
|
|
||||||
val servlet = new AkkaServlet
|
|
||||||
adapter.setServletInstance(servlet)
|
|
||||||
adapter.setContextPath(uri.getPath)
|
|
||||||
|
|
||||||
val scheme = uri.getScheme
|
val scheme = uri.getScheme
|
||||||
if (!scheme.equalsIgnoreCase("http")) throw new IllegalArgumentException("The URI scheme, of the URI " + REST_URL + ", must be equal (ignoring case) to 'http'")
|
if (!scheme.equalsIgnoreCase("http")) throw new IllegalArgumentException("The URI scheme, of the URI " + REST_URL + ", must be equal (ignoring case) to 'http'")
|
||||||
|
|
||||||
|
|
||||||
|
val adapter = new ServletAdapter()
|
||||||
|
|
||||||
|
adapter.setHandleStaticResources(true)
|
||||||
|
adapter.setServletInstance(new AkkaCometServlet)
|
||||||
|
adapter.setContextPath(uri.getPath)
|
||||||
|
adapter.setRootFolder(System.getenv("AKKA_HOME") + "/deploy/root")
|
||||||
|
log.info("REST service root path: [" + adapter.getRootFolder + "] and context path [" + adapter.getContextPath + "] ")
|
||||||
|
|
||||||
|
val ah = new com.sun.grizzly.arp.DefaultAsyncHandler
|
||||||
|
ah.addAsyncFilter(new com.sun.grizzly.comet.CometAsyncFilter)
|
||||||
jerseySelectorThread = new SelectorThread
|
jerseySelectorThread = new SelectorThread
|
||||||
jerseySelectorThread.setAlgorithmClassName(classOf[StaticStreamAlgorithm].getName)
|
jerseySelectorThread.setAlgorithmClassName(classOf[StaticStreamAlgorithm].getName)
|
||||||
jerseySelectorThread.setPort(REST_PORT)
|
jerseySelectorThread.setPort(REST_PORT)
|
||||||
jerseySelectorThread.setAdapter(adapter)
|
jerseySelectorThread.setAdapter(adapter)
|
||||||
|
jerseySelectorThread.setEnableAsyncExecution(true)
|
||||||
|
jerseySelectorThread.setAsyncHandler(ah)
|
||||||
jerseySelectorThread.listen
|
jerseySelectorThread.listen
|
||||||
|
|
||||||
log.info("REST service started successfully. Listening to port [" + REST_PORT + "]")
|
log.info("REST service started successfully. Listening to port [" + REST_PORT + "]")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,17 +4,22 @@
|
||||||
|
|
||||||
package se.scalablesolutions.akka.kernel.jersey
|
package se.scalablesolutions.akka.kernel.jersey
|
||||||
|
|
||||||
import com.sun.jersey.core.spi.component.ioc.IoCComponentProviderFactory
|
import kernel.Kernel
|
||||||
import com.sun.jersey.core.spi.component.ComponentContext
|
import util.Logging
|
||||||
|
import javax.ws.rs.core.Context
|
||||||
|
|
||||||
|
import com.sun.jersey.core.spi.component.ioc.{IoCComponentProvider,IoCComponentProviderFactory}
|
||||||
|
import com.sun.jersey.core.spi.component.{ComponentContext}
|
||||||
|
|
||||||
import config.Configurator
|
import config.Configurator
|
||||||
|
|
||||||
|
|
||||||
class ActorComponentProviderFactory(val configurators: List[Configurator])
|
class ActorComponentProviderFactory(val configurators: List[Configurator])
|
||||||
extends IoCComponentProviderFactory {
|
extends IoCComponentProviderFactory with Logging {
|
||||||
|
override def getComponentProvider(clazz: Class[_]): IoCComponentProvider = getComponentProvider(null, clazz)
|
||||||
|
|
||||||
override def getComponentProvider(clazz: Class[_]): ActorComponentProvider = getComponentProvider(null, clazz)
|
override def getComponentProvider(context: ComponentContext, clazz: Class[_]): IoCComponentProvider = {
|
||||||
|
//log.info("ProviderFactory: resolve => " + clazz.getName)
|
||||||
override def getComponentProvider(context: ComponentContext, clazz: Class[_]): ActorComponentProvider = {
|
configurators.find(_.isDefined(clazz)).map(_ => new ActorComponentProvider(clazz, configurators)).getOrElse(null)
|
||||||
new ActorComponentProvider(clazz, configurators)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -6,26 +6,101 @@ package se.scalablesolutions.akka.kernel.jersey
|
||||||
|
|
||||||
import kernel.Kernel
|
import kernel.Kernel
|
||||||
import config.ConfiguratorRepository
|
import config.ConfiguratorRepository
|
||||||
|
import util.Logging
|
||||||
|
|
||||||
import com.sun.jersey.api.core.{DefaultResourceConfig, ResourceConfig}
|
import com.sun.jersey.api.core.{DefaultResourceConfig, ResourceConfig,ClasspathResourceConfig}
|
||||||
import com.sun.jersey.spi.container.servlet.ServletContainer
|
import com.sun.jersey.spi.container.servlet.ServletContainer
|
||||||
import com.sun.jersey.spi.container.WebApplication
|
import com.sun.jersey.spi.container.WebApplication
|
||||||
|
|
||||||
import java.util.HashSet
|
import com.sun.jersey.server.impl.component.{IoCResourceFactory}
|
||||||
|
|
||||||
class AkkaServlet extends ServletContainer {
|
import javax.servlet.{ServletConfig}
|
||||||
|
import javax.servlet.http.{HttpServletRequest,HttpServletResponse}
|
||||||
|
|
||||||
|
import org.atmosphere.cpr.{AtmosphereServlet,AtmosphereServletProcessor,AtmosphereEvent,DefaultBroadcaster}
|
||||||
|
import org.atmosphere.cpr.AtmosphereServlet.{AtmosphereHandlerWrapper}
|
||||||
|
import org.atmosphere.container.GrizzlyCometSupport
|
||||||
|
import org.atmosphere.handler.ReflectorServletProcessor
|
||||||
|
import org.atmosphere.core.{JerseyBroadcaster}
|
||||||
|
|
||||||
|
import java.util.{HashSet, HashMap}
|
||||||
|
import java.net.{URL,URLClassLoader}
|
||||||
|
import java.io.{InputStream}
|
||||||
|
|
||||||
|
import scala.collection.jcl.Conversions._
|
||||||
|
|
||||||
|
|
||||||
|
class AkkaServlet extends ServletContainer with AtmosphereServletProcessor with Logging {
|
||||||
|
|
||||||
override def initiate(rc: ResourceConfig, wa: WebApplication) = {
|
override def initiate(rc: ResourceConfig, wa: WebApplication) = {
|
||||||
Kernel.boot // will boot if not already booted by 'main'
|
|
||||||
val configurators = ConfiguratorRepository.getConfiguratorsFor(getServletContext);
|
|
||||||
val set = new HashSet[Class[_]]
|
|
||||||
for {
|
|
||||||
conf <- configurators
|
|
||||||
clazz <- conf.getComponentInterfaces
|
|
||||||
} set.add(clazz)
|
|
||||||
|
|
||||||
wa.initiate(
|
Kernel.boot // will boot if not already booted by 'main'
|
||||||
new DefaultResourceConfig(set),
|
val configurators = ConfiguratorRepository.getConfiguratorsFor(getServletContext)
|
||||||
new ActorComponentProviderFactory(configurators));
|
|
||||||
|
rc.getClasses.addAll(configurators.flatMap(_.getComponentInterfaces))
|
||||||
|
rc.getProperties.put("com.sun.jersey.spi.container.ResourceFilters","org.atmosphere.core.AtmosphereFilter")
|
||||||
|
//rc.getFeatures.put("com.sun.jersey.config.feature.Redirect", true)
|
||||||
|
//rc.getFeatures.put("com.sun.jersey.config.feature.ImplicitViewables",true)
|
||||||
|
|
||||||
|
wa.initiate(rc,new ActorComponentProviderFactory(configurators))
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
//Borrowed from AbstractReflectorAtmosphereHandler
|
||||||
|
override def onMessage(event : AtmosphereEvent[HttpServletRequest,HttpServletResponse]) : AtmosphereEvent[_,_] =
|
||||||
|
{
|
||||||
|
//log.info("onMessage: " + event.getMessage.toString)
|
||||||
|
|
||||||
|
if(event.getMessage ne null)
|
||||||
|
{
|
||||||
|
var isUsingStream = false
|
||||||
|
try {
|
||||||
|
event.getResponse.getWriter
|
||||||
|
} catch {
|
||||||
|
case e: IllegalStateException => isUsingStream = true
|
||||||
|
}
|
||||||
|
|
||||||
|
val data = event.getMessage.toString
|
||||||
|
|
||||||
|
if (isUsingStream){
|
||||||
|
if(data != null)
|
||||||
|
event.getResponse.getOutputStream.write(data.getBytes)
|
||||||
|
event.getResponse.getOutputStream.flush
|
||||||
|
} else {
|
||||||
|
event.getResponse.getWriter.write(data)
|
||||||
|
event.getResponse.getWriter.flush
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
log.info("Null event message :/ req[ " + event.getRequest + "] res[" +event.getResponse + "]")
|
||||||
|
|
||||||
|
event
|
||||||
|
}
|
||||||
|
|
||||||
|
override def onEvent(event : AtmosphereEvent[HttpServletRequest,HttpServletResponse]) : AtmosphereEvent[_,_] =
|
||||||
|
{
|
||||||
|
//log.info("onEvent: " + event.getMessage)
|
||||||
|
event.getRequest.setAttribute(ReflectorServletProcessor.ATMOSPHERE_EVENT, event)
|
||||||
|
event.getRequest.setAttribute(ReflectorServletProcessor.ATMOSPHERE_HANDLER, this)
|
||||||
|
|
||||||
|
service(event.getRequest, event.getResponse)
|
||||||
|
|
||||||
|
event
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AkkaCometServlet extends org.atmosphere.cpr.AtmosphereServlet
|
||||||
|
{
|
||||||
|
override def init(sconf : ServletConfig) = {
|
||||||
|
val servlet = new AkkaServlet
|
||||||
|
this.config = new AtmosphereConfig { ah = servlet }
|
||||||
|
|
||||||
|
atmosphereHandlers.put("", new AtmosphereHandlerWrapper(servlet,new JerseyBroadcaster))
|
||||||
|
|
||||||
|
setCometSupport(new GrizzlyCometSupport(config))
|
||||||
|
getCometSupport.init(sconf)
|
||||||
|
|
||||||
|
servlet.init(sconf)
|
||||||
|
}
|
||||||
|
|
||||||
|
override def loadAtmosphereDotXml(is : InputStream, urlc :URLClassLoader) = () //Hide it
|
||||||
|
}
|
||||||
|
|
|
||||||
BIN
lib/akka-kernel-0.5.jar
Normal file
BIN
lib/akka-kernel-0.5.jar
Normal file
Binary file not shown.
BIN
lib/akka-util-java-0.5.jar
Normal file
BIN
lib/akka-util-java-0.5.jar
Normal file
Binary file not shown.
BIN
lib/atmosphere-compat-0.3-SNAPSHOT.jar
Normal file
BIN
lib/atmosphere-compat-0.3-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
lib/atmosphere-core-0.3-SNAPSHOT.jar
Normal file
BIN
lib/atmosphere-core-0.3-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
lib/atmosphere-portable-runtime-0.3-SNAPSHOT.jar
Normal file
BIN
lib/atmosphere-portable-runtime-0.3-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
lib/fscontext.jar
Normal file
BIN
lib/fscontext.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/jersey-scala-1.1.2-ea-SNAPSHOT.jar
Normal file
BIN
lib/jersey-scala-1.1.2-ea-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
lib/providerutil.jar
Normal file
BIN
lib/providerutil.jar
Normal file
Binary file not shown.
|
|
@ -1,23 +1,33 @@
|
||||||
package sample.scala
|
package sample.scala
|
||||||
|
|
||||||
import javax.ws.rs.{Path, GET, Produces}
|
import javax.ws.rs.{GET, POST, Path, Produces, WebApplicationException, Consumes}
|
||||||
import se.scalablesolutions.akka.kernel.state.{TransactionalState, TransactionalMap, CassandraStorageConfig}
|
import se.scalablesolutions.akka.kernel.state.{TransactionalState, TransactionalMap, CassandraStorageConfig}
|
||||||
import se.scalablesolutions.akka.kernel.actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor}
|
import se.scalablesolutions.akka.kernel.actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor}
|
||||||
import se.scalablesolutions.akka.kernel.config.ScalaConfig._
|
import se.scalablesolutions.akka.kernel.config.ScalaConfig._
|
||||||
|
import javax.ws.rs.core.MultivaluedMap
|
||||||
|
|
||||||
|
|
||||||
|
import _root_.scala.xml.{NodeSeq}
|
||||||
|
import se.scalablesolutions.akka.kernel.util.{Logging}
|
||||||
|
import org.atmosphere.core.annotation.{Broadcast, BroadcastFilter => FilterBroadcast, Suspend}
|
||||||
|
import org.atmosphere.util.{XSSHtmlFilter}
|
||||||
|
import org.atmosphere.cpr.{BroadcastFilter}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Boot {
|
class Boot {
|
||||||
object factory extends SupervisorFactory {
|
object factory extends SupervisorFactory {
|
||||||
override def getSupervisorConfig: SupervisorConfig = {
|
override def getSupervisorConfig: SupervisorConfig = {
|
||||||
SupervisorConfig(
|
SupervisorConfig(
|
||||||
RestartStrategy(OneForOne, 3, 100),
|
RestartStrategy(OneForOne, 3, 100),
|
||||||
Supervise(
|
Supervise(
|
||||||
new SimpleService,
|
new Chat,
|
||||||
LifeCycle(Permanent, 100))
|
LifeCycle(Permanent, 100))
|
||||||
:: Nil)
|
:: Nil)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
val supervisor = factory.newSupervisor
|
||||||
val supervisor = factory.newSupervisor
|
supervisor.startSupervisor
|
||||||
supervisor.startSupervisor
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -26,36 +36,99 @@ class Boot {
|
||||||
* curl http://localhost:9998/scalacount
|
* curl http://localhost:9998/scalacount
|
||||||
* </pre>
|
* </pre>
|
||||||
* Or browse to the URL from a web browser.
|
* Or browse to the URL from a web browser.
|
||||||
*/
|
*/
|
||||||
@Path("/scalacount")
|
@Path("/scalacount")
|
||||||
class SimpleService extends Actor {
|
class SimpleService extends Actor {
|
||||||
uuid = "SimpleService"
|
uuid = "SimpleService"
|
||||||
makeTransactionRequired
|
makeTransactionRequired
|
||||||
|
|
||||||
case object Tick
|
case object Tick
|
||||||
private val KEY = "COUNTER";
|
private val KEY = "COUNTER";
|
||||||
private var hasStartedTicking = false;
|
private var hasStartedTicking = false;
|
||||||
private val storage = TransactionalState.newPersistentMap(CassandraStorageConfig())
|
private val storage = TransactionalState.newPersistentMap(CassandraStorageConfig())
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Produces(Array("application/json"))
|
@Produces(Array("text/html"))
|
||||||
def count = (this !! Tick).getOrElse("Error in counter")
|
def count() = {
|
||||||
|
(this !! Tick).getOrElse(<error>Error in counter</error>)
|
||||||
override def receive: PartialFunction[Any, Unit] = {
|
|
||||||
case Tick => if (hasStartedTicking) {
|
|
||||||
val counter = storage.get(KEY).get.asInstanceOf[Integer].intValue
|
|
||||||
storage.put(KEY, new Integer(counter + 1))
|
|
||||||
//reply(<h1>Tick: { counter + 1 } </h1>)
|
|
||||||
reply("Tick: " + (counter + 1) + "\n")
|
|
||||||
} else {
|
|
||||||
storage.put(KEY, new Integer(0))
|
|
||||||
hasStartedTicking = true
|
|
||||||
//reply(<h1>Tick: 0</h1>)
|
|
||||||
reply("Tick: 0\n")
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
override def receive: PartialFunction[Any, Unit] = {
|
||||||
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) = {
|
case Tick => if (hasStartedTicking) {
|
||||||
println("Restarting due to: " + reason.asInstanceOf[Exception].getMessage)
|
val counter = storage.get(KEY).get.asInstanceOf[Integer].intValue
|
||||||
}
|
storage.put(KEY, new Integer(counter + 1))
|
||||||
}
|
reply(<success>Tick: {counter + 1}</success>)
|
||||||
|
} else {
|
||||||
|
storage.put(KEY, new Integer(0))
|
||||||
|
hasStartedTicking = true
|
||||||
|
reply(<success>Tick: 0</success>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) = {
|
||||||
|
println("Restarting due to: " + reason.asInstanceOf[Exception].getMessage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Path("/chat")
|
||||||
|
class Chat extends Actor with Logging{
|
||||||
|
uuid = "Chat"
|
||||||
|
makeTransactionRequired
|
||||||
|
|
||||||
|
case class Chat(val who : String, val what : String,val msg : String)
|
||||||
|
|
||||||
|
override protected def postRestart(reason: AnyRef, config: Option[AnyRef]) = {
|
||||||
|
println("Restarting due to: " + reason.asInstanceOf[Exception].getMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suspend
|
||||||
|
@GET
|
||||||
|
@Produces(Array("text/html"))
|
||||||
|
def suspend() = "<!-- Comet is a programming technique that enables web " +
|
||||||
|
"servers to send data to the client without having any need " +
|
||||||
|
"for the client to request it. -->\n"
|
||||||
|
|
||||||
|
override def receive: PartialFunction[Any, Unit] = {
|
||||||
|
case Chat(who,what,msg) => {
|
||||||
|
|
||||||
|
//log.info("Chat(" + who + ", " + what + ", " + msg + ")")
|
||||||
|
|
||||||
|
what match {
|
||||||
|
case "login" => reply("System Message__"+who+" has joined.")
|
||||||
|
case "post" => reply("" + who + "__" + msg)
|
||||||
|
case _ => throw new WebApplicationException(422)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case x => log.info("recieve unknown: " + x)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Broadcast
|
||||||
|
@Consumes(Array("application/x-www-form-urlencoded"))
|
||||||
|
@POST
|
||||||
|
@Produces(Array("text/html"))
|
||||||
|
@FilterBroadcast(Array(classOf[XSSHtmlFilter],classOf[JsonpFilter]))
|
||||||
|
def publishMessage(form: MultivaluedMap[String, String]) = (this !! Chat(form.getFirst("name"),form.getFirst("action"),form.getFirst("message"))).getOrElse("System__error")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class JsonpFilter extends BroadcastFilter[String] with Logging
|
||||||
|
{
|
||||||
|
|
||||||
|
val BEGIN_SCRIPT_TAG = "<script type='text/javascript'>\n"
|
||||||
|
val END_SCRIPT_TAG = "</script>\n"
|
||||||
|
|
||||||
|
def filter(m : String) = {
|
||||||
|
var name = m
|
||||||
|
var message = ""
|
||||||
|
|
||||||
|
if (m.indexOf("__") > 0) {
|
||||||
|
name = m.substring(0, m.indexOf("__"))
|
||||||
|
message = m.substring(m.indexOf("__") + 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
(BEGIN_SCRIPT_TAG + "window.parent.app.update({ name: \""
|
||||||
|
+ name + "\", message: \""
|
||||||
|
+ message + "\" });\n"
|
||||||
|
+ END_SCRIPT_TAG)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue