diff --git a/akka.ipr b/akka.ipr index 5a6b3cb3fe..a838a63504 100755 --- a/akka.ipr +++ b/akka.ipr @@ -1,312 +1,412 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/akka.iws b/akka.iws index 7a296d33b2..d1de636cec 100755 --- a/akka.iws +++ b/akka.iws @@ -1,840 +1,651 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - localhost - 5050 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/akka.sublime-project b/akka.sublime-project deleted file mode 100755 index 0aa4dace60..0000000000 --- a/akka.sublime-project +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/api-java/api-java.iml b/api-java/api-java.iml index 49b8e78ddc..82624ad49c 100755 --- a/api-java/api-java.iml +++ b/api-java/api-java.iml @@ -1,51 +1,50 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api-java/build.xml b/api-java/build.xml index 42cbbc576d..2134ac49a1 100755 --- a/api-java/build.xml +++ b/api-java/build.xml @@ -1,74 +1,74 @@ - - - - - - - - - - - Builds, tests, and runs the project api-java. - - - + + + + + + + + + + + Builds, tests, and runs the project api-java. + + + diff --git a/api-java/nbproject/build-impl.xml b/api-java/nbproject/build-impl.xml index 50f298fca0..6cfd1a1c00 100755 --- a/api-java/nbproject/build-impl.xml +++ b/api-java/nbproject/build-impl.xml @@ -1,646 +1,684 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set test.src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - - - - - - java -cp "${run.classpath.with.dist.jar}" ${main.class} - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + diff --git a/api-java/nbproject/genfiles.properties b/api-java/nbproject/genfiles.properties index c3be1a543c..ee886267b0 100755 --- a/api-java/nbproject/genfiles.properties +++ b/api-java/nbproject/genfiles.properties @@ -1,8 +1,8 @@ -build.xml.data.CRC32=3e53666f -build.xml.script.CRC32=b65508dc -build.xml.stylesheet.CRC32=958a1d3e -# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. -# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=3e53666f -nbproject/build-impl.xml.script.CRC32=0784ec5f -nbproject/build-impl.xml.stylesheet.CRC32=65b8de21 +build.xml.data.CRC32=3e53666f +build.xml.script.CRC32=b65508dc +build.xml.stylesheet.CRC32=958a1d3e@1.25.0.45 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=3e53666f +nbproject/build-impl.xml.script.CRC32=1b57f6f0 +nbproject/build-impl.xml.stylesheet.CRC32=ce896a9e@1.25.0.45 diff --git a/api-java/nbproject/private/private.properties b/api-java/nbproject/private/private.properties index 2608879383..29862ea4c7 100755 --- a/api-java/nbproject/private/private.properties +++ b/api-java/nbproject/private/private.properties @@ -1,7 +1,6 @@ -compile.on.save=true -do.depend=false -do.jar=true -javac.debug=true -javadoc.preview=true -jaxws.endorsed.dir=C:\\Program Files\\NetBeans 6.5.1\\java2\\modules\\ext\\jaxws21\\api:C:\\Program Files\\NetBeans 6.5.1\\ide10\\modules\\ext\\jaxb\\api -user.properties.file=C:\\Documents and Settings\\jboner\\.netbeans\\6.5\\build.properties +compile.on.save=true +do.depend=false +do.jar=true +javac.debug=true +javadoc.preview=true +user.properties.file=/Users/jboner/.netbeans/dev/build.properties diff --git a/api-java/nbproject/project.properties b/api-java/nbproject/project.properties index 0f4243de96..9e3d3db1b6 100755 --- a/api-java/nbproject/project.properties +++ b/api-java/nbproject/project.properties @@ -1,185 +1,217 @@ -application.title=api-java -application.vendor=jboner -build.classes.dir=${build.dir}/classes -build.classes.excludes=**/*.java,**/*.form -# This directory is removed when the project is cleaned: -build.dir=build -build.generated.dir=${build.dir}/generated -build.generated.sources.dir=${build.dir}/generated-sources -# Only compile against the classpath explicitly listed here: -build.sysclasspath=ignore -build.test.classes.dir=${build.dir}/test/classes -build.test.results.dir=${build.dir}/test/results -# Uncomment to specify the preferred debugger connection transport: -#debug.transport=dt_socket -debug.classpath=\ - ${run.classpath} -debug.test.classpath=\ - ${run.test.classpath} -# This directory is removed when the project is cleaned: -dist.dir=dist -dist.jar=${dist.dir}/api-java.jar -dist.javadoc.dir=${dist.dir}/javadoc -excludes= -file.reference.activation-1.1.jar=../lib/activation-1.1.jar -file.reference.akka-util-java.jar=../lib/akka-util-java.jar -file.reference.aopalliance-1.0.jar=../lib/aopalliance-1.0.jar -file.reference.asm-3.1.jar=../lib/asm-3.1.jar -file.reference.catalina-ant.jar=../lib/catalina-ant.jar -file.reference.cglib-2.2.jar=../lib/cglib-2.2.jar -file.reference.colt-1.2.0.jar=../lib/colt-1.2.0.jar -file.reference.commons-codec-1.3.jar=../lib/commons-codec-1.3.jar -file.reference.commons-collections-3.1.jar=../lib/commons-collections-3.1.jar -file.reference.commons-dbcp-1.2.2.jar=../lib/commons-dbcp-1.2.2.jar -file.reference.commons-httpclient-3.1.jar=../lib/commons-httpclient-3.1.jar -file.reference.commons-io-1.3.2.jar=../lib/commons-io-1.3.2.jar -file.reference.commons-lang-2.1.jar=../lib/commons-lang-2.1.jar -file.reference.commons-logging.jar=../lib/commons-logging.jar -file.reference.commons-pool-1.4.jar=../lib/commons-pool-1.4.jar -file.reference.configgy-1.2.jar=../lib/configgy-1.2.jar -file.reference.google-collect-snapshot-20090211.jar=../lib/google-collect-snapshot-20090211.jar -file.reference.grizzly-framework-1.8.6.3.jar=../lib/grizzly-framework-1.8.6.3.jar -file.reference.grizzly-http-1.8.6.3.jar=../lib/grizzly-http-1.8.6.3.jar -file.reference.grizzly-http-servlet-1.8.6.3.jar=../lib/grizzly-http-servlet-1.8.6.3.jar -file.reference.grizzly-http-utils-1.8.6.3.jar=../lib/grizzly-http-utils-1.8.6.3.jar -file.reference.grizzly-portunif-1.8.6.3.jar=../lib/grizzly-portunif-1.8.6.3.jar -file.reference.grizzly-rcm-1.8.6.3.jar=../lib/grizzly-rcm-1.8.6.3.jar -file.reference.grizzly-servlet-webserver-1.8.6.3.jar=../lib/grizzly-servlet-webserver-1.8.6.3.jar -file.reference.guice-core-2.0-SNAPSHOT.jar=../lib/guice-core-2.0-SNAPSHOT.jar -file.reference.guice-jsr250-2.0-SNAPSHOT.jar=../lib/guice-jsr250-2.0-SNAPSHOT.jar -file.reference.jaxb-api-2.1.jar=../lib/jaxb-api-2.1.jar -file.reference.jaxb-impl-2.1.jar=../lib/jaxb-impl-2.1.jar -file.reference.jdom-1.0.jar=../lib/jdom-1.0.jar -file.reference.je-3.3.62.jar=../lib/je-3.3.62.jar -file.reference.jersey-atom-1.0.1.jar=../lib/jersey-atom-1.0.1.jar -file.reference.jersey-core-1.0.1.jar=../lib/jersey-core-1.0.1.jar -file.reference.jersey-json-1.0.1.jar=../lib/jersey-json-1.0.1.jar -file.reference.jersey-server-1.0.1.jar=../lib/jersey-server-1.0.1.jar -file.reference.jettison-1.0.1.jar=../lib/jettison-1.0.1.jar -file.reference.jetty-6.1.6rc0.jar=../lib/jetty-6.1.6rc0.jar -file.reference.jetty-util-6.1.6rc0.jar=../lib/jetty-util-6.1.6rc0.jar -file.reference.jsr250-api-1.0.jar=../lib/jsr250-api-1.0.jar -file.reference.jsr311-api-1.0.jar=../lib/jsr311-api-1.0.jar -file.reference.junit-3.8.2.jar=../lib/junit-3.8.2.jar -file.reference.libthrift-20080411p1.jar=../lib/libthrift-20080411p1.jar -file.reference.log4j-1.2.13.jar=../lib/log4j-1.2.13.jar -file.reference.main-java=src/main/java -file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar=../lib/mina-core-2.0.0-M2-SNAPSHOT.jar -file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar=../lib/mina-integration-scala-2.0.0-M2-SNAPSHOT.jar -file.reference.protobuf-java-2.0.3.jar=../lib/protobuf-java-2.0.3.jar -file.reference.rome-0.9.jar=../lib/rome-0.9.jar -file.reference.scala-library-2.7.3.jar=../lib/scala-library-2.7.3.jar -file.reference.scalatest-0.9.5.jar=../lib/scalatest-0.9.5.jar -file.reference.scalatest-0.9.5.zip=../lib/scalatest-0.9.5.zip -file.reference.servlet-api-2.5.jar=../lib/servlet-api-2.5.jar -file.reference.slf4j-api-1.4.3.jar=../lib/slf4j-api-1.4.3.jar -file.reference.slf4j-log4j12-1.4.3.jar=../lib/slf4j-log4j12-1.4.3.jar -file.reference.stax-api-1.0-2.jar=../lib/stax-api-1.0-2.jar -file.reference.test-java=src/test/java -file.reference.velocity-1.5.jar=../lib/velocity-1.5.jar -file.reference.voldemort-0.4a.jar=../lib/voldemort-0.4a.jar -file.reference.voldemort-contrib-0.4a.jar=../lib/voldemort-contrib-0.4a.jar -file.reference.xerces.jar=../lib/xerces.jar -file.reference.zookeeper-3.1.0.jar=../lib/zookeeper-3.1.0.jar -includes=** -jar.compress=false -javac.classpath=\ - ${reference.akka-kernel.jar}:\ - ${file.reference.guice-core-2.0-SNAPSHOT.jar}:\ - ${file.reference.guice-jsr250-2.0-SNAPSHOT.jar}:\ - ${file.reference.activation-1.1.jar}:\ - ${file.reference.aopalliance-1.0.jar}:\ - ${file.reference.asm-3.1.jar}:\ - ${file.reference.catalina-ant.jar}:\ - ${file.reference.cglib-2.2.jar}:\ - ${file.reference.colt-1.2.0.jar}:\ - ${file.reference.akka-util-java.jar}:\ - ${file.reference.commons-codec-1.3.jar}:\ - ${file.reference.commons-collections-3.1.jar}:\ - ${file.reference.commons-dbcp-1.2.2.jar}:\ - ${file.reference.commons-httpclient-3.1.jar}:\ - ${file.reference.commons-io-1.3.2.jar}:\ - ${file.reference.commons-lang-2.1.jar}:\ - ${file.reference.commons-logging.jar}:\ - ${file.reference.commons-pool-1.4.jar}:\ - ${file.reference.configgy-1.2.jar}:\ - ${file.reference.google-collect-snapshot-20090211.jar}:\ - ${file.reference.grizzly-framework-1.8.6.3.jar}:\ - ${file.reference.grizzly-http-1.8.6.3.jar}:\ - ${file.reference.grizzly-http-servlet-1.8.6.3.jar}:\ - ${file.reference.grizzly-http-utils-1.8.6.3.jar}:\ - ${file.reference.grizzly-portunif-1.8.6.3.jar}:\ - ${file.reference.grizzly-rcm-1.8.6.3.jar}:\ - ${file.reference.grizzly-servlet-webserver-1.8.6.3.jar}:\ - ${file.reference.jaxb-api-2.1.jar}:\ - ${file.reference.jaxb-impl-2.1.jar}:\ - ${file.reference.jdom-1.0.jar}:\ - ${file.reference.je-3.3.62.jar}:\ - ${file.reference.jersey-atom-1.0.1.jar}:\ - ${file.reference.jersey-core-1.0.1.jar}:\ - ${file.reference.jersey-json-1.0.1.jar}:\ - ${file.reference.jersey-server-1.0.1.jar}:\ - ${file.reference.jettison-1.0.1.jar}:\ - ${file.reference.jetty-6.1.6rc0.jar}:\ - ${file.reference.jetty-util-6.1.6rc0.jar}:\ - ${file.reference.jsr250-api-1.0.jar}:\ - ${file.reference.jsr311-api-1.0.jar}:\ - ${file.reference.junit-3.8.2.jar}:\ - ${file.reference.libthrift-20080411p1.jar}:\ - ${file.reference.log4j-1.2.13.jar}:\ - ${file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar}:\ - ${file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar}:\ - ${file.reference.protobuf-java-2.0.3.jar}:\ - ${file.reference.rome-0.9.jar}:\ - ${file.reference.scala-library-2.7.3.jar}:\ - ${file.reference.scalatest-0.9.5.jar}:\ - ${file.reference.scalatest-0.9.5.zip}:\ - ${file.reference.servlet-api-2.5.jar}:\ - ${file.reference.slf4j-api-1.4.3.jar}:\ - ${file.reference.slf4j-log4j12-1.4.3.jar}:\ - ${file.reference.stax-api-1.0-2.jar}:\ - ${file.reference.velocity-1.5.jar}:\ - ${file.reference.voldemort-0.4a.jar}:\ - ${file.reference.voldemort-contrib-0.4a.jar}:\ - ${file.reference.xerces.jar}:\ - ${file.reference.zookeeper-3.1.0.jar} -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.source=1.5 -javac.target=1.5 -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir}:\ - ${libs.junit.classpath}:\ - ${libs.junit_4.classpath} -javadoc.additionalparam= -javadoc.author=false -javadoc.encoding=${source.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=false -javadoc.splitindex=true -javadoc.use=true -javadoc.version=false -javadoc.windowtitle= -main.class= -manifest.file=manifest.mf -meta.inf.dir=${src.dir}/META-INF -platform.active=default_platform -project.akka-kernel=../kernel -reference.akka-kernel.jar=${project.akka-kernel}/dist/akka-kernel.jar -run.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -# Space-separated list of JVM arguments used when running the project -# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value -# or test-sys-prop.name=value to set system properties for unit tests): -run.jvmargs= -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir} -source.encoding=UTF-8 -src.dir=${file.reference.main-java} -test.src.dir=${file.reference.test-java} +application.title=api-java +application.vendor=jboner +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/api-java.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +file.reference.activation-1.1.jar=../lib/activation-1.1.jar +file.reference.akka-util-java.jar=../lib/akka-util-java.jar +file.reference.antlr-3.1.3.jar=../lib/antlr-3.1.3.jar +file.reference.aopalliance-1.0.jar=../lib/aopalliance-1.0.jar +file.reference.asm-3.1.jar=../lib/asm-3.1.jar +file.reference.asm-all-2.2.1.jar=../lib/asm-all-2.2.1.jar +file.reference.cassandra.jar=../lib/cassandra.jar +file.reference.catalina-ant.jar=../lib/catalina-ant.jar +file.reference.cglib-2.2.jar=../lib/cglib-2.2.jar +file.reference.colt-1.2.0.jar=../lib/colt-1.2.0.jar +file.reference.commons-cli-1.1.jar=../lib/commons-cli-1.1.jar +file.reference.commons-codec-1.3.jar=../lib/commons-codec-1.3.jar +file.reference.commons-collections-3.2.1.jar=../lib/commons-collections-3.2.1.jar +file.reference.commons-dbcp-1.2.2.jar=../lib/commons-dbcp-1.2.2.jar +file.reference.commons-httpclient-3.1.jar=../lib/commons-httpclient-3.1.jar +file.reference.commons-io-1.3.2.jar=../lib/commons-io-1.3.2.jar +file.reference.commons-javaflow-1.0-SNAPSHOT.jar=../lib/commons-javaflow-1.0-SNAPSHOT.jar +file.reference.commons-lang-2.4.jar=../lib/commons-lang-2.4.jar +file.reference.commons-logging-1.0.4.jar=../lib/commons-logging-1.0.4.jar +file.reference.commons-math-1.1.jar=../lib/commons-math-1.1.jar +file.reference.commons-pool-1.4.jar=../lib/commons-pool-1.4.jar +file.reference.configgy-1.2.jar=../lib/configgy-1.2.jar +file.reference.google-collect-snapshot-20090211.jar=../lib/google-collect-snapshot-20090211.jar +file.reference.grizzly-framework-1.8.6.3.jar=../lib/grizzly-framework-1.8.6.3.jar +file.reference.grizzly-http-1.8.6.3.jar=../lib/grizzly-http-1.8.6.3.jar +file.reference.grizzly-http-servlet-1.8.6.3.jar=../lib/grizzly-http-servlet-1.8.6.3.jar +file.reference.grizzly-http-utils-1.8.6.3.jar=../lib/grizzly-http-utils-1.8.6.3.jar +file.reference.grizzly-portunif-1.8.6.3.jar=../lib/grizzly-portunif-1.8.6.3.jar +file.reference.grizzly-rcm-1.8.6.3.jar=../lib/grizzly-rcm-1.8.6.3.jar +file.reference.grizzly-servlet-webserver-1.8.6.3.jar=../lib/grizzly-servlet-webserver-1.8.6.3.jar +file.reference.guice-core-2.0-SNAPSHOT.jar=../lib/guice-core-2.0-SNAPSHOT.jar +file.reference.guice-jsr250-2.0-SNAPSHOT.jar=../lib/guice-jsr250-2.0-SNAPSHOT.jar +file.reference.high-scale-lib.jar=../lib/high-scale-lib.jar +file.reference.jaxb-api-2.1.jar=../lib/jaxb-api-2.1.jar +file.reference.jaxb-impl-2.1.jar=../lib/jaxb-impl-2.1.jar +file.reference.jdom-1.0.jar=../lib/jdom-1.0.jar +file.reference.je-3.3.62.jar=../lib/je-3.3.62.jar +file.reference.jersey-atom-1.0.1.jar=../lib/jersey-atom-1.0.1.jar +file.reference.jersey-core-1.0.1.jar=../lib/jersey-core-1.0.1.jar +file.reference.jersey-json-1.0.1.jar=../lib/jersey-json-1.0.1.jar +file.reference.jersey-server-1.0.1.jar=../lib/jersey-server-1.0.1.jar +file.reference.jettison-1.0.1.jar=../lib/jettison-1.0.1.jar +file.reference.jetty-6.1.6rc0.jar=../lib/jetty-6.1.6rc0.jar +file.reference.jetty-util-6.1.6rc0.jar=../lib/jetty-util-6.1.6rc0.jar +file.reference.JSAP-2.1.jar=../lib/JSAP-2.1.jar +file.reference.jsr250-api-1.0.jar=../lib/jsr250-api-1.0.jar +file.reference.jsr311-api-1.0.jar=../lib/jsr311-api-1.0.jar +file.reference.junit-3.8.2.jar=../lib/junit-3.8.2.jar +file.reference.junit-4.5.jar=../lib/junit-4.5.jar +file.reference.junit4runner-1.0-SNAPSHOT.jar=../lib/junit4runner-1.0-SNAPSHOT.jar +file.reference.libfb303.jar=../lib/libfb303.jar +file.reference.libthrift-20080411p1.jar=../lib/libthrift-20080411p1.jar +file.reference.libthrift.jar=../lib/libthrift.jar +file.reference.log4j-1.2.15.jar=../lib/log4j-1.2.15.jar +file.reference.lucene-core-2.2.0.jar=../lib/lucene-core-2.2.0.jar +file.reference.main-java=src/main/java +file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar=../lib/mina-core-2.0.0-M2-SNAPSHOT.jar +file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar=../lib/mina-integration-scala-2.0.0-M2-SNAPSHOT.jar +file.reference.pcj.jar=../lib/pcj.jar +file.reference.protobuf-java-2.0.3.jar=../lib/protobuf-java-2.0.3.jar +file.reference.rome-0.9.jar=../lib/rome-0.9.jar +file.reference.scala-library-2.7.3.jar=../lib/scala-library-2.7.3.jar +file.reference.scala-library-2.7.3.zip=../lib/scala-library-2.7.3.zip +file.reference.scalatest-0.9.5.jar=../lib/scalatest-0.9.5.jar +file.reference.scalatest-0.9.5.zip=../lib/scalatest-0.9.5.zip +file.reference.servlet-api-2.5.jar=../lib/servlet-api-2.5.jar +file.reference.slf4j-api-1.4.3.jar=../lib/slf4j-api-1.4.3.jar +file.reference.slf4j-log4j12-1.4.3.jar=../lib/slf4j-log4j12-1.4.3.jar +file.reference.stax-api-1.0-2.jar=../lib/stax-api-1.0-2.jar +file.reference.stringtemplate-3.0.jar=../lib/stringtemplate-3.0.jar +file.reference.test-java=src/test/java +file.reference.velocity-1.5.jar=../lib/velocity-1.5.jar +file.reference.voldemort-0.4a.jar=../lib/voldemort-0.4a.jar +file.reference.voldemort-contrib-0.4a.jar=../lib/voldemort-contrib-0.4a.jar +file.reference.xerces.jar=../lib/xerces.jar +file.reference.zookeeper-3.1.0.jar=../lib/zookeeper-3.1.0.jar +includes=** +jar.compress=false +javac.classpath=\ + ${reference.akka-kernel.jar}:\ + ${file.reference.activation-1.1.jar}:\ + ${file.reference.akka-util-java.jar}:\ + ${file.reference.antlr-3.1.3.jar}:\ + ${file.reference.aopalliance-1.0.jar}:\ + ${file.reference.asm-3.1.jar}:\ + ${file.reference.asm-all-2.2.1.jar}:\ + ${file.reference.cassandra.jar}:\ + ${file.reference.catalina-ant.jar}:\ + ${file.reference.cglib-2.2.jar}:\ + ${file.reference.colt-1.2.0.jar}:\ + ${file.reference.commons-cli-1.1.jar}:\ + ${file.reference.commons-codec-1.3.jar}:\ + ${file.reference.commons-collections-3.2.1.jar}:\ + ${file.reference.commons-dbcp-1.2.2.jar}:\ + ${file.reference.commons-httpclient-3.1.jar}:\ + ${file.reference.commons-io-1.3.2.jar}:\ + ${file.reference.commons-javaflow-1.0-SNAPSHOT.jar}:\ + ${file.reference.commons-lang-2.4.jar}:\ + ${file.reference.commons-logging-1.0.4.jar}:\ + ${file.reference.commons-math-1.1.jar}:\ + ${file.reference.commons-pool-1.4.jar}:\ + ${file.reference.configgy-1.2.jar}:\ + ${file.reference.google-collect-snapshot-20090211.jar}:\ + ${file.reference.grizzly-framework-1.8.6.3.jar}:\ + ${file.reference.grizzly-http-1.8.6.3.jar}:\ + ${file.reference.grizzly-http-servlet-1.8.6.3.jar}:\ + ${file.reference.grizzly-http-utils-1.8.6.3.jar}:\ + ${file.reference.grizzly-portunif-1.8.6.3.jar}:\ + ${file.reference.grizzly-rcm-1.8.6.3.jar}:\ + ${file.reference.grizzly-servlet-webserver-1.8.6.3.jar}:\ + ${file.reference.guice-core-2.0-SNAPSHOT.jar}:\ + ${file.reference.guice-jsr250-2.0-SNAPSHOT.jar}:\ + ${file.reference.high-scale-lib.jar}:\ + ${file.reference.jaxb-api-2.1.jar}:\ + ${file.reference.jaxb-impl-2.1.jar}:\ + ${file.reference.jdom-1.0.jar}:\ + ${file.reference.je-3.3.62.jar}:\ + ${file.reference.jersey-atom-1.0.1.jar}:\ + ${file.reference.jersey-core-1.0.1.jar}:\ + ${file.reference.jersey-json-1.0.1.jar}:\ + ${file.reference.jersey-server-1.0.1.jar}:\ + ${file.reference.jettison-1.0.1.jar}:\ + ${file.reference.jetty-6.1.6rc0.jar}:\ + ${file.reference.jetty-util-6.1.6rc0.jar}:\ + ${file.reference.JSAP-2.1.jar}:\ + ${file.reference.jsr250-api-1.0.jar}:\ + ${file.reference.jsr311-api-1.0.jar}:\ + ${file.reference.junit-3.8.2.jar}:\ + ${file.reference.junit-4.5.jar}:\ + ${file.reference.junit4runner-1.0-SNAPSHOT.jar}:\ + ${file.reference.libfb303.jar}:\ + ${file.reference.libthrift-20080411p1.jar}:\ + ${file.reference.libthrift.jar}:\ + ${file.reference.log4j-1.2.15.jar}:\ + ${file.reference.lucene-core-2.2.0.jar}:\ + ${file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar}:\ + ${file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar}:\ + ${file.reference.pcj.jar}:\ + ${file.reference.protobuf-java-2.0.3.jar}:\ + ${file.reference.rome-0.9.jar}:\ + ${file.reference.scala-library-2.7.3.jar}:\ + ${file.reference.scala-library-2.7.3.zip}:\ + ${file.reference.scalatest-0.9.5.jar}:\ + ${file.reference.scalatest-0.9.5.zip}:\ + ${file.reference.servlet-api-2.5.jar}:\ + ${file.reference.slf4j-api-1.4.3.jar}:\ + ${file.reference.slf4j-log4j12-1.4.3.jar}:\ + ${file.reference.stax-api-1.0-2.jar}:\ + ${file.reference.stringtemplate-3.0.jar}:\ + ${file.reference.velocity-1.5.jar}:\ + ${file.reference.voldemort-0.4a.jar}:\ + ${file.reference.voldemort-contrib-0.4a.jar}:\ + ${file.reference.xerces.jar}:\ + ${file.reference.zookeeper-3.1.0.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.source=1.5 +javac.target=1.5 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir}:\ + ${libs.junit.classpath}:\ + ${libs.junit_4.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +main.class= +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +platform.active=default_platform +project.akka-kernel=../kernel +reference.akka-kernel.jar=${project.akka-kernel}/dist/akka-kernel.jar +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=${file.reference.main-java} +test.src.dir=${file.reference.test-java} diff --git a/api-java/nbproject/project.xml b/api-java/nbproject/project.xml index cd805e1441..d7da070731 100755 --- a/api-java/nbproject/project.xml +++ b/api-java/nbproject/project.xml @@ -1,26 +1,26 @@ - - - org.netbeans.modules.java.j2seproject - - - api-java - 1.6.5 - - - - - - - - - - akka-kernel - jar - - jar - clean - jar - - - - + + + org.netbeans.modules.java.j2seproject + + + api-java + 1.6.5 + + + + + + + + + + akka-kernel + jar + + jar + clean + jar + + + + diff --git a/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java b/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java index 89e2bab034..4bbec35a7e 100755 --- a/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java +++ b/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java @@ -103,58 +103,58 @@ public class ActiveObjectGuiceConfiguratorTest extends TestCase { } catch (RuntimeException e) { } } +} - interface Foo { - public String foo(String msg); - @oneway public void bar(String msg); - public void longRunning(); - public void throwsException(); - public Bar getBar(); +interface Foo { + public String foo(String msg); + @oneway public void bar(String msg); + public void longRunning(); + public void throwsException(); + public Bar getBar(); +} + +class FooImpl implements Foo { + @Inject private Bar bar; + public Bar getBar() { + return bar; } - - class FooImpl implements Foo { - @Inject private Bar bar; - public Bar getBar() { - return bar; - } - public String foo(String msg) { - return msg + "return_foo "; - } - public void bar(String msg) { - bar.bar(msg); - } - public void longRunning() { - try { - Thread.sleep(10000); - } catch (InterruptedException e) { - } - } - public void throwsException() { - throw new RuntimeException("expected"); + public String foo(String msg) { + return msg + "return_foo "; + } + public void bar(String msg) { + bar.bar(msg); + } + public void longRunning() { + try { + Thread.sleep(10000); + } catch (InterruptedException e) { } } - - interface Bar { - @oneway void bar(String msg); - Ext getExt(); + public void throwsException() { + throw new RuntimeException("expected"); } +} - class BarImpl implements Bar { - @Inject private Ext ext; - public Ext getExt() { - return ext; - } - public void bar(String msg) { - } +interface Bar { + @oneway void bar(String msg); + Ext getExt(); +} + +class BarImpl implements Bar { + @Inject private Ext ext; + public Ext getExt() { + return ext; } - - interface Ext { - void ext(); + public void bar(String msg) { } +} - class ExtImpl implements Ext { - public void ext() { - } +interface Ext { + void ext(); +} + +class ExtImpl implements Ext { + public void ext() { } } diff --git a/api-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java b/api-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java index 39e5c21333..33280f20be 100755 --- a/api-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java +++ b/api-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java @@ -14,7 +14,6 @@ import com.google.inject.Scopes; import junit.framework.TestCase; - public class InMemoryStateTest extends TestCase { static String messageLog = ""; @@ -22,57 +21,50 @@ public class InMemoryStateTest extends TestCase { protected void setUp() { conf.configureActiveObjects( - new RestartStrategy(new AllForOne(), 3, 5000), new Component[]{ - new Component( - Stateful.class, - StatefulImpl.class, - new LifeCycle(new Permanent(), 1000), - 10000000), - new Component( - Failer.class, - FailerImpl.class, - new LifeCycle(new Permanent(), 1000), - 1000), - new Component( - Clasher.class, - ClasherImpl.class, - new LifeCycle(new Permanent(), 1000), - 100000) + new RestartStrategy(new AllForOne(), 3, 5000), + new Component[] { + new Component(InMemStateful.class, InMemStatefulImpl.class, new LifeCycle(new Permanent(), 1000), 10000000), + new Component(InMemFailer.class, InMemFailerImpl.class, new LifeCycle(new Permanent(), 1000), 1000), + new Component(InMemClasher.class, InMemClasherImpl.class, new LifeCycle(new Permanent(), 1000), 100000) }).inject().supervise(); } -// public void testShouldNotRollbackStateForStatefulServerInCaseOfSuccess() { -// Stateful stateful = conf.getActiveObject(Stateful.class); -// stateful.setState("stateful", "init"); // set init state -// stateful.success("stateful", "new state"); // transactional -// assertEquals("new state", stateful.getState("stateful")); -// } -// -// public void testShouldRollbackStateForStatefulServerInCaseOfFailure() { -// Stateful stateful = conf.getActiveObject(Stateful.class); -// stateful.setState("stateful", "init"); // set init state -// -// Failer failer = conf.getActiveObject(Failer.class); -// try { -// stateful.failure("stateful", "new state", failer); // call failing transactional method -// fail("should have thrown an exception"); -// } catch (RuntimeException e) { } // expected -// assertEquals("init", stateful.getState("stateful")); // check that state is == init state -// } + // public void testShouldNotRollbackStateForStatefulServerInCaseOfSuccess() { + // Stateful stateful = conf.getActiveObject(Stateful.class); + // stateful.setState("stateful", "init"); // set init state + // stateful.success("stateful", "new state"); // transactional + // assertEquals("new state", stateful.getState("stateful")); + // } + // + // public void testShouldRollbackStateForStatefulServerInCaseOfFailure() { + // Stateful stateful = conf.getActiveObject(Stateful.class); + // stateful.setState("stateful", "init"); // set init state + // + // Failer failer = conf.getActiveObject(Failer.class); + // try { + // stateful.failure("stateful", "new state", failer); // call failing + // transactional method + // fail("should have thrown an exception"); + // } catch (RuntimeException e) { } // expected + // assertEquals("init", stateful.getState("stateful")); // check that state is + // == init state + // } public void testShouldRollbackStateForStatefulServerInCaseOfMessageClash() { - Stateful stateful = conf.getActiveObject(Stateful.class); + InMemStateful stateful = conf.getActiveObject(InMemStateful.class); stateful.setState("stateful", "init"); // set init state - Clasher clasher = conf.getActiveObject(Clasher.class); + InMemClasher clasher = conf.getActiveObject(InMemClasher.class); clasher.setState("clasher", "init"); // set init state -// try { -// stateful.clashOk("stateful", "new state", clasher); -// } catch (RuntimeException e) { } // expected -// assertEquals("new state", stateful.getState("stateful")); // check that state is == init state -// assertEquals("was here", clasher.getState("clasher")); // check that state is == init state + // try { + // stateful.clashOk("stateful", "new state", clasher); + // } catch (RuntimeException e) { } // expected + // assertEquals("new state", stateful.getState("stateful")); // check that + // state is == init state + // assertEquals("was here", clasher.getState("clasher")); // check that + // state is == init state try { stateful.clashNotOk("stateful", "new state", clasher); @@ -80,113 +72,111 @@ public class InMemoryStateTest extends TestCase { } catch (RuntimeException e) { System.out.println(e); } // expected - assertEquals("init", stateful.getState("stateful")); // check that state is == init state - //assertEquals("init", clasher.getState("clasher")); // check that state is == init state - } - - - interface Stateful { - // transactional - @transactional - public void success(String key, String msg); - - @transactional - public void failure(String key, String msg, Failer failer); - - @transactional - public void clashOk(String key, String msg, Clasher clasher); - - @transactional - public void clashNotOk(String key, String msg, Clasher clasher); - - // non-transactional - public String getState(String key); - - public void setState(String key, String value); - } - - class StatefulImpl implements Stateful { - @state - private - InMemoryState state = new InMemoryState(); - - public String getState(String key) { - return (String) state.get(key); - } - - public void setState(String key, String msg) { - state.put(key, msg); - } - - public void success(String key, String msg) { - state.put(key, msg); - } - - public void failure(String key, String msg, Failer failer) { - state.put(key, msg); - failer.fail(); - } - - public void clashOk(String key, String msg, Clasher clasher) { - state.put(key, msg); - clasher.clash(); - } - - public void clashNotOk(String key, String msg, Clasher clasher) { - state.put(key, msg); - clasher.clash(); - clasher.clash(); - } - } - - interface Failer { - public void fail(); - } - - class FailerImpl implements Failer { - public void fail() { - throw new RuntimeException("expected"); - } - } - - interface Clasher { - public void clash(); - - public String getState(String key); - - public void setState(String key, String value); - } - - class ClasherImpl implements Clasher { - @state - private InMemoryState state = new InMemoryState(); - - public String getState(String key) { - return (String) state.get(key); - } - - public void setState(String key, String msg) { - state.put(key, msg); - } - - public void clash() { - state.put("clasher", "was here"); - // spend some time here - for (long i = 0; i < 1000000000; i++) { - for (long j = 0; j < 10000000; j++) { - j += i; - } - } - - // FIXME: this statement gives me this error: - // se.scalablesolutions.akka.kernel.ActiveObjectException: - // Unexpected message [!(scala.actors.Channel@c2b2f6,ErrRef[Right(null)])] to - // [GenericServer[se.scalablesolutions.akka.api.StatefulImpl]] from - // [GenericServer[se.scalablesolutions.akka.api.ClasherImpl]]] - //try { Thread.sleep(1000); } catch (InterruptedException e) {} - } + assertEquals("init", stateful.getState("stateful")); // check that state is + // == init state + // assertEquals("init", clasher.getState("clasher")); // check that state is + // == init state } } +interface InMemStateful { + // transactional + @transactional + public void success(String key, String msg); + @transactional + public void failure(String key, String msg, InMemFailer failer); + @transactional + public void clashOk(String key, String msg, InMemClasher clasher); + + @transactional + public void clashNotOk(String key, String msg, InMemClasher clasher); + + // non-transactional + public String getState(String key); + + public void setState(String key, String value); +} + +class InMemStatefulImpl implements InMemStateful { + @state + private InMemoryState state = new InMemoryState(); + + public String getState(String key) { + return (String) state.get(key); + } + + public void setState(String key, String msg) { + state.put(key, msg); + } + + public void success(String key, String msg) { + state.put(key, msg); + } + + public void failure(String key, String msg, InMemFailer failer) { + state.put(key, msg); + failer.fail(); + } + + public void clashOk(String key, String msg, InMemClasher clasher) { + state.put(key, msg); + clasher.clash(); + } + + public void clashNotOk(String key, String msg, InMemClasher clasher) { + state.put(key, msg); + clasher.clash(); + clasher.clash(); + } +} + +interface InMemFailer { + public void fail(); +} + +class InMemFailerImpl implements InMemFailer { + public void fail() { + throw new RuntimeException("expected"); + } +} + +interface InMemClasher { + public void clash(); + + public String getState(String key); + + public void setState(String key, String value); +} + +class InMemClasherImpl implements InMemClasher { + @state + private InMemoryState state = new InMemoryState(); + + public String getState(String key) { + return (String) state.get(key); + } + + public void setState(String key, String msg) { + state.put(key, msg); + } + + public void clash() { + state.put("clasher", "was here"); + // spend some time here + for (long i = 0; i < 1000000000; i++) { + for (long j = 0; j < 10000000; j++) { + j += i; + } + } + + // FIXME: this statement gives me this error: + // se.scalablesolutions.akka.kernel.ActiveObjectException: + // Unexpected message [!(scala.actors.Channel@c2b2f6,ErrRef[Right(null)])] + // to + // [GenericServer[se.scalablesolutions.akka.api.StatefulImpl]] from + // [GenericServer[se.scalablesolutions.akka.api.ClasherImpl]]] + // try { Thread.sleep(1000); } catch (InterruptedException e) {} + } +} diff --git a/api-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateTest.java b/api-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateTest.java index d70ee70049..336d8cc939 100755 --- a/api-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateTest.java +++ b/api-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateTest.java @@ -14,7 +14,6 @@ import com.google.inject.Scopes; import junit.framework.TestCase; - public class PersistentStateTest extends TestCase { static String messageLog = ""; @@ -22,131 +21,121 @@ public class PersistentStateTest extends TestCase { protected void setUp() { conf.configureActiveObjects( - new RestartStrategy(new AllForOne(), 3, 5000), new Component[]{ - new Component( - Stateful.class, - StatefulImpl.class, - new LifeCycle(new Permanent(), 1000), - 10000000), - new Component( - Failer.class, - FailerImpl.class, - new LifeCycle(new Permanent(), 1000), - 1000), - new Component( - Clasher.class, - ClasherImpl.class, - new LifeCycle(new Permanent(), 1000), - 100000) + new RestartStrategy(new AllForOne(), 3, 5000), + new Component[] { + new Component(PersistentStateful.class, PersistentStatefulImpl.class, new LifeCycle(new Permanent(), 1000), 10000000), + new Component(PersistentFailer.class, PersistentFailerImpl.class, new LifeCycle(new Permanent(), 1000), 1000), + new Component(PersistentClasher.class, PersistentClasherImpl.class, new LifeCycle(new Permanent(), 1000), 100000) }).inject().supervise(); } public void testShouldNotRollbackStateForStatefulServerInCaseOfSuccess() { - Stateful stateful = conf.getActiveObject(Stateful.class); + PersistentStateful stateful = conf.getActiveObject(PersistentStateful.class); stateful.setState("stateful", "init"); // set init state stateful.success("stateful", "new state"); // transactional assertEquals("new state", stateful.getState("stateful")); } +} - interface Stateful { - // transactional - @transactional - public void success(String key, String msg); +interface PersistentStateful { + // transactional + @transactional + public void success(String key, String msg); - @transactional - public void failure(String key, String msg, Failer failer); + @transactional + public void failure(String key, String msg, PersistentFailer failer); - @transactional - public void clashOk(String key, String msg, Clasher clasher); + @transactional + public void clashOk(String key, String msg, PersistentClasher clasher); - @transactional - public void clashNotOk(String key, String msg, Clasher clasher); + @transactional + public void clashNotOk(String key, String msg, PersistentClasher clasher); - // non-transactional - public String getState(String key); + // non-transactional + public String getState(String key); - public void setState(String key, String value); + public void setState(String key, String value); +} + +class PersistentStatefulImpl implements PersistentStateful { + @state + private InMemoryState state = new InMemoryState(); + + public String getState(String key) { + return (String) state.get(key); } - class StatefulImpl implements Stateful { - @state - private InMemoryState state = new InMemoryState(); - - public String getState(String key) { - return (String) state.get(key); - } - - public void setState(String key, String msg) { - state.put(key, msg); - } - - public void success(String key, String msg) { - state.put(key, msg); - } - - public void failure(String key, String msg, Failer failer) { - state.put(key, msg); - failer.fail(); - } - - public void clashOk(String key, String msg, Clasher clasher) { - state.put(key, msg); - clasher.clash(); - } - - public void clashNotOk(String key, String msg, Clasher clasher) { - state.put(key, msg); - clasher.clash(); - clasher.clash(); - } + public void setState(String key, String msg) { + state.put(key, msg); } - interface Failer { - public void fail(); + public void success(String key, String msg) { + state.put(key, msg); } - class FailerImpl implements Failer { - public void fail() { - throw new RuntimeException("expected"); - } + public void failure(String key, String msg, PersistentFailer failer) { + state.put(key, msg); + failer.fail(); } - interface Clasher { - public void clash(); - - public String getState(String key); - - public void setState(String key, String value); + public void clashOk(String key, String msg, PersistentClasher clasher) { + state.put(key, msg); + clasher.clash(); } - class ClasherImpl implements Clasher { - @state - private InMemoryState state = new InMemoryState(); + public void clashNotOk(String key, String msg, PersistentClasher clasher) { + state.put(key, msg); + clasher.clash(); + clasher.clash(); + } +} - public String getState(String key) { - return (String) state.get(key); - } +interface PersistentFailer { + public void fail(); +} - public void setState(String key, String msg) { - state.put(key, msg); - } +class PersistentFailerImpl implements PersistentFailer { + public void fail() { + throw new RuntimeException("expected"); + } +} - public void clash() { - state.put("clasher", "was here"); - // spend some time here - for (long i = 0; i < 1000000000; i++) { - for (long j = 0; j < 10000000; j++) { - j += i; - } +interface PersistentClasher { + public void clash(); + + public String getState(String key); + + public void setState(String key, String value); +} + +class PersistentClasherImpl implements PersistentClasher { + @state + private InMemoryState state = new InMemoryState(); + + public String getState(String key) { + return (String) state.get(key); + } + + public void setState(String key, String msg) { + state.put(key, msg); + } + + public void clash() { + state.put("clasher", "was here"); + // spend some time here + for (long i = 0; i < 1000000000; i++) { + for (long j = 0; j < 10000000; j++) { + j += i; } - - // FIXME: this statement gives me this error: - // se.scalablesolutions.akka.kernel.ActiveObjectException: - // Unexpected message [!(scala.actors.Channel@c2b2f6,ErrRef[Right(null)])] to - // [GenericServer[se.scalablesolutions.akka.api.StatefulImpl]] from - // [GenericServer[se.scalablesolutions.akka.api.ClasherImpl]]] - //try { Thread.sleep(1000); } catch (InterruptedException e) {} } + + // FIXME: this statement gives me this error: + // se.scalablesolutions.akka.kernel.ActiveObjectException: + // Unexpected message [!(scala.actors.Channel@c2b2f6,ErrRef[Right(null)])] + // to + // [GenericServer[se.scalablesolutions.akka.api.StatefulImpl]] from + // [GenericServer[se.scalablesolutions.akka.api.ClasherImpl]]] + // try { Thread.sleep(1000); } catch (InterruptedException e) {} } } \ No newline at end of file diff --git a/bin/start-akka-server.sh b/bin/start-akka-server.sh index cb079b69fd..2095d4d73f 100755 --- a/bin/start-akka-server.sh +++ b/bin/start-akka-server.sh @@ -39,4 +39,4 @@ JVM_OPTS=" \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false" -java $JVM_OPTS $STORAGE_OPTS -cp $CLASSPATH se.scalablesolutions.akka.Boot se.scalablesolutions.akka.kernel.Kernel ${1} +java $JVM_OPTS $STORAGE_OPTS -cp $CLASSPATH se.scalablesolutions.akka.Boot se.scalablesolutions.akka.kernel.Kernel ${1} \ No newline at end of file diff --git a/buildfile b/buildfile index 51da0dda22..5d8ab018c3 100644 --- a/buildfile +++ b/buildfile @@ -22,25 +22,33 @@ JERSEY = ['com.sun.jersey:jersey-core:jar:1.0.1', 'com.sun.jersey:jersey-json:jar:1.0.1', 'com.sun.jersey:jersey-atom:jar:1.0.1', 'javax.ws.rs:jsr311-api:jar:1.0'] -VOLDEMORT = ['voldemort:voldemort:jar:0.4a', - 'voldemort:voldemort-contrib:jar:0.4a'] -ZOOKEEPER = 'org.apache:zookeeper:jar:3.1.0' GRIZZLY = 'com.sun.grizzly:grizzly-servlet-webserver:jar:1.8.6.3' -MINA_CORE = 'com.assembla.scala.mina:mina-core:jar:2.0.0-M2-SNAPSHOT' -MINA_SCALA = 'com.assembla.scala.mina:mina-integration-scala:jar:2.0.0-M2-SNAPSHOT' - +NETTY = 'org.jboss.netty:netty:jar:3.1.0.BETA2' +CASSANDRA = 'org.apache.cassandra:cassandra:jar:1.0' +THRIFT = 'com.facebook:thrift:jar:1.0' +FB303 = 'com.facebook:fb303:jar:1.0' CONFIGGY = 'net.lag:configgy:jar:1.2' + +JSR_250 = 'javax.annotation:jsr250-api:jar:1.0' + SLF4J = ['org.slf4j:slf4j-log4j12:jar:1.4.3', 'org.slf4j:slf4j-api:jar:1.4.3', 'log4j:log4j:jar:1.2.13'] JDOM = 'jdom:jdom:jar:1.0' +CGLIB = 'cglib:cglib-nodep:jar:2.1_3' +AOPALLIANCE = 'aopalliance:aopalliance:jar:1.0' GOOGLE_COLLECT = 'com.google.code.google-collections:google-collect:jar:snapshot-20080530' SCALA = 'org.scala-lang:scala-library:jar:2.7.3' SCALATEST = 'org.scala-tools.testing:scalatest:jar:0.9.5' JUNIT4 = 'junit:junit:jar:4.5' -JUNIT3 = 'junit:junit:jar:3.8.2' -#SCALATEST_JUNIT4_MVN_PLUGIN = 'com.jteigen.scalatest:junit4runner:jar:1.0-SNAPSHOT' +JUNIT4RUNNER = 'com.jteigen.scalatest:junit4runner:jar:1.0' + +#VOLDEMORT = ['voldemort:voldemort:jar:0.4a', +# 'voldemort:voldemort-contrib:jar:0.4a'] +#MINA_CORE = 'com.assembla.scala.mina:mina-core:jar:2.0.0-M2-SNAPSHOT' +#MINA_SCALA = 'com.assembla.scala.mina:mina-integration-scala:jar:2.0.0-M2-SNAPSHOT' +#ZOOKEEPER = 'org.apache:zookeeper:jar:3.1.0' desc 'The Akka Actor Kernel' define 'akka' do @@ -55,16 +63,17 @@ define 'akka' do package :jar end - desc 'Akka Actor kernel core implementation' + desc 'Akka Actor Kernel core implementation' define 'kernel' do - compile.with(AKKA_UTIL_JAVA, GUICEYFRUIT, MINA_CORE, MINA_SCALA, JERSEY, VOLDEMORT, ZOOKEEPER, SLF4J, GRIZZLY, CONFIGGY) - test.using :scalatest + compile.with(AKKA_UTIL_JAVA, GUICEYFRUIT, NETTY, JERSEY, GRIZZLY, CASSANDRA, THRIFT, FB303, SLF4J, CONFIGGY, JUNIT4RUNNER, JUNIT4, SCALATEST) + test.using :junit package :jar end desc 'Akka Java API' define 'api-java' do - compile.with(AKKA_KERNEL, AKKA_UTIL_JAVA, GUICEYFRUIT) + compile.with(AKKA_KERNEL, AKKA_UTIL_JAVA, NETTY, JERSEY, GRIZZLY, CASSANDRA, THRIFT, FB303, SLF4J, CONFIGGY, GUICEYFRUIT, SCALA, GOOGLE_COLLECT, AOPALLIANCE, CGLIB, JSR_250) + test.using :junit package :jar end @@ -74,20 +83,12 @@ define 'akka' do # test.using :scalatest # package :jar #end - #desc 'Implementation of Erlangs Supervisor and GenericServer behaviors' - #define 'supervisor' do - # compile.with(CONFIGGY) - # test.using :scalatest - # package :jar - #end - - + package(:zip).include 'README' package(:zip).include 'bin/*', :path=>'bin' package(:zip).include 'config/*', :path=>'config' package(:zip).include 'kernel/lib/*', :path=>'lib' package(:zip).include 'kernel/target/*.jar', :path=>'lib' - #package(:zip).include 'supervisor/target/*.jar', :path=>'lib' package(:zip).include 'api-java/target/*.jar', :path=>'lib' package(:zip).include 'util-java/target/*.jar', :path=>'lib' @@ -100,7 +101,7 @@ define 'akka' do # uri = URI("file://./lib") # uri.upload file('kernel') - cp = [SCALA, GUICEYFRUIT, JERSEY, VOLDEMORT, GOOGLE_COLLECT, JDOM, ZOOKEEPER, SLF4J, GRIZZLY, CONFIGGY, project('kernel').package(:jar)] + cp = [SCALA, GUICEYFRUIT, JERSEY, CASSANDRA, GOOGLE_COLLECT, JDOM, ZOOKEEPER, SLF4J, GRIZZLY, CONFIGGY, project('kernel').package(:jar)] # Java.java('se.scalablesolutions.akka.kernel.Kernel', {:classpath => '-cp ' + cp}) # cp = FileList[_('lib/*')].join(File::PATH_SEPARATOR) puts "Running with classpath:\n" + cp diff --git a/config/log4j.properties b/config/log4j.properties index c03de259b2..a737e5d745 100755 --- a/config/log4j.properties +++ b/config/log4j.properties @@ -2,7 +2,7 @@ # and the pattern to %c instead of %l. (%l is slower.) # output messages into a rolling log file as well as stdout -log4j.rootLogger=DEBUG,stdout,R +log4j.rootLogger=ERROR,stdout,R # stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender diff --git a/config/storage-conf.xml b/config/storage-conf.xml index 88bfa99c16..5a0c2d89d8 100755 --- a/config/storage-conf.xml +++ b/config/storage-conf.xml @@ -19,22 +19,22 @@ 9160 256 7002 - ./storage/system - ./storage/commitlog + /Users/jboner/src/scala/akka/storage/system + /Users/jboner/src/scala/akka/storage/commitlog 128 127.0.0.1:12000 - ./storage/data + /Users/jboner/src/scala/akka/storage/data - ./storage/callouts - ./storage/bootstrap - ./storage/staging + /Users/jboner/src/scala/akka/storage/callouts + /Users/jboner/src/scala/akka/storage/bootstrap + /Users/jboner/src/scala/akka/storage/staging false - +
diff --git a/kernel/.classpath b/kernel/.classpath index 558ebb7040..4d757200a6 100644 --- a/kernel/.classpath +++ b/kernel/.classpath @@ -76,7 +76,6 @@ - diff --git a/kernel/kernel.iml b/kernel/kernel.iml index 5e8568e938..49b183109e 100755 --- a/kernel/kernel.iml +++ b/kernel/kernel.iml @@ -1,677 +1,667 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kernel/nbproject/build-impl.xml b/kernel/nbproject/build-impl.xml index 688fb5e88a..0bd16f2c24 100644 --- a/kernel/nbproject/build-impl.xml +++ b/kernel/nbproject/build-impl.xml @@ -1,709 +1,713 @@ - - - - - - - - - - - - - - - - - - -You must set SCALA_HOME or environment property and append "-J-Dscala.home=scalahomepath" -property to the end of "netbeans_default_options" in NetBeansInstallationPath/etc/netbeans.conf to point to -Scala installation directory. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set test.src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - - - - - - java -cp "${run.classpath.with.dist.jar}" ${main.class} - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +You must set SCALA_HOME or environment property and append "-J-Dscala.home=scalahomepath" +property to the end of "netbeans_default_options" in NetBeansInstallationPath/etc/netbeans.conf to point to +Scala installation directory. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + diff --git a/kernel/nbproject/genfiles.properties b/kernel/nbproject/genfiles.properties index 18265baff3..395289ec72 100644 --- a/kernel/nbproject/genfiles.properties +++ b/kernel/nbproject/genfiles.properties @@ -1,8 +1,8 @@ -build.xml.data.CRC32=e25238a8 -build.xml.script.CRC32=c2aecc70 -build.xml.stylesheet.CRC32=ca9d572e -# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. -# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=4c75645b -nbproject/build-impl.xml.script.CRC32=a2fb0c36 -nbproject/build-impl.xml.stylesheet.CRC32=371897b9 +build.xml.data.CRC32=e25238a8 +build.xml.script.CRC32=c2aecc70 +build.xml.stylesheet.CRC32=ca9d572e +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=e25238a8 +nbproject/build-impl.xml.script.CRC32=749b9ab1 +nbproject/build-impl.xml.stylesheet.CRC32=371897b9@1.3.0 diff --git a/kernel/nbproject/private/private.properties b/kernel/nbproject/private/private.properties index 7b3c25d6aa..54bce4649c 100644 --- a/kernel/nbproject/private/private.properties +++ b/kernel/nbproject/private/private.properties @@ -1,6 +1,5 @@ -do.depend=false -do.jar=false -javac.debug=true -javadoc.preview=true -jaxws.endorsed.dir=C:\\Program Files\\NetBeans 6.5.1\\java2\\modules\\ext\\jaxws21\\api -user.properties.file=C:\\Documents and Settings\\jboner\\.netbeans\\6.5\\build.properties +do.depend=false +do.jar=false +javac.debug=true +javadoc.preview=true +user.properties.file=/Users/jboner/.netbeans/dev/build.properties diff --git a/kernel/nbproject/private/private.xml b/kernel/nbproject/private/private.xml index cc2c0e57c4..c1f155a782 100644 --- a/kernel/nbproject/private/private.xml +++ b/kernel/nbproject/private/private.xml @@ -1,4 +1,4 @@ - - - - + + + + diff --git a/kernel/nbproject/project.properties b/kernel/nbproject/project.properties index 2ab8028fef..16acf8f86e 100644 --- a/kernel/nbproject/project.properties +++ b/kernel/nbproject/project.properties @@ -1,216 +1,222 @@ -application.title=akka-kernel -application.vendor=jboner -build.classes.dir=${build.dir}/classes -build.classes.excludes=**/*.java,**/*.form,**/*.scala -# This directory is removed when the project is cleaned: -build.dir=build -build.generated.dir=${build.dir}/generated -# Only compile against the classpath explicitly listed here: -build.sysclasspath=ignore -build.test.classes.dir=${build.dir}/test/classes -build.test.results.dir=${build.dir}/test/results -debug.classpath=\ - ${run.classpath} -debug.test.classpath=\ - ${run.test.classpath} -# This directory is removed when the project is cleaned: -dist.dir=dist -dist.jar=${dist.dir}/akka-kernel.jar -dist.javadoc.dir=${dist.dir}/javadoc -excludes= -file.reference.activation-1.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\activation-1.1.jar -file.reference.akka-util-java.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\akka-util-java.jar -file.reference.antlr-3.1.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\antlr-3.1.3.jar -file.reference.aopalliance-1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\aopalliance-1.0.jar -file.reference.asm-3.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\asm-3.1.jar -file.reference.asm-all-2.2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\asm-all-2.2.1.jar -file.reference.cassandra.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\cassandra.jar -file.reference.catalina-ant.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\catalina-ant.jar -file.reference.cglib-2.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\cglib-2.2.jar -file.reference.colt-1.2.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\colt-1.2.0.jar -file.reference.commons-cli-1.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-cli-1.1.jar -file.reference.commons-codec-1.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-codec-1.3.jar -file.reference.commons-collections-3.2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-collections-3.2.1.jar -file.reference.commons-dbcp-1.2.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-dbcp-1.2.2.jar -file.reference.commons-httpclient-3.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-httpclient-3.1.jar -file.reference.commons-io-1.3.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-io-1.3.2.jar -file.reference.commons-javaflow-1.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-javaflow-1.0-SNAPSHOT.jar -file.reference.commons-lang-2.4.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-lang-2.4.jar -file.reference.commons-logging-1.0.4.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-logging-1.0.4.jar -file.reference.commons-math-1.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-math-1.1.jar -file.reference.commons-pool-1.4.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-pool-1.4.jar -file.reference.configgy-1.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\configgy-1.2.jar -file.reference.google-collect-snapshot-20090211.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\google-collect-snapshot-20090211.jar -file.reference.grizzly-framework-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-framework-1.8.6.3.jar -file.reference.grizzly-http-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-http-1.8.6.3.jar -file.reference.grizzly-http-servlet-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-http-servlet-1.8.6.3.jar -file.reference.grizzly-http-utils-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-http-utils-1.8.6.3.jar -file.reference.grizzly-portunif-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-portunif-1.8.6.3.jar -file.reference.grizzly-rcm-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-rcm-1.8.6.3.jar -file.reference.grizzly-servlet-webserver-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-servlet-webserver-1.8.6.3.jar -file.reference.guice-core-2.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\guice-core-2.0-SNAPSHOT.jar -file.reference.guice-jsr250-2.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\guice-jsr250-2.0-SNAPSHOT.jar -file.reference.high-scale-lib.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\high-scale-lib.jar -file.reference.jaxb-api-2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jaxb-api-2.1.jar -file.reference.jaxb-impl-2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jaxb-impl-2.1.jar -file.reference.jdom-1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jdom-1.0.jar -file.reference.je-3.3.62.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\je-3.3.62.jar -file.reference.jersey-atom-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jersey-atom-1.0.1.jar -file.reference.jersey-core-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jersey-core-1.0.1.jar -file.reference.jersey-json-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jersey-json-1.0.1.jar -file.reference.jersey-server-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jersey-server-1.0.1.jar -file.reference.jettison-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jettison-1.0.1.jar -file.reference.jetty-6.1.6rc0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jetty-6.1.6rc0.jar -file.reference.jetty-util-6.1.6rc0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jetty-util-6.1.6rc0.jar -file.reference.JSAP-2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\JSAP-2.1.jar -file.reference.jsr250-api-1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jsr250-api-1.0.jar -file.reference.jsr311-api-1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jsr311-api-1.0.jar -file.reference.junit-3.8.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit-3.8.2.jar -file.reference.junit-4.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit-4.5.jar -file.reference.junit4runner-1.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit4runner-1.0-SNAPSHOT.jar -file.reference.libfb303.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\libfb303.jar -file.reference.libthrift-20080411p1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\libthrift-20080411p1.jar -file.reference.libthrift.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\libthrift.jar -file.reference.log4j-1.2.15.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\log4j-1.2.15.jar -file.reference.lucene-core-2.2.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\lucene-core-2.2.0.jar -file.reference.main-scala=src/main/scala -file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\mina-core-2.0.0-M2-SNAPSHOT.jar -file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\mina-integration-scala-2.0.0-M2-SNAPSHOT.jar -file.reference.pcj.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\pcj.jar -file.reference.protobuf-java-2.0.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\protobuf-java-2.0.3.jar -file.reference.rome-0.9.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\rome-0.9.jar -file.reference.scala-library-2.7.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\scala-library-2.7.3.jar -file.reference.scala-library-2.7.3.zip=C:\\home\\jboner\\src\\scala\\akka\\lib\\scala-library-2.7.3.zip -file.reference.scalatest-0.9.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\scalatest-0.9.5.jar -file.reference.scalatest-0.9.5.zip=C:\\home\\jboner\\src\\scala\\akka\\lib\\scalatest-0.9.5.zip -file.reference.servlet-api-2.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\servlet-api-2.5.jar -file.reference.slf4j-api-1.4.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\slf4j-api-1.4.3.jar -file.reference.slf4j-log4j12-1.4.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\slf4j-log4j12-1.4.3.jar -file.reference.stax-api-1.0-2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\stax-api-1.0-2.jar -file.reference.stringtemplate-3.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\stringtemplate-3.0.jar -file.reference.test-scala=src/test/scala -file.reference.velocity-1.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\velocity-1.5.jar -file.reference.voldemort-0.4a.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\voldemort-0.4a.jar -file.reference.voldemort-contrib-0.4a.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\voldemort-contrib-0.4a.jar -file.reference.xerces.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\xerces.jar -file.reference.zookeeper-3.1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\zookeeper-3.1.0.jar -includes=** -jar.compress=false -java.platform.active=java_default_platform -javac.classpath=\ - ${file.reference.activation-1.1.jar}:\ - ${file.reference.akka-util-java.jar}:\ - ${file.reference.antlr-3.1.3.jar}:\ - ${file.reference.aopalliance-1.0.jar}:\ - ${file.reference.asm-3.1.jar}:\ - ${file.reference.asm-all-2.2.1.jar}:\ - ${file.reference.cassandra.jar}:\ - ${file.reference.catalina-ant.jar}:\ - ${file.reference.cglib-2.2.jar}:\ - ${file.reference.colt-1.2.0.jar}:\ - ${file.reference.commons-cli-1.1.jar}:\ - ${file.reference.commons-codec-1.3.jar}:\ - ${file.reference.commons-collections-3.2.1.jar}:\ - ${file.reference.commons-dbcp-1.2.2.jar}:\ - ${file.reference.commons-httpclient-3.1.jar}:\ - ${file.reference.commons-io-1.3.2.jar}:\ - ${file.reference.commons-javaflow-1.0-SNAPSHOT.jar}:\ - ${file.reference.commons-lang-2.4.jar}:\ - ${file.reference.commons-logging-1.0.4.jar}:\ - ${file.reference.commons-math-1.1.jar}:\ - ${file.reference.commons-pool-1.4.jar}:\ - ${file.reference.configgy-1.2.jar}:\ - ${file.reference.google-collect-snapshot-20090211.jar}:\ - ${file.reference.grizzly-framework-1.8.6.3.jar}:\ - ${file.reference.grizzly-http-1.8.6.3.jar}:\ - ${file.reference.grizzly-http-servlet-1.8.6.3.jar}:\ - ${file.reference.grizzly-http-utils-1.8.6.3.jar}:\ - ${file.reference.grizzly-portunif-1.8.6.3.jar}:\ - ${file.reference.grizzly-rcm-1.8.6.3.jar}:\ - ${file.reference.grizzly-servlet-webserver-1.8.6.3.jar}:\ - ${file.reference.guice-core-2.0-SNAPSHOT.jar}:\ - ${file.reference.guice-jsr250-2.0-SNAPSHOT.jar}:\ - ${file.reference.high-scale-lib.jar}:\ - ${file.reference.jaxb-api-2.1.jar}:\ - ${file.reference.jaxb-impl-2.1.jar}:\ - ${file.reference.jdom-1.0.jar}:\ - ${file.reference.je-3.3.62.jar}:\ - ${file.reference.jersey-atom-1.0.1.jar}:\ - ${file.reference.jersey-core-1.0.1.jar}:\ - ${file.reference.jersey-json-1.0.1.jar}:\ - ${file.reference.jersey-server-1.0.1.jar}:\ - ${file.reference.jettison-1.0.1.jar}:\ - ${file.reference.jetty-6.1.6rc0.jar}:\ - ${file.reference.jetty-util-6.1.6rc0.jar}:\ - ${file.reference.JSAP-2.1.jar}:\ - ${file.reference.jsr250-api-1.0.jar}:\ - ${file.reference.jsr311-api-1.0.jar}:\ - ${file.reference.junit-3.8.2.jar}:\ - ${file.reference.junit-4.5.jar}:\ - ${file.reference.junit4runner-1.0-SNAPSHOT.jar}:\ - ${file.reference.libfb303.jar}:\ - ${file.reference.libthrift-20080411p1.jar}:\ - ${file.reference.libthrift.jar}:\ - ${file.reference.log4j-1.2.15.jar}:\ - ${file.reference.lucene-core-2.2.0.jar}:\ - ${file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar}:\ - ${file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar}:\ - ${file.reference.pcj.jar}:\ - ${file.reference.protobuf-java-2.0.3.jar}:\ - ${file.reference.rome-0.9.jar}:\ - ${file.reference.scala-library-2.7.3.jar}:\ - ${file.reference.scala-library-2.7.3.zip}:\ - ${file.reference.scalatest-0.9.5.jar}:\ - ${file.reference.scalatest-0.9.5.zip}:\ - ${file.reference.servlet-api-2.5.jar}:\ - ${file.reference.slf4j-api-1.4.3.jar}:\ - ${file.reference.slf4j-log4j12-1.4.3.jar}:\ - ${file.reference.stax-api-1.0-2.jar}:\ - ${file.reference.stringtemplate-3.0.jar}:\ - ${file.reference.velocity-1.5.jar}:\ - ${file.reference.voldemort-0.4a.jar}:\ - ${file.reference.voldemort-contrib-0.4a.jar}:\ - ${file.reference.xerces.jar}:\ - ${file.reference.zookeeper-3.1.0.jar} -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.source=1.5 -javac.target=1.5 -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir}:\ - ${file.reference.scalatest-0.9.5.jar}:\ - ${file.reference.junit-4.5.jar}:\ - ${file.reference.junit4runner-1.0-SNAPSHOT.jar} -javadoc.additionalparam= -javadoc.author=false -javadoc.encoding=${source.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=false -javadoc.splitindex=true -javadoc.use=true -javadoc.version=false -javadoc.windowtitle= -main.class= -manifest.file=manifest.mf -meta.inf.dir=${src.dir}/META-INF -platform.active=default_platform -run.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -# Space-separated list of JVM arguments used when running the project -# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value -# or test-sys-prop.name=value to set system properties for unit tests): -run.jvmargs= -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir}:\ - ${file.reference.scalatest-0.9.5.jar}:\ - ${file.reference.junit-4.5.jar}:\ - ${file.reference.junit4runner-1.0-SNAPSHOT.jar} -source.encoding=UTF-8 -src.dir=${file.reference.main-scala} -test.src.dir=${file.reference.test-scala} +application.title=akka-kernel +application.vendor=jboner +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form,**/*.scala +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/akka-kernel.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +file.reference.activation-1.1.jar=/Users/jboner/src/scala/akka/lib/activation-1.1.jar +file.reference.akka-util-java.jar=/Users/jboner/src/scala/akka/lib/akka-util-java.jar +file.reference.antlr-3.1.3.jar=/Users/jboner/src/scala/akka/lib/antlr-3.1.3.jar +file.reference.aopalliance-1.0.jar=/Users/jboner/src/scala/akka/lib/aopalliance-1.0.jar +file.reference.asm-3.1.jar=/Users/jboner/src/scala/akka/lib/asm-3.1.jar +file.reference.asm-all-2.2.1.jar=/Users/jboner/src/scala/akka/lib/asm-all-2.2.1.jar +file.reference.cassandra.jar=/Users/jboner/src/scala/akka/lib/cassandra.jar +file.reference.catalina-ant.jar=/Users/jboner/src/scala/akka/lib/catalina-ant.jar +file.reference.cglib-2.2.jar=/Users/jboner/src/scala/akka/lib/cglib-2.2.jar +file.reference.colt-1.2.0.jar=/Users/jboner/src/scala/akka/lib/colt-1.2.0.jar +file.reference.commons-cli-1.1.jar=/Users/jboner/src/scala/akka/lib/commons-cli-1.1.jar +file.reference.commons-codec-1.3.jar=/Users/jboner/src/scala/akka/lib/commons-codec-1.3.jar +file.reference.commons-collections-3.2.1.jar=/Users/jboner/src/scala/akka/lib/commons-collections-3.2.1.jar +file.reference.commons-dbcp-1.2.2.jar=/Users/jboner/src/scala/akka/lib/commons-dbcp-1.2.2.jar +file.reference.commons-httpclient-3.1.jar=/Users/jboner/src/scala/akka/lib/commons-httpclient-3.1.jar +file.reference.commons-io-1.3.2.jar=/Users/jboner/src/scala/akka/lib/commons-io-1.3.2.jar +file.reference.commons-javaflow-1.0-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/commons-javaflow-1.0-SNAPSHOT.jar +file.reference.commons-lang-2.4.jar=/Users/jboner/src/scala/akka/lib/commons-lang-2.4.jar +file.reference.commons-logging-1.0.4.jar=/Users/jboner/src/scala/akka/lib/commons-logging-1.0.4.jar +file.reference.commons-math-1.1.jar=/Users/jboner/src/scala/akka/lib/commons-math-1.1.jar +file.reference.commons-pool-1.4.jar=/Users/jboner/src/scala/akka/lib/commons-pool-1.4.jar +file.reference.configgy-1.2.jar=/Users/jboner/src/scala/akka/lib/configgy-1.2.jar +file.reference.google-collect-snapshot-20090211.jar=/Users/jboner/src/scala/akka/lib/google-collect-snapshot-20090211.jar +file.reference.grizzly-framework-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-framework-1.8.6.3.jar +file.reference.grizzly-http-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-http-1.8.6.3.jar +file.reference.grizzly-http-servlet-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-http-servlet-1.8.6.3.jar +file.reference.grizzly-http-utils-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-http-utils-1.8.6.3.jar +file.reference.grizzly-portunif-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-portunif-1.8.6.3.jar +file.reference.grizzly-rcm-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-rcm-1.8.6.3.jar +file.reference.grizzly-servlet-webserver-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-servlet-webserver-1.8.6.3.jar +file.reference.guice-core-2.0-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/guice-core-2.0-SNAPSHOT.jar +file.reference.guice-jsr250-2.0-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/guice-jsr250-2.0-SNAPSHOT.jar +file.reference.high-scale-lib.jar=/Users/jboner/src/scala/akka/lib/high-scale-lib.jar +file.reference.jaxb-api-2.1.jar=/Users/jboner/src/scala/akka/lib/jaxb-api-2.1.jar +file.reference.jaxb-impl-2.1.jar=/Users/jboner/src/scala/akka/lib/jaxb-impl-2.1.jar +file.reference.jdom-1.0.jar=/Users/jboner/src/scala/akka/lib/jdom-1.0.jar +file.reference.je-3.3.62.jar=/Users/jboner/src/scala/akka/lib/je-3.3.62.jar +file.reference.jersey-atom-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-atom-1.0.1.jar +file.reference.jersey-core-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-core-1.0.1.jar +file.reference.jersey-json-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-json-1.0.1.jar +file.reference.jersey-server-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-server-1.0.1.jar +file.reference.jettison-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jettison-1.0.1.jar +file.reference.jetty-6.1.6rc0.jar=/Users/jboner/src/scala/akka/lib/jetty-6.1.6rc0.jar +file.reference.jetty-util-6.1.6rc0.jar=/Users/jboner/src/scala/akka/lib/jetty-util-6.1.6rc0.jar +file.reference.JSAP-2.1.jar=/Users/jboner/src/scala/akka/lib/JSAP-2.1.jar +file.reference.jsr250-api-1.0.jar=/Users/jboner/src/scala/akka/lib/jsr250-api-1.0.jar +file.reference.jsr311-api-1.0.jar=/Users/jboner/src/scala/akka/lib/jsr311-api-1.0.jar +file.reference.junit-3.8.2.jar=/Users/jboner/src/scala/akka/lib/junit-3.8.2.jar +file.reference.junit-4.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit-4.5.jar +file.reference.junit-4.5.jar-1=/Users/jboner/src/scala/akka/lib/junit-4.5.jar +file.reference.junit4runner-1.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit4runner-1.0-SNAPSHOT.jar +file.reference.junit4runner-1.0-SNAPSHOT.jar-1=/Users/jboner/src/scala/akka/lib/junit4runner-1.0-SNAPSHOT.jar +file.reference.libfb303.jar=/Users/jboner/src/scala/akka/lib/libfb303.jar +file.reference.libthrift-20080411p1.jar=/Users/jboner/src/scala/akka/lib/libthrift-20080411p1.jar +file.reference.libthrift.jar=/Users/jboner/src/scala/akka/lib/libthrift.jar +file.reference.log4j-1.2.15.jar=/Users/jboner/src/scala/akka/lib/log4j-1.2.15.jar +file.reference.lucene-core-2.2.0.jar=/Users/jboner/src/scala/akka/lib/lucene-core-2.2.0.jar +file.reference.main-scala=src/main/scala +file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/mina-core-2.0.0-M2-SNAPSHOT.jar +file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/mina-integration-scala-2.0.0-M2-SNAPSHOT.jar +file.reference.pcj.jar=/Users/jboner/src/scala/akka/lib/pcj.jar +file.reference.protobuf-java-2.0.3.jar=/Users/jboner/src/scala/akka/lib/protobuf-java-2.0.3.jar +file.reference.rome-0.9.jar=/Users/jboner/src/scala/akka/lib/rome-0.9.jar +file.reference.scala-library-2.7.3.jar=/Users/jboner/src/scala/akka/lib/scala-library-2.7.3.jar +file.reference.scala-library-2.7.3.zip=/Users/jboner/src/scala/akka/lib/scala-library-2.7.3.zip +file.reference.scalatest-0.9.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\scalatest-0.9.5.jar +file.reference.scalatest-0.9.5.jar-1=/Users/jboner/src/scala/akka/lib/scalatest-0.9.5.jar +file.reference.scalatest-0.9.5.zip=/Users/jboner/src/scala/akka/lib/scalatest-0.9.5.zip +file.reference.servlet-api-2.5.jar=/Users/jboner/src/scala/akka/lib/servlet-api-2.5.jar +file.reference.slf4j-api-1.4.3.jar=/Users/jboner/src/scala/akka/lib/slf4j-api-1.4.3.jar +file.reference.slf4j-log4j12-1.4.3.jar=/Users/jboner/src/scala/akka/lib/slf4j-log4j12-1.4.3.jar +file.reference.stax-api-1.0-2.jar=/Users/jboner/src/scala/akka/lib/stax-api-1.0-2.jar +file.reference.stringtemplate-3.0.jar=/Users/jboner/src/scala/akka/lib/stringtemplate-3.0.jar +file.reference.test-scala=src/test/scala +file.reference.velocity-1.5.jar=/Users/jboner/src/scala/akka/lib/velocity-1.5.jar +file.reference.voldemort-0.4a.jar=/Users/jboner/src/scala/akka/lib/voldemort-0.4a.jar +file.reference.voldemort-contrib-0.4a.jar=/Users/jboner/src/scala/akka/lib/voldemort-contrib-0.4a.jar +file.reference.xerces.jar=/Users/jboner/src/scala/akka/lib/xerces.jar +file.reference.zookeeper-3.1.0.jar=/Users/jboner/src/scala/akka/lib/zookeeper-3.1.0.jar +includes=** +jar.compress=false +java.platform.active=java_default_platform +javac.classpath=\ + ${file.reference.activation-1.1.jar}:\ + ${reference.akka-util-java.jar}:\ + ${file.reference.akka-util-java.jar}:\ + ${file.reference.antlr-3.1.3.jar}:\ + ${file.reference.aopalliance-1.0.jar}:\ + ${file.reference.asm-3.1.jar}:\ + ${file.reference.asm-all-2.2.1.jar}:\ + ${file.reference.cassandra.jar}:\ + ${file.reference.catalina-ant.jar}:\ + ${file.reference.cglib-2.2.jar}:\ + ${file.reference.colt-1.2.0.jar}:\ + ${file.reference.commons-cli-1.1.jar}:\ + ${file.reference.commons-codec-1.3.jar}:\ + ${file.reference.commons-collections-3.2.1.jar}:\ + ${file.reference.commons-dbcp-1.2.2.jar}:\ + ${file.reference.commons-httpclient-3.1.jar}:\ + ${file.reference.commons-io-1.3.2.jar}:\ + ${file.reference.commons-javaflow-1.0-SNAPSHOT.jar}:\ + ${file.reference.commons-lang-2.4.jar}:\ + ${file.reference.commons-logging-1.0.4.jar}:\ + ${file.reference.commons-math-1.1.jar}:\ + ${file.reference.commons-pool-1.4.jar}:\ + ${file.reference.configgy-1.2.jar}:\ + ${file.reference.google-collect-snapshot-20090211.jar}:\ + ${file.reference.grizzly-framework-1.8.6.3.jar}:\ + ${file.reference.grizzly-http-1.8.6.3.jar}:\ + ${file.reference.grizzly-http-servlet-1.8.6.3.jar}:\ + ${file.reference.grizzly-http-utils-1.8.6.3.jar}:\ + ${file.reference.grizzly-portunif-1.8.6.3.jar}:\ + ${file.reference.grizzly-rcm-1.8.6.3.jar}:\ + ${file.reference.grizzly-servlet-webserver-1.8.6.3.jar}:\ + ${file.reference.guice-core-2.0-SNAPSHOT.jar}:\ + ${file.reference.guice-jsr250-2.0-SNAPSHOT.jar}:\ + ${file.reference.high-scale-lib.jar}:\ + ${file.reference.jaxb-api-2.1.jar}:\ + ${file.reference.jaxb-impl-2.1.jar}:\ + ${file.reference.jdom-1.0.jar}:\ + ${file.reference.je-3.3.62.jar}:\ + ${file.reference.jersey-atom-1.0.1.jar}:\ + ${file.reference.jersey-core-1.0.1.jar}:\ + ${file.reference.jersey-json-1.0.1.jar}:\ + ${file.reference.jersey-server-1.0.1.jar}:\ + ${file.reference.jettison-1.0.1.jar}:\ + ${file.reference.jetty-6.1.6rc0.jar}:\ + ${file.reference.jetty-util-6.1.6rc0.jar}:\ + ${file.reference.JSAP-2.1.jar}:\ + ${file.reference.jsr250-api-1.0.jar}:\ + ${file.reference.jsr311-api-1.0.jar}:\ + ${file.reference.junit-3.8.2.jar}:\ + ${file.reference.junit-4.5.jar-1}:\ + ${file.reference.junit4runner-1.0-SNAPSHOT.jar-1}:\ + ${file.reference.libfb303.jar}:\ + ${file.reference.libthrift-20080411p1.jar}:\ + ${file.reference.libthrift.jar}:\ + ${file.reference.log4j-1.2.15.jar}:\ + ${file.reference.lucene-core-2.2.0.jar}:\ + ${file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar}:\ + ${file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar}:\ + ${file.reference.pcj.jar}:\ + ${file.reference.protobuf-java-2.0.3.jar}:\ + ${file.reference.rome-0.9.jar}:\ + ${file.reference.scala-library-2.7.3.jar}:\ + ${file.reference.scala-library-2.7.3.zip}:\ + ${file.reference.scalatest-0.9.5.jar-1}:\ + ${file.reference.scalatest-0.9.5.zip}:\ + ${file.reference.servlet-api-2.5.jar}:\ + ${file.reference.slf4j-api-1.4.3.jar}:\ + ${file.reference.slf4j-log4j12-1.4.3.jar}:\ + ${file.reference.stax-api-1.0-2.jar}:\ + ${file.reference.stringtemplate-3.0.jar}:\ + ${file.reference.velocity-1.5.jar}:\ + ${file.reference.voldemort-0.4a.jar}:\ + ${file.reference.voldemort-contrib-0.4a.jar}:\ + ${file.reference.xerces.jar}:\ + ${file.reference.zookeeper-3.1.0.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.source=1.5 +javac.target=1.5 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir}:\ + ${file.reference.scalatest-0.9.5.jar}:\ + ${file.reference.junit-4.5.jar}:\ + ${file.reference.junit4runner-1.0-SNAPSHOT.jar} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +main.class= +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +platform.active=default_platform +project.akka-util-java=../util-java +reference.akka-util-java.jar=${project.akka-util-java}/dist/akka-util-java.jar +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir}:\ + ${file.reference.scalatest-0.9.5.jar}:\ + ${file.reference.junit-4.5.jar}:\ + ${file.reference.junit4runner-1.0-SNAPSHOT.jar} +source.encoding=UTF-8 +src.dir=${file.reference.main-scala} +test.src.dir=${file.reference.test-scala} diff --git a/kernel/nbproject/project.xml b/kernel/nbproject/project.xml index 2e5d7907a4..d1c3e16982 100644 --- a/kernel/nbproject/project.xml +++ b/kernel/nbproject/project.xml @@ -1,17 +1,26 @@ - - - org.netbeans.modules.scala.project - - - akka-kernel - 1.6.5 - - - - - - - - - - + + + org.netbeans.modules.scala.project + + + akka-kernel + 1.6.5 + + + + + + + + + + akka-util-java + jar + + jar + clean + jar + + + + diff --git a/kernel/pom.xml b/kernel/pom.xml index a1d406a201..c8db54b0e4 100755 --- a/kernel/pom.xml +++ b/kernel/pom.xml @@ -60,7 +60,27 @@ jersey-atom 1.0.1 - + + org.jboss.netty + netty + 3.1.0.BETA2 + + + org.apache.cassandra + cassandra + 1.0 + + + com.facebook + thrift + 1.0 + + + com.facebook + fb303 + 1.0 + + + + com.assembla.scala.mina mina-core @@ -108,24 +126,18 @@ 0.9.5 test - + @@ -177,7 +189,7 @@ - + diff --git a/kernel/src/main/scala/ActiveObject.scala b/kernel/src/main/scala/ActiveObject.scala index efba3ecfa0..1b3fe06b8f 100755 --- a/kernel/src/main/scala/ActiveObject.scala +++ b/kernel/src/main/scala/ActiveObject.scala @@ -14,7 +14,7 @@ import java.lang.annotation.Annotation sealed class ActiveObjectException(msg: String) extends RuntimeException(msg) class ActiveObjectInvocationTimeoutException(msg: String) extends ActiveObjectException(msg) -object Annotation { +object Annotations { import se.scalablesolutions.akka.annotation._ val transactional = classOf[transactional] val oneway = classOf[oneway] @@ -84,17 +84,17 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I private var targetInstance: AnyRef = _ private[kernel] def setTargetInstance(instance: AnyRef) = { targetInstance = instance - getStateList(targetInstance) match { - case Nil => {} - case states => server.states = states - } + val (maps, vectors, refs) = getTransactionalItemsFor(targetInstance) + server.transactionalMaps = maps + server.transactionalVectors = vectors + server.transactionalRefs = refs } private[kernel] val server = new GenericServerContainer(target.getName, () => new Dispatcher(target.getName)) server.setTimeout(timeout) def invoke(proxy: AnyRef, m: Method, args: Array[AnyRef]): AnyRef = { - if (m.isAnnotationPresent(Annotation.transactional)) { + if (m.isAnnotationPresent(Annotations.transactional)) { // FIXME: check if we are already in a transaction if so NEST (set parent) val newTx = new Transaction newTx.begin(server) @@ -122,7 +122,7 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I private def invoke(invocation: Invocation): AnyRef = { val result: AnyRef = - if (invocation.method.isAnnotationPresent(Annotation.oneway)) server ! invocation + if (invocation.method.isAnnotationPresent(Annotations.oneway)) server ! invocation else { val result: ErrRef[AnyRef] = server !!! (invocation, { @@ -150,22 +150,29 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I threadBoundTx.set(Some(tx)) } - private def getStateList(targetInstance: AnyRef): List[State[_,_]] = { + private def getTransactionalItemsFor(targetInstance: AnyRef): + Tuple3[List[TransactionalMap[_, _]], List[TransactionalVector[_]], List[TransactionalRef[_]]] = { require(targetInstance != null) - import se.scalablesolutions.akka.kernel.configuration.ConfigurationException - val states: List[State[_,_]] = for { - field <- target.getDeclaredFields.toArray.toList - if field.isAnnotationPresent(Annotation.state) - state = { + var maps: List[TransactionalMap[_, _]] = Nil + var vectors: List[TransactionalVector[_]] = Nil + var refs: List[TransactionalRef[_]] = Nil + for { + field <- target.getDeclaredFields.toArray.toList.asInstanceOf[List[Field]] + fieldType = field.getType + if fieldType == classOf[TransactionalMap[_, _]] || + fieldType == classOf[TransactionalVector[_]] || + fieldType == classOf[TransactionalRef[_]] + txItem = { field.setAccessible(true) field.get(targetInstance) } - if state != null - } yield { - if (!state.isInstanceOf[State[_, _]]) throw new ConfigurationException("Fields annotated with [@state] needs to to be a subtype of [se.scalablesolutions.akka.kernel.State[K, V]]") - state.asInstanceOf[State[_,_]] + if txItem != null + } { + if (txItem.isInstanceOf[TransactionalMap[_, _]]) maps ::= txItem.asInstanceOf[TransactionalMap[_, _]] + else if (txItem.isInstanceOf[TransactionalVector[_]]) vectors ::= txItem.asInstanceOf[TransactionalVector[_]] + else if (txItem.isInstanceOf[TransactionalRef[_]]) refs ::= txItem.asInstanceOf[TransactionalRef[_]] } - states + (maps, vectors, refs) } } diff --git a/kernel/src/main/scala/CassandraNode.scala b/kernel/src/main/scala/CassandraNode.scala index 95151d2947..500148d075 100755 --- a/kernel/src/main/scala/CassandraNode.scala +++ b/kernel/src/main/scala/CassandraNode.scala @@ -6,6 +6,90 @@ package se.scalablesolutions.akka.kernel import java.io.File +import org.apache.cassandra.config.DatabaseDescriptor +import org.apache.cassandra.service._ + +/** + * @author Jonas Bonér + */ +final object CassandraNode extends Logging { + + val TABLE_NAME = "akka" + val ACTOR_KEY_PREFIX = "actor" + val ACTOR_MAP_COLUMN_FAMILY = "map" + + // TODO: is this server thread-safe or needed to be wrapped up in an actor? + private[this] val server = new CassandraServer + + def start = { + try { + server.start + log.info("Persistent storage has started up successfully"); + } catch { + case e => + log.error("Could not start up persistent storage") + throw e + } + } + + def stop = server.shutdown + + def insertActorStorageEntry(actorName: String, entry: String, content: String) = { + server.insert( + TABLE_NAME, + ACTOR_KEY_PREFIX + ":" + actorName, + ACTOR_MAP_COLUMN_FAMILY + ":" + entry, + content, + System.currentTimeMillis) + } + + def insertActorStorageEntries(actorName: String, entries: List[Tuple2[String, String]]) = { + import java.util.{Map, HashMap, List, ArrayList} + val columns: Map[String, List[column_t]] = new HashMap + for (entry <- entries) { + val cls: List[column_t] = new ArrayList + cls.add(new column_t(entry._1, entry._2, System.currentTimeMillis)) + columns.put(ACTOR_MAP_COLUMN_FAMILY, cls) + } + server.batch_insert_blocking(new batch_mutation_t( + TABLE_NAME, + ACTOR_KEY_PREFIX + ":" + actorName, + columns, + new HashMap[String, List[column_t]])) + } + + def getActorStorageEntryFor(actorName: String, entry: String): Option[String] = { + try { + val column = server.get_column(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY + ":" + entry) + Some(column.value) + } catch { case e => None } + } + + def getActorStorageFor(actorName: String): List[Tuple2[String, String]] = { + val columns = server.get_columns_since(TABLE_NAME, ACTOR_KEY_PREFIX, ACTOR_MAP_COLUMN_FAMILY, -1) + .toArray.toList.asInstanceOf[List[org.apache.cassandra.service.column_t]] + for { + column <- columns + col = (column.columnName, column.value) + } yield col + } + + def getActorStorageSizeFor(actorName: String): Int = + server.get_column_count(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY) + + def removeActorStorageFor(actorName: String) = + server.remove(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY) + + def getActorStorageRange(actorName: String, start: Int, count: Int): List[Tuple2[String, String]] = + server.get_slice(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY, start, count) + .toArray.toList.asInstanceOf[List[Tuple2[String, String]]] +} + +/* + * This code is only for starting up the Cassandra Thrift server, perhaps later + +import scala.actors.Actor._ + import com.facebook.thrift.protocol.TBinaryProtocol import com.facebook.thrift.protocol.TProtocolFactory import com.facebook.thrift.server.TThreadPoolServer @@ -14,24 +98,7 @@ import com.facebook.thrift.transport.TTransportException import com.facebook.thrift.transport.TTransportFactory import com.facebook.thrift.TProcessorFactory -import org.apache.cassandra.config.DatabaseDescriptor -import org.apache.cassandra.service._ - -/** - * @author Jonas Bonér - */ -final class CassandraNode extends Logging { - val server = try { - val cassandra = new CassandraServer - cassandra.start - cassandra - } catch { - case e => - log.error("Could not start up persistent storage node") - throw e - } - - private val serverEngine: TThreadPoolServer = try { + private[this] val serverEngine: TThreadPoolServer = try { val pidFile = System.getProperty("pidfile") if (pidFile != null) new File(pidFile).deleteOnExit(); val listenPort = DatabaseDescriptor.getThriftPort @@ -54,20 +121,17 @@ final class CassandraNode extends Logging { log.error("Could not start up persistent storage node.") throw e } - - def start = { - scala.actors.Actor.actor { - log.info("Persistent storage node starting up..."); - serverEngine.serve + private[this] val serverDaemon = actor { + receive { + case Start => + log.info("Persistent storage node starting up...") + serverEngine.serve + case Stop => + log.info("Persistent storage node shutting down...") + serverEngine.stop + //case Insert(..) => + // server. } - log.info("Persistent storage node starting up 2222..."); - server.insert("akka", "TestActor", "hash:data", "some data", System.currentTimeMillis) - val column = server.get_column("akka", "TestActor", "hash:data") - log.info("column: " + column) + } +*/ - } - def stop = { - log.info("Persistent storage node shutting down...") - serverEngine.stop - } -} diff --git a/kernel/src/main/scala/Configuration.scala b/kernel/src/main/scala/Configuration.scala index 1956c13af3..3aa2914b4c 100755 --- a/kernel/src/main/scala/Configuration.scala +++ b/kernel/src/main/scala/Configuration.scala @@ -51,8 +51,8 @@ abstract class Server extends Configuration // def transform = se.scalablesolutions.akka.kernel.kernelConfig(restartStrategy.transform, servers.toArray.toList.asInstanceOf[List[Server]].map(_.transform)) //} class Component(@BeanProperty val intf: Class[_], - @BeanProperty val target: Class[_], - @BeanProperty val lifeCycle: LifeCycle, - @BeanProperty val timeout: Int) extends Server { + @BeanProperty val target: Class[_], + @BeanProperty val lifeCycle: LifeCycle, + @BeanProperty val timeout: Int) extends Server { def newWorker(proxy: ActiveObjectProxy) = se.scalablesolutions.akka.kernel.Worker(proxy.server, lifeCycle.transform) } diff --git a/kernel/src/main/scala/DataFlowVariable.scala b/kernel/src/main/scala/DataFlowVariable.scala index dc9c98049d..bf4417ed00 100644 --- a/kernel/src/main/scala/DataFlowVariable.scala +++ b/kernel/src/main/scala/DataFlowVariable.scala @@ -12,8 +12,7 @@ import scala.actors.Actor._ import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.{ConcurrentLinkedQueue, LinkedBlockingQueue} -object DataFlow { - +object DataFlow { def thread(body: => Unit) = { val thread = new IsolatedEventBasedThread(body).start thread ! 'start diff --git a/kernel/src/main/scala/GenericServer.scala b/kernel/src/main/scala/GenericServer.scala index 71f9ab3b1d..be754d2074 100644 --- a/kernel/src/main/scala/GenericServer.scala +++ b/kernel/src/main/scala/GenericServer.scala @@ -86,17 +86,48 @@ class GenericServerContainer( private[kernel] var serverFactory: () => GenericServer) extends Logging { require(id != null && id != "") + private[kernel] var lifeCycle: Option[LifeCycle] = None + private[kernel] val lock = new ReadWriteLock + private[kernel] val txItemsLock = new ReadWriteLock + + private var server: GenericServer = _ + private var currentConfig: Option[AnyRef] = None + private var timeout = 5000 + // TODO: see if we can parameterize class and add type safe getActor method //class GenericServerContainer[T <: GenericServer](var factory: () => T) { //def getActor: T = server - private[kernel] var lifeCycle: Option[LifeCycle] = None - private[kernel] var states: List[State[_,_]] = Nil - private[kernel] val lock = new ReadWriteLock + private[kernel] def transactionalItems: List[Transactional] = txItemsLock.withReadLock { + _transactionalMaps ::: _transactionalVectors ::: _transactionalRefs + } + + // TX Maps + private[this] var _transactionalMaps: List[TransactionalMap[_, _]] = Nil + private[kernel] def transactionalMaps_=(maps: List[TransactionalMap[_, _]]) = txItemsLock.withWriteLock { + _transactionalMaps = maps + } + private[kernel] def transactionalMaps: List[TransactionalMap[_, _]] = txItemsLock.withReadLock { + _transactionalMaps + } - private var server: GenericServer = _ - private var currentConfig: Option[AnyRef] = None - private var timeout = 5000 + // TX Vectors + private[this] var _transactionalVectors: List[TransactionalVector[_]] = Nil + private[kernel] def transactionalVectors_=(vectors: List[TransactionalVector[_]]) = txItemsLock.withWriteLock { + _transactionalVectors = vectors + } + private[kernel] def transactionalVectors: List[TransactionalVector[_]] = txItemsLock.withReadLock { + _transactionalVectors + } + + // TX Refs + private[this] var _transactionalRefs: List[TransactionalRef[_]] = Nil + private[kernel] def transactionalRefs_=(refs: List[TransactionalRef[_]]) = txItemsLock.withWriteLock { + _transactionalRefs = refs + } + private[kernel] def transactionalRefs: List[TransactionalRef[_]] = txItemsLock.withReadLock { + _transactionalRefs + } /** * Sends a one way message to the server - alias for cast(message). diff --git a/kernel/src/main/scala/Helpers.scala b/kernel/src/main/scala/Helpers.scala index 0a02be63bb..265cef0a93 100644 --- a/kernel/src/main/scala/Helpers.scala +++ b/kernel/src/main/scala/Helpers.scala @@ -47,7 +47,7 @@ object Helpers extends Logging { // implicit conversion between regular actor and actor with a type future implicit def actorWithFuture(a: Actor) = new ActorWithTypedFuture(a) - abstract class FutureWithTimeout[T](ch: InputChannel[Any]) extends Future[T](ch) { + abstract class FutureWithTimeout[T](ch: InputChannel[T]) extends Future[T](ch) { def receiveWithin(timeout: Int) : Option[T] override def respond(f: T => Unit): Unit = throw new UnsupportedOperationException("Does not support the Responder API") } @@ -63,8 +63,8 @@ object Helpers extends Logging { require(a != null) def !!![A](msg: Any): FutureWithTimeout[A] = { - val ftch = new Channel[Any](Actor.self) - a.send(msg, ftch) + val ftch = new Channel[A](Actor.self) + a.send(msg, ftch.asInstanceOf[OutputChannel[Any]]) new FutureWithTimeout[A](ftch) { def apply() = if (isSet) value.get.asInstanceOf[A] diff --git a/kernel/src/main/scala/Kernel.scala b/kernel/src/main/scala/Kernel.scala index 0596dcf2f1..e3e0541e89 100755 --- a/kernel/src/main/scala/Kernel.scala +++ b/kernel/src/main/scala/Kernel.scala @@ -9,9 +9,9 @@ package se.scalablesolutions.akka.kernel //import org.apache.zookeeper.server.ServerConfig //import org.apache.zookeeper.server.NIOServerCnxn -import voldemort.client.{SocketStoreClientFactory, StoreClient, StoreClientFactory} -import voldemort.server.{VoldemortConfig, VoldemortServer} -import voldemort.versioning.Versioned +//import voldemort.client.{SocketStoreClientFactory, StoreClient, StoreClientFactory} +//import voldemort.server.{VoldemortConfig, VoldemortServer} +//import voldemort.versioning.Versioned import com.sun.grizzly.http.SelectorThread import com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory @@ -36,29 +36,29 @@ object Kernel extends Logging { val JERSEY_REST_CLASSES_ROOT_PACKAGE = "se.scalablesolutions.akka.kernel" val JERSEY_BASE_URI = UriBuilder.fromUri(JERSEY_SERVER_URL).port(getPort(JERSEY_SERVER_PORT)).build() +/* val VOLDEMORT_SERVER_URL = "tcp://" + SERVER_URL val VOLDEMORT_SERVER_PORT = 6666 val VOLDEMORT_BOOTSTRAP_URL = VOLDEMORT_SERVER_URL + ":" + VOLDEMORT_SERVER_PORT - val ZOO_KEEPER_SERVER_URL = SERVER_URL val ZOO_KEEPER_SERVER_PORT = 9898 - - private[this] var cassandraNode: CassandraNode = _ - - //private[this] var storageFactory: StoreClientFactory = _ - //private[this] var storageServer: VoldemortServer = _ + private[this] var storageFactory: StoreClientFactory = _ + private[this] var storageServer: VoldemortServer = _ +*/ def main(args: Array[String]): Unit = { log.info("Starting Akka kernel...") - //startZooKeeper - //startVoldemort startCassandra + cassandraBenchmark + //val threadSelector = startJersey - // TODO: handle shutdown of Jersey in separate thread // TODO: spawn main in new thread an communicate using socket //System.in.read //threadSelector.stopEndpoint + + //startZooKeeper + //startVoldemort } private[akka] def startJersey: SelectorThread = { @@ -70,10 +70,51 @@ object Kernel extends Logging { } private[akka] def startCassandra = { - cassandraNode = new CassandraNode - cassandraNode.start + CassandraNode.start } + private def cassandraBenchmark = { + val NR_ENTRIES = 1000000 + + println("=================================================") + var start = System.currentTimeMillis + for (i <- 1 to NR_ENTRIES) CassandraNode.insertActorStorageEntry("test", i.toString, "data") + var end = System.currentTimeMillis + println("Writes per second: " + NR_ENTRIES / ((end - start).toDouble / 1000)) + + /* +FIXME: batch_insert fails with the following exception: + +ERROR - Exception was generated at : 04/27/2009 15:26:35 on thread main +[B cannot be cast to org.apache.cassandra.db.WriteResponse +java.lang.ClassCastException: [B cannot be cast to org.apache.cassandra.db.WriteResponse + at org.apache.cassandra.service.WriteResponseResolver.resolve(WriteResponseResolver.java:50) + at org.apache.cassandra.service.WriteResponseResolver.resolve(WriteResponseResolver.java:31) + at org.apache.cassandra.service.QuorumResponseHandler.get(QuorumResponseHandler.java:101) + at org.apache.cassandra.service.StorageProxy.insertBlocking(StorageProxy.java:135) + at org.apache.cassandra.service.CassandraServer.batch_insert_blocking(CassandraServer.java:489) + at se.scalablesolutions.akka.kernel.CassandraNode$.insertHashEntries(CassandraNode.scala:59) + at se.scalablesolutions.akka.kernel.Kernel$.cassandraBenchmark(Kernel.scala:91) + at se.scalablesolutions.akka.kernel.Kernel$.main(Kernel.scala:52) + at se.scalablesolutions.akka.kernel.Kernel.main(Kernel.scala) + + println("=================================================") + var start = System.currentTimeMillis + println(start) + val entries = new scala.collection.mutable.ArrayBuffer[Tuple2[String, String]] + for (i <- 1 to NR_ENTRIES) entries += (i.toString, "data") + CassandraNode.insertHashEntries("test", entries.toList) + var end = System.currentTimeMillis + println("Writes per second - batch: " + NR_ENTRIES / ((end - start).toDouble / 1000)) + */ + println("=================================================") + start = System.currentTimeMillis + for (i <- 1 to NR_ENTRIES) CassandraNode.getActorStorageEntryFor("test", i.toString) + end = System.currentTimeMillis + println("Reads per second: " + NR_ENTRIES / ((end - start).toDouble / 1000)) + + System.exit(0) + } // private[akka] def startVoldemort = { // // Start Voldemort server // val config = VoldemortConfig.loadFromVoldemortHome(Boot.HOME) diff --git a/kernel/src/main/scala/NetCat.scala b/kernel/src/main/scala/NetCat.scala deleted file mode 100644 index ed6ec2b085..0000000000 --- a/kernel/src/main/scala/NetCat.scala +++ /dev/null @@ -1,107 +0,0 @@ -package org.apache.mina.example.scala.netcat - -import _root_.scala.actors.Actor -import _root_.scala.actors.Actor._ -import _root_.scala.actors.Exit -import _root_.scala.collection.immutable - -import java.net.InetSocketAddress -import java.nio.charset.Charset - -import org.apache.mina.common._ -import org.apache.mina.filter.codec.ProtocolCodecFilter -import org.apache.mina.filter.codec.textline.TextLineCodecFactory -import org.apache.mina.integration.scala.common._ -import org.apache.mina.integration.scala.common.IoHandlerEvent._ -import org.apache.mina.integration.scala.common.IoServiceEvent._ -import org.apache.mina.integration.scala.common.IoSessionCall._ -import org.apache.mina.integration.scala.common.IoSessionConfigOption._ -import org.apache.mina.integration.scala.util._ -import org.apache.mina.integration.scala.util.CallableActor._ -import org.apache.mina.transport.socket.nio.NioSocketConnector - -/** - * (Entry point) NetCat client. NetCat client connects to the specified - * endpoint and prints out received data. NetCat client disconnects - * automatically when no data is read for 10 seconds. - * - * @author The Apache MINA Project (dev@mina.apache.org) - * @version $Rev:$ - */ -object NetCat { - - def handleSession(session: Actor) = { - loop { - react { - case Opened => { - // Set reader idle time to 10 seconds. - // sessionIdle(...) method will be invoked when no data is read - // for 10 seconds. - val config = immutable.Map.empty[Any, Any] + Tuple2(IdleTime(IdleStatus.READER_IDLE), 10) - session.callReact(SetConfig(config)) { - case OK(_) => () - case Error(cause) => exit(('setConfigFailed, cause)) - } - } - case Closed => { - // Print out total number of bytes read from the remote peer. - session.callReact(GetReadBytes) { - case OK(readBytes) => { - System.err.println - System.err.println("Total " + readBytes + " byte(s)"); - exit() - } - case Error(cause) => exit(('getReadBytesFailed, cause)) - } - } - case Idle(status) => { - // Close the connection if reader is idle. - if (status == IdleStatus.READER_IDLE) { - session.callReact(CloseOnFlush) { - case OK(_) => exit() - case Error(cause) => exit(('idleCloseFailed, cause)) - } - } - } - case MessageReceived(buf: IoBuffer) => { - // Print out read buffer content. - while (buf.hasRemaining) { - System.out.print(buf.get.asInstanceOf[char]) - } - System.out.flush() - } - // Consume other IoHandlerEvents, or exit if something goes wrong. - case ExceptionCaught(cause) => exit(('exceptionCaught, cause)) - case _: IoHandlerEvent => () // Consume - case unexpected => exit(('unexpectedMessage, unexpected)) - } - } - } - - def main(args: Array[String]) { - var host = System.getProperty("netcat.host") - var portString = System.getProperty("netcat.port") - if ((host eq null) || (portString eq null)) { - // Read from command line - if (args.length != 2) { - System.out.println(this.getClass().getName() + " ") - return - } - host = args(0) - portString = args(1) - } - val port = Integer.parseInt(portString) - - // Create TCP/IP connector. - val connector = new NioSocketConnector() - connector.setConnectTimeout(30) - - // Hook up our code, and start service. - val handlingReference = IoSessionActor.installHandling(connector, handleSession(_)) - val cf = connector.connect(new InetSocketAddress(host, port)) - cf.awaitUninterruptibly() - cf.getSession().getCloseFuture().awaitUninterruptibly() - handlingReference.removeHandling - connector.dispose() - } -} diff --git a/kernel/src/main/scala/State.scala b/kernel/src/main/scala/State.scala index 0f7d94b462..ec9745314b 100755 --- a/kernel/src/main/scala/State.scala +++ b/kernel/src/main/scala/State.scala @@ -13,7 +13,12 @@ trait Transactional { private[kernel] def rollback } -sealed trait State[K, V] extends Transactional { +/** + * Base trait for all state implementations (persistent or in-memory). + * + * TODO: Make this class inherit scala.collection.mutable.Map and/or java.util.Map + */ +trait TransactionalMap[K, V] extends Transactional { def put(key: K, value: V) def remove(key: K) def get(key: K): V @@ -24,87 +29,134 @@ sealed trait State[K, V] extends Transactional { } /** + * Base class for all persistent state implementations should extend. + * Implements a Unit of Work, records changes into a change set. + * * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. */ -sealed class InMemoryState[K, V] extends State[K, V] { - private[kernel] var state = new HashTrie[K, V] - private[kernel] var snapshot = state +abstract class PersistentTransactionalMap[K, V] extends TransactionalMap[K, V] { + protected[kernel] val changeSet = new HashMap[K, V] - private[kernel] override def begin = { - snapshot = state - } - - private[kernel] override def commit = { - snapshot = state - } - - private[kernel] override def rollback = { - state = snapshot - } - - override def put(key: K, value: V) = { - state = state.update(key, value) - } - - override def remove(key: K) = { - state = state - key - } - - def get(key: K): V = state.get(key).getOrElse { throw new NoSuchElementException("No value for key [" + key + "]") } - - def contains(key: K): Boolean = state.contains(key) - - def elements: Iterator[(K, V)] = state.elements - - def size: Int = state.size - - def clear = state = new HashTrie[K, V] -} - -//final class InMemoryStringState extends InMemoryState[String, String] -//final class InMemoryObjectState extends InMemoryState[String, AnyRef] -// -/** - * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. - */ -trait UnitOfWork[K, V] extends State[K, V] with Transactional { - this: InMemoryState[K, V] => - private[kernel] val changeSet = new HashMap[K, V] - - abstract override def begin = { - super.begin + override def begin = { changeSet.clear } - abstract override def put(key: K, value: V) = { - super.put(key, value) + override def put(key: K, value: V) = { changeSet += key -> value } - abstract override def remove(key: K) = { - super.remove(key) + override def remove(key: K) = { changeSet -= key } + + def getRange(start: Int, count: Int) +} + +/** + * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. + */ +class InMemoryTransactionalMap[K, V] extends TransactionalMap[K, V] { + protected[kernel] var state = new HashTrie[K, V] + protected[kernel] var snapshot = state + + override def begin = snapshot = state + override def commit = snapshot = state + override def rollback = state = snapshot + + override def put(key: K, value: V) = state = state.update(key, value) + override def get(key: K): V = state.get(key).getOrElse(throw new NoSuchElementException("No value for key [" + key + "]")) + override def remove(key: K) = state = state - key + override def contains(key: K): Boolean = state.contains(key) + override def elements: Iterator[(K, V)] = state.elements + override def size: Int = state.size + override def clear = state = new HashTrie[K, V] +} + +/** + * Implements a persistent state based on the Cassandra distributed P2P key-value storage. + */ +class CassandraPersistentTransactionalMap(val actorName: String) extends PersistentTransactionalMap[String, String] { + override def begin = {} + override def rollback = {} + + override def commit = { + // FIXME: should use batch function once the bug is resolved + for (entry <- changeSet) { + val (key, value) = entry + CassandraNode.insertActorStorageEntry(actorName, key, value) + } + } + + override def get(key: String): String = CassandraNode.getActorStorageEntryFor(actorName, key) + .getOrElse(throw new NoSuchElementException("Could not find element for key [" + key + "]")) + + override def contains(key: String): Boolean = CassandraNode.getActorStorageEntryFor(actorName, key).isDefined + + override def size: Int = CassandraNode.getActorStorageSizeFor(actorName) + + override def clear = CassandraNode.removeActorStorageFor(actorName) + + override def getRange(start: Int, count: Int) = CassandraNode.getActorStorageRange(actorName, start, count) + + override def elements: Iterator[Tuple2[String, String]] = { + new Iterator[Tuple2[String, String]] { + private val originalList: List[Tuple2[String, String]] = CassandraNode.getActorStorageFor(actorName) + private var elements = originalList.reverse + + override def next: Tuple2[String, String]= synchronized { + val element = elements.head + elements = elements.tail + element + } + + override def hasNext: Boolean = synchronized { !elements.isEmpty } + } + } } -//class VectorState[T] { -// private[kernel] var state: Vector[T] = EmptyVector -// private[kernel] var snapshot = state -// private[kernel] var unitOfWork: List[T] = Nil -// -// private[kernel] def record = { -// snapshot = state -// unitOfWork = Nil -// } -// -// def add(elem: T): VectorState[T] = { -// state = state + elem -// unitOfWork ::= elem -// } -// -// def get(index: Int): T = state(index) -// -// def size: Int = state.size -//} -// -// +/** + * TODO: extend scala.Seq + * Base for all transactional vector implementations. + */ +abstract class TransactionalVector[T] extends Transactional { + def add(elem: T) + def get(index: Int): T + def size: Int +} + +/** + * Implements an in-memory transactional vector. + * + * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. + */ +class InMemoryTransactionalVector[T] extends TransactionalVector[T] { + private[kernel] var state: Vector[T] = EmptyVector + private[kernel] var snapshot = state + + override def begin = snapshot = state + override def commit = snapshot = state + override def rollback = state = snapshot + + override def add(elem: T) = state = state + elem + override def get(index: Int): T = state(index) + override def size: Int = state.size +} + +/** + * Implements a transactional reference. + * + * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. + */ +class TransactionalRef[T] extends Transactional { + private[kernel] var ref: Option[T] = None + private[kernel] var snapshot: Option[T] = None + + override def begin = if (ref.isDefined) snapshot = Some(ref.get) + override def commit = if (ref.isDefined) snapshot = Some(ref.get) + override def rollback = if (snapshot.isDefined) ref = Some(snapshot.get) + + def swap(elem: T) = ref = Some(elem) + def get: Option[T] = ref + def getOrElse(default: => T): T = ref.getOrElse(default) + def isDefined: Boolean= ref.isDefined +} diff --git a/kernel/src/main/scala/Transaction.scala b/kernel/src/main/scala/Transaction.scala index 5fb614a74b..1ce13116f0 100644 --- a/kernel/src/main/scala/Transaction.scala +++ b/kernel/src/main/scala/Transaction.scala @@ -47,7 +47,7 @@ class Transaction extends Logging { if (status == TransactionStatus.New) log.debug("Actor [%s] is starting NEW transaction", server) else log.debug("Actor [%s] is participating in transaction", server) println("===== begin 2 " + server) - server.states.foreach(_.begin) + server.transactionalItems.foreach(_.begin) participants ::= server status = TransactionStatus.Active } @@ -80,13 +80,13 @@ class Transaction extends Logging { ensureIsActiveOrAborted println("===== rollback " + server) log.debug("Actor [%s] has initiated transaction rollback, rolling back [%s]" , server, participants) - participants.foreach(_.states.foreach(_.rollback)) + participants.foreach(_.transactionalItems.foreach(_.rollback)) status = TransactionStatus.Aborted } def join(server: GenericServerContainer) = synchronized { println("===== joining " + server) - server.states.foreach(_.begin) + server.transactionalItems.foreach(_.begin) participants ::= server } diff --git a/kernel/src/test/scala/GenericServerContainerSuite.scala b/kernel/src/test/scala/GenericServerContainerSuite.scala index b03feb913b..e75a560a38 100755 --- a/kernel/src/test/scala/GenericServerContainerSuite.scala +++ b/kernel/src/test/scala/GenericServerContainerSuite.scala @@ -7,11 +7,14 @@ package se.scalablesolutions.akka.kernel import scala.actors._ import scala.actors.Actor._ +import com.jteigen.scalatest.JUnit4Runner +import org.junit.runner.RunWith import org.scalatest._ /** * @author Jonas Bonér */ +@RunWith(classOf[JUnit4Runner]) class GenericServerContainerSpec extends Suite { var inner: GenericServerContainerActor = null diff --git a/kernel/src/test/scala/GenericServerSpec.scala b/kernel/src/test/scala/GenericServerSpec.scala index ad090e6861..eb0affae46 100755 --- a/kernel/src/test/scala/GenericServerSpec.scala +++ b/kernel/src/test/scala/GenericServerSpec.scala @@ -4,6 +4,8 @@ package se.scalablesolutions.akka.kernel +import com.jteigen.scalatest.JUnit4Runner +import org.junit.runner.RunWith import org.scalatest._ import scala.actors.Actor._ @@ -11,6 +13,7 @@ import scala.actors.Actor._ /** * @author Jonas Bonér */ +@RunWith(classOf[JUnit4Runner]) class GenericServerSpec extends Suite { def testSendRegularMessage = { diff --git a/kernel/src/test/scala/SupervisorSpec.scala b/kernel/src/test/scala/SupervisorSpec.scala index 2af8008557..ad9bb7e787 100755 --- a/kernel/src/test/scala/SupervisorSpec.scala +++ b/kernel/src/test/scala/SupervisorSpec.scala @@ -9,11 +9,14 @@ import scala.actors.Actor._ import scala.collection.Map import scala.collection.mutable.HashMap +import com.jteigen.scalatest.JUnit4Runner +import org.junit.runner.RunWith import org.scalatest._ /** * @author Jonas Bonér */ +@RunWith(classOf[JUnit4Runner]) class SupervisorSpec extends Suite { var messageLog: String = "" diff --git a/kernel/src/test/scala/SupervisorStateSpec.scala b/kernel/src/test/scala/SupervisorStateSpec.scala index d88a88029a..f341063df0 100755 --- a/kernel/src/test/scala/SupervisorStateSpec.scala +++ b/kernel/src/test/scala/SupervisorStateSpec.scala @@ -4,6 +4,8 @@ package se.scalablesolutions.akka.kernel +import com.jteigen.scalatest.JUnit4Runner +import org.junit.runner.RunWith import org.scalatest._ import scala.actors.Actor._ @@ -11,6 +13,7 @@ import scala.actors.Actor._ /** * @author Jonas Bonér */ +@RunWith(classOf[JUnit4Runner]) class SupervisorStateSpec extends Suite { val dummyActor = new GenericServer { override def body: PartialFunction[Any, Unit] = { case _ => }} diff --git a/lib/cassandra.jar b/lib/cassandra.jar deleted file mode 100755 index 5f93a9b3fb..0000000000 Binary files a/lib/cassandra.jar and /dev/null differ diff --git a/lib/junit4runner-1.0-SNAPSHOT.jar b/lib/junit4runner-1.0-SNAPSHOT.jar deleted file mode 100755 index 6f91bd8044..0000000000 Binary files a/lib/junit4runner-1.0-SNAPSHOT.jar and /dev/null differ diff --git a/lib/libthrift-20080411p1.jar b/lib/libthrift-20080411p1.jar deleted file mode 100644 index 0ba61a4788..0000000000 Binary files a/lib/libthrift-20080411p1.jar and /dev/null differ diff --git a/pom.xml b/pom.xml index 47368f998a..c28b4b0c6d 100755 --- a/pom.xml +++ b/pom.xml @@ -51,8 +51,17 @@ java.net + Java.net Legacy Repository for Maven http://download.java.net/maven/1 legacy + + + repository.jboss.org + JBoss Repository for Maven + http://repository.jboss.org/maven2 + + false + diff --git a/storage/bootstrap/.nil b/storage/bootstrap/.nil deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/storage/callouts/.nil b/storage/callouts/.nil deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/storage/commitlog/.nil b/storage/commitlog/.nil deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/storage/staging/.nil b/storage/staging/.nil deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/storage/system/.nil b/storage/system/.nil deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/supervisor/README b/supervisor/README deleted file mode 100755 index 1b23a275a1..0000000000 --- a/supervisor/README +++ /dev/null @@ -1,214 +0,0 @@ ---- OVERVIEW --- -Scala Actors Behavior Module - -Implements Erlang-style Behaviors for Scala; Supervisor, GenericServer, GenericEvent and GenericFiniteStateMachine allowing creating fault-tolerant actor-based enterprise systems. - -The implementation consists of four main abstractions; - -* Supervisor -- The Supervisor manages hierarchies of Scala actors and provides fault-tolerance in terms of different restart -semantics. The configuration and semantics is almost a 1-1 port of the Erlang Supervisor implementation, explained -here: http://www.erlang.org/doc/design_principles/sup_princ.html, read this document in order to understand how to -configure the Supervisor properly. - -* GenericServer -- The GenericServer (which subclasses Actor) is a trait that forms the base for a server to be managed by a Supervisor. -The GenericServer is wrapped by a GenericServerContainer instance providing a necessary indirection needed to be able to -fully manage the life-cycle of the GenericServer. - -* GenericEvent -- TBD - -* GenericFiniteStateMachine -- TBD - ---- CHECK OUT --- -The SCM system used is Git. - -1. Download and install Git (google git). -2. Invoke 'git clone git://github.com/jboner/scala-otp.git'. - ---- BUILD --- -The build system used is Maven. - -1. Download and install Maven 2. -2. Step into the root dir 'scala-otp'. -3. Invoke 'mvn install' - -This will build the project, run all tests, create a jar and upload it to your local Maven repository ready for use. - ---- RUNTIME DEPENDENCIES --- -1. Scala 2.7.1-final -2. SLF4J 1.5.2 -3. LogBack Classic 0.9.9 - ---- USAGE --- -Here is a small step-by-step runnable tutorial on how to create a server, configure it, use it, hotswap its -implementation etc. For more details on the API, look at the code or the tests. - -You can find this code in the sample.scala file in the root directory. Run it by invoking 'scala -cp -target/scala-behavior-0.1-SNAPSHOT.jar: sample.scala' - -// ============================================= -// 1. Import statements and Server messages - -import scala.actors._ -import scala.actors.Actor._ - -import scala.actors.behavior._ -import scala.actors.behavior.Helpers._ - -sealed abstract class SampleMessage -case object Ping extends SampleMessage -case object Pong extends SampleMessage -case object OneWay extends SampleMessage -case object Die extends SampleMessage - -// ============================================= -// 2. Create the GenericServer by extending the GenericServer trait and override the 'body' method - -class SampleServer extends GenericServer { - - // This method implements the core server logic and naturally has to be overridden - override def body: PartialFunction[Any, Unit] = { - case Ping => - println("Received Ping"); reply(Pong) - - case OneWay => - println("Received OneWay") - - case Die => - println("Received Die..dying...") - throw new RuntimeException("Received Die message") - } - - // GenericServer also has some callback life-cycle methods, such as init(..) and shutdown(..) -} - -// ============================================= -// 3. Wrap our SampleServer in a GenericServerContainer and give it a name to be able to refer to it later. - -object sampleServer1 extends GenericServerContainer("sample1", () => new SampleServer) -object sampleServer2 extends GenericServerContainer("sample2", () => new SampleServer) - -// ============================================= -// 4. Create a Supervisor configuration (and a SupervisorFactory) that is configuring our SampleServer (takes a list of -'Worker' configurations, one or many) - -object factory extends SupervisorFactory { - override protected def getSupervisorConfig: SupervisorConfig = { - SupervisorConfig( - RestartStrategy(AllForOne, 3, 10000), - Worker( - sampleServer1, - LifeCycle(Permanent, 1000)) :: - Worker( - sampleServer2, - LifeCycle(Permanent, 1000)) :: - Nil) - } -} - -// ============================================= -// 5. Create a new Supervisor with the custom factory - -val supervisor = factory.newSupervisor - -// ============================================= -// 6. Start the Supervisor (which starts the server(s)) - -supervisor ! Start - -// ============================================= -// 7. Try to send a one way asyncronous message to our servers - -sampleServer1 ! OneWay - -// Try to get sampleServer2 from the Supervisor before sending a message -supervisor.getServer("sample2") match { - case Some(server2) => server2 ! OneWay - case None => println("server [sample2] could not be found") -} - -// ============================================= -// 8. Try to send an asyncronous message - receive a future - wait 100 ms (time-out) for the reply - -val future = sampleServer1 !! Ping -val reply1 = future.receiveWithin(100) match { - case Some(reply) => - println("Received reply: " + reply) - case None => - println("Did not get a reply witin 100 ms") -} - -// ============================================= -// 9. Try to send a message (Die) telling the server to kill itself (throw an exception) - -sampleServer1 ! Die - -// ============================================= -// 10. Send an asyncronous message and wait on a future. If it times out -> use error handler (in this case throw an -exception). It is likely that this call will time out since the server is in the middle of recovering from failure. - -val reply2 = try { - sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 10) // time out is set to 10 ms (very low on purpose) - -} catch { case e => println("Expected exception: " + e.toString); Pong } - -// ============================================= -// 11. Server should be up again. Try the same call again - -val reply3 = try { - sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 1000) -} catch { case e => println("Expected exception: " + e.toString); Pong } - -// Also check server number 2 -sampleServer2 ! Ping - -// ============================================= -// 11. Try to hotswap the server implementation - -sampleServer1.hotswap(Some({ - case Ping => - println("Hotswapped Ping") -})) - -// ============================================= -// 12. Try the hotswapped server out - -sampleServer1 ! Ping - -// ============================================= -// 13. Hotswap again - -sampleServer1.hotswap(Some({ - case Pong => - println("Hotswapped again, now doing Pong") - reply(Ping) -})) - -// ============================================= -// 14. Send an asyncronous message that will wait on a future. Method returns an Option[T] => if Some(result) -> return -result, if None -> print out an info message (or throw an exception or do whatever you like...) - -val reply4 = (sampleServer1 !!! Pong).getOrElse({println("Time out when sending Pong"); Ping}) - -// Same invocation with pattern matching syntax. - -val reply5 = sampleServer1 !!! Pong match { - case Some(result) => result - case None => println("Time out when sending Pong"); Ping -} - -// ============================================= -// 15. Hotswap back to original implementation by passing in None - -sampleServer1.hotswap(None) - -// ============================================= -// 16. Test the final hotswap by sending an async message - -sampleServer1 ! Ping - -// ============================================= -// 17. Shut down the supervisor and its server(s) - -supervisor ! Stop - - diff --git a/supervisor/sample.scala b/supervisor/sample.scala deleted file mode 100755 index 23baa6c686..0000000000 --- a/supervisor/sample.scala +++ /dev/null @@ -1,164 +0,0 @@ -// ============================================= -// 1. Import statements and Server messages - -import scala.actors._ -import scala.actors.Actor._ - -import scala.actors.behavior._ -import scala.actors.behavior.Helpers._ - -sealed abstract class SampleMessage -case object Ping extends SampleMessage -case object Pong extends SampleMessage -case object OneWay extends SampleMessage -case object Die extends SampleMessage - -// ============================================= -// 2. Create the GenericServer by extending the GenericServer trait and override the 'body' method - -class SampleServer extends GenericServer { - - // This method implements the core server logic and naturally has to be overridden - override def body: PartialFunction[Any, Unit] = { - case Ping => - println("Received Ping"); reply(Pong) - - case OneWay => - println("Received OneWay") - - case Die => - println("Received Die..dying...") - throw new RuntimeException("Received Die message") - } - - // GenericServer also has some callback life-cycle methods, such as init(..) and shutdown(..) -} - -// ============================================= -// 3. Wrap our SampleServer in a GenericServerContainer and give it a name to be able to refer to it later. - -object sampleServer1 extends GenericServerContainer("sample1", () => new SampleServer) -object sampleServer2 extends GenericServerContainer("sample2", () => new SampleServer) - -// ============================================= -// 4. Create a Supervisor configuration (and a SupervisorFactory) that is configuring our SampleServer (takes a list of 'Worker' configurations, one or many) - -object factory extends SupervisorFactory { - override protected def getSupervisorConfig: SupervisorConfig = { - SupervisorConfig( - RestartStrategy(AllForOne, 3, 10000), - Worker( - sampleServer1, - LifeCycle(Permanent, 1000)) :: - Worker( - sampleServer2, - LifeCycle(Permanent, 1000)) :: - Nil) - } -} - -// ============================================= -// 5. Create a new Supervisor with the custom factory - -val supervisor = factory.newSupervisor - -// ============================================= -// 6. Start the Supervisor (which starts the server(s)) - -supervisor ! Start - -// ============================================= -// 7. Try to send a one way asyncronous message to our servers - -sampleServer1 ! OneWay - -// Try to get sampleServer2 from the Supervisor before sending a message -supervisor.getServer("sample2") match { - case Some(server2) => server2 ! OneWay - case None => println("server [sample2] could not be found") -} - -// ============================================= -// 8. Try to send an asyncronous message - receive a future - wait 100 ms (time-out) for the reply - -val future = sampleServer1 !! Ping -val reply1 = future.receiveWithin(100) match { - case Some(reply) => - println("Received reply: " + reply) - case None => - println("Did not get a reply witin 100 ms") -} - -// ============================================= -// 9. Try to send a message (Die) telling the server to kill itself (throw an exception) - -sampleServer1 ! Die - -// ============================================= -// 10. Send an asyncronous message and wait on a future. If it times out -> use error handler (in this case throw an exception). It is likely that this call will time out since the server is in the middle of recovering from failure. - -val reply2 = try { - sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 10) // time out is set to 10 ms (very low on purpose) - -} catch { case e => println("Expected exception: " + e.toString); Pong } - -// ============================================= -// 11. Server should be up again. Try the same call again - -val reply3 = try { - sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 1000) -} catch { case e => println("Expected exception: " + e.toString); Pong } - -// Also check server number 2 -sampleServer2 ! Ping - -// ============================================= -// 11. Try to hotswap the server implementation - -sampleServer1.hotswap(Some({ - case Ping => - println("Hotswapped Ping") -})) - -// ============================================= -// 12. Try the hotswapped server out - -sampleServer1 ! Ping - -// ============================================= -// 13. Hotswap again - -sampleServer1.hotswap(Some({ - case Pong => - println("Hotswapped again, now doing Pong") - reply(Ping) -})) - -// ============================================= -// 14. Send an asyncronous message that will wait on a future. Method returns an Option[T] => if Some(result) -> return result, if None -> print out an info message (or throw an exception or do whatever you like...) - -val reply4 = (sampleServer1 !!! Pong).getOrElse({println("Time out when sending Pong"); Ping}) - -// Same invocation with pattern matching syntax. - -val reply5 = sampleServer1 !!! Pong match { - case Some(result) => result - case None => println("Time out when sending Pong"); Ping -} - -// ============================================= -// 15. Hotswap back to original implementation by passing in None - -sampleServer1.hotswap(None) - -// ============================================= -// 16. Test the final hotswap by sending an async message - -sampleServer1 ! Ping - -// ============================================= -// 17. Shut down the supervisor and its server(s) - -supervisor ! Stop - - diff --git a/supervisor/src/main/scala/GenericServer.scala b/supervisor/src/main/scala/GenericServer.scala deleted file mode 100755 index b5c6a1bb70..0000000000 --- a/supervisor/src/main/scala/GenericServer.scala +++ /dev/null @@ -1,282 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package com.scalablesolutions.akka.supervisor - -import scala.actors._ -import scala.actors.Actor._ - -import com.scalablesolutions.akka.supervisor.Helpers._ - -sealed abstract class GenericServerMessage -case class Init(config: AnyRef) extends GenericServerMessage -case class ReInit(config: AnyRef) extends GenericServerMessage -case class Shutdown(reason: AnyRef) extends GenericServerMessage -case class Terminate(reason: AnyRef) extends GenericServerMessage -case class HotSwap(code: Option[PartialFunction[Any, Unit]]) extends GenericServerMessage - -/** - * Base trait for all user-defined servers/actors. - * - * @author Jonas Bonér - */ -trait GenericServer extends Actor { - - /** - * Template method implementing the server logic. - * To be implemented by subclassing server. - *

- * Example code: - *

-   *   override def body: PartialFunction[Any, Unit] = {
-   *     case Ping =>
-   *       println("got a ping")
-   *       reply("pong")
-   *
-   *     case OneWay =>
-   *       println("got a oneway")
-   *   }
-   * 
- */ - def body: PartialFunction[Any, Unit] - - /** - * Callback method that is called during initialization. - * To be implemented by subclassing server. - */ - def init(config: AnyRef) {} - - /** - * Callback method that is called during reinitialization after a server crash. - * To be implemented by subclassing server. - */ - def reinit(config: AnyRef) {} - - /** - * Callback method that is called during termination. - * To be implemented by subclassing server. - */ - def shutdown(reason: AnyRef) {} - - def act = loop { react { genericBase orElse actorBase } } - - private def actorBase: PartialFunction[Any, Unit] = hotswap getOrElse body - - private var hotswap: Option[PartialFunction[Any, Unit]] = None - - private val genericBase: PartialFunction[Any, Unit] = { - case Init(config) => init(config) - case ReInit(config) => reinit(config) - case HotSwap(code) => hotswap = code - case Shutdown(reason) => shutdown(reason); reply('success) - case Terminate(reason) => exit(reason) - } -} - -/** - * The container (proxy) for GenericServer, responsible for managing the life-cycle of the server; - * such as shutdown, restart, re-initialization etc. - * Each GenericServerContainer manages one GenericServer. - * - * @author Jonas Bonér - */ -class GenericServerContainer(val id: String, var serverFactory: () => GenericServer) extends Logging { - require(id != null && id != "") - - // TODO: see if we can parameterize class and add type safe getActor method - //class GenericServerContainer[T <: GenericServer](var factory: () => T) { - //def getActor: T = server - - var lifeCycle: Option[LifeCycle] = None - val lock = new ReadWriteLock - - private var server: GenericServer = null - private var currentConfig: Option[AnyRef] = None - private var timeout = 5000 - - /** - * Sends a one way message to the server - alias for cast(message). - *

- * Example: - *

-   *   server ! Message
-   * 
- */ - def !(message: Any) = { - require(server != null) - lock.withReadLock { server ! message } - } - - /** - * Sends a message to the server returns a FutureWithTimeout holding the future reply . - *

- * Example: - *

-   *  val future = server !! Message
-   *  future.receiveWithin(100) match {
-   *    case None => ... // timed out
-   *    case Some(reply) => ... // handle reply
-   *  }
-   * 
- */ - def !![T](message: Any): FutureWithTimeout[T] = { - require(server != null) - lock.withReadLock { server !!! message } - } - - /** - * Sends a message to the server and blocks indefinitely (no time out), waiting for the reply. - *

- * Example: - *

-   *   val result: String = server !? Message
-   * 
- */ - def !?[T](message: Any): T = { - require(server != null) - val future: Future[T] = lock.withReadLock { server.!![T](message, {case t => t.asInstanceOf[T]}) } - Actor.receive { - case (future.ch ! arg) => arg.asInstanceOf[T] - } - } - - /** - * Sends a message to the server and gets a future back with the reply. Returns - * an Option with either Some(result) if succesful or None if timeout. - *

- * Timeout specified by the setTimeout(time: Int) method. - *

- * Example: - *

-   *   (server !!! Message).getOrElse(throw new RuntimeException("time out")
-   * 
- */ - def !!![T](message: Any): Option[T] = { - require(server != null) - val future: FutureWithTimeout[T] = lock.withReadLock { server !!! message } - future.receiveWithin(timeout) - } - - /** - * Sends a message to the server and gets a future back with the reply. - *

- * Tries to get the reply within the timeout specified in the GenericServerContainer - * and else execute the error handler (which can return a default value, throw an exception - * or whatever is appropriate). - *

- * Example: - *

-   *   server !!! (Message, throw new RuntimeException("time out"))
-   *   // OR
-   *   server !!! (Message, DefaultReturnValue)
-   * 
- */ - def !!![T](message: Any, errorHandler: => T): T = !!!(message, errorHandler, timeout) - - /** - * Sends a message to the server and gets a future back with the reply. - *

- * Tries to get the reply within the timeout specified as parameter to the method - * and else execute the error handler (which can return a default value, throw an exception - * or whatever is appropriate). - *

- * Example: - *

-   *   server !!! (Message, throw new RuntimeException("time out"), 1000)
-   *   // OR
-   *   server !!! (Message, DefaultReturnValue, 1000)
-   * 
- */ - def !!![T](message: Any, errorHandler: => T, time: Int): T = { - require(server != null) - val future: FutureWithTimeout[T] = lock.withReadLock { server !!! message } - future.receiveWithin(time) match { - case None => errorHandler - case Some(reply) => reply - } - } - - /** - * Initializes the server by sending a Init(config) message. - */ - def init(config: AnyRef) = lock.withWriteLock { - currentConfig = Some(config) - server ! Init(config) - } - - /** - * Re-initializes the server by sending a ReInit(config) message with the most recent configuration. - */ - def reinit = lock.withWriteLock { - currentConfig match { - case Some(config) => server ! ReInit(config) - case None => {} - } - } - - /** - * Hotswaps the server body by sending it a HotSwap(code) with the new code - * block (PartialFunction) to be executed. - */ - def hotswap(code: Option[PartialFunction[Any, Unit]]) = lock.withReadLock { server ! HotSwap(code) } - - /** - * Swaps the server factory, enabling creating of a completely new server implementation - * (upon failure and restart). - */ - def swapFactory(newFactory: () => GenericServer) = serverFactory = newFactory - - /** - * Sets the timeout for the call(..) method, e.g. the maximum time to wait for a reply - * before bailing out. Sets the timeout on the future return from the call to the server. - */ - def setTimeout(time: Int) = timeout = time - - /** - * Returns the next message in the servers mailbox. - */ - def nextMessage = lock.withReadLock { server ? } - - /** - * Creates a new actor for the GenericServerContainer, and return the newly created actor. - */ - private[supervisor] def newServer(): GenericServer = lock.withWriteLock { - server = serverFactory() - server - } - - /** - * Starts the server. - */ - private[supervisor] def start = lock.withReadLock { server.start } - - /** - * Terminates the server with a reason by sending a Terminate(Some(reason)) message. - */ - private[supervisor] def terminate(reason: AnyRef) = lock.withReadLock { server ! Terminate(reason) } - - /** - * Terminates the server with a reason by sending a Terminate(Some(reason)) message, - * the shutdownTime defines the maximal time to wait for the server to shutdown before - * killing it. - */ - private[supervisor] def terminate(reason: AnyRef, shutdownTime: Int) = lock.withReadLock { - if (shutdownTime > 0) { - log.debug("Waiting {} milliseconds for the server to shut down before killing it.", shutdownTime) - server !? (shutdownTime, Shutdown(reason)) match { - case Some('success) => log.debug("Server [{}] has been shut down cleanly.", id) - case None => log.warning("Server [{}] was **not able** to complete shutdown cleanly within its configured shutdown time [{}]", id, shutdownTime) - } - } - server ! Terminate(reason) - } - - private[supervisor] def reconfigure(reason: AnyRef, restartedServer: GenericServer, supervisor: Supervisor) = lock.withWriteLock { - server = restartedServer - reinit - } - - private[supervisor] def getServer: GenericServer = server -} - diff --git a/supervisor/src/main/scala/Helpers.scala b/supervisor/src/main/scala/Helpers.scala deleted file mode 100755 index 50dbeb0b98..0000000000 --- a/supervisor/src/main/scala/Helpers.scala +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package com.scalablesolutions.akka.supervisor - -import java.util.concurrent.locks.ReentrantReadWriteLock - -import scala.actors._ -import scala.actors.Actor._ - -import net.lag.logging.Logger - -class SystemFailure(cause: Throwable) extends RuntimeException(cause) - -/** - * Base trait for all classes that wants to be able use the logging infrastructure. - * - * @author Jonas Bonér - */ -trait Logging { - @transient val log = Logger.get(this.getClass.getName) -} - -/** - * @author Jonas Bonér - */ -object Helpers extends Logging { - - // ================================================ - class ReadWriteLock { - private val rwl = new ReentrantReadWriteLock - private val readLock = rwl.readLock - private val writeLock = rwl.writeLock - - def withWriteLock[T](body: => T): T = { - writeLock.lock - try { - body - } finally { - writeLock.unlock - } - } - - def withReadLock[T](body: => T): T = { - readLock.lock - try { - body - } finally { - readLock.unlock - } - } - } - - // ================================================ - // implicit conversion between regular actor and actor with a type future - implicit def actorWithFuture(a: Actor) = new ActorWithTypedFuture(a) - - abstract class FutureWithTimeout[T](ch: InputChannel[Any]) extends Future[T](ch) { - def receiveWithin(timeout: Int) : Option[T] - override def respond(f: T => Unit): Unit = throw new UnsupportedOperationException("Does not support the Responder API") - } - - def receiveOrFail[T](future: => FutureWithTimeout[T], timeout: Int, errorHandler: => T): T = { - future.receiveWithin(timeout) match { - case None => errorHandler - case Some(reply) => reply - } - } - - class ActorWithTypedFuture(a: Actor) { - require(a != null) - - def !!![A](msg: Any): FutureWithTimeout[A] = { - val ftch = new Channel[Any](Actor.self) - a.send(msg, ftch) - new FutureWithTimeout[A](ftch) { - def apply() = - if (isSet) value.get.asInstanceOf[A] - else ch.receive { - case a => - value = Some(a) - value.get.asInstanceOf[A] - } - def isSet = receiveWithin(0).isDefined - def receiveWithin(timeout: Int): Option[A] = value match { - case None => ch.receiveWithin(timeout) { - case TIMEOUT => - log.debug("Future timed out while waiting for actor: {}", a) - None - case a => - value = Some(a) - value.asInstanceOf[Option[A]] - } - case a => a.asInstanceOf[Option[A]] - } - } - } - } -} - diff --git a/supervisor/src/main/scala/Supervisor.scala b/supervisor/src/main/scala/Supervisor.scala deleted file mode 100755 index 62f9d94ec1..0000000000 --- a/supervisor/src/main/scala/Supervisor.scala +++ /dev/null @@ -1,358 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package com.scalablesolutions.akka.supervisor - -import scala.actors._ -import scala.actors.Actor._ -import scala.collection.mutable.HashMap - -import com.scalablesolutions.akka.supervisor.Helpers._ - -//==================================================== - -/** - * Configuration classes - not to be used as messages. - * - * @author Jonas Bonér - */ -sealed abstract class ConfigElement - -abstract class Server extends ConfigElement -abstract class FailOverScheme extends ConfigElement -abstract class Scope extends ConfigElement - -case class SupervisorConfig(restartStrategy: RestartStrategy, worker: List[Server]) extends Server -case class Worker(serverContainer: GenericServerContainer, lifeCycle: LifeCycle) extends Server - -case class RestartStrategy(scheme: FailOverScheme, maxNrOfRetries: Int, withinTimeRange: Int) extends ConfigElement - -case object AllForOne extends FailOverScheme -case object OneForOne extends FailOverScheme - -case class LifeCycle(scope: Scope, shutdownTime: Int) extends ConfigElement -case object Permanent extends Scope -case object Transient extends Scope -case object Temporary extends Scope - -//==================================================== - -/** - * Messages that the supervisor responds to and returns. - * - * @author Jonas Bonér - */ -sealed abstract class SupervisorMessage -case object Start extends SupervisorMessage -case object Stop extends SupervisorMessage -case class Configure(config: SupervisorConfig, factory: SupervisorFactory) extends SupervisorMessage - -/** - * Abstract base class for all supervisor factories. - *

- * Example usage: - *

- *  class MySupervisorFactory extends SupervisorFactory {
- *
- *    override protected def getSupervisorConfig: SupervisorConfig = {
- *      SupervisorConfig(
- *        RestartStrategy(OneForOne, 3, 10),
- *        Worker(
- *          myFirstActorInstance,
- *          LifeCycle(Permanent, 1000))
- *        ::
- *        Worker(
- *          mySecondActorInstance,
- *          LifeCycle(Permanent, 1000))
- *        :: Nil)
- *    }
- * }
- * 
- * - * Then create a concrete factory in which we mix in support for the specific implementation of the Service we want to use. - * - *
- * object factory extends MySupervisorFactory
- * 
- * - * Then create a new Supervisor tree with the concrete Services we have defined. - * - *
- * val supervisor = factory.newSupervisor
- * supervisor ! Start // start up all managed servers
- * 
- * - * @author Jonas Bonér - */ -abstract class SupervisorFactory extends Logging { - def newSupervisor: Supervisor = newSupervisorFor(getSupervisorConfig) - - def newSupervisorFor(config: SupervisorConfig): Supervisor = config match { - case SupervisorConfig(restartStrategy, _) => - val supervisor = create(restartStrategy) - supervisor.start - supervisor !? Configure(config, this) match { - case 'success => log.debug("Supervisor successfully configured") - case _ => log.error("Supervisor could not be configured") - } - supervisor - } - - /** - * To be overridden by concrete factory. - * Should return the SupervisorConfig for the supervisor. - */ - protected def getSupervisorConfig: SupervisorConfig - - protected def create(strategy: RestartStrategy): Supervisor = strategy match { - case RestartStrategy(scheme, maxNrOfRetries, timeRange) => - scheme match { - case AllForOne => new Supervisor(new AllForOneStrategy(maxNrOfRetries, timeRange)) - case OneForOne => new Supervisor(new OneForOneStrategy(maxNrOfRetries, timeRange)) - } - } -} - -//==================================================== -/** - * TODO: document - * - * @author Jonas Bonér - */ -class Supervisor(faultHandler: FaultHandlingStrategy) extends Actor with Logging { - - private val state = new SupervisorState(this, faultHandler) - - /** - * Returns an Option with the GenericServerContainer for the server with the name specified. - * If the server is found then Some(server) is returned else None. - */ - def getServer(id: String): Option[GenericServerContainer] = state.getServerContainer(id) - - /** - * Returns an the GenericServerContainer for the server with the name specified. - * If the server is not found then the error handler is invoked. - */ - def getServerOrElse(id: String, errorHandler: => GenericServerContainer): GenericServerContainer = { - getServer(id) match { - case Some(serverContainer) => serverContainer - case None => errorHandler - } - } - - def act = { - self.trapExit = true - loop { - react { - case Configure(config, factory) => - log.debug("Configuring supervisor:{} ", this) - configure(config, factory) - reply('success) - - case Start => - state.serverContainers.foreach { serverContainer => - serverContainer.start - log.info("Starting server: {}", serverContainer.getServer) - } - - case Stop => - state.serverContainers.foreach { serverContainer => - serverContainer.terminate('normal) - log.info("Stopping server: {}", serverContainer) - } - log.info("Stopping supervisor: {}", this) - exit('normal) - - case Exit(failedServer, reason) => - reason match { - case 'forced => {} // do nothing - case _ => state.faultHandler.handleFailure(state, failedServer, reason) - } - - case unexpected => log.warning("Unexpected message [{}], ignoring...", unexpected) - } - } - } - - private def configure(config: SupervisorConfig, factory: SupervisorFactory) = config match { - case SupervisorConfig(_, servers) => - servers.map(server => - server match { - case Worker(serverContainer, lifecycle) => - serverContainer.lifeCycle = Some(lifecycle) - spawnLink(serverContainer) - - case SupervisorConfig(_, _) => // recursive configuration - val supervisor = factory.newSupervisorFor(server.asInstanceOf[SupervisorConfig]) - supervisor ! Start - state.addSupervisor(supervisor) - }) - } - - private[supervisor] def spawnLink(serverContainer: GenericServerContainer): GenericServer = { - val newServer = serverContainer.newServer() - newServer.start - self.link(newServer) - log.debug("Linking actor [{}] to supervisor [{}]", newServer, this) - state.addServerContainer(serverContainer) - newServer - } -} - -//==================================================== -/** - * TODO: document - * - * @author Jonas Bonér - */ -abstract class FaultHandlingStrategy(val maxNrOfRetries: Int, val withinTimeRange: Int) extends Logging { - private[supervisor] var supervisor: Supervisor = _ - private var nrOfRetries = 0 - private var retryStartTime = currentTime - - private[supervisor] def handleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = { - nrOfRetries += 1 - if (timeRangeHasExpired) { - if (hasReachedMaximumNrOfRetries) { - log.info("Maximum of restarts [{}] for server [{}] has been reached - the supervisor including all its servers will now be shut down.", maxNrOfRetries, failedServer) - supervisor ! Stop // execution stops here - } else { - nrOfRetries = 0 - retryStartTime = currentTime - } - } - doHandleFailure(state, failedServer, reason) - } - - - private[supervisor] def restart(serverContainer: GenericServerContainer, reason: AnyRef, state: SupervisorState) = { - preRestart(serverContainer) - serverContainer.lock.withWriteLock { - - // TODO: this is the place to fail-over all pending messages in the failing actor's mailbox, if possible to get a hold of them - // e.g. something like 'serverContainer.getServer.getPendingMessages.map(newServer ! _)' - - self.unlink(serverContainer.getServer) - serverContainer.lifeCycle match { - case None => throw new IllegalStateException("Server [" + serverContainer.id + "] does not have a life-cycle defined.") - case Some(LifeCycle(scope, shutdownTime)) => - serverContainer.terminate(reason, shutdownTime) - - scope match { - case Permanent => - log.debug("Restarting server [{}] configured as PERMANENT.", serverContainer.id) - serverContainer.reconfigure(reason, supervisor.spawnLink(serverContainer), state.supervisor) - - case Temporary => - if (reason == 'normal) { - log.debug("Restarting server [{}] configured as TEMPORARY (since exited naturally).", serverContainer.id) - serverContainer.reconfigure(reason, supervisor.spawnLink(serverContainer), state.supervisor) - } else log.info("Server [{}] configured as TEMPORARY will not be restarted (received unnatural exit message).", serverContainer.id) - - case Transient => - log.info("Server [{}] configured as TRANSIENT will not be restarted.", serverContainer.id) - } - } - } - postRestart(serverContainer) - } - - /** - * To be overriden by concrete strategies. - */ - protected def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) - - /** - * To be overriden by concrete strategies. - */ - protected def preRestart(serverContainer: GenericServerContainer) = {} - - /** - * To be overriden by concrete strategies. - */ - protected def postRestart(serverContainer: GenericServerContainer) = {} - - private def hasReachedMaximumNrOfRetries: Boolean = nrOfRetries > maxNrOfRetries - private def timeRangeHasExpired: Boolean = (currentTime - retryStartTime) > withinTimeRange - private def currentTime: Long = System.currentTimeMillis -} - -//==================================================== -/** - * TODO: document - * - * @author Jonas Bonér - */ -class AllForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) -extends FaultHandlingStrategy(maxNrOfRetries, withinTimeRange) { - override def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = { - log.error("Server [{}] has failed due to [{}] - scheduling restart - scheme: ALL_FOR_ONE.", failedServer, reason) - for (serverContainer <- state.serverContainers) restart(serverContainer, reason, state) - state.supervisors.foreach(_ ! Exit(failedServer, reason)) - } -} - -//==================================================== -/** - * TODO: document - * - * @author Jonas Bonér - */ -class OneForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) -extends FaultHandlingStrategy(maxNrOfRetries, withinTimeRange) { - override def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = { - log.error("Server [{}] has failed due to [{}] - scheduling restart - scheme: ONE_FOR_ONE.", failedServer, reason) - var serverContainer: Option[GenericServerContainer] = None - state.serverContainers.foreach { - container => if (container.getServer == failedServer) serverContainer = Some(container) - } - serverContainer match { - case None => throw new RuntimeException("Could not find a generic server for actor: " + failedServer) - case Some(container) => restart(container, reason, state) - } - } -} - -//==================================================== -/** - * TODO: document - * - * @author Jonas Bonér - */ -private[supervisor] class SupervisorState(val supervisor: Supervisor, val faultHandler: FaultHandlingStrategy) extends Logging { - faultHandler.supervisor = supervisor - - private val _lock = new ReadWriteLock - private val _serverContainerRegistry = new HashMap[String, GenericServerContainer] - private var _supervisors: List[Supervisor] = Nil - - def supervisors: List[Supervisor] = _lock.withReadLock { - _supervisors - } - - def addSupervisor(supervisor: Supervisor) = _lock.withWriteLock { - _supervisors = supervisor :: _supervisors - } - - def serverContainers: List[GenericServerContainer] = _lock.withReadLock { - _serverContainerRegistry.values.toList - } - - def getServerContainer(id: String): Option[GenericServerContainer] = _lock.withReadLock { - if (_serverContainerRegistry.contains(id)) Some(_serverContainerRegistry(id)) - else None - } - - def addServerContainer(serverContainer: GenericServerContainer) = _lock.withWriteLock { - _serverContainerRegistry += serverContainer.id -> serverContainer - } - - def removeServerContainer(id: String) = _lock.withWriteLock { - getServerContainer(id) match { - case Some(serverContainer) => _serverContainerRegistry - id - case None => {} - } - } -} - diff --git a/supervisor/test-code/test/scala/GenericServerContainerSuite.scala b/supervisor/test-code/test/scala/GenericServerContainerSuite.scala deleted file mode 100755 index 1b85425d74..0000000000 --- a/supervisor/test-code/test/scala/GenericServerContainerSuite.scala +++ /dev/null @@ -1,202 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package com.scalablesolutions.akka.supervisor - -import org.specs.runner.JUnit4 -import org.specs.Specification - -import scala.actors._ -import scala.actors.Actor._ - -/** - * @author Jonas Bonér - */ -class GenericServerContainerTest extends JUnit4(genericServerContainerSpec) // for JUnit4 and Maven -object genericServerContainerSpec extends Specification { - - var inner: GenericServerContainerActor = null - var server: GenericServerContainer = null - def createProxy(f: () => GenericServer) = { - val server = new GenericServerContainer("server", f) - server.setTimeout(100) - server - } - - inner = new GenericServerContainerActor - server = createProxy(() => inner) - server.newServer - server.start - - "server should be initialized" in { - server.init("testInit") - Thread.sleep(100) - expect("initializing: testInit") { - inner.log - } - } - - "server should terminate with a reason " in { - server.terminate("testTerminateWithReason", 100) - Thread.sleep(100) - expect("terminating: testTerminateWithReason") { - inner.log - } - } - - "server respond to async oneway message" in { - server ! OneWay - Thread.sleep(100) - expect("got a oneway") { - inner.log - } - } - - "server respond to async ping message" in { - server ! Ping - Thread.sleep(100) - expect("got a ping") { - inner.log - } - } - - "server respond to !!!" in { - expect("pong") { - (server !!! Ping).getOrElse("nil") - } - expect("got a ping") { - inner.log - } - } - - "server respond to !?" in { - expect("pong") { - val res: String = server !? Ping - res - } - expect("got a ping") { - inner.log - } - } - - "server respond to !!! with timeout" in { - expect("pong") { - (server !!! Ping).getOrElse("nil") - } - expect("got a ping") { - inner.log - } - } - - "server respond to !!! with timeout" in { - expect("error handler") { - server !!! (OneWay, "error handler") - } - expect("got a oneway") { - inner.log - } - } - - "server respond to !!! and return future with timeout" in { - val future = server !! Ping - future.receiveWithin(100) match { - case None => fail("timed out") // timed out - case Some(reply) => - expect("got a ping") { - inner.log - } - assert("pong" === reply) - } - } - - "server respond to !!! and return future with timeout" in { - val future = server !! OneWay - future.receiveWithin(100) match { - case None => - expect("got a oneway") { - inner.log - } - case Some(reply) => - fail("expected a timeout, got Some(reply)") - } - } - - "server respond do hotswap" in { - // using base - expect("pong") { - (server !!! Ping).getOrElse("nil") - } - - // hotswapping - server.hotswap(Some({ - case Ping => reply("hotswapped pong") - })) - expect("hotswapped pong") { - (server !!! Ping).getOrElse("nil") - } - } - - "server respond do double hotswap" in { - // using base - expect("pong") { - (server !!! Ping).getOrElse("nil") - } - - // hotswapping - server.hotswap(Some({ - case Ping => reply("hotswapped pong") - })) - expect("hotswapped pong") { - (server !!! Ping).getOrElse("nil") - } - - // hotswapping again - server.hotswap(Some({ - case Ping => reply("hotswapped pong again") - })) - expect("hotswapped pong again") { - (server !!! Ping).getOrElse("nil") - } - } - - "server respond do hotswap and then revert" in { - // using base - expect("pong") { - (server !!! Ping).getOrElse("nil") - } - - // hotswapping - server.hotswap(Some({ - case Ping => reply("hotswapped pong") - })) - expect("hotswapped pong") { - (server !!! Ping).getOrElse("nil") - } - - // restoring original base - server.hotswap(None) - expect("pong") { - (server !!! Ping).getOrElse("nil") - } - } -} - - -class GenericServerContainerActor extends GenericServer { - var log = "" - - override def body: PartialFunction[Any, Unit] = { - case Ping => - log = "got a ping" - reply("pong") - - case OneWay => - log = "got a oneway" - } - - override def init(config: AnyRef) = log = "initializing: " + config - override def shutdown(reason: AnyRef) = log = "terminating: " + reason -} - - diff --git a/supervisor/test-code/test/scala/GenericServerSuite.scala b/supervisor/test-code/test/scala/GenericServerSuite.scala deleted file mode 100755 index 44aab326eb..0000000000 --- a/supervisor/test-code/test/scala/GenericServerSuite.scala +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package com.scalablesolutions.akka.supervisor - -import org.specs.runner.JUnit4 -import org.specs.Specification - -import scala.actors._ -import scala.actors.Actor._ - -/** - * @author Jonas Bonér - */ -class GenericServerTest extends JUnit4(genericServerSpec) // for JUnit4 and Maven -object genericServerSpec extends Specification { - - "server should respond to a regular message" in { - val server = new TestGenericServerActor - server.start - server !? Ping match { - case reply: String => - assert("got a ping" === server.log) - assert("pong" === reply) - case _ => fail() - } - } -} - -class TestGenericServerActor extends GenericServer { - var log: String = "" - - override def body: PartialFunction[Any, Unit] = { - case Ping => - log = "got a ping" - reply("pong") - } -} - diff --git a/supervisor/test-code/test/scala/Messages.scala b/supervisor/test-code/test/scala/Messages.scala deleted file mode 100755 index 0f014ca692..0000000000 --- a/supervisor/test-code/test/scala/Messages.scala +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package com.scalablesolutions.akka.supervisor - -sealed abstract class TestMessage -case object Ping extends TestMessage -case object Pong extends TestMessage -case object OneWay extends TestMessage -case object Die extends TestMessage -case object NotifySupervisorExit extends TestMessage diff --git a/supervisor/test-code/test/scala/SupervisorStateSuite.scala b/supervisor/test-code/test/scala/SupervisorStateSuite.scala deleted file mode 100755 index 6df3b7e059..0000000000 --- a/supervisor/test-code/test/scala/SupervisorStateSuite.scala +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package com.scalablesolutions.akka.supervisor - -import org.specs.runner.JUnit4 -import org.specs.Specification - -import scala.actors._ -import scala.actors.Actor._ - -/** - * @author Jonas Bonér - */ -class SupervisorStateTest extends JUnit4(supervisorStateSpec) // for JUnit4 and Maven -object supervisorStateSpec extends Specification { - val dummyActor = new GenericServer { override def body: PartialFunction[Any, Unit] = { case _ => }} - val newDummyActor = () => dummyActor - var state: SupervisorState = _ - var proxy: GenericServerContainer = _ - var supervisor: Supervisor = _ - - proxy = new GenericServerContainer("server1", newDummyActor) - object factory extends SupervisorFactory { - override def getSupervisorConfig: SupervisorConfig = { - SupervisorConfig( - RestartStrategy(AllForOne, 3, 100), - Worker( - proxy, - LifeCycle(Permanent, 100)) - :: Nil) - } - } - - supervisor = factory.newSupervisor - state = new SupervisorState(supervisor, new AllForOneStrategy(3, 100)) - - "supervisor state should return added server" in { - state.addServerContainer(proxy) - state.getServerContainer("server1") match { - case None => fail("should have returned server") - case Some(server) => - assert(server != null) - assert(server.isInstanceOf[GenericServerContainer]) - assert(proxy === server) - } - } - - "supervisor state should remove added server" in { - state.addServerContainer(proxy) - - state.removeServerContainer("server1") - state.getServerContainer("server1") match { - case Some(_) => fail("should have returned None") - case None => - } - state.getServerContainer("dummyActor") match { - case Some(_) => fail("should have returned None") - case None => - } - } - - "supervisor state should fail getting non-existent server by symbol" in { - state.getServerContainer("server2") match { - case Some(_) => fail("should have returned None") - case None => - } - } - - "supervisor state should fail getting non-existent server by actor" in { - state.getServerContainer("dummyActor") match { - case Some(_) => fail("should have returned None") - case None => - } - } -} diff --git a/supervisor/test-code/test/scala/SupervisorSuite.scala b/supervisor/test-code/test/scala/SupervisorSuite.scala deleted file mode 100755 index 4e8bd048e1..0000000000 --- a/supervisor/test-code/test/scala/SupervisorSuite.scala +++ /dev/null @@ -1,434 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package com.scalablesolutions.akka.supervisor - -import org.specs.runner.JUnit4 -import org.specs.Specification - -import scala.actors._ -import scala.actors.Actor._ -import scala.collection.Map -import scala.collection.mutable.HashMap - -/** - * @author Jonas Bonér - */ -class SupervisorTest extends JUnit4(supervisorSpec) // for JUnit4 and Maven -object supervisorSpec extends Specification { - - var messageLog: String = "" - val pingpong1 = new GenericServerContainer("pingpong1", () => new PingPong1Actor) - val pingpong2 = new GenericServerContainer("pingpong2", () => new PingPong2Actor) - val pingpong3 = new GenericServerContainer("pingpong3", () => new PingPong3Actor) - - pingpong1.setTimeout(100) - pingpong2.setTimeout(100) - pingpong3.setTimeout(100) - - @BeforeMethod - def setup = messageLog = "" - - // =========================================== - "starting supervisor should start the servers" in { - val sup = getSingleActorAllForOneSupervisor - sup ! Start - - expect("pong") { - (pingpong1 !!! Ping).getOrElse("nil") - } - } - - // =========================================== - "started supervisor should be able to return started servers" in { - val sup = getSingleActorAllForOneSupervisor - sup ! Start - val server = sup.getServerOrElse("pingpong1", throw new RuntimeException("server not found")) - assert(server.isInstanceOf[GenericServerContainer]) - assert(server === pingpong1) - } - - // =========================================== - "started supervisor should fail returning non-existing server" in { - val sup = getSingleActorAllForOneSupervisor - sup ! Start - intercept(classOf[RuntimeException]) { - sup.getServerOrElse("wrong_name", throw new RuntimeException("server not found")) - } - } - - // =========================================== - "supervisor should restart killed server with restart strategy one_for_one" in { - val sup = getSingleActorOneForOneSupervisor - sup ! Start - - intercept(classOf[RuntimeException]) { - pingpong1 !!! (Die, throw new RuntimeException("TIME OUT")) - } - Thread.sleep(100) - expect("oneforone") { - messageLog - } - } - - // =========================================== - "supervisor should restart used killed server with restart strategy one_for_one" in { - val sup = getSingleActorOneForOneSupervisor - sup ! Start - - expect("pong") { - (pingpong1 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("ping") { - messageLog - } - intercept(classOf[RuntimeException]) { - pingpong1 !!! (Die, throw new RuntimeException("TIME OUT")) - } - Thread.sleep(100) - expect("pingoneforone") { - messageLog - } - expect("pong") { - (pingpong1 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pingoneforoneping") { - messageLog - } - } - - // =========================================== - "supervisor should restart killed server with restart strategy all_for_one" in { - val sup = getSingleActorAllForOneSupervisor - sup ! Start - intercept(classOf[RuntimeException]) { - pingpong1 !!! (Die, throw new RuntimeException("TIME OUT")) - } - Thread.sleep(100) - expect("allforone") { - messageLog - } - } - - // =========================================== - "supervisor should restart used killed server with restart strategy all_for_one" in { - val sup = getSingleActorAllForOneSupervisor - sup ! Start - expect("pong") { - (pingpong1 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("ping") { - messageLog - } - intercept(classOf[RuntimeException]) { - pingpong1 !!! (Die, throw new RuntimeException("TIME OUT")) - } - Thread.sleep(100) - expect("pingallforone") { - messageLog - } - expect("pong") { - (pingpong1 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pingallforoneping") { - messageLog - } - } - - // =========================================== - "supervisor should restart killed multiple servers with restart strategy one_for_one" in { - val sup = getMultipleActorsOneForOneConf - sup ! Start - intercept(classOf[RuntimeException]) { - pingpong3 !!! (Die, throw new RuntimeException("TIME OUT")) - } - Thread.sleep(100) - expect("oneforone") { - messageLog - } - } - - // =========================================== - "supervisor should restart killed multiple servers with restart strategy one_for_one" in { - val sup = getMultipleActorsOneForOneConf - sup ! Start - expect("pong") { - (pingpong1 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pong") { - (pingpong2 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pong") { - (pingpong3 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pingpingping") { - messageLog - } - intercept(classOf[RuntimeException]) { - pingpong2 !!! (Die, throw new RuntimeException("TIME OUT")) - } - Thread.sleep(100) - expect("pingpingpingoneforone") { - messageLog - } - expect("pong") { - (pingpong1 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pong") { - (pingpong2 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pong") { - (pingpong3 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pingpingpingoneforonepingpingping") { - messageLog - } - } - - // =========================================== - "supervisor should restart killed muliple servers with restart strategy all_for_one" in { - val sup = getMultipleActorsAllForOneConf - sup ! Start - intercept(classOf[RuntimeException]) { - pingpong2 !!! (Die, throw new RuntimeException("TIME OUT")) - } - Thread.sleep(100) - expect("allforoneallforoneallforone") { - messageLog - } - } - - // =========================================== - "supervisor should restart killed muliple servers with restart strategy all_for_one" in { - val sup = getMultipleActorsAllForOneConf - sup ! Start - expect("pong") { - (pingpong1 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pong") { - (pingpong2 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pong") { - (pingpong3 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pingpingping") { - messageLog - } - intercept(classOf[RuntimeException]) { - pingpong2 !!! (Die, throw new RuntimeException("TIME OUT")) - } - Thread.sleep(100) - expect("pingpingpingallforoneallforoneallforone") { - messageLog - } - expect("pong") { - (pingpong1 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pong") { - (pingpong2 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pong") { - (pingpong3 !!! Ping).getOrElse("nil") - } - Thread.sleep(100) - expect("pingpingpingallforoneallforoneallforonepingpingping") { - messageLog - } - } - - "supervisor should restart killed first-level server with restart strategy all_for_one" in { - val sup = getNestedSupervisorsAllForOneConf - sup ! Start - intercept(classOf[RuntimeException]) { - pingpong1 !!! (Die, throw new RuntimeException("TIME OUT")) - } - Thread.sleep(100) - expect("allforoneallforoneallforone") { - messageLog - } - } - - - // ============================================= - // Creat some supervisors with different configurations - - def getSingleActorAllForOneSupervisor: Supervisor = { - - // Create an abstract SupervisorContainer that works for all implementations - // of the different Actors (Services). - // - // Then create a concrete container in which we mix in support for the specific - // implementation of the Actors we want to use. - - object factory extends TestSupervisorFactory { - override def getSupervisorConfig: SupervisorConfig = { - SupervisorConfig( - RestartStrategy(AllForOne, 3, 100), - Worker( - pingpong1, - LifeCycle(Permanent, 100)) - :: Nil) - } - } - factory.newSupervisor - } - - def getSingleActorOneForOneSupervisor: Supervisor = { - object factory extends TestSupervisorFactory { - override def getSupervisorConfig: SupervisorConfig = { - SupervisorConfig( - RestartStrategy(OneForOne, 3, 100), - Worker( - pingpong1, - LifeCycle(Permanent, 100)) - :: Nil) - } - } - factory.newSupervisor - } - - def getMultipleActorsAllForOneConf: Supervisor = { - object factory extends TestSupervisorFactory { - override def getSupervisorConfig: SupervisorConfig = { - SupervisorConfig( - RestartStrategy(AllForOne, 3, 100), - Worker( - pingpong1, - LifeCycle(Permanent, 100)) - :: - Worker( - pingpong2, - LifeCycle(Permanent, 100)) - :: - Worker( - pingpong3, - LifeCycle(Permanent, 100)) - :: Nil) - } - } - factory.newSupervisor - } - - def getMultipleActorsOneForOneConf: Supervisor = { - object factory extends TestSupervisorFactory { - override def getSupervisorConfig: SupervisorConfig = { - SupervisorConfig( - RestartStrategy(OneForOne, 3, 100), - Worker( - pingpong1, - LifeCycle(Permanent, 100)) - :: - Worker( - pingpong2, - LifeCycle(Permanent, 100)) - :: - Worker( - pingpong3, - LifeCycle(Permanent, 100)) - :: Nil) - } - } - factory.newSupervisor - } - - def getNestedSupervisorsAllForOneConf: Supervisor = { - object factory extends TestSupervisorFactory { - override def getSupervisorConfig: SupervisorConfig = { - SupervisorConfig( - RestartStrategy(AllForOne, 3, 100), - Worker( - pingpong1, - LifeCycle(Permanent, 100)) - :: - SupervisorConfig( - RestartStrategy(AllForOne, 3, 100), - Worker( - pingpong2, - LifeCycle(Permanent, 100)) - :: - Worker( - pingpong3, - LifeCycle(Permanent, 100)) - :: Nil) - :: Nil) - } - } - factory.newSupervisor - } - - class PingPong1Actor extends GenericServer { - override def body: PartialFunction[Any, Unit] = { - case Ping => - messageLog += "ping" - reply("pong") - case Die => - throw new RuntimeException("Recieved Die message") - } - } - - class PingPong2Actor extends GenericServer { - override def body: PartialFunction[Any, Unit] = { - case Ping => - messageLog += "ping" - reply("pong") - case Die => - throw new RuntimeException("Recieved Die message") - } - } - - class PingPong3Actor extends GenericServer { - override def body: PartialFunction[Any, Unit] = { - case Ping => - messageLog += "ping" - reply("pong") - case Die => - throw new RuntimeException("Recieved Die message") - } - } - - // ============================================= - - class TestAllForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends AllForOneStrategy(maxNrOfRetries, withinTimeRange) { - override def postRestart(serverContainer: GenericServerContainer) = { - messageLog += "allforone" - } - } - - class TestOneForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends OneForOneStrategy(maxNrOfRetries, withinTimeRange) { - override def postRestart(serverContainer: GenericServerContainer) = { - messageLog += "oneforone" - } - } - - abstract class TestSupervisorFactory extends SupervisorFactory { - override def create(strategy: RestartStrategy): Supervisor = strategy match { - case RestartStrategy(scheme, maxNrOfRetries, timeRange) => - scheme match { - case AllForOne => new Supervisor(new TestAllForOneStrategy(maxNrOfRetries, timeRange)) - case OneForOne => new Supervisor(new TestOneForOneStrategy(maxNrOfRetries, timeRange)) - } - } - } -} - - - - - - diff --git a/util-java/util-java.iml b/util-java/util-java.iml index 723223dded..138b161455 100755 --- a/util-java/util-java.iml +++ b/util-java/util-java.iml @@ -1,12 +1,12 @@ - - - - - - - - - - - - + + + + + + + + + + + +