diff --git a/akka.iml b/akka.iml index 2c465df4e9..d26ed1fee1 100755 --- a/akka.iml +++ b/akka.iml @@ -9,6 +9,7 @@ + diff --git a/akka.ipr b/akka.ipr index f5a05a8e16..36e92c08a2 100755 --- a/akka.ipr +++ b/akka.ipr @@ -44,6 +44,29 @@ + - - - - - - - - - @@ -36,15 +28,6 @@ - - - - - - - - - @@ -54,15 +37,6 @@ - - - - - - - - - diff --git a/api-java/nbproject/build-impl.xml b/api-java/nbproject/build-impl.xml index 0083ec74f8..50f298fca0 100755 --- a/api-java/nbproject/build-impl.xml +++ b/api-java/nbproject/build-impl.xml @@ -1,675 +1,646 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + + + + + + + diff --git a/api-java/nbproject/genfiles.properties b/api-java/nbproject/genfiles.properties index 77b5fce023..c3be1a543c 100755 --- a/api-java/nbproject/genfiles.properties +++ b/api-java/nbproject/genfiles.properties @@ -1,8 +1,8 @@ -build.xml.data.CRC32=a3c53bfd -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=a3c53bfd -nbproject/build-impl.xml.script.CRC32=3a7ee62c -nbproject/build-impl.xml.stylesheet.CRC32=d5ddc080@1.24.0.45 +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 diff --git a/api-java/nbproject/private/private.properties b/api-java/nbproject/private/private.properties index 2c2124cd11..2608879383 100755 --- a/api-java/nbproject/private/private.properties +++ b/api-java/nbproject/private/private.properties @@ -1,7 +1,7 @@ -compile.on.save=true -do.depend=false -do.jar=true -javac.debug=true -javadoc.preview=true -jaxws.endorsed.dir=/home/jboner/bin/netbeans-dev-200903220201/java2/modules/ext/jaxws21/api:/home/jboner/bin/netbeans-dev-200903220201/ide11/modules/ext/jaxb/api -user.properties.file=/home/jboner/.netbeans/dev/build.properties +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 diff --git a/api-java/nbproject/private/private.xml b/api-java/nbproject/private/private.xml new file mode 100755 index 0000000000..cc2c0e57c4 --- /dev/null +++ b/api-java/nbproject/private/private.xml @@ -0,0 +1,4 @@ + + + + diff --git a/api-java/nbproject/project.properties b/api-java/nbproject/project.properties index 0c75912fc6..0f4243de96 100755 --- a/api-java/nbproject/project.properties +++ b/api-java/nbproject/project.properties @@ -1,186 +1,185 @@ -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.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-util-java.jar}:\ - ${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.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 -project.akka-util-java=../util-java -reference.akka-kernel.jar=${project.akka-kernel}/dist/akka-kernel.jar -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} -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.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} diff --git a/api-java/nbproject/project.xml b/api-java/nbproject/project.xml index 8375cbcc76..cd805e1441 100755 --- a/api-java/nbproject/project.xml +++ b/api-java/nbproject/project.xml @@ -21,14 +21,6 @@ clean jar - - akka-util-java - jar - - jar - clean - jar - diff --git a/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java b/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java index 0747f04e62..fb4136da3b 100755 --- a/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java +++ b/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java @@ -25,10 +25,10 @@ import java.util.HashMap; public class ActiveObjectGuiceConfigurator { private List modules = new ArrayList(); private Injector injector; - private Supervisor supervisor; + private Supervisor supervisor; // TODO is supervisor needed private RestartStrategy restartStrategy; private Component[] components; - private Map configRegistry = new HashMap(); + private Map configRegistry = new HashMap(); // TODO is configRegistry needed? private Map activeObjectRegistry = new HashMap(); private ActiveObjectFactory activeObjectFactory = new ActiveObjectFactory(); 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 7f629d5684..de6327a3c9 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 @@ -25,27 +25,32 @@ public class ActiveObjectGuiceConfiguratorTest extends TestCase { bind(Ext.class).to(ExtImpl.class).in(Scopes.SINGLETON); } }).configureActiveObjects( - new RestartStrategy(new AllForOne(), 3, 100), new Component[]{ + new RestartStrategy(new AllForOne(), 3, 5000), new Component[]{ new Component( Foo.class, FooImpl.class, - new LifeCycle(new Permanent(), 100), + new LifeCycle(new Permanent(), 1000), 1000), new Component( Bar.class, BarImpl.class, - new LifeCycle(new Permanent(), 100), + new LifeCycle(new Permanent(), 1000), 1000), new Component( Stateful.class, StatefulImpl.class, - new LifeCycle(new Permanent(), 100), - 1000), + new LifeCycle(new Permanent(), 1000), + 10000000), new Component( Failer.class, FailerImpl.class, - new LifeCycle(new Permanent(), 100), - 1000) + new LifeCycle(new Permanent(), 1000), + 1000), + new Component( + Clasher.class, + ClasherImpl.class, + new LifeCycle(new Permanent(), 1000), + 100000) }).inject().supervise(); } @@ -64,6 +69,15 @@ public class ActiveObjectGuiceConfiguratorTest extends TestCase { assertTrue(bar.getExt().toString().equals(ext.toString())); } + public void testLookupNonSupervisedInstance() { + try { + String str = conf.getActiveObject(String.class); + fail("exception should have been thrown"); + } catch (Exception e) { + assertEquals("Class java.lang.String has not been put under supervision (by passing in the config to the supervise() method", e.getMessage()); + } + } + public void testActiveObjectInvocation() throws InterruptedException { messageLog = ""; Foo foo = conf.getActiveObject(Foo.class); @@ -85,6 +99,7 @@ public class ActiveObjectGuiceConfiguratorTest extends TestCase { assertEquals("foo return_foo before_bar ", messageLog); } + public void testForcedTimeout() { messageLog = ""; Foo foo = conf.getActiveObject(Foo.class); @@ -104,18 +119,45 @@ public class ActiveObjectGuiceConfiguratorTest extends TestCase { } catch (RuntimeException e) { } } +// +// 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.success("test", "new state"); - assertEquals("new state", stateful.getState("test")); - } - - public void testShouldRollbackStateForStatefulServerInCaseOfFailure() { + public void testShouldRollbackStateForStatefulServerInCaseOfMessageClash() { Stateful stateful = conf.getActiveObject(Stateful.class); - Failer failer = conf.getActiveObject(Failer.class); - stateful.failure("test", "new state", failer); - assertEquals("nil", stateful.getState("test")); + stateful.setState("stateful", "init"); // set init state + + Clasher clasher = conf.getActiveObject(Clasher.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.clashNotOk("stateful", "new state", clasher); + fail("should have thrown an exception"); + } 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 } } @@ -123,60 +165,44 @@ public class ActiveObjectGuiceConfiguratorTest extends TestCase { interface Foo { public String foo(String msg); - - @oneway - public void bar(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; - + @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"); } } interface Bar { - @oneway - void bar(String msg); - + @oneway void bar(String msg); Ext getExt(); } class BarImpl implements Bar { - @Inject - private Ext ext; - + @Inject private Ext ext; public Ext getExt() { return ext; } - public void bar(String msg) { } } @@ -191,17 +217,25 @@ class ExtImpl implements Ext { } 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 TransientObjectState state = new TransientObjectState(); - 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); } @@ -209,6 +243,15 @@ class StatefulImpl implements Stateful { 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 { @@ -221,4 +264,36 @@ class FailerImpl implements Failer { } } - +interface Clasher { + public void clash(); + public String getState(String key); + public void setState(String key, String value); +} + +class ClasherImpl implements Clasher { + @state private TransientObjectState state = new TransientObjectState(); + 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/buildfile b/buildfile index 3ccd95f138..51da0dda22 100644 --- a/buildfile +++ b/buildfile @@ -12,12 +12,9 @@ repositories.remote << 'http://scala-tools.org/repo-snapshots' repositories.remote << 'http://www.lag.net/repo' AKKA_KERNEL = 'se.scalablesolutions.akka:akka-kernel:jar:0.1' -#AKKA_SUPERVISOR = 'se.scalablesolutions.akka:akka-supervisor:jar:0.1' AKKA_UTIL_JAVA = 'se.scalablesolutions.akka:akka-util-java:jar:0.1' AKKA_API_JAVA = 'se.scalablesolutions.akka:akka-api-java:jar:0.1' -SCALA = 'org.scala-lang:scala-library:jar:2.7.3' -SCALATEST = 'org.scala-tools.testing:scalatest:jar:0.9.5' GUICEYFRUIT = ['org.guiceyfruit:guice-core:jar:2.0-SNAPSHOT', 'org.guiceyfruit:guice-jsr250:jar:2.0-SNAPSHOT'] JERSEY = ['com.sun.jersey:jersey-core:jar:1.0.1', @@ -27,18 +24,23 @@ JERSEY = ['com.sun.jersey:jersey-core: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' + +CONFIGGY = 'net.lag:configgy:jar:1.2' SLF4J = ['org.slf4j:slf4j-log4j12:jar:1.4.3', 'org.slf4j:slf4j-api:jar:1.4.3', 'log4j:log4j:jar:1.2.13'] -CONFIGGY = 'net.lag:configgy:jar:1.2' -ZOOKEEPER = 'org.apache:zookeeper:jar:3.1.0' -GRIZZLY = 'com.sun.grizzly:grizzly-servlet-webserver:jar:1.8.6.3' +JDOM = 'jdom:jdom: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' -GOOGLE_COLLECT = 'com.google.code.google-collections:google-collect:jar:snapshot-20080530' -JDOM = 'jdom:jdom:jar:1.0' -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' +#SCALATEST_JUNIT4_MVN_PLUGIN = 'com.jteigen.scalatest:junit4runner:jar:1.0-SNAPSHOT' desc 'The Akka Actor Kernel' define 'akka' do @@ -53,33 +55,33 @@ define 'akka' do package :jar end - #desc 'Implementation of Erlangs Supervisor and GenericServer behaviors' - #define 'supervisor' do - # compile.with(CONFIGGY) - # test.using :scalatest - # package :jar - #end - 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, SCALATEST) + compile.with(AKKA_UTIL_JAVA, GUICEYFRUIT, MINA_CORE, MINA_SCALA, JERSEY, VOLDEMORT, ZOOKEEPER, SLF4J, GRIZZLY, CONFIGGY) test.using :scalatest package :jar end + desc 'Akka Java API' + define 'api-java' do + compile.with(AKKA_KERNEL, AKKA_UTIL_JAVA, GUICEYFRUIT) + package :jar + end + #desc 'Akka DB' #define 'db' do # compile.with(AKKA_KERNEL, MINA_CORE, MINA_SCALA, ZOOKEEPER, CONFIGGY, SLF4J) # 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 + - desc 'Akka Java API' - define 'api-java' do - compile.with(AKKA_KERNEL, AKKA_UTIL_JAVA, GUICEYFRUIT, JUNIT4) - package :jar - end - package(:zip).include 'README' package(:zip).include 'bin/*', :path=>'bin' package(:zip).include 'config/*', :path=>'config' diff --git a/kernel/build.xml b/kernel/build.xml index 885d7dbb72..254a41494f 100644 --- a/kernel/build.xml +++ b/kernel/build.xml @@ -18,7 +18,7 @@ - + diff --git a/kernel/kernel.iml b/kernel/kernel.iml index cdb7948e9f..3468b93952 100755 --- a/kernel/kernel.iml +++ b/kernel/kernel.iml @@ -11,13 +11,13 @@ - + - + @@ -26,7 +26,7 @@ - + @@ -35,7 +35,7 @@ - + @@ -44,7 +44,7 @@ - + @@ -53,7 +53,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -71,7 +71,7 @@ - + @@ -80,7 +80,7 @@ - + @@ -89,7 +89,7 @@ - + @@ -98,7 +98,7 @@ - + @@ -107,7 +107,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -125,7 +125,7 @@ - + @@ -134,7 +134,7 @@ - + @@ -143,7 +143,7 @@ - + @@ -152,7 +152,7 @@ - + @@ -161,7 +161,7 @@ - + @@ -170,7 +170,7 @@ - + @@ -179,7 +179,7 @@ - + @@ -188,7 +188,7 @@ - + @@ -197,7 +197,7 @@ - + @@ -206,12 +206,355 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kernel/nbproject/build-impl.xml b/kernel/nbproject/build-impl.xml index 0bd16f2c24..688fb5e88a 100644 --- a/kernel/nbproject/build-impl.xml +++ b/kernel/nbproject/build-impl.xml @@ -1,713 +1,709 @@ - - - - - - - - - - - - - - - - - - -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 395289ec72..18265baff3 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=e25238a8 -nbproject/build-impl.xml.script.CRC32=749b9ab1 -nbproject/build-impl.xml.stylesheet.CRC32=371897b9@1.3.0 +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 diff --git a/kernel/nbproject/private/private.properties b/kernel/nbproject/private/private.properties index e1835a3d7b..7b3c25d6aa 100644 --- a/kernel/nbproject/private/private.properties +++ b/kernel/nbproject/private/private.properties @@ -1,6 +1,6 @@ -do.depend=false -do.jar=false -javac.debug=true -javadoc.preview=true -jaxws.endorsed.dir=/home/jboner/bin/netbeans-dev-200903220201/java2/modules/ext/jaxws21/api -user.properties.file=/home/jboner/.netbeans/dev/build.properties +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 diff --git a/kernel/nbproject/project.properties b/kernel/nbproject/project.properties index e06cb59ace..3eb244b3ed 100644 --- a/kernel/nbproject/project.properties +++ b/kernel/nbproject/project.properties @@ -1,183 +1,186 @@ -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=/home/jboner/src/scala/akka/lib/activation-1.1.jar -file.reference.aopalliance-1.0.jar=/home/jboner/src/scala/akka/lib/aopalliance-1.0.jar -file.reference.asm-3.1.jar=/home/jboner/src/scala/akka/lib/asm-3.1.jar -file.reference.catalina-ant.jar=/home/jboner/src/scala/akka/lib/catalina-ant.jar -file.reference.cglib-2.2.jar=/home/jboner/src/scala/akka/lib/cglib-2.2.jar -file.reference.colt-1.2.0.jar=/home/jboner/src/scala/akka/lib/colt-1.2.0.jar -file.reference.commons-codec-1.3.jar=/home/jboner/src/scala/akka/lib/commons-codec-1.3.jar -file.reference.commons-collections-3.1.jar=/home/jboner/src/scala/akka/lib/commons-collections-3.1.jar -file.reference.commons-dbcp-1.2.2.jar=/home/jboner/src/scala/akka/lib/commons-dbcp-1.2.2.jar -file.reference.commons-httpclient-3.1.jar=/home/jboner/src/scala/akka/lib/commons-httpclient-3.1.jar -file.reference.commons-io-1.3.2.jar=/home/jboner/src/scala/akka/lib/commons-io-1.3.2.jar -file.reference.commons-lang-2.1.jar=/home/jboner/src/scala/akka/lib/commons-lang-2.1.jar -file.reference.commons-logging.jar=/home/jboner/src/scala/akka/lib/commons-logging.jar -file.reference.commons-pool-1.4.jar=/home/jboner/src/scala/akka/lib/commons-pool-1.4.jar -file.reference.configgy-1.2.jar=/home/jboner/src/scala/akka/lib/configgy-1.2.jar -file.reference.google-collect-snapshot-20090211.jar=/home/jboner/src/scala/akka/lib/google-collect-snapshot-20090211.jar -file.reference.grizzly-framework-1.8.6.3.jar=/home/jboner/src/scala/akka/lib/grizzly-framework-1.8.6.3.jar -file.reference.grizzly-http-1.8.6.3.jar=/home/jboner/src/scala/akka/lib/grizzly-http-1.8.6.3.jar -file.reference.grizzly-http-servlet-1.8.6.3.jar=/home/jboner/src/scala/akka/lib/grizzly-http-servlet-1.8.6.3.jar -file.reference.grizzly-http-utils-1.8.6.3.jar=/home/jboner/src/scala/akka/lib/grizzly-http-utils-1.8.6.3.jar -file.reference.grizzly-portunif-1.8.6.3.jar=/home/jboner/src/scala/akka/lib/grizzly-portunif-1.8.6.3.jar -file.reference.grizzly-rcm-1.8.6.3.jar=/home/jboner/src/scala/akka/lib/grizzly-rcm-1.8.6.3.jar -file.reference.grizzly-servlet-webserver-1.8.6.3.jar=/home/jboner/src/scala/akka/lib/grizzly-servlet-webserver-1.8.6.3.jar -file.reference.guice-core-2.0-SNAPSHOT.jar=/home/jboner/src/scala/akka/lib/guice-core-2.0-SNAPSHOT.jar -file.reference.guice-jsr250-2.0-SNAPSHOT.jar=/home/jboner/src/scala/akka/lib/guice-jsr250-2.0-SNAPSHOT.jar -file.reference.jaxb-api-2.1.jar=/home/jboner/src/scala/akka/lib/jaxb-api-2.1.jar -file.reference.jaxb-impl-2.1.jar=/home/jboner/src/scala/akka/lib/jaxb-impl-2.1.jar -file.reference.jdom-1.0.jar=/home/jboner/src/scala/akka/lib/jdom-1.0.jar -file.reference.je-3.3.62.jar=/home/jboner/src/scala/akka/lib/je-3.3.62.jar -file.reference.jersey-atom-1.0.1.jar=/home/jboner/src/scala/akka/lib/jersey-atom-1.0.1.jar -file.reference.jersey-core-1.0.1.jar=/home/jboner/src/scala/akka/lib/jersey-core-1.0.1.jar -file.reference.jersey-json-1.0.1.jar=/home/jboner/src/scala/akka/lib/jersey-json-1.0.1.jar -file.reference.jersey-server-1.0.1.jar=/home/jboner/src/scala/akka/lib/jersey-server-1.0.1.jar -file.reference.jettison-1.0.1.jar=/home/jboner/src/scala/akka/lib/jettison-1.0.1.jar -file.reference.jetty-6.1.6rc0.jar=/home/jboner/src/scala/akka/lib/jetty-6.1.6rc0.jar -file.reference.jetty-util-6.1.6rc0.jar=/home/jboner/src/scala/akka/lib/jetty-util-6.1.6rc0.jar -file.reference.jsr250-api-1.0.jar=/home/jboner/src/scala/akka/lib/jsr250-api-1.0.jar -file.reference.jsr311-api-1.0.jar=/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-3.8.2.jar-1=/home/jboner/src/scala/akka/lib/junit-3.8.2.jar -file.reference.libthrift-20080411p1.jar=/home/jboner/src/scala/akka/lib/libthrift-20080411p1.jar -file.reference.log4j-1.2.13.jar=/home/jboner/src/scala/akka/lib/log4j-1.2.13.jar -file.reference.main-scala=src/main/scala -file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar=/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=/home/jboner/src/scala/akka/lib/mina-integration-scala-2.0.0-M2-SNAPSHOT.jar -file.reference.protobuf-java-2.0.3.jar=/home/jboner/src/scala/akka/lib/protobuf-java-2.0.3.jar -file.reference.rome-0.9.jar=/home/jboner/src/scala/akka/lib/rome-0.9.jar -file.reference.scala-library-2.7.3.jar=/home/jboner/src/scala/akka/lib/scala-library-2.7.3.jar -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=/home/jboner/src/scala/akka/lib/scalatest-0.9.5.jar -file.reference.scalatest-0.9.5.zip=/home/jboner/src/scala/akka/lib/scalatest-0.9.5.zip -file.reference.servlet-api-2.5.jar=/home/jboner/src/scala/akka/lib/servlet-api-2.5.jar -file.reference.slf4j-api-1.4.3.jar=/home/jboner/src/scala/akka/lib/slf4j-api-1.4.3.jar -file.reference.slf4j-log4j12-1.4.3.jar=/home/jboner/src/scala/akka/lib/slf4j-log4j12-1.4.3.jar -file.reference.stax-api-1.0-2.jar=/home/jboner/src/scala/akka/lib/stax-api-1.0-2.jar -file.reference.test-scala=src/test/scala -file.reference.velocity-1.5.jar=/home/jboner/src/scala/akka/lib/velocity-1.5.jar -file.reference.voldemort-0.4a.jar=/home/jboner/src/scala/akka/lib/voldemort-0.4a.jar -file.reference.voldemort-contrib-0.4a.jar=/home/jboner/src/scala/akka/lib/voldemort-contrib-0.4a.jar -file.reference.xerces.jar=/home/jboner/src/scala/akka/lib/xerces.jar -file.reference.zookeeper-3.1.0.jar=/home/jboner/src/scala/akka/lib/zookeeper-3.1.0.jar -includes=** -jar.compress=false -java.platform.active=java_default_platform -javac.classpath=\ - ${reference.akka-util-java.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.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.guice-core-2.0-SNAPSHOT.jar}:\ - ${file.reference.guice-jsr250-2.0-SNAPSHOT.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-1}:\ - ${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-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.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.junit-3.8.2.jar}:\ - ${file.reference.scalatest-0.9.5.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} -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=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.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.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-codec-1.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-codec-1.3.jar +file.reference.commons-collections-3.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-collections-3.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-lang-2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-lang-2.1.jar +file.reference.commons-logging.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-logging.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.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.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.libthrift-20080411p1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\libthrift-20080411p1.jar +file.reference.log4j-1.2.13.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\log4j-1.2.13.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.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.scalatest-0.9.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\scalatest-0.9.5.jar +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.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.aopalliance-1.0.jar}:\ + ${file.reference.akka-util-java.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.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.guice-core-2.0-SNAPSHOT.jar}:\ + ${file.reference.guice-jsr250-2.0-SNAPSHOT.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.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}:\ + ${file.reference.junit4runner-1.0-SNAPSHOT.jar}:\ + ${file.reference.junit-4.5.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} diff --git a/kernel/nbproject/project.xml b/kernel/nbproject/project.xml index d1c3e16982..2e5d7907a4 100644 --- a/kernel/nbproject/project.xml +++ b/kernel/nbproject/project.xml @@ -1,26 +1,17 @@ - - - org.netbeans.modules.scala.project - - - akka-kernel - 1.6.5 - - - - - - - - - - akka-util-java - jar - - jar - clean - jar - - - - + + + org.netbeans.modules.scala.project + + + akka-kernel + 1.6.5 + + + + + + + + + + diff --git a/kernel/src/main/scala/ActiveObject.scala b/kernel/src/main/scala/ActiveObject.scala index 6b33405c14..efba3ecfa0 100755 --- a/kernel/src/main/scala/ActiveObject.scala +++ b/kernel/src/main/scala/ActiveObject.scala @@ -14,6 +14,14 @@ import java.lang.annotation.Annotation sealed class ActiveObjectException(msg: String) extends RuntimeException(msg) class ActiveObjectInvocationTimeoutException(msg: String) extends ActiveObjectException(msg) +object Annotation { + import se.scalablesolutions.akka.annotation._ + val transactional = classOf[transactional] + val oneway = classOf[oneway] + val immutable = classOf[immutable] + val state = classOf[state] +} + /** * @author Jonas Bonér */ @@ -70,11 +78,7 @@ object ActiveObject { * @author Jonas Bonér */ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: Int) extends InvocationHandler { - val transactional = classOf[se.scalablesolutions.akka.annotation.transactional] - val oneway = classOf[se.scalablesolutions.akka.annotation.oneway] - val immutable = classOf[se.scalablesolutions.akka.annotation.immutable] - val state= classOf[se.scalablesolutions.akka.annotation.state] - + import ActiveObject.threadBoundTx private[this] var activeTx: Option[Transaction] = None private var targetInstance: AnyRef = _ @@ -86,58 +90,39 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I } } - private[this] val dispatcher = new GenericServer { - override def body: PartialFunction[Any, Unit] = { - case invocation: Invocation => - val tx = invocation.tx - ActiveObject.threadBoundTx.set(tx) - try { - reply(ErrRef(invocation.invoke, tx)) - } catch { - case e: InvocationTargetException => - val te = e.getTargetException - te.printStackTrace - reply(ErrRef({ throw te }, tx)) - case e => - e.printStackTrace - reply(ErrRef({ throw e }, tx)) - } - case 'exit => exit; reply() - case unexpected => throw new ActiveObjectException("Unexpected message to actor proxy: " + unexpected) - } - } - - private[kernel] val server = new GenericServerContainer(target.getName, () => dispatcher) + 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(transactional)) { + if (m.isAnnotationPresent(Annotation.transactional)) { + // FIXME: check if we are already in a transaction if so NEST (set parent) val newTx = new Transaction newTx.begin(server) - ActiveObject.threadBoundTx.set(Some(newTx)) + threadBoundTx.set(Some(newTx)) } - val cflowTx = ActiveObject.threadBoundTx.get - -// println("========== invoking: " + m.getName) -// println("========== cflowTx: " + cflowTx) -// println("========== activeTx: " + activeTx) + val cflowTx = threadBoundTx.get activeTx match { case Some(tx) => if (cflowTx.isDefined && cflowTx.get != tx) { // new tx in scope; try to commit tx.commit(server) + threadBoundTx.set(None) activeTx = None } case None => - if (cflowTx.isDefined) activeTx = Some(cflowTx.get) + if (cflowTx.isDefined) { + val currentTx = cflowTx.get + currentTx.join(server) + activeTx = Some(currentTx) + } } - activeTx = ActiveObject.threadBoundTx.get + activeTx = threadBoundTx.get invoke(Invocation(m, args, targetInstance, activeTx)) } private def invoke(invocation: Invocation): AnyRef = { val result: AnyRef = - if (invocation.method.isAnnotationPresent(oneway)) server ! invocation + if (invocation.method.isAnnotationPresent(Annotation.oneway)) server ! invocation else { val result: ErrRef[AnyRef] = server !!! (invocation, { @@ -153,6 +138,7 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I throw e } } + // FIXME: clear threadBoundTx on successful commit if (activeTx.isDefined) activeTx.get.precommit(server) result } @@ -160,45 +146,76 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I private def rollback(tx: Option[Transaction]) = tx match { case None => {} // no tx; nothing to do case Some(tx) => - println("================ ROLLING BACK") tx.rollback(server) - ActiveObject.threadBoundTx.set(Some(tx)) + threadBoundTx.set(Some(tx)) } private def getStateList(targetInstance: AnyRef): List[State[_,_]] = { require(targetInstance != null) import se.scalablesolutions.akka.kernel.configuration.ConfigurationException - val states = for { - field <- target.getDeclaredFields - if field.isAnnotationPresent(state) - state = field.get(targetInstance) + val states: List[State[_,_]] = for { + field <- target.getDeclaredFields.toArray.toList + if field.isAnnotationPresent(Annotation.state) + state = { + 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 + state.asInstanceOf[State[_,_]] } states -// if (fields.size > 1) throw new ConfigurationException("Stateful active object can only have one single field '@Inject TransientObjectState state' defined") } } +/** + * Generic GenericServer managing Invocation dispatch, transaction and error management. + * + * @author Jonas Bonér + */ +private[kernel] class Dispatcher(val targetName: String) extends GenericServer { + override def body: PartialFunction[Any, Unit] = { + case invocation: Invocation => + val tx = invocation.tx + ActiveObject.threadBoundTx.set(tx) + try { + reply(ErrRef(invocation.invoke, tx)) + } catch { + case e: InvocationTargetException => + val ref = ErrRef(tx); ref() = throw e.getTargetException; reply(ref) + case e => + val ref = ErrRef(tx); ref() = throw e; reply(ref) + } + case 'exit => + exit; reply() + case unexpected => + throw new ActiveObjectException("Unexpected message [" + unexpected + "] to [" + this + "] from [" + sender + "]") + } + + override def toString(): String = "GenericServer[" + targetName + "]" +} + /** * Represents a snapshot of the current invocation. * * @author Jonas Bonér */ -case class Invocation(val method: Method, - val args: Array[AnyRef], - val target: AnyRef, - val tx: Option[Transaction]) { +private[kernel] case class Invocation(val method: Method, + val args: Array[AnyRef], + val target: AnyRef, + val tx: Option[Transaction]) { method.setAccessible(true) - def invoke: AnyRef = method.invoke(target, args:_*) + def invoke: AnyRef = synchronized { + method.invoke(target, args:_*) + } - override def toString: String = + override def toString: String = synchronized { "Invocation [method: " + method.getName + ", args: " + argsToString(args) + ", target: " + target + "]" - - override def hashCode(): Int = { + } + + override def hashCode(): Int = synchronized { var result = HashCode.SEED result = HashCode.hash(result, method) result = HashCode.hash(result, args) @@ -206,7 +223,7 @@ case class Invocation(val method: Method, result } - override def equals(that: Any): Boolean = { + override def equals(that: Any): Boolean = synchronized { that != null && that.isInstanceOf[Invocation] && that.asInstanceOf[Invocation].method == method && @@ -214,14 +231,13 @@ case class Invocation(val method: Method, isEqual(that.asInstanceOf[Invocation].args, args) } - private def isEqual(a1: Array[Object], a2: Array[Object]): Boolean = + private[this] def isEqual(a1: Array[Object], a2: Array[Object]): Boolean = (a1 == null && a2 == null) || (a1 != null && a2 != null && a1.size == a2.size && a1.zip(a2).find(t => t._1 == t._2).isDefined) - private def argsToString(array: Array[Object]): String = synchronized { + private[this] def argsToString(array: Array[Object]): String = array.foldLeft("(")(_ + " " + _) + ")" - } } diff --git a/kernel/src/main/scala/GenericServer.scala b/kernel/src/main/scala/GenericServer.scala index 0712eaf087..71f9ab3b1d 100644 --- a/kernel/src/main/scala/GenericServer.scala +++ b/kernel/src/main/scala/GenericServer.scala @@ -267,8 +267,7 @@ class GenericServerContainer( private[kernel] def terminate(reason: AnyRef, shutdownTime: Int) = lock.withReadLock { if (shutdownTime > 0) { log.debug("Waiting [%s milliseconds for the server to shut down before killing it.", shutdownTime) -// server !? (shutdownTime, Shutdown(reason)) match { - server !? Shutdown(reason) match { + server !? (shutdownTime, Shutdown(reason)) match { case Some('success) => log.debug("Server [%s] has been shut down cleanly.", id) case None => log.warning("Server [%s] was **not able** to complete shutdown cleanly within its configured shutdown time [%s]", id, shutdownTime) } @@ -292,5 +291,7 @@ class GenericServerContainer( private[kernel] def swapServer(newServer: GenericServer) = lock.withWriteLock { server = newServer } + + override def toString(): String = "GenericServerContainer[" + server + "]" } diff --git a/kernel/src/main/scala/Kernel.scala b/kernel/src/main/scala/Kernel.scala index 32a6a83032..cf3aca4cd9 100755 --- a/kernel/src/main/scala/Kernel.scala +++ b/kernel/src/main/scala/Kernel.scala @@ -4,10 +4,10 @@ package se.scalablesolutions.akka.kernel -import org.apache.zookeeper.jmx.ManagedUtil -import org.apache.zookeeper.server.persistence.FileTxnSnapLog -import org.apache.zookeeper.server.ServerConfig -import org.apache.zookeeper.server.NIOServerCnxn +//import org.apache.zookeeper.jmx.ManagedUtil +//import org.apache.zookeeper.server.persistence.FileTxnSnapLog +//import org.apache.zookeeper.server.ServerConfig +//import org.apache.zookeeper.server.NIOServerCnxn import voldemort.client.{SocketStoreClientFactory, StoreClient, StoreClientFactory} import voldemort.server.{VoldemortConfig, VoldemortServer} diff --git a/kernel/src/main/scala/State.scala b/kernel/src/main/scala/State.scala index 8295e77320..5aacd98bec 100755 --- a/kernel/src/main/scala/State.scala +++ b/kernel/src/main/scala/State.scala @@ -13,7 +13,7 @@ trait Transactional { private[kernel] def rollback } -sealed trait State[K, V] { +sealed trait State[K, V] extends Transactional { def put(key: K, value: V) def remove(key: K) def get(key: K): V @@ -23,7 +23,10 @@ sealed trait State[K, V] { def clear } -sealed class TransientState[K, V] extends State[K, V] with Transactional { +/** + * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. + */ +sealed class TransientState[K, V] extends State[K, V] { private[kernel] var state = new HashTrie[K, V] private[kernel] var snapshot = state @@ -32,6 +35,7 @@ sealed class TransientState[K, V] extends State[K, V] with Transactional { } private[kernel] override def commit = { + snapshot = state } private[kernel] override def rollback = { @@ -60,6 +64,9 @@ sealed class TransientState[K, V] extends State[K, V] with Transactional { final class TransientStringState extends TransientState[String, String] final class TransientObjectState extends TransientState[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: TransientState[K, V] => private[kernel] val changeSet = new HashMap[K, V] diff --git a/kernel/src/main/scala/Supervisor.scala b/kernel/src/main/scala/Supervisor.scala index 5f486c9afa..693bfaae04 100644 --- a/kernel/src/main/scala/Supervisor.scala +++ b/kernel/src/main/scala/Supervisor.scala @@ -93,7 +93,7 @@ abstract class SupervisorFactory extends Logging { val supervisor = create(restartStrategy) supervisor.start supervisor !? Configure(config, this) match { - case 'success => log.debug("Supervisor successfully configured") + case 'configSuccess => log.debug("Supervisor successfully configured") case _ => log.error("Supervisor could not be configured") } supervisor @@ -148,7 +148,7 @@ class Supervisor(faultHandler: FaultHandlingStrategy) extends Actor with Logging case Configure(config, factory) => log.debug("Configuring supervisor:%s ", this) configure(config, factory) - reply('success) + reply('configSuccess) case Start => state.serverContainers.foreach { serverContainer => @@ -229,20 +229,21 @@ abstract class FaultHandlingStrategy(val maxNrOfRetries: Int, val withinTimeRang private[kernel] 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)) => + 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 => + case Permanent => { log.debug("Restarting server [%s] configured as PERMANENT.", serverContainer.id) serverContainer.reconfigure(reason, supervisor.spawnLink(serverContainer), state.supervisor) + } case Temporary => if (reason == 'normal) { @@ -253,6 +254,7 @@ abstract class FaultHandlingStrategy(val maxNrOfRetries: Int, val withinTimeRang case Transient => log.info("Server [%s] configured as TRANSIENT will not be restarted.", serverContainer.id) } + } } } postRestart(serverContainer) diff --git a/kernel/src/main/scala/Transaction.scala b/kernel/src/main/scala/Transaction.scala index 8114d93464..7a3fab8d80 100644 --- a/kernel/src/main/scala/Transaction.scala +++ b/kernel/src/main/scala/Transaction.scala @@ -36,21 +36,25 @@ class Transaction extends Logging { log.debug("Creating a new transaction [%s]", id) private[this] var parent: Option[Transaction] = None - private[this] var participants = new HashMap[GenericServerContainer, GenericServer] + private[this] var participants: List[GenericServerContainer] = Nil private[this] var precommitted: List[GenericServerContainer] = Nil @volatile private[this] var status: TransactionStatus = TransactionStatus.New def begin(server: GenericServerContainer) = synchronized { + println("===== begin 1 " + server) if (status == TransactionStatus.Aborted) throw new IllegalStateException("Can't begin ABORTED transaction") if (status == TransactionStatus.Completed) throw new IllegalStateException("Can't begin COMPLETED transaction") if (status == TransactionStatus.New) log.debug("Actor [%s] is starting NEW transaction", server) else log.debug("Actor [%s] is participating in transaction", server) - if (server.state.isDefined) server.state.get.begin + println("===== begin 2 " + server) + server.states.foreach(_.begin) + participants ::= server status = TransactionStatus.Active } def precommit(server: GenericServerContainer) = synchronized { if (status == TransactionStatus.Active) { + println("===== precommit " + server) log.debug("Pre-committing transaction for actor [%s]", server) precommitted ::= server } @@ -58,10 +62,11 @@ class Transaction extends Logging { def commit(server: GenericServerContainer) = synchronized { if (status == TransactionStatus.Active) { + println("===== commit " + server) log.debug("Committing transaction for actor [%s]", server) val haveAllPreCommitted = if (participants.size == precommitted.size) {{ - for (server <- participants.keys) yield { + for (server <- participants) yield { if (precommitted.exists(_.id == server.id)) true else false }}.exists(_ == false) @@ -73,14 +78,18 @@ class Transaction extends Logging { def rollback(server: GenericServerContainer) = synchronized { ensureIsActiveOrAborted - log.debug("Actor [%s] has initiated transaction rollback, rolling back [%s]" , server, participants.keys) - participants.foreach(entry => { - val (server, backup) = entry - if (server.state.isDefined) server.state.get.rollback - }) + println("===== rollback " + server) + log.debug("Actor [%s] has initiated transaction rollback, rolling back [%s]" , server, participants) + participants.foreach(_.states.foreach(_.rollback)) status = TransactionStatus.Aborted } + def join(server: GenericServerContainer) = synchronized { + println("===== joining " + server) + server.states.foreach(_.begin) + participants ::= server + } + private def ensureIsActive = if (status != TransactionStatus.Active) throw new IllegalStateException("Expected ACTIVE transaction - current status [" + status + "]") diff --git a/kernel/src/main/scala/collection/Vector.scala b/kernel/src/main/scala/collection/Vector.scala index b77a39299e..8530835681 100755 --- a/kernel/src/main/scala/collection/Vector.scala +++ b/kernel/src/main/scala/collection/Vector.scala @@ -222,7 +222,7 @@ class Vector[+T] private (val length: Int, shift: Int, root: Array[AnyRef], tail back } - override def flatMap[A](f: (T)=>Iterable[A]) = { + override def flatMap[A](f: (T)=>Iterable[A]): Vector[A] = { var back = new Vector[A] var i = 0 @@ -234,7 +234,7 @@ class Vector[+T] private (val length: Int, shift: Int, root: Array[AnyRef], tail back } - override def map[A](f: (T)=>A) = { + override def map[A](f: (T)=>A): Vector[A] = { var back = new Vector[A] var i = 0 diff --git a/kernel/src/test/scala/ActiveObjectSpec.scala b/kernel/src/test/scala/ActiveObjectSpec.scala deleted file mode 100755 index b4903bde6c..0000000000 --- a/kernel/src/test/scala/ActiveObjectSpec.scala +++ /dev/null @@ -1,188 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package se.scalablesolutions.akka.kernel - -import org.scalatest.Spec -import org.scalatest.matchers.ShouldMatchers -import org.scalatest.junit.JUnit3Suite - -import se.scalablesolutions.akka.annotation.{oneway, transactional, stateful} - -/** - * @author Jonas Bonér - */ -object ActiveObjectSpec { - var messageLog = "" -} -class ActiveObjectSpec extends Spec with ShouldMatchers { - - describe("An ActiveObject") { - - it("(with default supervisor) should dispatch method calls normally") { - val foo = ActiveObject.newInstance[Foo](classOf[Foo], new FooImpl, 1000) - - val result = foo.foo("foo ") - ActiveObjectSpec.messageLog += result - - foo.bar("bar ") - ActiveObjectSpec.messageLog += "before_bar " - - Thread.sleep(500) - ActiveObjectSpec.messageLog should equal ("foo return_foo before_bar bar ") - } - - it("should not rollback state for a stateful server in case of success") { - val stateful = ActiveObject.newInstance[Stateful](classOf[Stateful], new StatefulImpl, 1000) - - stateful.success("new state") - stateful.state should equal ("new state") - } - - it("should rollback state for a stateful server in case of failure") { - val stateful = ActiveObject.newInstance[Stateful](classOf[Stateful], new StatefulImpl, 1000) - val failer = ActiveObject.newInstance[Failer](classOf[Failer], new FailerImpl, 1000) - - stateful.failure("new state", failer) - stateful.state should equal ("nil") - } - } -} - -trait Foo { - def foo(msg: String): String - @transactional def fooInTx(msg: String): String - @oneway def bar(msg: String) - def longRunning - def throwsException -} - -class FooImpl extends Foo { - val bar: Bar = new BarImpl - def foo(msg: String): String = { - ActiveObjectSpec.messageLog += msg - "return_foo " - } - def fooInTx(msg: String): String = { - ActiveObjectSpec.messageLog += msg - "return_foo " - } - def bar(msg: String) = bar.bar(msg) - def longRunning = Thread.sleep(10000) - def throwsException = error("expected") -} - -trait Bar { - @oneway def bar(msg: String) -} - -class BarImpl extends Bar { - def bar(msg: String) = { - Thread.sleep(100) - ActiveObjectSpec.messageLog += msg - } -} - -trait Stateful { - @transactional def success(msg: String) - @transactional def failure(msg: String, failer: Failer) - def state: String -} - -@stateful -class StatefulImpl extends Stateful { - var state: String = "nil" - def success(msg: String) = state = msg - def failure(msg: String, failer: Failer) = { - state = msg - failer.fail - } -} - -trait Failer { - def fail -} - -class FailerImpl extends Failer { - def fail = throw new RuntimeException("expected") -} - -// @Test { val groups=Array("unit") } -// def testCreateGenericServerBasedComponentUsingCustomSupervisorConfiguration = { -// val proxy = new ActiveObjectProxy(new FooImpl, 1000) - -// val supervisor = -// ActiveObject.supervise( -// RestartStrategy(AllForOne, 3, 100), -// Component( -// proxy, -// LifeCycle(Permanent, 100)) -// :: Nil) - -// val foo = ActiveObject.newInstance[Foo](classOf[Foo], proxy) - -// val result = foo.foo("foo ") -// messageLog += result - -// foo.bar("bar ") -// messageLog += "before_bar " - -// Thread.sleep(500) -// assert(messageLog === "foo return_foo before_bar bar ") - -// supervisor ! Stop -// } - -// @Test { val groups=Array("unit") } -// def testCreateTwoGenericServerBasedComponentUsingCustomSupervisorConfiguration = { -// val fooProxy = new ActiveObjectProxy(new FooImpl, 1000) -// val barProxy = new ActiveObjectProxy(new BarImpl, 1000) - -// val supervisor = -// ActiveObject.supervise( -// RestartStrategy(AllForOne, 3, 100), -// Component( -// fooProxy, -// LifeCycle(Permanent, 100)) :: -// Component( -// barProxy, -// LifeCycle(Permanent, 100)) -// :: Nil) - -// val foo = ActiveObject.newInstance[Foo](classOf[Foo], fooProxy) -// val bar = ActiveObject.newInstance[Bar](classOf[Bar], barProxy) - -// val result = foo.foo("foo ") -// messageLog += result - -// bar.bar("bar ") -// messageLog += "before_bar " - -// Thread.sleep(500) -// assert(messageLog === "foo return_foo before_bar bar ") - -// supervisor ! Stop -// } - -// @Test { val groups=Array("unit") } -// def testCreateGenericServerBasedComponentUsingDefaultSupervisorAndForcedTimeout = { -// val foo = ActiveObject.newInstance[Foo](classOf[Foo], new FooImpl, 1000) -// intercept(classOf[ActiveObjectInvocationTimeoutException]) { -// foo.longRunning -// } -// assert(true === true) -// } - -// @Test { val groups=Array("unit") } -// def testCreateGenericServerBasedComponentUsingDefaultSupervisorAndForcedException = { -// val foo = ActiveObject.newInstance[Foo](classOf[Foo], new FooImpl, 10000) -// intercept(classOf[RuntimeException]) { -// foo.throwsException -// } -// assert(true === true) -// } -// } - - - diff --git a/kernel/src/test/scala/AllSuite.scala b/kernel/src/test/scala/AllSuite.scala index de4e3ef678..ddf582d654 100755 --- a/kernel/src/test/scala/AllSuite.scala +++ b/kernel/src/test/scala/AllSuite.scala @@ -10,9 +10,14 @@ import org.scalatest._ * @author Jonas Bonér */ class AllSuite extends SuperSuite( + List( - new ActiveObjectSpec, - new RestManagerSpec + new SupervisorSpec, + new SupervisorStateSpec, + new GenericServerSpec, + new GenericServerContainerSpec +// new ActiveObjectSpec, +// new RestManagerSpec ) ) diff --git a/kernel/src/test/scala/GenericServerContainerSuite.scala b/kernel/src/test/scala/GenericServerContainerSuite.scala new file mode 100755 index 0000000000..b03feb913b --- /dev/null +++ b/kernel/src/test/scala/GenericServerContainerSuite.scala @@ -0,0 +1,212 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel + +import scala.actors._ +import scala.actors.Actor._ + +import org.scalatest._ + +/** + * @author Jonas Bonér + */ +class GenericServerContainerSpec extends Suite { + + var inner: GenericServerContainerActor = null + var server: GenericServerContainer = null + def createProxy(f: () => GenericServer) = { val server = new GenericServerContainer("server", f); server.setTimeout(100); server } + + def setup = { + inner = new GenericServerContainerActor + server = createProxy(() => inner) + server.newServer + server.start + } + + def testInit = { + setup + server.init("testInit") + Thread.sleep(100) + expect("initializing: testInit") { + inner.log + } + } + + def testTerminateWithReason = { + setup + server.terminate("testTerminateWithReason", 100) + Thread.sleep(100) + expect("terminating: testTerminateWithReason") { + inner.log + } + } + + def test_bang_1 = { + setup + server ! OneWay + Thread.sleep(100) + expect("got a oneway") { + inner.log + } + } + + def test_bang_2 = { + setup + server ! Ping + Thread.sleep(100) + expect("got a ping") { + inner.log + } + } + + def test_bangbangbang = { + setup + expect("pong") { + (server !!! Ping).getOrElse("nil") + } + expect("got a ping") { + inner.log + } + } + + def test_bangquestion = { + setup + expect("pong") { + val res: String = server !? Ping + res + } + expect("got a ping") { + inner.log + } + } + + def test_bangbangbang_Timeout1 = { + setup + expect("pong") { + (server !!! Ping).getOrElse("nil") + } + expect("got a ping") { + inner.log + } + } + + def test_bangbangbang_Timeout2 = { + setup + expect("error handler") { + server !!! (OneWay, "error handler") + } + expect("got a oneway") { + inner.log + } + } + + def test_bangbangbang_GetFutureTimeout1 = { + setup + 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) + } + } + + def test_bangbangbang_GetFutureTimeout2 = { + setup + 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)") + } + } + + def testHotSwap = { + setup + // using base + expect("pong") { + (server !!! Ping).getOrElse("nil") + } + + // hotswapping + server.hotswap(Some({ + case Ping => reply("hotswapped pong") + })) + expect("hotswapped pong") { + (server !!! Ping).getOrElse("nil") + } + } + + def testDoubleHotSwap = { + setup + // 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") + } + } + + + def testHotSwapReturnToBase = { + setup + // 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/kernel/src/test/scala/GenericServerSpec.scala b/kernel/src/test/scala/GenericServerSpec.scala new file mode 100755 index 0000000000..ad090e6861 --- /dev/null +++ b/kernel/src/test/scala/GenericServerSpec.scala @@ -0,0 +1,37 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel + +import org.scalatest._ + +import scala.actors.Actor._ + +/** + * @author Jonas Bonér + */ +class GenericServerSpec extends Suite { + + def testSendRegularMessage = { + val server = new MyGenericServerActor + server.start + server !? Ping match { + case reply: String => + assert("got a ping" === server.log) + assert("pong" === reply) + case _ => fail() + } + } +} + +class MyGenericServerActor extends GenericServer { + var log: String = "" + + override def body: PartialFunction[Any, Unit] = { + case Ping => + log = "got a ping" + reply("pong") + } +} + diff --git a/kernel/src/test/scala/Messages.scala b/kernel/src/test/scala/Messages.scala new file mode 100755 index 0000000000..a1ab186f06 --- /dev/null +++ b/kernel/src/test/scala/Messages.scala @@ -0,0 +1,12 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel + +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/kernel/src/test/scala/RestManagerSpec.scala b/kernel/src/test/scala/RestManagerSpec.scala deleted file mode 100755 index b80ad38abb..0000000000 --- a/kernel/src/test/scala/RestManagerSpec.scala +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (C) 2009 Scalable Solutions. - */ - -package se.scalablesolutions.akka.kernel - -import org.scalatest.Spec -import org.scalatest.matchers.ShouldMatchers - -import javax.ws.rs.{Produces, Path, GET} - -//import com.sun.net.httpserver.HttpServer; -//import com.sun.ws.rest.api.client.Client; -//import com.sun.ws.rest.api.client.ClientResponse; -//import com.sun.ws.rest.api.client.ResourceProxy; - -/** - * @author Jonas Bonér - */ -class RestManagerSpec extends Spec with ShouldMatchers { - - describe("A RestManager") { - - it("should be able to start and stop") { - val threadSelector = Kernel.startJersey - /* val cc = new DefaultClientConfig - val c = Client.create(cc) - val resource = c.proxy("http://localhost:9998/") - val hello = resource.get(classOf[HelloWorldResource]) - val msg = hello.getMessage - println("=============: " + msg) -*/ threadSelector.stopEndpoint - } - } -} - -@Path("/helloworld") -class HelloWorldResource { - @GET - @Produces(Array("text/plain")) - def getMessage = "Hello World" -} diff --git a/kernel/src/test/scala/SupervisorSpec.scala b/kernel/src/test/scala/SupervisorSpec.scala new file mode 100755 index 0000000000..2af8008557 --- /dev/null +++ b/kernel/src/test/scala/SupervisorSpec.scala @@ -0,0 +1,430 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel + +import scala.actors._ +import scala.actors.Actor._ +import scala.collection.Map +import scala.collection.mutable.HashMap + +import org.scalatest._ + +/** + * @author Jonas Bonér + */ +class SupervisorSpec extends Suite { + + 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) + + def testStartServer = { + messageLog = "" + val sup = getSingleActorAllForOneSupervisor + sup ! Start + + expect("pong") { + (pingpong1 !!! Ping).getOrElse("nil") + } + } + + def testGetServer = { + messageLog = "" + val sup = getSingleActorAllForOneSupervisor + sup ! Start + val server = sup.getServerOrElse("pingpong1", throw new RuntimeException("server not found")) + assert(server.isInstanceOf[GenericServerContainer]) + assert(server === pingpong1) + } + + def testGetServerOrFail = { + messageLog = "" + val sup = getSingleActorAllForOneSupervisor + sup ! Start + intercept(classOf[RuntimeException]) { + sup.getServerOrElse("wrong_name", throw new RuntimeException("server not found")) + } + } + + def testKillSingleActorOneForOne = { + messageLog = "" + val sup = getSingleActorOneForOneSupervisor + sup ! Start + + intercept(classOf[RuntimeException]) { + pingpong1 !!! (Die, throw new RuntimeException("TIME OUT")) + } + Thread.sleep(100) + expect("oneforone") { + messageLog + } + } + + def testCallKillCallSingleActorOneForOne = { + messageLog = "" + 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 + } + } + + def testKillSingleActorAllForOne = { + messageLog = "" + val sup = getSingleActorAllForOneSupervisor + sup ! Start + intercept(classOf[RuntimeException]) { + pingpong1 !!! (Die, throw new RuntimeException("TIME OUT")) + } + Thread.sleep(100) + expect("allforone") { + messageLog + } + } + + def testCallKillCallSingleActorAllForOne = { + messageLog = "" + 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 + } + } + + def testKillMultipleActorsOneForOne = { + messageLog = "" + val sup = getMultipleActorsOneForOneConf + sup ! Start + intercept(classOf[RuntimeException]) { + pingpong3 !!! (Die, throw new RuntimeException("TIME OUT")) + } + Thread.sleep(100) + expect("oneforone") { + messageLog + } + } + + def tesCallKillCallMultipleActorsOneForOne = { + messageLog = "" + 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 + } + } + + def testKillMultipleActorsAllForOne = { + messageLog = "" + val sup = getMultipleActorsAllForOneConf + sup ! Start + intercept(classOf[RuntimeException]) { + pingpong2 !!! (Die, throw new RuntimeException("TIME OUT")) + } + Thread.sleep(100) + expect("allforoneallforoneallforone") { + messageLog + } + } + + def tesCallKillCallMultipleActorsAllForOne = { + messageLog = "" + 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 + } + } + + def testTerminateFirstLevelActorAllForOne = { + messageLog = "" + 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/kernel/src/test/scala/SupervisorStateSpec.scala b/kernel/src/test/scala/SupervisorStateSpec.scala new file mode 100755 index 0000000000..d88a88029a --- /dev/null +++ b/kernel/src/test/scala/SupervisorStateSpec.scala @@ -0,0 +1,92 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.kernel + +import org.scalatest._ + +import scala.actors.Actor._ + +/** + * @author Jonas Bonér + */ +class SupervisorStateSpec extends Suite { + + val dummyActor = new GenericServer { override def body: PartialFunction[Any, Unit] = { case _ => }} + val newDummyActor = () => dummyActor + var state: SupervisorState = _ + var proxy: GenericServerContainer = _ + var supervisor: Supervisor = _ + + def setup = { + 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)) + } + + def testAddServer = { + setup + 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) + } + } + + def testGetServer = { + setup + 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) + } + } + + def testRemoveServer = { + setup + 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 => + } + } + + def testGetNonExistingServerBySymbol = { + setup + state.getServerContainer("server2") match { + case Some(_) => fail("should have returned None") + case None => + } + } + + def testGetNonExistingServerByActor = { + setup + state.getServerContainer("dummyActor") match { + case Some(_) => fail("should have returned None") + case None => + } + } +} diff --git a/lib/scalatest-0.9.5.jar b/lib/scalatest-0.9.5.jar index b3927b95e6..a6c3c2c561 100755 Binary files a/lib/scalatest-0.9.5.jar and b/lib/scalatest-0.9.5.jar differ diff --git a/util-java/nbproject/build-impl.xml b/util-java/nbproject/build-impl.xml index ac37a50928..ece3e019ac 100644 --- a/util-java/nbproject/build-impl.xml +++ b/util-java/nbproject/build-impl.xml @@ -1,658 +1,631 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set 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 - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set 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 + + + + + + + + + + + + + + + + + + + diff --git a/util-java/nbproject/genfiles.properties b/util-java/nbproject/genfiles.properties index 06aceedbfc..dc82f91b7f 100644 --- a/util-java/nbproject/genfiles.properties +++ b/util-java/nbproject/genfiles.properties @@ -1,8 +1,8 @@ -build.xml.data.CRC32=30ca9bc2 -build.xml.script.CRC32=deaf720b -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=30ca9bc2 -nbproject/build-impl.xml.script.CRC32=7c31e977 -nbproject/build-impl.xml.stylesheet.CRC32=d5ddc080@1.24.0.45 +build.xml.data.CRC32=30ca9bc2 +build.xml.script.CRC32=deaf720b +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=30ca9bc2 +nbproject/build-impl.xml.script.CRC32=595e16a7 +nbproject/build-impl.xml.stylesheet.CRC32=65b8de21 diff --git a/util-java/nbproject/private/private.properties b/util-java/nbproject/private/private.properties index e9492343da..cf05bfd2e2 100644 --- a/util-java/nbproject/private/private.properties +++ b/util-java/nbproject/private/private.properties @@ -1,3 +1,3 @@ -compile.on.save=true -jaxws.endorsed.dir=/home/jboner/bin/netbeans-dev-200903220201/java2/modules/ext/jaxws21/api:/home/jboner/bin/netbeans-dev-200903220201/ide11/modules/ext/jaxb/api -user.properties.file=/home/jboner/.netbeans/dev/build.properties +compile.on.save=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 diff --git a/util-java/util-java.iml b/util-java/util-java.iml new file mode 100755 index 0000000000..723223dded --- /dev/null +++ b/util-java/util-java.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + +