completed cassandra read/write (and bench) + added transactional vector and ref + cleaned up transactional state hierarchy + rewrote tx state wiring

This commit is contained in:
Jonas Boner 2009-04-27 19:55:57 +02:00
parent e9f7162245
commit 7dec0a747c
60 changed files with 4481 additions and 6283 deletions

146
akka.ipr
View file

@ -15,11 +15,99 @@
<option name="BUILD_JARS_ON_MAKE" value="false" /> <option name="BUILD_JARS_ON_MAKE" value="false" />
</component> </component>
<component name="CodeStyleSettingsManager"> <component name="CodeStyleSettingsManager">
<option name="PER_PROJECT_SETTINGS" /> <option name="PER_PROJECT_SETTINGS">
<option name="USE_PER_PROJECT_SETTINGS" value="false" /> <value>
<option name="USE_SAME_INDENTS" value="true" />
<option name="OTHER_INDENT_OPTIONS">
<value>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="4" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
</value>
</option>
<option name="LINE_SEPARATOR" value="&#10;" />
<ADDITIONAL_INDENT_OPTIONS fileType="groovy">
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="gsp">
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="java">
<option name="INDENT_SIZE" value="4" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="js">
<option name="INDENT_SIZE" value="4" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="jsp">
<option name="INDENT_SIZE" value="4" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="scala">
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="2" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="sql">
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="xml">
<option name="INDENT_SIZE" value="4" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
</value>
</option>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</component> </component>
<component name="CompilerConfiguration"> <component name="CompilerConfiguration">
<option name="DEFAULT_COMPILER" value="Javac" /> <option name="DEFAULT_COMPILER" value="Eclipse" />
<option name="DEPLOY_AFTER_MAKE" value="0" /> <option name="DEPLOY_AFTER_MAKE" value="0" />
<resourceExtensions> <resourceExtensions>
<entry name=".+\.(properties|xml|html|dtd|tld)" /> <entry name=".+\.(properties|xml|html|dtd|tld)" />
@ -78,6 +166,35 @@
<file url="file://$PROJECT_DIR$/supervisor/test-code/test/scala/SupervisorSuite.scala" /> <file url="file://$PROJECT_DIR$/supervisor/test-code/test/scala/SupervisorSuite.scala" />
</files> </files>
</module> </module>
<module name="kernel">
<files>
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/ActiveObject.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/AkkaComponentProvider.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Boot.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/CassandraNode.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Configuration.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/DataFlowVariable.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/ErrRef.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/GenericServer.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/HashCode.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Helpers.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Kernel.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Logging.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/NetCat.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Serializer.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/State.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Supervisor.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/Transaction.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/collection/HashTrie.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/main/scala/collection/Vector.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/AllSuite.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/GenericServerContainerSuite.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/GenericServerSpec.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/Messages.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala" />
<file url="file://$PROJECT_DIR$/kernel/src/test/scala/SupervisorStateSpec.scala" />
</files>
</module>
</modules> </modules>
</facet-type> </facet-type>
</autodetection-disabled> </autodetection-disabled>
@ -253,18 +370,18 @@
</component> </component>
<component name="ProjectFileVersion" converted="true" /> <component name="ProjectFileVersion" converted="true" />
<component name="ProjectKey"> <component name="ProjectKey">
<option name="state" value="project://C:\home\jboner\src\scala\akka\akka.ipr" /> <option name="state" value="project:///Users/jboner/src/scala/akka/akka.ipr" />
</component> </component>
<component name="ProjectModuleManager"> <component name="ProjectModuleManager">
<modules> <modules>
<module fileurl="file://$PROJECT_DIR$/akka.iml" filepath="$PROJECT_DIR$/akka.iml" /> <module fileurl="file://$PROJECT_DIR$/akka.iml" filepath="$PROJECT_DIR$/akka.iml" />
<module fileurl="file://$PROJECT_DIR$/api-java/api-java.iml" filepath="$PROJECT_DIR$/api-java/api-java.iml" /> <module fileurl="file://$PROJECT_DIR$/api-java/api-java.iml" filepath="$PROJECT_DIR$/api-java/api-java.iml" />
<module fileurl="file://$PROJECT_DIR$/kernel/kernel.iml" filepath="$PROJECT_DIR$/kernel/kernel.iml" /> <module fileurl="file://$PROJECT_DIR$/core/core.iml" filepath="$PROJECT_DIR$/core/core.iml" />
<module fileurl="file://$PROJECT_DIR$/util-java/util-java.iml" filepath="$PROJECT_DIR$/util-java/util-java.iml" /> <module fileurl="file://$PROJECT_DIR$/util-java/util-java.iml" filepath="$PROJECT_DIR$/util-java/util-java.iml" />
</modules> </modules>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/build" />
</component> </component>
<component name="ResourceManagerContainer"> <component name="ResourceManagerContainer">
<option name="myResourceBundles"> <option name="myResourceBundles">
@ -288,23 +405,6 @@
<mapping directory="" vcs="Git" /> <mapping directory="" vcs="Git" />
</component> </component>
<component name="WebServicesPlugin" addRequiredLibraries="true" /> <component name="WebServicesPlugin" addRequiredLibraries="true" />
<component name="libraryTable">
<library name="scala-2.7.3">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/lib/scala-compiler.jar!/" />
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/lib/scala-dbc.jar!/" />
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/lib/scala-library.jar!/" />
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/lib/scala-swing.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/src/scala-compiler-src.jar!/" />
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/src/scala-dbc-src.jar!/" />
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/src/scala-library-src.jar!/" />
<root url="jar://$PROJECT_DIR$/../../../../../bin/scala-2.7.3.final/src/scala-swing-src.jar!/" />
</SOURCES>
</library>
</component>
<UsedPathMacros> <UsedPathMacros>
<macro name="MAVEN_REPOSITORY" description="Maven Local Repostiry" /> <macro name="MAVEN_REPOSITORY" description="Maven Local Repostiry" />
</UsedPathMacros> </UsedPathMacros>

457
akka.iws
View file

@ -1,32 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project relativePaths="false" version="4"> <project relativePaths="false" version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" name="Default" comment=""> <list default="true" name="Default" comment="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/Transaction.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/Transaction.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java" afterPath="$PROJECT_DIR$/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/kernel/src/main/scala/CassandraNode.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/Kernel.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/Kernel.scala" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateTest.java" />
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\lib\commons-lang-2.1.jar" afterPath="" />
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\lib\log4j-1.2.13.jar" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java" afterPath="$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java" />
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\lib\commons-collections-3.1.jar" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/api-java/api-java.iml" afterPath="$PROJECT_DIR$/api-java/api-java.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/nbproject/project.properties" afterPath="$PROJECT_DIR$/kernel/nbproject/project.properties" />
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\lib\commons-logging.jar" afterPath="" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.ipr" afterPath="$PROJECT_DIR$/akka.ipr" />
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\config\stores.xml" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/kernel.iml" afterPath="$PROJECT_DIR$/kernel/kernel.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/State.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/State.scala" />
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\config\cluster.xml" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/bin/start-akka-server.sh" afterPath="$PROJECT_DIR$/bin/start-akka-server.sh" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iml" afterPath="$PROJECT_DIR$/akka.iml" />
<change type="DELETED" beforePath="C:\home\jboner\src\scala\akka\config\server.properties" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" />
</list>
<ignored path="akka.iws" />
<ignored path=".idea/workspace.xml" /> <ignored path=".idea/workspace.xml" />
<ignored path="akka.iws" />
</component> </component>
<component name="ChangesViewManager" flattened_view="true" show_ignored="false" /> <component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
<component name="Commander"> <component name="Commander">
@ -76,22 +53,22 @@
</breakpoint_any> </breakpoint_any>
<breakpoint_rules /> <breakpoint_rules />
<ui_properties> <ui_properties>
<property name="line_breakpoints_groupByMethods" value="false" />
<property name="line_breakpoints_viewId" value="TABLE" />
<property name="exception_breakpoints_flattenPackages" value="true" /> <property name="exception_breakpoints_flattenPackages" value="true" />
<property name="method_breakpoints_flattenPackages" value="true" />
<property name="field_breakpoints_flattenPackages" value="true" />
<property name="exception_breakpoints_groupByMethods" value="false" />
<property name="line_breakpoints_groupByClasses" value="true" /> <property name="line_breakpoints_groupByClasses" value="true" />
<property name="exception_breakpoints_groupByMethods" value="false" />
<property name="method_breakpoints_viewId" value="TABLE" /> <property name="method_breakpoints_viewId" value="TABLE" />
<property name="field_breakpoints_groupByMethods" value="false" />
<property name="line_breakpoints_flattenPackages" value="true" />
<property name="field_breakpoints_groupByClasses" value="true" />
<property name="method_breakpoints_groupByClasses" value="true" />
<property name="exception_breakpoints_viewId" value="TABLE" />
<property name="exception_breakpoints_groupByClasses" value="true" /> <property name="exception_breakpoints_groupByClasses" value="true" />
<property name="field_breakpoints_viewId" value="TABLE" /> <property name="line_breakpoints_viewId" value="TABLE" />
<property name="method_breakpoints_groupByMethods" value="false" /> <property name="method_breakpoints_groupByMethods" value="false" />
<property name="field_breakpoints_flattenPackages" value="true" />
<property name="line_breakpoints_flattenPackages" value="true" />
<property name="exception_breakpoints_viewId" value="TABLE" />
<property name="field_breakpoints_groupByClasses" value="true" />
<property name="method_breakpoints_flattenPackages" value="true" />
<property name="field_breakpoints_viewId" value="TABLE" />
<property name="line_breakpoints_groupByMethods" value="false" />
<property name="method_breakpoints_groupByClasses" value="true" />
<property name="field_breakpoints_groupByMethods" value="false" />
</ui_properties> </ui_properties>
</component> </component>
<component name="FavoritesManager"> <component name="FavoritesManager">
@ -99,82 +76,10 @@
</component> </component>
<component name="FileEditorManager"> <component name="FileEditorManager">
<leaf> <leaf>
<file leaf-file-name="NetCat.scala" pinned="false" current="false" current-in-tab="false"> <file leaf-file-name="GenericServer.scala" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/NetCat.scala"> <entry file="file://$PROJECT_DIR$/kernel/src/main/scala/GenericServer.scala">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="47" column="1" selection-start="1796" selection-end="1796" vertical-scroll-proportion="0.0"> <state line="15" column="22" selection-start="449" selection-end="449" vertical-scroll-proportion="0.18025751">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="SupervisorSpec.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="50" column="1" selection-start="1316" selection-end="1316" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ActiveObjectGuiceConfigurator.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="59" column="15" selection-start="2579" selection-end="2579" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ActiveObjectGuiceConfiguratorTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="8" column="0" selection-start="195" selection-end="195" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="InMemoryStateTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="9" column="0" selection-start="195" selection-end="250" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="CassandraNode.scala" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/CassandraNode.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="39" column="61" selection-start="1212" selection-end="1212" vertical-scroll-proportion="0.49462366">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="storage-conf.xml" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/config/storage-conf.xml">
<provider selected="true" editor-type-id="text-editor">
<state line="36" column="49" selection-start="1742" selection-end="1742" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="start-akka-server.sh" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/bin/start-akka-server.sh">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="State.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/State.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="26" column="69" selection-start="581" selection-end="581" vertical-scroll-proportion="0.0">
<folding /> <folding />
</state> </state>
</provider> </provider>
@ -187,6 +92,16 @@
<setting name="OPEN_NEW_TAB" value="false" /> <setting name="OPEN_NEW_TAB" value="false" />
</FindUsagesManager> </FindUsagesManager>
</component> </component>
<component name="MavenImportPreferences">
<option name="generalSettings">
<MavenGeneralSettings>
<option name="workOffline" value="true" />
</MavenGeneralSettings>
</option>
</component>
<component name="MavenRunner">
<option name="jreName" value="#JAVA_INTERNAL" />
</component>
<component name="ModuleEditorState"> <component name="ModuleEditorState">
<option name="LAST_EDITED_MODULE_NAME" /> <option name="LAST_EDITED_MODULE_NAME" />
<option name="LAST_EDITED_TAB_NAME" /> <option name="LAST_EDITED_TAB_NAME" />
@ -212,74 +127,6 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
</PATH> </PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="kernel" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="main" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="scala" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH> <PATH>
<PATH_ELEMENT> <PATH_ELEMENT>
<option name="myItemId" value="akka" /> <option name="myItemId" value="akka" />
@ -290,56 +137,6 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
</PATH> </PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="config" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="bin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
</subPane> </subPane>
</component> </component>
<component name="ProjectReloadState"> <component name="ProjectReloadState">
@ -360,47 +157,47 @@
</navigator> </navigator>
</component> </component>
<component name="PropertiesComponent"> <component name="PropertiesComponent">
<property name="project.structure.last.edited" value="Modules" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth0" value="269" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth1" value="308" />
<property name="project.structure.proportion" value="0.15" /> <property name="project.structure.proportion" value="0.15" />
<property name="options.splitter.main.proportions" value="0.3" />
<property name="RunManagerConfig.showSettingsBeforeRunnig" value="false" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth0" value="290" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder1" value="1" />
<property name="MemberChooser.sorted" value="false" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder0" value="0" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth2" value="293" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth3" value="972" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth3" value="965" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth2" value="286" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth1" value="301" />
<property name="GoToClass.includeJavaFiles" value="false" /> <property name="GoToClass.includeJavaFiles" value="false" />
<property name="GoToClass.toSaveIncludeLibraries" value="false" /> <property name="MemberChooser.copyJavadoc" value="false" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder2" value="2" /> <property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder2" value="2" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder3" value="3" /> <property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder2" value="2" />
<property name="MemberChooser.showClasses" value="true" /> <property name="options.splitter.main.proportions" value="0.3" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth3" value="965" />
<property name="GoToFile.includeJavaFiles" value="false" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth0" value="269" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth2" value="286" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth2" value="293" />
<property name="GoToClass.includeLibraries" value="false" /> <property name="GoToClass.includeLibraries" value="false" />
<property name="options.splitter.details.proportions" value="0.2" /> <property name="options.splitter.details.proportions" value="0.2" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder0" value="0" /> <property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder0" value="0" />
<property name="GoToFile.includeJavaFiles" value="false" /> <property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder3" value="3" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder3" value="3" /> <property name="MemberChooser.showClasses" value="true" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder1" value="1" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder2" value="2" />
<property name="options.lastSelected" value="preferences.pluginManager" />
<property name="project.structure.side.proportion" value="0.2" /> <property name="project.structure.side.proportion" value="0.2" />
<property name="MemberChooser.copyJavadoc" value="false" /> <property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth0" value="290" />
<property name="dynamic.classpath" value="false" /> <property name="options.lastSelected" value="project.validation" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder3" value="3" />
<property name="GoToClass.toSaveIncludeLibraries" value="false" />
<property name="RunManagerConfig.showSettingsBeforeRunnig" value="false" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder0" value="0" />
<property name="project.structure.last.edited" value="Modules" />
<property name="options.searchVisible" value="true" /> <property name="options.searchVisible" value="true" />
<property name="MemberChooser.sorted" value="false" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder1" value="1" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth1" value="301" />
<property name="dynamic.classpath" value="false" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth3" value="972" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth1" value="308" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder1" value="1" />
</component> </component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CopyClassDialog.RECENTS_KEY"> <key name="CopyClassDialog.RECENTS_KEY">
<recent name="se.scalablesolutions.akka.api" /> <recent name="se.scalablesolutions.akka.api" />
</key> </key>
</component> </component>
<component name="RunManager" selected="Application.Kernel"> <component name="RunManager" selected="Scala Console.Scala Console">
<tempConfiguration default="false" name="Scala Console" type="ScalaScriptConsoleRunConfiguration" factoryName="Scala Console"> <tempConfiguration default="false" name="Scala Console" type="ScalaScriptConsoleRunConfiguration" factoryName="Scala Console">
<module name="kernel" /> <module name="" />
<setting name="vmparams" value="" /> <setting name="vmparams" value="" />
<setting name="consoleArgs" value="" /> <setting name="consoleArgs" value="" />
<RunnerSettings RunnerId="Run" /> <RunnerSettings RunnerId="Run" />
@ -409,11 +206,6 @@
<option name="Make" value="true" /> <option name="Make" value="true" />
</method> </method>
</tempConfiguration> </tempConfiguration>
<configuration default="true" type="ScalaScriptConsoleRunConfiguration" factoryName="Scala Console">
<module name="" />
<setting name="vmparams" value="" />
<setting name="consoleArgs" value="" />
</configuration>
<configuration default="true" type="Remote" factoryName="Remote"> <configuration default="true" type="Remote" factoryName="Remote">
<option name="USE_SOCKET_TRANSPORT" value="true" /> <option name="USE_SOCKET_TRANSPORT" value="true" />
<option name="SERVER_MODE" value="false" /> <option name="SERVER_MODE" value="false" />
@ -421,6 +213,23 @@
<option name="HOST" value="localhost" /> <option name="HOST" value="localhost" />
<option name="PORT" value="5005" /> <option name="PORT" value="5005" />
</configuration> </configuration>
<configuration default="true" type="ScalaScriptConsoleRunConfiguration" factoryName="Scala Console">
<module name="" />
<setting name="vmparams" value="" />
<setting name="consoleArgs" value="" />
</configuration>
<configuration default="true" type="Applet" factoryName="Applet">
<module name="" />
<option name="MAIN_CLASS_NAME" />
<option name="HTML_FILE_NAME" />
<option name="HTML_USED" value="false" />
<option name="WIDTH" value="400" />
<option name="HEIGHT" value="300" />
<option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
<option name="VM_PARAMETERS" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
</configuration>
<configuration default="true" type="TestNG" factoryName="TestNG" enabled="false" merge="false" runner="emma"> <configuration default="true" type="TestNG" factoryName="TestNG" enabled="false" merge="false" runner="emma">
<module name="" /> <module name="" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
@ -447,31 +256,6 @@
<properties /> <properties />
<listeners /> <listeners />
</configuration> </configuration>
<configuration default="true" type="Applet" factoryName="Applet">
<module name="" />
<option name="MAIN_CLASS_NAME" />
<option name="HTML_FILE_NAME" />
<option name="HTML_USED" value="false" />
<option name="WIDTH" value="400" />
<option name="HEIGHT" value="300" />
<option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
<option name="VM_PARAMETERS" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
</configuration>
<configuration default="true" type="Application" factoryName="Application" enabled="false" merge="false" runner="emma">
<option name="MAIN_CLASS_NAME" />
<option name="VM_PARAMETERS" />
<option name="PROGRAM_PARAMETERS" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="ENABLE_SWING_INSPECTOR" value="false" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<module name="" />
<envs />
</configuration>
<configuration default="true" type="JUnit" factoryName="JUnit" enabled="false" merge="false" runner="emma"> <configuration default="true" type="JUnit" factoryName="JUnit" enabled="false" merge="false" runner="emma">
<module name="" /> <module name="" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
@ -491,6 +275,19 @@
</option> </option>
<envs /> <envs />
</configuration> </configuration>
<configuration default="true" type="Application" factoryName="Application" enabled="false" merge="false" runner="emma">
<option name="MAIN_CLASS_NAME" />
<option name="VM_PARAMETERS" />
<option name="PROGRAM_PARAMETERS" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="ENABLE_SWING_INSPECTOR" value="false" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<module name="" />
<envs />
</configuration>
<configuration default="false" name="Kernel" type="Application" factoryName="Application" enabled="false" merge="false" sample_coverage="true" runner="emma"> <configuration default="false" name="Kernel" type="Application" factoryName="Application" enabled="false" merge="false" sample_coverage="true" runner="emma">
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.kernel.Kernel" /> <option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.kernel.Kernel" />
<option name="VM_PARAMETERS" value="-Dcassandra -Dstorage-config=config/ -Dpidfile=akka.pid" /> <option name="VM_PARAMETERS" value="-Dcassandra -Dstorage-config=config/ -Dpidfile=akka.pid" />
@ -533,7 +330,7 @@
<option name="MERGE_DIFF_USE_ANCESTRY" value="true" /> <option name="MERGE_DIFF_USE_ANCESTRY" value="true" />
<option name="UPDATE_LOCK_ON_DEMAND" value="false" /> <option name="UPDATE_LOCK_ON_DEMAND" value="false" />
<option name="IGNORE_SPACES_IN_MERGE" value="false" /> <option name="IGNORE_SPACES_IN_MERGE" value="false" />
<configuration useDefault="true">C:\Documents and Settings\jboner\Application Data\Subversion</configuration> <configuration useDefault="true">$PROJECT_DIR$/../../../.subversion</configuration>
<myIsUseDefaultProxy>false</myIsUseDefaultProxy> <myIsUseDefaultProxy>false</myIsUseDefaultProxy>
</component> </component>
<component name="TodoView" selected-index="0"> <component name="TodoView" selected-index="0">
@ -557,32 +354,32 @@
</todo-panel> </todo-panel>
</component> </component>
<component name="ToolWindowManager"> <component name="ToolWindowManager">
<frame x="-4" y="-4" width="1928" height="1178" extended-state="6" /> <frame x="0" y="22" width="1436" height="878" extended-state="0" />
<editor active="false" /> <editor active="false" />
<layout> <layout>
<window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32976654" sideWeight="0.5" order="13" side_tool="false" />
<window_info id="Dataflow to this" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="14" side_tool="false" />
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="5" side_tool="false" />
<window_info id="Data Sources" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" /> <window_info id="Data Sources" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32879376" sideWeight="0.5" order="7" side_tool="false" /> <window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32879376" sideWeight="0.5" order="6" side_tool="false" />
<window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.3258832" sideWeight="0.67417216" order="1" side_tool="false" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32879376" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24945295" sideWeight="0.84143966" order="0" side_tool="false" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.3165563" sideWeight="0.5" order="11" side_tool="false" />
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="12" side_tool="false" />
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" /> <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24986653" sideWeight="0.75" order="1" side_tool="false" /> <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24986653" sideWeight="0.75" order="1" side_tool="false" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32879376" sideWeight="0.5" order="1" side_tool="false" /> <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32879376" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39980546" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Dataflow to this" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="14" side_tool="false" />
<window_info id="IDEtalk Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" />
<window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" />
<window_info id="FindBugs-IDEA" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32976654" sideWeight="0.5" order="9" side_tool="false" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32879376" sideWeight="0.5" order="10" side_tool="false" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.3180934" sideWeight="0.5" order="11" side_tool="false" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32879376" sideWeight="0.5" order="6" side_tool="false" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24986653" sideWeight="0.84143966" order="0" side_tool="false" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39989322" sideWeight="0.75" order="0" side_tool="false" />
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="5" side_tool="false" />
<window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.35451147" sideWeight="0.6750973" order="1" side_tool="false" />
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="12" side_tool="false" />
<window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32976654" sideWeight="0.5" order="13" side_tool="false" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="true" internal_type="DOCKED" type="FLOATING" visible="false" weight="0.47276264" sideWeight="0.5" order="2" side_tool="false" x="16" y="58" width="1798" height="1028" /> <window_info id="Run" active="false" anchor="bottom" auto_hide="true" internal_type="DOCKED" type="FLOATING" visible="false" weight="0.47276264" sideWeight="0.5" order="2" side_tool="false" x="16" y="58" width="1798" height="1028" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" /> <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39989322" sideWeight="0.75" order="0" side_tool="false" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39980546" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="IDEtalk Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32879376" sideWeight="0.5" order="10" side_tool="false" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" /> <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" />
<window_info id="FindBugs-IDEA" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32976654" sideWeight="0.5" order="9" side_tool="false" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24965987" sideWeight="0.5" order="2" side_tool="false" /> <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24965987" sideWeight="0.5" order="2" side_tool="false" />
</layout> </layout>
</component> </component>
@ -669,22 +466,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="50" column="1" selection-start="1316" selection-end="1316" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="59" column="15" selection-start="2579" selection-end="2579" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java"> <entry file="file://$PROJECT_DIR$/api-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="8" column="0" selection-start="195" selection-end="195" vertical-scroll-proportion="0.0"> <state line="8" column="0" selection-start="195" selection-end="195" vertical-scroll-proportion="0.0">
@ -722,7 +503,37 @@
</entry> </entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/CassandraNode.scala"> <entry file="file://$PROJECT_DIR$/kernel/src/main/scala/CassandraNode.scala">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="39" column="61" selection-start="1212" selection-end="1212" vertical-scroll-proportion="0.49462366"> <state line="36" column="11" selection-start="1063" selection-end="1063" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/Messages.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="7" column="12" selection-start="139" selection-end="139" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="2" column="33" selection-start="49" selection-end="49" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/api-java/src/main/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfigurator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="59" column="15" selection-start="2579" selection-end="2579" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/GenericServer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="15" column="22" selection-start="449" selection-end="449" vertical-scroll-proportion="0.18025751">
<folding /> <folding />
</state> </state>
</provider> </provider>

View file

@ -1,4 +0,0 @@
<!-- Documentation is available at http://www.sublimetext.com/docs/projects -->
<project>
<mount dir="." direxclude=".svn"/>
</project>

View file

@ -18,7 +18,6 @@
</library> </library>
</orderEntry> </orderEntry>
<orderEntry type="module" module-name="util-java" exported="" /> <orderEntry type="module" module-name="util-java" exported="" />
<orderEntry type="module" module-name="kernel" exported="" />
<orderEntry type="module-library" exported=""> <orderEntry type="module-library" exported="">
<library> <library>
<CLASSES> <CLASSES>

View file

@ -20,6 +20,13 @@ is divided into following sections:
--> -->
<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="api-java-impl"> <project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="api-java-impl">
<fail message="Please build using Ant 1.7.1 or higher.">
<condition>
<not>
<antversion atleast="1.7.1"/>
</not>
</condition>
</fail>
<target depends="test,jar,javadoc" description="Build and test whole project." name="default"/> <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
<!-- <!--
====================== ======================
@ -153,9 +160,15 @@ is divided into following sections:
<attribute default="${excludes}" name="excludes"/> <attribute default="${excludes}" name="excludes"/>
<attribute default="${javac.debug}" name="debug"/> <attribute default="${javac.debug}" name="debug"/>
<attribute default="/does/not/exist" name="sourcepath"/> <attribute default="/does/not/exist" name="sourcepath"/>
<attribute default="/does/not/exist" name="gensrcdir"/>
<element name="customize" optional="true"/> <element name="customize" optional="true"/>
<sequential> <sequential>
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}"> <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}">
<src>
<dirset dir="@{gensrcdir}" erroronmissingdir="false">
<include name="*"/>
</dirset>
</src>
<classpath> <classpath>
<path path="@{classpath}"/> <path path="@{classpath}"/>
</classpath> </classpath>
@ -271,6 +284,8 @@ is divided into following sections:
<java classname="@{classname}" dir="${work.dir}" fork="true"> <java classname="@{classname}" dir="${work.dir}" fork="true">
<jvmarg line="${debug-args-line}"/> <jvmarg line="${debug-args-line}"/>
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/> <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
<jvmarg value="-Dfile.encoding=${source.encoding}"/>
<redirector errorencoding="${source.encoding}" inputencoding="${source.encoding}" outputencoding="${source.encoding}"/>
<jvmarg line="${run.jvmargs}"/> <jvmarg line="${run.jvmargs}"/>
<classpath> <classpath>
<path path="@{classpath}"/> <path path="@{classpath}"/>
@ -287,12 +302,15 @@ is divided into following sections:
<target name="-init-macrodef-java"> <target name="-init-macrodef-java">
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1"> <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="classname"/> <attribute default="${main.class}" name="classname"/>
<attribute default="${run.classpath}" name="classpath"/>
<element name="customize" optional="true"/> <element name="customize" optional="true"/>
<sequential> <sequential>
<java classname="@{classname}" dir="${work.dir}" fork="true"> <java classname="@{classname}" dir="${work.dir}" fork="true">
<jvmarg value="-Dfile.encoding=${source.encoding}"/>
<redirector errorencoding="${source.encoding}" inputencoding="${source.encoding}" outputencoding="${source.encoding}"/>
<jvmarg line="${run.jvmargs}"/> <jvmarg line="${run.jvmargs}"/>
<classpath> <classpath>
<path path="${run.classpath}"/> <path path="@{classpath}"/>
</classpath> </classpath>
<syspropertyset> <syspropertyset>
<propertyref prefix="run-sys-prop."/> <propertyref prefix="run-sys-prop."/>
@ -334,10 +352,15 @@ is divided into following sections:
<!-- You can override this target in the ../build.xml file. --> <!-- You can override this target in the ../build.xml file. -->
</target> </target>
<target if="do.depend.true" name="-compile-depend"> <target if="do.depend.true" name="-compile-depend">
<j2seproject3:depend/> <pathconvert property="build.generated.subdirs">
<dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
<include name="*"/>
</dirset>
</pathconvert>
<j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
</target> </target>
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile"> <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
<j2seproject3:javac/> <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
<copy todir="${build.classes.dir}"> <copy todir="${build.classes.dir}">
<fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
</copy> </copy>
@ -354,7 +377,7 @@ is divided into following sections:
<target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single"> <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail> <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
<j2seproject3:force-recompile/> <j2seproject3:force-recompile/>
<j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/> <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
</target> </target>
<target name="-post-compile-single"> <target name="-post-compile-single">
<!-- Empty placeholder for easier customization. --> <!-- Empty placeholder for easier customization. -->
@ -444,6 +467,10 @@ is divided into following sections:
<fail unless="run.class">Must select one file in the IDE or set run.class</fail> <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
<j2seproject1:java classname="${run.class}"/> <j2seproject1:java classname="${run.class}"/>
</target> </target>
<target depends="init,-do-not-recompile,compile-test-single" name="run-test-with-main">
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
<j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
</target>
<!-- <!--
================= =================
DEBUGGING SECTION DEBUGGING SECTION
@ -452,6 +479,9 @@ is divided into following sections:
<target depends="init" if="netbeans.home" name="-debug-start-debugger"> <target depends="init" if="netbeans.home" name="-debug-start-debugger">
<j2seproject1:nbjpdastart name="${debug.class}"/> <j2seproject1:nbjpdastart name="${debug.class}"/>
</target> </target>
<target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
<j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
</target>
<target depends="init,compile" name="-debug-start-debuggee"> <target depends="init,compile" name="-debug-start-debuggee">
<j2seproject3:debug> <j2seproject3:debug>
<customize> <customize>
@ -469,6 +499,11 @@ is divided into following sections:
<j2seproject3:debug classname="${debug.class}"/> <j2seproject3:debug classname="${debug.class}"/>
</target> </target>
<target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/> <target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
<target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
<fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
<j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
</target>
<target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
<target depends="init" name="-pre-debug-fix"> <target depends="init" name="-pre-debug-fix">
<fail unless="fix.includes">Must set fix.includes</fail> <fail unless="fix.includes">Must set fix.includes</fail>
<property name="javac.includes" value="${fix.includes}.java"/> <property name="javac.includes" value="${fix.includes}.java"/>
@ -491,6 +526,9 @@ is divided into following sections:
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}"> <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
<filename name="**/*.java"/> <filename name="**/*.java"/>
</fileset> </fileset>
<fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
<include name="**/*.java"/>
</fileset>
</javadoc> </javadoc>
</target> </target>
<target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview"> <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
@ -552,7 +590,7 @@ is divided into following sections:
<j2seproject3:junit testincludes="**/*Test.java"/> <j2seproject3:junit testincludes="**/*Test.java"/>
</target> </target>
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run"> <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
<fail if="tests.failed">Some tests failed; see details above.</fail> <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
</target> </target>
<target depends="init" if="have.tests" name="test-report"/> <target depends="init" if="have.tests" name="test-report"/>
<target depends="init" if="netbeans.home+have.tests" name="-test-browse"/> <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
@ -565,7 +603,7 @@ is divided into following sections:
<j2seproject3:junit excludes="" includes="${test.includes}"/> <j2seproject3:junit excludes="" includes="${test.includes}"/>
</target> </target>
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single"> <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
<fail if="tests.failed">Some tests failed; see details above.</fail> <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
</target> </target>
<target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/> <target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
<!-- <!--

View file

@ -1,8 +1,8 @@
build.xml.data.CRC32=3e53666f build.xml.data.CRC32=3e53666f
build.xml.script.CRC32=b65508dc build.xml.script.CRC32=b65508dc
build.xml.stylesheet.CRC32=958a1d3e build.xml.stylesheet.CRC32=958a1d3e@1.25.0.45
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # 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. # 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.data.CRC32=3e53666f
nbproject/build-impl.xml.script.CRC32=0784ec5f nbproject/build-impl.xml.script.CRC32=1b57f6f0
nbproject/build-impl.xml.stylesheet.CRC32=65b8de21 nbproject/build-impl.xml.stylesheet.CRC32=ce896a9e@1.25.0.45

View file

@ -3,5 +3,4 @@ do.depend=false
do.jar=true do.jar=true
javac.debug=true javac.debug=true
javadoc.preview=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=/Users/jboner/.netbeans/dev/build.properties
user.properties.file=C:\\Documents and Settings\\jboner\\.netbeans\\6.5\\build.properties

View file

@ -23,18 +23,24 @@ dist.javadoc.dir=${dist.dir}/javadoc
excludes= excludes=
file.reference.activation-1.1.jar=../lib/activation-1.1.jar file.reference.activation-1.1.jar=../lib/activation-1.1.jar
file.reference.akka-util-java.jar=../lib/akka-util-java.jar file.reference.akka-util-java.jar=../lib/akka-util-java.jar
file.reference.antlr-3.1.3.jar=../lib/antlr-3.1.3.jar
file.reference.aopalliance-1.0.jar=../lib/aopalliance-1.0.jar file.reference.aopalliance-1.0.jar=../lib/aopalliance-1.0.jar
file.reference.asm-3.1.jar=../lib/asm-3.1.jar file.reference.asm-3.1.jar=../lib/asm-3.1.jar
file.reference.asm-all-2.2.1.jar=../lib/asm-all-2.2.1.jar
file.reference.cassandra.jar=../lib/cassandra.jar
file.reference.catalina-ant.jar=../lib/catalina-ant.jar file.reference.catalina-ant.jar=../lib/catalina-ant.jar
file.reference.cglib-2.2.jar=../lib/cglib-2.2.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.colt-1.2.0.jar=../lib/colt-1.2.0.jar
file.reference.commons-cli-1.1.jar=../lib/commons-cli-1.1.jar
file.reference.commons-codec-1.3.jar=../lib/commons-codec-1.3.jar file.reference.commons-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-collections-3.2.1.jar=../lib/commons-collections-3.2.1.jar
file.reference.commons-dbcp-1.2.2.jar=../lib/commons-dbcp-1.2.2.jar file.reference.commons-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-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-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-javaflow-1.0-SNAPSHOT.jar=../lib/commons-javaflow-1.0-SNAPSHOT.jar
file.reference.commons-logging.jar=../lib/commons-logging.jar file.reference.commons-lang-2.4.jar=../lib/commons-lang-2.4.jar
file.reference.commons-logging-1.0.4.jar=../lib/commons-logging-1.0.4.jar
file.reference.commons-math-1.1.jar=../lib/commons-math-1.1.jar
file.reference.commons-pool-1.4.jar=../lib/commons-pool-1.4.jar file.reference.commons-pool-1.4.jar=../lib/commons-pool-1.4.jar
file.reference.configgy-1.2.jar=../lib/configgy-1.2.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.google-collect-snapshot-20090211.jar=../lib/google-collect-snapshot-20090211.jar
@ -47,6 +53,7 @@ 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.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-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.guice-jsr250-2.0-SNAPSHOT.jar=../lib/guice-jsr250-2.0-SNAPSHOT.jar
file.reference.high-scale-lib.jar=../lib/high-scale-lib.jar
file.reference.jaxb-api-2.1.jar=../lib/jaxb-api-2.1.jar file.reference.jaxb-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.jaxb-impl-2.1.jar=../lib/jaxb-impl-2.1.jar
file.reference.jdom-1.0.jar=../lib/jdom-1.0.jar file.reference.jdom-1.0.jar=../lib/jdom-1.0.jar
@ -58,23 +65,32 @@ 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.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-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.jetty-util-6.1.6rc0.jar=../lib/jetty-util-6.1.6rc0.jar
file.reference.JSAP-2.1.jar=../lib/JSAP-2.1.jar
file.reference.jsr250-api-1.0.jar=../lib/jsr250-api-1.0.jar file.reference.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.jsr311-api-1.0.jar=../lib/jsr311-api-1.0.jar
file.reference.junit-3.8.2.jar=../lib/junit-3.8.2.jar file.reference.junit-3.8.2.jar=../lib/junit-3.8.2.jar
file.reference.junit-4.5.jar=../lib/junit-4.5.jar
file.reference.junit4runner-1.0-SNAPSHOT.jar=../lib/junit4runner-1.0-SNAPSHOT.jar
file.reference.libfb303.jar=../lib/libfb303.jar
file.reference.libthrift-20080411p1.jar=../lib/libthrift-20080411p1.jar file.reference.libthrift-20080411p1.jar=../lib/libthrift-20080411p1.jar
file.reference.log4j-1.2.13.jar=../lib/log4j-1.2.13.jar file.reference.libthrift.jar=../lib/libthrift.jar
file.reference.log4j-1.2.15.jar=../lib/log4j-1.2.15.jar
file.reference.lucene-core-2.2.0.jar=../lib/lucene-core-2.2.0.jar
file.reference.main-java=src/main/java file.reference.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-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.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar=../lib/mina-integration-scala-2.0.0-M2-SNAPSHOT.jar
file.reference.pcj.jar=../lib/pcj.jar
file.reference.protobuf-java-2.0.3.jar=../lib/protobuf-java-2.0.3.jar file.reference.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.rome-0.9.jar=../lib/rome-0.9.jar
file.reference.scala-library-2.7.3.jar=../lib/scala-library-2.7.3.jar file.reference.scala-library-2.7.3.jar=../lib/scala-library-2.7.3.jar
file.reference.scala-library-2.7.3.zip=../lib/scala-library-2.7.3.zip
file.reference.scalatest-0.9.5.jar=../lib/scalatest-0.9.5.jar file.reference.scalatest-0.9.5.jar=../lib/scalatest-0.9.5.jar
file.reference.scalatest-0.9.5.zip=../lib/scalatest-0.9.5.zip 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.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-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.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.stax-api-1.0-2.jar=../lib/stax-api-1.0-2.jar
file.reference.stringtemplate-3.0.jar=../lib/stringtemplate-3.0.jar
file.reference.test-java=src/test/java file.reference.test-java=src/test/java
file.reference.velocity-1.5.jar=../lib/velocity-1.5.jar 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-0.4a.jar=../lib/voldemort-0.4a.jar
@ -85,22 +101,26 @@ includes=**
jar.compress=false jar.compress=false
javac.classpath=\ javac.classpath=\
${reference.akka-kernel.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.activation-1.1.jar}:\
${file.reference.akka-util-java.jar}:\
${file.reference.antlr-3.1.3.jar}:\
${file.reference.aopalliance-1.0.jar}:\ ${file.reference.aopalliance-1.0.jar}:\
${file.reference.asm-3.1.jar}:\ ${file.reference.asm-3.1.jar}:\
${file.reference.asm-all-2.2.1.jar}:\
${file.reference.cassandra.jar}:\
${file.reference.catalina-ant.jar}:\ ${file.reference.catalina-ant.jar}:\
${file.reference.cglib-2.2.jar}:\ ${file.reference.cglib-2.2.jar}:\
${file.reference.colt-1.2.0.jar}:\ ${file.reference.colt-1.2.0.jar}:\
${file.reference.akka-util-java.jar}:\ ${file.reference.commons-cli-1.1.jar}:\
${file.reference.commons-codec-1.3.jar}:\ ${file.reference.commons-codec-1.3.jar}:\
${file.reference.commons-collections-3.1.jar}:\ ${file.reference.commons-collections-3.2.1.jar}:\
${file.reference.commons-dbcp-1.2.2.jar}:\ ${file.reference.commons-dbcp-1.2.2.jar}:\
${file.reference.commons-httpclient-3.1.jar}:\ ${file.reference.commons-httpclient-3.1.jar}:\
${file.reference.commons-io-1.3.2.jar}:\ ${file.reference.commons-io-1.3.2.jar}:\
${file.reference.commons-lang-2.1.jar}:\ ${file.reference.commons-javaflow-1.0-SNAPSHOT.jar}:\
${file.reference.commons-logging.jar}:\ ${file.reference.commons-lang-2.4.jar}:\
${file.reference.commons-logging-1.0.4.jar}:\
${file.reference.commons-math-1.1.jar}:\
${file.reference.commons-pool-1.4.jar}:\ ${file.reference.commons-pool-1.4.jar}:\
${file.reference.configgy-1.2.jar}:\ ${file.reference.configgy-1.2.jar}:\
${file.reference.google-collect-snapshot-20090211.jar}:\ ${file.reference.google-collect-snapshot-20090211.jar}:\
@ -111,6 +131,9 @@ javac.classpath=\
${file.reference.grizzly-portunif-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-rcm-1.8.6.3.jar}:\
${file.reference.grizzly-servlet-webserver-1.8.6.3.jar}:\ ${file.reference.grizzly-servlet-webserver-1.8.6.3.jar}:\
${file.reference.guice-core-2.0-SNAPSHOT.jar}:\
${file.reference.guice-jsr250-2.0-SNAPSHOT.jar}:\
${file.reference.high-scale-lib.jar}:\
${file.reference.jaxb-api-2.1.jar}:\ ${file.reference.jaxb-api-2.1.jar}:\
${file.reference.jaxb-impl-2.1.jar}:\ ${file.reference.jaxb-impl-2.1.jar}:\
${file.reference.jdom-1.0.jar}:\ ${file.reference.jdom-1.0.jar}:\
@ -122,22 +145,31 @@ javac.classpath=\
${file.reference.jettison-1.0.1.jar}:\ ${file.reference.jettison-1.0.1.jar}:\
${file.reference.jetty-6.1.6rc0.jar}:\ ${file.reference.jetty-6.1.6rc0.jar}:\
${file.reference.jetty-util-6.1.6rc0.jar}:\ ${file.reference.jetty-util-6.1.6rc0.jar}:\
${file.reference.JSAP-2.1.jar}:\
${file.reference.jsr250-api-1.0.jar}:\ ${file.reference.jsr250-api-1.0.jar}:\
${file.reference.jsr311-api-1.0.jar}:\ ${file.reference.jsr311-api-1.0.jar}:\
${file.reference.junit-3.8.2.jar}:\ ${file.reference.junit-3.8.2.jar}:\
${file.reference.junit-4.5.jar}:\
${file.reference.junit4runner-1.0-SNAPSHOT.jar}:\
${file.reference.libfb303.jar}:\
${file.reference.libthrift-20080411p1.jar}:\ ${file.reference.libthrift-20080411p1.jar}:\
${file.reference.log4j-1.2.13.jar}:\ ${file.reference.libthrift.jar}:\
${file.reference.log4j-1.2.15.jar}:\
${file.reference.lucene-core-2.2.0.jar}:\
${file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar}:\ ${file.reference.mina-core-2.0.0-M2-SNAPSHOT.jar}:\
${file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar}:\ ${file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar}:\
${file.reference.pcj.jar}:\
${file.reference.protobuf-java-2.0.3.jar}:\ ${file.reference.protobuf-java-2.0.3.jar}:\
${file.reference.rome-0.9.jar}:\ ${file.reference.rome-0.9.jar}:\
${file.reference.scala-library-2.7.3.jar}:\ ${file.reference.scala-library-2.7.3.jar}:\
${file.reference.scala-library-2.7.3.zip}:\
${file.reference.scalatest-0.9.5.jar}:\ ${file.reference.scalatest-0.9.5.jar}:\
${file.reference.scalatest-0.9.5.zip}:\ ${file.reference.scalatest-0.9.5.zip}:\
${file.reference.servlet-api-2.5.jar}:\ ${file.reference.servlet-api-2.5.jar}:\
${file.reference.slf4j-api-1.4.3.jar}:\ ${file.reference.slf4j-api-1.4.3.jar}:\
${file.reference.slf4j-log4j12-1.4.3.jar}:\ ${file.reference.slf4j-log4j12-1.4.3.jar}:\
${file.reference.stax-api-1.0-2.jar}:\ ${file.reference.stax-api-1.0-2.jar}:\
${file.reference.stringtemplate-3.0.jar}:\
${file.reference.velocity-1.5.jar}:\ ${file.reference.velocity-1.5.jar}:\
${file.reference.voldemort-0.4a.jar}:\ ${file.reference.voldemort-0.4a.jar}:\
${file.reference.voldemort-contrib-0.4a.jar}:\ ${file.reference.voldemort-contrib-0.4a.jar}:\

View file

@ -103,58 +103,58 @@ public class ActiveObjectGuiceConfiguratorTest extends TestCase {
} catch (RuntimeException e) { } catch (RuntimeException e) {
} }
} }
}
interface Foo { interface Foo {
public String foo(String msg); public String foo(String msg);
@oneway public void bar(String msg); @oneway public void bar(String msg);
public void longRunning(); public void longRunning();
public void throwsException(); public void throwsException();
public Bar getBar(); public Bar getBar();
}
class FooImpl implements Foo {
@Inject private Bar bar;
public Bar getBar() {
return bar;
} }
public String foo(String msg) {
class FooImpl implements Foo { return msg + "return_foo ";
@Inject private Bar bar; }
public Bar getBar() { public void bar(String msg) {
return bar; bar.bar(msg);
} }
public String foo(String msg) { public void longRunning() {
return msg + "return_foo "; try {
} Thread.sleep(10000);
public void bar(String msg) { } catch (InterruptedException e) {
bar.bar(msg);
}
public void longRunning() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
}
public void throwsException() {
throw new RuntimeException("expected");
} }
} }
public void throwsException() {
interface Bar { throw new RuntimeException("expected");
@oneway void bar(String msg);
Ext getExt();
} }
}
class BarImpl implements Bar { interface Bar {
@Inject private Ext ext; @oneway void bar(String msg);
public Ext getExt() { Ext getExt();
return ext; }
}
public void bar(String msg) { class BarImpl implements Bar {
} @Inject private Ext ext;
public Ext getExt() {
return ext;
} }
public void bar(String msg) {
interface Ext {
void ext();
} }
}
class ExtImpl implements Ext { interface Ext {
public void ext() { void ext();
} }
class ExtImpl implements Ext {
public void ext() {
} }
} }

View file

@ -14,7 +14,6 @@ import com.google.inject.Scopes;
import junit.framework.TestCase; import junit.framework.TestCase;
public class InMemoryStateTest extends TestCase { public class InMemoryStateTest extends TestCase {
static String messageLog = ""; static String messageLog = "";
@ -22,57 +21,50 @@ public class InMemoryStateTest extends TestCase {
protected void setUp() { protected void setUp() {
conf.configureActiveObjects( conf.configureActiveObjects(
new RestartStrategy(new AllForOne(), 3, 5000), new Component[]{ new RestartStrategy(new AllForOne(), 3, 5000),
new Component( new Component[] {
Stateful.class, new Component(InMemStateful.class, InMemStatefulImpl.class, new LifeCycle(new Permanent(), 1000), 10000000),
StatefulImpl.class, new Component(InMemFailer.class, InMemFailerImpl.class, new LifeCycle(new Permanent(), 1000), 1000),
new LifeCycle(new Permanent(), 1000), new Component(InMemClasher.class, InMemClasherImpl.class, new LifeCycle(new Permanent(), 1000), 100000)
10000000),
new Component(
Failer.class,
FailerImpl.class,
new LifeCycle(new Permanent(), 1000),
1000),
new Component(
Clasher.class,
ClasherImpl.class,
new LifeCycle(new Permanent(), 1000),
100000)
}).inject().supervise(); }).inject().supervise();
} }
// public void testShouldNotRollbackStateForStatefulServerInCaseOfSuccess() { // public void testShouldNotRollbackStateForStatefulServerInCaseOfSuccess() {
// Stateful stateful = conf.getActiveObject(Stateful.class); // Stateful stateful = conf.getActiveObject(Stateful.class);
// stateful.setState("stateful", "init"); // set init state // stateful.setState("stateful", "init"); // set init state
// stateful.success("stateful", "new state"); // transactional // stateful.success("stateful", "new state"); // transactional
// assertEquals("new state", stateful.getState("stateful")); // assertEquals("new state", stateful.getState("stateful"));
// } // }
// //
// public void testShouldRollbackStateForStatefulServerInCaseOfFailure() { // public void testShouldRollbackStateForStatefulServerInCaseOfFailure() {
// Stateful stateful = conf.getActiveObject(Stateful.class); // Stateful stateful = conf.getActiveObject(Stateful.class);
// stateful.setState("stateful", "init"); // set init state // stateful.setState("stateful", "init"); // set init state
// //
// Failer failer = conf.getActiveObject(Failer.class); // Failer failer = conf.getActiveObject(Failer.class);
// try { // try {
// stateful.failure("stateful", "new state", failer); // call failing transactional method // stateful.failure("stateful", "new state", failer); // call failing
// fail("should have thrown an exception"); // transactional method
// } catch (RuntimeException e) { } // expected // fail("should have thrown an exception");
// assertEquals("init", stateful.getState("stateful")); // check that state is == init state // } catch (RuntimeException e) { } // expected
// } // assertEquals("init", stateful.getState("stateful")); // check that state is
// == init state
// }
public void testShouldRollbackStateForStatefulServerInCaseOfMessageClash() { public void testShouldRollbackStateForStatefulServerInCaseOfMessageClash() {
Stateful stateful = conf.getActiveObject(Stateful.class); InMemStateful stateful = conf.getActiveObject(InMemStateful.class);
stateful.setState("stateful", "init"); // set init state stateful.setState("stateful", "init"); // set init state
Clasher clasher = conf.getActiveObject(Clasher.class); InMemClasher clasher = conf.getActiveObject(InMemClasher.class);
clasher.setState("clasher", "init"); // set init state clasher.setState("clasher", "init"); // set init state
// try { // try {
// stateful.clashOk("stateful", "new state", clasher); // stateful.clashOk("stateful", "new state", clasher);
// } catch (RuntimeException e) { } // expected // } catch (RuntimeException e) { } // expected
// assertEquals("new state", stateful.getState("stateful")); // check that state is == init state // assertEquals("new state", stateful.getState("stateful")); // check that
// assertEquals("was here", clasher.getState("clasher")); // check that state is == init state // state is == init state
// assertEquals("was here", clasher.getState("clasher")); // check that
// state is == init state
try { try {
stateful.clashNotOk("stateful", "new state", clasher); stateful.clashNotOk("stateful", "new state", clasher);
@ -80,113 +72,111 @@ public class InMemoryStateTest extends TestCase {
} catch (RuntimeException e) { } catch (RuntimeException e) {
System.out.println(e); System.out.println(e);
} // expected } // expected
assertEquals("init", stateful.getState("stateful")); // check that state is == init state assertEquals("init", stateful.getState("stateful")); // check that state is
//assertEquals("init", clasher.getState("clasher")); // check that state is == init state // == init state
} // assertEquals("init", clasher.getState("clasher")); // check that state is
// == init state
interface Stateful {
// transactional
@transactional
public void success(String key, String msg);
@transactional
public void failure(String key, String msg, Failer failer);
@transactional
public void clashOk(String key, String msg, Clasher clasher);
@transactional
public void clashNotOk(String key, String msg, Clasher clasher);
// non-transactional
public String getState(String key);
public void setState(String key, String value);
}
class StatefulImpl implements Stateful {
@state
private
InMemoryState<String, Object> state = new InMemoryState<String, Object>();
public String getState(String key) {
return (String) state.get(key);
}
public void setState(String key, String msg) {
state.put(key, msg);
}
public void success(String key, String msg) {
state.put(key, msg);
}
public void failure(String key, String msg, Failer failer) {
state.put(key, msg);
failer.fail();
}
public void clashOk(String key, String msg, Clasher clasher) {
state.put(key, msg);
clasher.clash();
}
public void clashNotOk(String key, String msg, Clasher clasher) {
state.put(key, msg);
clasher.clash();
clasher.clash();
}
}
interface Failer {
public void fail();
}
class FailerImpl implements Failer {
public void fail() {
throw new RuntimeException("expected");
}
}
interface Clasher {
public void clash();
public String getState(String key);
public void setState(String key, String value);
}
class ClasherImpl implements Clasher {
@state
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
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) {}
}
} }
} }
interface InMemStateful {
// transactional
@transactional
public void success(String key, String msg);
@transactional
public void failure(String key, String msg, InMemFailer failer);
@transactional
public void clashOk(String key, String msg, InMemClasher clasher);
@transactional
public void clashNotOk(String key, String msg, InMemClasher clasher);
// non-transactional
public String getState(String key);
public void setState(String key, String value);
}
class InMemStatefulImpl implements InMemStateful {
@state
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
public String getState(String key) {
return (String) state.get(key);
}
public void setState(String key, String msg) {
state.put(key, msg);
}
public void success(String key, String msg) {
state.put(key, msg);
}
public void failure(String key, String msg, InMemFailer failer) {
state.put(key, msg);
failer.fail();
}
public void clashOk(String key, String msg, InMemClasher clasher) {
state.put(key, msg);
clasher.clash();
}
public void clashNotOk(String key, String msg, InMemClasher clasher) {
state.put(key, msg);
clasher.clash();
clasher.clash();
}
}
interface InMemFailer {
public void fail();
}
class InMemFailerImpl implements InMemFailer {
public void fail() {
throw new RuntimeException("expected");
}
}
interface InMemClasher {
public void clash();
public String getState(String key);
public void setState(String key, String value);
}
class InMemClasherImpl implements InMemClasher {
@state
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
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) {}
}
}

View file

@ -14,7 +14,6 @@ import com.google.inject.Scopes;
import junit.framework.TestCase; import junit.framework.TestCase;
public class PersistentStateTest extends TestCase { public class PersistentStateTest extends TestCase {
static String messageLog = ""; static String messageLog = "";
@ -22,131 +21,121 @@ public class PersistentStateTest extends TestCase {
protected void setUp() { protected void setUp() {
conf.configureActiveObjects( conf.configureActiveObjects(
new RestartStrategy(new AllForOne(), 3, 5000), new Component[]{ new RestartStrategy(new AllForOne(), 3, 5000),
new Component( new Component[] {
Stateful.class, new Component(PersistentStateful.class, PersistentStatefulImpl.class, new LifeCycle(new Permanent(), 1000), 10000000),
StatefulImpl.class, new Component(PersistentFailer.class, PersistentFailerImpl.class, new LifeCycle(new Permanent(), 1000), 1000),
new LifeCycle(new Permanent(), 1000), new Component(PersistentClasher.class, PersistentClasherImpl.class, new LifeCycle(new Permanent(), 1000), 100000)
10000000),
new Component(
Failer.class,
FailerImpl.class,
new LifeCycle(new Permanent(), 1000),
1000),
new Component(
Clasher.class,
ClasherImpl.class,
new LifeCycle(new Permanent(), 1000),
100000)
}).inject().supervise(); }).inject().supervise();
} }
public void testShouldNotRollbackStateForStatefulServerInCaseOfSuccess() { public void testShouldNotRollbackStateForStatefulServerInCaseOfSuccess() {
Stateful stateful = conf.getActiveObject(Stateful.class); PersistentStateful stateful = conf.getActiveObject(PersistentStateful.class);
stateful.setState("stateful", "init"); // set init state stateful.setState("stateful", "init"); // set init state
stateful.success("stateful", "new state"); // transactional stateful.success("stateful", "new state"); // transactional
assertEquals("new state", stateful.getState("stateful")); assertEquals("new state", stateful.getState("stateful"));
} }
}
interface Stateful { interface PersistentStateful {
// transactional // transactional
@transactional @transactional
public void success(String key, String msg); public void success(String key, String msg);
@transactional @transactional
public void failure(String key, String msg, Failer failer); public void failure(String key, String msg, PersistentFailer failer);
@transactional @transactional
public void clashOk(String key, String msg, Clasher clasher); public void clashOk(String key, String msg, PersistentClasher clasher);
@transactional @transactional
public void clashNotOk(String key, String msg, Clasher clasher); public void clashNotOk(String key, String msg, PersistentClasher clasher);
// non-transactional // non-transactional
public String getState(String key); public String getState(String key);
public void setState(String key, String value); public void setState(String key, String value);
}
class PersistentStatefulImpl implements PersistentStateful {
@state
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
public String getState(String key) {
return (String) state.get(key);
} }
class StatefulImpl implements Stateful { public void setState(String key, String msg) {
@state state.put(key, msg);
private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
public String getState(String key) {
return (String) state.get(key);
}
public void setState(String key, String msg) {
state.put(key, msg);
}
public void success(String key, String msg) {
state.put(key, msg);
}
public void failure(String key, String msg, Failer failer) {
state.put(key, msg);
failer.fail();
}
public void clashOk(String key, String msg, Clasher clasher) {
state.put(key, msg);
clasher.clash();
}
public void clashNotOk(String key, String msg, Clasher clasher) {
state.put(key, msg);
clasher.clash();
clasher.clash();
}
} }
interface Failer { public void success(String key, String msg) {
public void fail(); state.put(key, msg);
} }
class FailerImpl implements Failer { public void failure(String key, String msg, PersistentFailer failer) {
public void fail() { state.put(key, msg);
throw new RuntimeException("expected"); failer.fail();
}
} }
interface Clasher { public void clashOk(String key, String msg, PersistentClasher clasher) {
public void clash(); state.put(key, msg);
clasher.clash();
public String getState(String key);
public void setState(String key, String value);
} }
class ClasherImpl implements Clasher { public void clashNotOk(String key, String msg, PersistentClasher clasher) {
@state state.put(key, msg);
private InMemoryState<String, Object> state = new InMemoryState<String, Object>(); clasher.clash();
clasher.clash();
public String getState(String key) { }
return (String) state.get(key); }
}
interface PersistentFailer {
public void setState(String key, String msg) { public void fail();
state.put(key, msg); }
}
class PersistentFailerImpl implements PersistentFailer {
public void clash() { public void fail() {
state.put("clasher", "was here"); throw new RuntimeException("expected");
// spend some time here }
for (long i = 0; i < 1000000000; i++) { }
for (long j = 0; j < 10000000; j++) {
j += i; interface PersistentClasher {
} public void clash();
}
public String getState(String key);
// FIXME: this statement gives me this error:
// se.scalablesolutions.akka.kernel.ActiveObjectException: public void setState(String key, String value);
// Unexpected message [!(scala.actors.Channel@c2b2f6,ErrRef[Right(null)])] to }
// [GenericServer[se.scalablesolutions.akka.api.StatefulImpl]] from
// [GenericServer[se.scalablesolutions.akka.api.ClasherImpl]]] class PersistentClasherImpl implements PersistentClasher {
//try { Thread.sleep(1000); } catch (InterruptedException e) {} @state
} private InMemoryState<String, Object> state = new InMemoryState<String, Object>();
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) {}
} }
} }

View file

@ -22,25 +22,33 @@ JERSEY = ['com.sun.jersey:jersey-core:jar:1.0.1',
'com.sun.jersey:jersey-json:jar:1.0.1', 'com.sun.jersey:jersey-json:jar:1.0.1',
'com.sun.jersey:jersey-atom:jar:1.0.1', 'com.sun.jersey:jersey-atom:jar:1.0.1',
'javax.ws.rs:jsr311-api:jar:1.0'] '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' 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' NETTY = 'org.jboss.netty:netty:jar:3.1.0.BETA2'
MINA_SCALA = 'com.assembla.scala.mina:mina-integration-scala:jar:2.0.0-M2-SNAPSHOT' CASSANDRA = 'org.apache.cassandra:cassandra:jar:1.0'
THRIFT = 'com.facebook:thrift:jar:1.0'
FB303 = 'com.facebook:fb303:jar:1.0'
CONFIGGY = 'net.lag:configgy:jar:1.2' CONFIGGY = 'net.lag:configgy:jar:1.2'
JSR_250 = 'javax.annotation:jsr250-api:jar:1.0'
SLF4J = ['org.slf4j:slf4j-log4j12:jar:1.4.3', SLF4J = ['org.slf4j:slf4j-log4j12:jar:1.4.3',
'org.slf4j:slf4j-api:jar:1.4.3', 'org.slf4j:slf4j-api:jar:1.4.3',
'log4j:log4j:jar:1.2.13'] 'log4j:log4j:jar:1.2.13']
JDOM = 'jdom:jdom:jar:1.0' JDOM = 'jdom:jdom:jar:1.0'
CGLIB = 'cglib:cglib-nodep:jar:2.1_3'
AOPALLIANCE = 'aopalliance:aopalliance:jar:1.0'
GOOGLE_COLLECT = 'com.google.code.google-collections:google-collect:jar:snapshot-20080530' GOOGLE_COLLECT = 'com.google.code.google-collections:google-collect:jar:snapshot-20080530'
SCALA = 'org.scala-lang:scala-library:jar:2.7.3' SCALA = 'org.scala-lang:scala-library:jar:2.7.3'
SCALATEST = 'org.scala-tools.testing:scalatest:jar:0.9.5' SCALATEST = 'org.scala-tools.testing:scalatest:jar:0.9.5'
JUNIT4 = 'junit:junit:jar:4.5' JUNIT4 = 'junit:junit:jar:4.5'
JUNIT3 = 'junit:junit:jar:3.8.2' JUNIT4RUNNER = 'com.jteigen.scalatest:junit4runner:jar:1.0'
#SCALATEST_JUNIT4_MVN_PLUGIN = 'com.jteigen.scalatest:junit4runner:jar:1.0-SNAPSHOT'
#VOLDEMORT = ['voldemort:voldemort:jar:0.4a',
# 'voldemort:voldemort-contrib:jar:0.4a']
#MINA_CORE = 'com.assembla.scala.mina:mina-core:jar:2.0.0-M2-SNAPSHOT'
#MINA_SCALA = 'com.assembla.scala.mina:mina-integration-scala:jar:2.0.0-M2-SNAPSHOT'
#ZOOKEEPER = 'org.apache:zookeeper:jar:3.1.0'
desc 'The Akka Actor Kernel' desc 'The Akka Actor Kernel'
define 'akka' do define 'akka' do
@ -55,16 +63,17 @@ define 'akka' do
package :jar package :jar
end end
desc 'Akka Actor kernel core implementation' desc 'Akka Actor Kernel core implementation'
define 'kernel' do define 'kernel' do
compile.with(AKKA_UTIL_JAVA, GUICEYFRUIT, MINA_CORE, MINA_SCALA, JERSEY, VOLDEMORT, ZOOKEEPER, SLF4J, GRIZZLY, CONFIGGY) compile.with(AKKA_UTIL_JAVA, GUICEYFRUIT, NETTY, JERSEY, GRIZZLY, CASSANDRA, THRIFT, FB303, SLF4J, CONFIGGY, JUNIT4RUNNER, JUNIT4, SCALATEST)
test.using :scalatest test.using :junit
package :jar package :jar
end end
desc 'Akka Java API' desc 'Akka Java API'
define 'api-java' do define 'api-java' do
compile.with(AKKA_KERNEL, AKKA_UTIL_JAVA, GUICEYFRUIT) compile.with(AKKA_KERNEL, AKKA_UTIL_JAVA, NETTY, JERSEY, GRIZZLY, CASSANDRA, THRIFT, FB303, SLF4J, CONFIGGY, GUICEYFRUIT, SCALA, GOOGLE_COLLECT, AOPALLIANCE, CGLIB, JSR_250)
test.using :junit
package :jar package :jar
end end
@ -74,20 +83,12 @@ define 'akka' do
# test.using :scalatest # test.using :scalatest
# package :jar # package :jar
#end #end
#desc 'Implementation of Erlangs Supervisor and GenericServer behaviors'
#define 'supervisor' do
# compile.with(CONFIGGY)
# test.using :scalatest
# package :jar
#end
package(:zip).include 'README' package(:zip).include 'README'
package(:zip).include 'bin/*', :path=>'bin' package(:zip).include 'bin/*', :path=>'bin'
package(:zip).include 'config/*', :path=>'config' package(:zip).include 'config/*', :path=>'config'
package(:zip).include 'kernel/lib/*', :path=>'lib' package(:zip).include 'kernel/lib/*', :path=>'lib'
package(:zip).include 'kernel/target/*.jar', :path=>'lib' package(:zip).include 'kernel/target/*.jar', :path=>'lib'
#package(:zip).include 'supervisor/target/*.jar', :path=>'lib'
package(:zip).include 'api-java/target/*.jar', :path=>'lib' package(:zip).include 'api-java/target/*.jar', :path=>'lib'
package(:zip).include 'util-java/target/*.jar', :path=>'lib' package(:zip).include 'util-java/target/*.jar', :path=>'lib'
@ -100,7 +101,7 @@ define 'akka' do
# uri = URI("file://./lib") # uri = URI("file://./lib")
# uri.upload file('kernel') # uri.upload file('kernel')
cp = [SCALA, GUICEYFRUIT, JERSEY, VOLDEMORT, GOOGLE_COLLECT, JDOM, ZOOKEEPER, SLF4J, GRIZZLY, CONFIGGY, project('kernel').package(:jar)] cp = [SCALA, GUICEYFRUIT, JERSEY, CASSANDRA, GOOGLE_COLLECT, JDOM, ZOOKEEPER, SLF4J, GRIZZLY, CONFIGGY, project('kernel').package(:jar)]
# Java.java('se.scalablesolutions.akka.kernel.Kernel', {:classpath => '-cp ' + cp}) # Java.java('se.scalablesolutions.akka.kernel.Kernel', {:classpath => '-cp ' + cp})
# cp = FileList[_('lib/*')].join(File::PATH_SEPARATOR) # cp = FileList[_('lib/*')].join(File::PATH_SEPARATOR)
puts "Running with classpath:\n" + cp puts "Running with classpath:\n" + cp

View file

@ -2,7 +2,7 @@
# and the pattern to %c instead of %l. (%l is slower.) # and the pattern to %c instead of %l. (%l is slower.)
# output messages into a rolling log file as well as stdout # output messages into a rolling log file as well as stdout
log4j.rootLogger=DEBUG,stdout,R log4j.rootLogger=ERROR,stdout,R
# stdout # stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout=org.apache.log4j.ConsoleAppender

View file

@ -19,22 +19,22 @@
<ThriftPort>9160</ThriftPort> <ThriftPort>9160</ThriftPort>
<ColumnIndexSizeInKB>256</ColumnIndexSizeInKB> <ColumnIndexSizeInKB>256</ColumnIndexSizeInKB>
<HttpPort>7002</HttpPort> <HttpPort>7002</HttpPort>
<MetadataDirectory>./storage/system</MetadataDirectory> <MetadataDirectory>/Users/jboner/src/scala/akka/storage/system</MetadataDirectory>
<CommitLogDirectory>./storage/commitlog</CommitLogDirectory> <CommitLogDirectory>/Users/jboner/src/scala/akka/storage/commitlog</CommitLogDirectory>
<CommitLogRotationThresholdInMB>128</CommitLogRotationThresholdInMB> <CommitLogRotationThresholdInMB>128</CommitLogRotationThresholdInMB>
<GangliaServers> <GangliaServers>
<GangliaServer>127.0.0.1:12000</GangliaServer> <GangliaServer>127.0.0.1:12000</GangliaServer>
</GangliaServers> </GangliaServers>
<DataFileDirectories> <DataFileDirectories>
<DataFileDirectory>./storage/data</DataFileDirectory> <DataFileDirectory>/Users/jboner/src/scala/akka/storage/data</DataFileDirectory>
</DataFileDirectories> </DataFileDirectories>
<CalloutLocation>./storage/callouts</CalloutLocation> <CalloutLocation>/Users/jboner/src/scala/akka/storage/callouts</CalloutLocation>
<BootstrapFileDirectory>./storage/bootstrap</BootstrapFileDirectory> <BootstrapFileDirectory>/Users/jboner/src/scala/akka/storage/bootstrap</BootstrapFileDirectory>
<StagingFileDirectory>./storage/staging</StagingFileDirectory> <StagingFileDirectory>/Users/jboner/src/scala/akka/storage/staging</StagingFileDirectory>
<CommitLogFastSync>false</CommitLogFastSync> <CommitLogFastSync>false</CommitLogFastSync>
<Tables> <Tables>
<Table Name = "akka"> <Table Name = "akka">
<ColumnFamily ColumnSort="Name" Name="hash"/> <ColumnFamily ColumnSort="Name" Name="hashtrie"/>
<!--ColumnFamily ColumnType="Super" ColumnSort="Name" Name="Super2"/--> <!--ColumnFamily ColumnType="Super" ColumnSort="Name" Name="Super2"/-->
</Table> </Table>
</Tables> </Tables>

View file

@ -76,7 +76,6 @@
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/voldemort-contrib-0.4a.jar"/> <classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/voldemort-contrib-0.4a.jar"/>
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/xerces.jar"/> <classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/xerces.jar"/>
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/zookeeper-3.1.0.jar"/> <classpathentry kind="lib" path="/Users/jboner/src/scala/akka/lib/zookeeper-3.1.0.jar"/>
<classpathentry kind="var" path="JRE_LIB"/>
<classpathentry kind="lib" path="/Users/jboner/src/scala/akka/config"/> <classpathentry kind="lib" path="/Users/jboner/src/scala/akka/config"/>
<classpathentry kind="output" path="build"/> <classpathentry kind="output" path="build"/>
</classpath> </classpath>

View file

@ -11,7 +11,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/scala" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/scala" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/scala" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/scala" isTestSource="true" />
</content> </content>
<orderEntry type="library" name="scala-2.7.3.final" level="application" />
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="util-java" /> <orderEntry type="module" module-name="util-java" />
@ -33,15 +32,6 @@
<SOURCES /> <SOURCES />
</library> </library>
</orderEntry> </orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/../lib/scala-library-2.7.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library"> <orderEntry type="module-library">
<library> <library>
<CLASSES> <CLASSES>
@ -60,15 +50,6 @@
<SOURCES /> <SOURCES />
</library> </library>
</orderEntry> </orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/../lib/libthrift-20080411p1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library"> <orderEntry type="module-library">
<library> <library>
<CLASSES> <CLASSES>
@ -672,6 +653,15 @@
<SOURCES /> <SOURCES />
</library> </library>
</orderEntry> </orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/../../../../bin/scala-2.7.4.RC1/lib/scala-compiler.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component> </component>
</module> </module>

View file

@ -389,7 +389,9 @@ Scala installation directory.
COMPILATION SECTION COMPILATION SECTION
=================== ===================
--> -->
<target depends="init" name="deps-jar" unless="no.deps"/> <target depends="init" name="deps-jar" unless="no.deps">
<ant antfile="${project.akka-util-java}/build.xml" inheritall="false" target="jar"/>
</target>
<target depends="init,deps-jar" name="-pre-pre-compile"> <target depends="init,deps-jar" name="-pre-pre-compile">
<mkdir dir="${build.classes.dir}"/> <mkdir dir="${build.classes.dir}"/>
</target> </target>
@ -696,7 +698,9 @@ Scala installation directory.
CLEANUP SECTION CLEANUP SECTION
=============== ===============
--> -->
<target depends="init" name="deps-clean" unless="no.deps"/> <target depends="init" name="deps-clean" unless="no.deps">
<ant antfile="${project.akka-util-java}/build.xml" inheritall="false" target="clean"/>
</target>
<target depends="init" name="-do-clean"> <target depends="init" name="-do-clean">
<delete dir="${build.dir}"/> <delete dir="${build.dir}"/>
<delete dir="${dist.dir}"/> <delete dir="${dist.dir}"/>

View file

@ -3,6 +3,6 @@ build.xml.script.CRC32=c2aecc70
build.xml.stylesheet.CRC32=ca9d572e 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. # 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. # 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.data.CRC32=e25238a8
nbproject/build-impl.xml.script.CRC32=a2fb0c36 nbproject/build-impl.xml.script.CRC32=749b9ab1
nbproject/build-impl.xml.stylesheet.CRC32=371897b9 nbproject/build-impl.xml.stylesheet.CRC32=371897b9@1.3.0

View file

@ -2,5 +2,4 @@ do.depend=false
do.jar=false do.jar=false
javac.debug=true javac.debug=true
javadoc.preview=true javadoc.preview=true
jaxws.endorsed.dir=C:\\Program Files\\NetBeans 6.5.1\\java2\\modules\\ext\\jaxws21\\api user.properties.file=/Users/jboner/.netbeans/dev/build.properties
user.properties.file=C:\\Documents and Settings\\jboner\\.netbeans\\6.5\\build.properties

View file

@ -18,87 +18,91 @@ dist.dir=dist
dist.jar=${dist.dir}/akka-kernel.jar dist.jar=${dist.dir}/akka-kernel.jar
dist.javadoc.dir=${dist.dir}/javadoc dist.javadoc.dir=${dist.dir}/javadoc
excludes= excludes=
file.reference.activation-1.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\activation-1.1.jar file.reference.activation-1.1.jar=/Users/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.akka-util-java.jar=/Users/jboner/src/scala/akka/lib/akka-util-java.jar
file.reference.antlr-3.1.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\antlr-3.1.3.jar file.reference.antlr-3.1.3.jar=/Users/jboner/src/scala/akka/lib/antlr-3.1.3.jar
file.reference.aopalliance-1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\aopalliance-1.0.jar file.reference.aopalliance-1.0.jar=/Users/jboner/src/scala/akka/lib/aopalliance-1.0.jar
file.reference.asm-3.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\asm-3.1.jar file.reference.asm-3.1.jar=/Users/jboner/src/scala/akka/lib/asm-3.1.jar
file.reference.asm-all-2.2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\asm-all-2.2.1.jar file.reference.asm-all-2.2.1.jar=/Users/jboner/src/scala/akka/lib/asm-all-2.2.1.jar
file.reference.cassandra.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\cassandra.jar file.reference.cassandra.jar=/Users/jboner/src/scala/akka/lib/cassandra.jar
file.reference.catalina-ant.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\catalina-ant.jar file.reference.catalina-ant.jar=/Users/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.cglib-2.2.jar=/Users/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.colt-1.2.0.jar=/Users/jboner/src/scala/akka/lib/colt-1.2.0.jar
file.reference.commons-cli-1.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-cli-1.1.jar file.reference.commons-cli-1.1.jar=/Users/jboner/src/scala/akka/lib/commons-cli-1.1.jar
file.reference.commons-codec-1.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-codec-1.3.jar file.reference.commons-codec-1.3.jar=/Users/jboner/src/scala/akka/lib/commons-codec-1.3.jar
file.reference.commons-collections-3.2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-collections-3.2.1.jar file.reference.commons-collections-3.2.1.jar=/Users/jboner/src/scala/akka/lib/commons-collections-3.2.1.jar
file.reference.commons-dbcp-1.2.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-dbcp-1.2.2.jar file.reference.commons-dbcp-1.2.2.jar=/Users/jboner/src/scala/akka/lib/commons-dbcp-1.2.2.jar
file.reference.commons-httpclient-3.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-httpclient-3.1.jar file.reference.commons-httpclient-3.1.jar=/Users/jboner/src/scala/akka/lib/commons-httpclient-3.1.jar
file.reference.commons-io-1.3.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-io-1.3.2.jar file.reference.commons-io-1.3.2.jar=/Users/jboner/src/scala/akka/lib/commons-io-1.3.2.jar
file.reference.commons-javaflow-1.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-javaflow-1.0-SNAPSHOT.jar file.reference.commons-javaflow-1.0-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/commons-javaflow-1.0-SNAPSHOT.jar
file.reference.commons-lang-2.4.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-lang-2.4.jar file.reference.commons-lang-2.4.jar=/Users/jboner/src/scala/akka/lib/commons-lang-2.4.jar
file.reference.commons-logging-1.0.4.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-logging-1.0.4.jar file.reference.commons-logging-1.0.4.jar=/Users/jboner/src/scala/akka/lib/commons-logging-1.0.4.jar
file.reference.commons-math-1.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-math-1.1.jar file.reference.commons-math-1.1.jar=/Users/jboner/src/scala/akka/lib/commons-math-1.1.jar
file.reference.commons-pool-1.4.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\commons-pool-1.4.jar file.reference.commons-pool-1.4.jar=/Users/jboner/src/scala/akka/lib/commons-pool-1.4.jar
file.reference.configgy-1.2.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\configgy-1.2.jar file.reference.configgy-1.2.jar=/Users/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.google-collect-snapshot-20090211.jar=/Users/jboner/src/scala/akka/lib/google-collect-snapshot-20090211.jar
file.reference.grizzly-framework-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-framework-1.8.6.3.jar file.reference.grizzly-framework-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-framework-1.8.6.3.jar
file.reference.grizzly-http-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-http-1.8.6.3.jar file.reference.grizzly-http-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-http-1.8.6.3.jar
file.reference.grizzly-http-servlet-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-http-servlet-1.8.6.3.jar file.reference.grizzly-http-servlet-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-http-servlet-1.8.6.3.jar
file.reference.grizzly-http-utils-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-http-utils-1.8.6.3.jar file.reference.grizzly-http-utils-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-http-utils-1.8.6.3.jar
file.reference.grizzly-portunif-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-portunif-1.8.6.3.jar file.reference.grizzly-portunif-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-portunif-1.8.6.3.jar
file.reference.grizzly-rcm-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-rcm-1.8.6.3.jar file.reference.grizzly-rcm-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-rcm-1.8.6.3.jar
file.reference.grizzly-servlet-webserver-1.8.6.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\grizzly-servlet-webserver-1.8.6.3.jar file.reference.grizzly-servlet-webserver-1.8.6.3.jar=/Users/jboner/src/scala/akka/lib/grizzly-servlet-webserver-1.8.6.3.jar
file.reference.guice-core-2.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\guice-core-2.0-SNAPSHOT.jar file.reference.guice-core-2.0-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/guice-core-2.0-SNAPSHOT.jar
file.reference.guice-jsr250-2.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\guice-jsr250-2.0-SNAPSHOT.jar file.reference.guice-jsr250-2.0-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/guice-jsr250-2.0-SNAPSHOT.jar
file.reference.high-scale-lib.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\high-scale-lib.jar file.reference.high-scale-lib.jar=/Users/jboner/src/scala/akka/lib/high-scale-lib.jar
file.reference.jaxb-api-2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jaxb-api-2.1.jar file.reference.jaxb-api-2.1.jar=/Users/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.jaxb-impl-2.1.jar=/Users/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.jdom-1.0.jar=/Users/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.je-3.3.62.jar=/Users/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-atom-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-atom-1.0.1.jar
file.reference.jersey-core-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jersey-core-1.0.1.jar file.reference.jersey-core-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-core-1.0.1.jar
file.reference.jersey-json-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jersey-json-1.0.1.jar file.reference.jersey-json-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-json-1.0.1.jar
file.reference.jersey-server-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jersey-server-1.0.1.jar file.reference.jersey-server-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jersey-server-1.0.1.jar
file.reference.jettison-1.0.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jettison-1.0.1.jar file.reference.jettison-1.0.1.jar=/Users/jboner/src/scala/akka/lib/jettison-1.0.1.jar
file.reference.jetty-6.1.6rc0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jetty-6.1.6rc0.jar file.reference.jetty-6.1.6rc0.jar=/Users/jboner/src/scala/akka/lib/jetty-6.1.6rc0.jar
file.reference.jetty-util-6.1.6rc0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jetty-util-6.1.6rc0.jar file.reference.jetty-util-6.1.6rc0.jar=/Users/jboner/src/scala/akka/lib/jetty-util-6.1.6rc0.jar
file.reference.JSAP-2.1.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\JSAP-2.1.jar file.reference.JSAP-2.1.jar=/Users/jboner/src/scala/akka/lib/JSAP-2.1.jar
file.reference.jsr250-api-1.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\jsr250-api-1.0.jar file.reference.jsr250-api-1.0.jar=/Users/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.jsr311-api-1.0.jar=/Users/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=/Users/jboner/src/scala/akka/lib/junit-3.8.2.jar
file.reference.junit-4.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit-4.5.jar file.reference.junit-4.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit-4.5.jar
file.reference.junit-4.5.jar-1=/Users/jboner/src/scala/akka/lib/junit-4.5.jar
file.reference.junit4runner-1.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit4runner-1.0-SNAPSHOT.jar file.reference.junit4runner-1.0-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\junit4runner-1.0-SNAPSHOT.jar
file.reference.libfb303.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\libfb303.jar file.reference.junit4runner-1.0-SNAPSHOT.jar-1=/Users/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.libfb303.jar=/Users/jboner/src/scala/akka/lib/libfb303.jar
file.reference.libthrift.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\libthrift.jar file.reference.libthrift-20080411p1.jar=/Users/jboner/src/scala/akka/lib/libthrift-20080411p1.jar
file.reference.log4j-1.2.15.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\log4j-1.2.15.jar file.reference.libthrift.jar=/Users/jboner/src/scala/akka/lib/libthrift.jar
file.reference.lucene-core-2.2.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\lucene-core-2.2.0.jar file.reference.log4j-1.2.15.jar=/Users/jboner/src/scala/akka/lib/log4j-1.2.15.jar
file.reference.lucene-core-2.2.0.jar=/Users/jboner/src/scala/akka/lib/lucene-core-2.2.0.jar
file.reference.main-scala=src/main/scala file.reference.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-core-2.0.0-M2-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/mina-core-2.0.0-M2-SNAPSHOT.jar
file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\mina-integration-scala-2.0.0-M2-SNAPSHOT.jar file.reference.mina-integration-scala-2.0.0-M2-SNAPSHOT.jar=/Users/jboner/src/scala/akka/lib/mina-integration-scala-2.0.0-M2-SNAPSHOT.jar
file.reference.pcj.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\pcj.jar file.reference.pcj.jar=/Users/jboner/src/scala/akka/lib/pcj.jar
file.reference.protobuf-java-2.0.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\protobuf-java-2.0.3.jar file.reference.protobuf-java-2.0.3.jar=/Users/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.rome-0.9.jar=/Users/jboner/src/scala/akka/lib/rome-0.9.jar
file.reference.scala-library-2.7.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\scala-library-2.7.3.jar file.reference.scala-library-2.7.3.jar=/Users/jboner/src/scala/akka/lib/scala-library-2.7.3.jar
file.reference.scala-library-2.7.3.zip=C:\\home\\jboner\\src\\scala\\akka\\lib\\scala-library-2.7.3.zip file.reference.scala-library-2.7.3.zip=/Users/jboner/src/scala/akka/lib/scala-library-2.7.3.zip
file.reference.scalatest-0.9.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\scalatest-0.9.5.jar file.reference.scalatest-0.9.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\scalatest-0.9.5.jar
file.reference.scalatest-0.9.5.zip=C:\\home\\jboner\\src\\scala\\akka\\lib\\scalatest-0.9.5.zip file.reference.scalatest-0.9.5.jar-1=/Users/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.scalatest-0.9.5.zip=/Users/jboner/src/scala/akka/lib/scalatest-0.9.5.zip
file.reference.slf4j-api-1.4.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\slf4j-api-1.4.3.jar file.reference.servlet-api-2.5.jar=/Users/jboner/src/scala/akka/lib/servlet-api-2.5.jar
file.reference.slf4j-log4j12-1.4.3.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\slf4j-log4j12-1.4.3.jar file.reference.slf4j-api-1.4.3.jar=/Users/jboner/src/scala/akka/lib/slf4j-api-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.slf4j-log4j12-1.4.3.jar=/Users/jboner/src/scala/akka/lib/slf4j-log4j12-1.4.3.jar
file.reference.stringtemplate-3.0.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\stringtemplate-3.0.jar file.reference.stax-api-1.0-2.jar=/Users/jboner/src/scala/akka/lib/stax-api-1.0-2.jar
file.reference.stringtemplate-3.0.jar=/Users/jboner/src/scala/akka/lib/stringtemplate-3.0.jar
file.reference.test-scala=src/test/scala file.reference.test-scala=src/test/scala
file.reference.velocity-1.5.jar=C:\\home\\jboner\\src\\scala\\akka\\lib\\velocity-1.5.jar file.reference.velocity-1.5.jar=/Users/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-0.4a.jar=/Users/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.voldemort-contrib-0.4a.jar=/Users/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.xerces.jar=/Users/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 file.reference.zookeeper-3.1.0.jar=/Users/jboner/src/scala/akka/lib/zookeeper-3.1.0.jar
includes=** includes=**
jar.compress=false jar.compress=false
java.platform.active=java_default_platform java.platform.active=java_default_platform
javac.classpath=\ javac.classpath=\
${file.reference.activation-1.1.jar}:\ ${file.reference.activation-1.1.jar}:\
${reference.akka-util-java.jar}:\
${file.reference.akka-util-java.jar}:\ ${file.reference.akka-util-java.jar}:\
${file.reference.antlr-3.1.3.jar}:\ ${file.reference.antlr-3.1.3.jar}:\
${file.reference.aopalliance-1.0.jar}:\ ${file.reference.aopalliance-1.0.jar}:\
@ -146,8 +150,8 @@ javac.classpath=\
${file.reference.jsr250-api-1.0.jar}:\ ${file.reference.jsr250-api-1.0.jar}:\
${file.reference.jsr311-api-1.0.jar}:\ ${file.reference.jsr311-api-1.0.jar}:\
${file.reference.junit-3.8.2.jar}:\ ${file.reference.junit-3.8.2.jar}:\
${file.reference.junit-4.5.jar}:\ ${file.reference.junit-4.5.jar-1}:\
${file.reference.junit4runner-1.0-SNAPSHOT.jar}:\ ${file.reference.junit4runner-1.0-SNAPSHOT.jar-1}:\
${file.reference.libfb303.jar}:\ ${file.reference.libfb303.jar}:\
${file.reference.libthrift-20080411p1.jar}:\ ${file.reference.libthrift-20080411p1.jar}:\
${file.reference.libthrift.jar}:\ ${file.reference.libthrift.jar}:\
@ -160,7 +164,7 @@ javac.classpath=\
${file.reference.rome-0.9.jar}:\ ${file.reference.rome-0.9.jar}:\
${file.reference.scala-library-2.7.3.jar}:\ ${file.reference.scala-library-2.7.3.jar}:\
${file.reference.scala-library-2.7.3.zip}:\ ${file.reference.scala-library-2.7.3.zip}:\
${file.reference.scalatest-0.9.5.jar}:\ ${file.reference.scalatest-0.9.5.jar-1}:\
${file.reference.scalatest-0.9.5.zip}:\ ${file.reference.scalatest-0.9.5.zip}:\
${file.reference.servlet-api-2.5.jar}:\ ${file.reference.servlet-api-2.5.jar}:\
${file.reference.slf4j-api-1.4.3.jar}:\ ${file.reference.slf4j-api-1.4.3.jar}:\
@ -198,6 +202,8 @@ main.class=
manifest.file=manifest.mf manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF meta.inf.dir=${src.dir}/META-INF
platform.active=default_platform 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=\ run.classpath=\
${javac.classpath}:\ ${javac.classpath}:\
${build.classes.dir} ${build.classes.dir}

View file

@ -12,6 +12,15 @@
<root id="test.src.dir"/> <root id="test.src.dir"/>
</test-roots> </test-roots>
</data> </data>
<references xmlns="http://www.netbeans.org/ns/ant-project-references/1"/> <references xmlns="http://www.netbeans.org/ns/ant-project-references/1">
<reference>
<foreign-project>akka-util-java</foreign-project>
<artifact-type>jar</artifact-type>
<script>build.xml</script>
<target>jar</target>
<clean-target>clean</clean-target>
<id>jar</id>
</reference>
</references>
</configuration> </configuration>
</project> </project>

View file

@ -60,7 +60,27 @@
<artifactId>jersey-atom</artifactId> <artifactId>jersey-atom</artifactId>
<version>1.0.1</version> <version>1.0.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
<version>3.1.0.BETA2</version>
</dependency>
<dependency>
<groupId>org.apache.cassandra</groupId>
<artifactId>cassandra</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.facebook</groupId>
<artifactId>thrift</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.facebook</groupId>
<artifactId>fb303</artifactId>
<version>1.0</version>
</dependency>
<!--dependency>
<groupId>voldemort</groupId> <groupId>voldemort</groupId>
<artifactId>voldemort</artifactId> <artifactId>voldemort</artifactId>
<version>0.4a</version> <version>0.4a</version>
@ -69,14 +89,12 @@
<groupId>voldemort</groupId> <groupId>voldemort</groupId>
<artifactId>voldemort-contrib</artifactId> <artifactId>voldemort-contrib</artifactId>
<version>0.4a</version> <version>0.4a</version>
</dependency> </dependency-->
<!-- <!--dependency>
<dependency>
<groupId>org.apache</groupId> <groupId>org.apache</groupId>
<artifactId>zookeeper</artifactId> <artifactId>zookeeper</artifactId>
<version>3.1.0</version> <version>3.1.0</version>
</dependency> </dependency-->
-->
<dependency> <dependency>
<groupId>com.assembla.scala.mina</groupId> <groupId>com.assembla.scala.mina</groupId>
<artifactId>mina-core</artifactId> <artifactId>mina-core</artifactId>
@ -108,16 +126,10 @@
<version>0.9.5</version> <version>0.9.5</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <!--dependency>
<groupId>com.jteigen.scalatest</groupId> <groupId>com.jteigen.scalatest</groupId>
<artifactId>junit4runner</artifactId> <artifactId>junit4runner</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.scalacheck</groupId>
<artifactId>scalacheck</artifactId>
<version>1.5</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -125,7 +137,7 @@
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>4.5</version> <version>4.5</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency-->
</dependencies> </dependencies>
<build> <build>
@ -177,7 +189,7 @@
</classpathContainers> </classpathContainers>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <!--plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<configuration> <configuration>
@ -186,7 +198,7 @@
</includes> </includes>
<junitArtifactName>junit:junit</junitArtifactName> <junitArtifactName>junit:junit</junitArtifactName>
</configuration> </configuration>
</plugin> </plugin-->
</plugins> </plugins>
<resources> <resources>
<resource> <resource>

View file

@ -14,7 +14,7 @@ import java.lang.annotation.Annotation
sealed class ActiveObjectException(msg: String) extends RuntimeException(msg) sealed class ActiveObjectException(msg: String) extends RuntimeException(msg)
class ActiveObjectInvocationTimeoutException(msg: String) extends ActiveObjectException(msg) class ActiveObjectInvocationTimeoutException(msg: String) extends ActiveObjectException(msg)
object Annotation { object Annotations {
import se.scalablesolutions.akka.annotation._ import se.scalablesolutions.akka.annotation._
val transactional = classOf[transactional] val transactional = classOf[transactional]
val oneway = classOf[oneway] val oneway = classOf[oneway]
@ -84,17 +84,17 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I
private var targetInstance: AnyRef = _ private var targetInstance: AnyRef = _
private[kernel] def setTargetInstance(instance: AnyRef) = { private[kernel] def setTargetInstance(instance: AnyRef) = {
targetInstance = instance targetInstance = instance
getStateList(targetInstance) match { val (maps, vectors, refs) = getTransactionalItemsFor(targetInstance)
case Nil => {} server.transactionalMaps = maps
case states => server.states = states server.transactionalVectors = vectors
} server.transactionalRefs = refs
} }
private[kernel] val server = new GenericServerContainer(target.getName, () => new Dispatcher(target.getName)) private[kernel] val server = new GenericServerContainer(target.getName, () => new Dispatcher(target.getName))
server.setTimeout(timeout) server.setTimeout(timeout)
def invoke(proxy: AnyRef, m: Method, args: Array[AnyRef]): AnyRef = { def invoke(proxy: AnyRef, m: Method, args: Array[AnyRef]): AnyRef = {
if (m.isAnnotationPresent(Annotation.transactional)) { if (m.isAnnotationPresent(Annotations.transactional)) {
// FIXME: check if we are already in a transaction if so NEST (set parent) // FIXME: check if we are already in a transaction if so NEST (set parent)
val newTx = new Transaction val newTx = new Transaction
newTx.begin(server) newTx.begin(server)
@ -122,7 +122,7 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I
private def invoke(invocation: Invocation): AnyRef = { private def invoke(invocation: Invocation): AnyRef = {
val result: AnyRef = val result: AnyRef =
if (invocation.method.isAnnotationPresent(Annotation.oneway)) server ! invocation if (invocation.method.isAnnotationPresent(Annotations.oneway)) server ! invocation
else { else {
val result: ErrRef[AnyRef] = val result: ErrRef[AnyRef] =
server !!! (invocation, { server !!! (invocation, {
@ -150,22 +150,29 @@ class ActiveObjectProxy(val intf: Class[_], val target: Class[_], val timeout: I
threadBoundTx.set(Some(tx)) threadBoundTx.set(Some(tx))
} }
private def getStateList(targetInstance: AnyRef): List[State[_,_]] = { private def getTransactionalItemsFor(targetInstance: AnyRef):
Tuple3[List[TransactionalMap[_, _]], List[TransactionalVector[_]], List[TransactionalRef[_]]] = {
require(targetInstance != null) require(targetInstance != null)
import se.scalablesolutions.akka.kernel.configuration.ConfigurationException var maps: List[TransactionalMap[_, _]] = Nil
val states: List[State[_,_]] = for { var vectors: List[TransactionalVector[_]] = Nil
field <- target.getDeclaredFields.toArray.toList var refs: List[TransactionalRef[_]] = Nil
if field.isAnnotationPresent(Annotation.state) for {
state = { field <- target.getDeclaredFields.toArray.toList.asInstanceOf[List[Field]]
fieldType = field.getType
if fieldType == classOf[TransactionalMap[_, _]] ||
fieldType == classOf[TransactionalVector[_]] ||
fieldType == classOf[TransactionalRef[_]]
txItem = {
field.setAccessible(true) field.setAccessible(true)
field.get(targetInstance) field.get(targetInstance)
} }
if state != null if txItem != 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]]") if (txItem.isInstanceOf[TransactionalMap[_, _]]) maps ::= txItem.asInstanceOf[TransactionalMap[_, _]]
state.asInstanceOf[State[_,_]] else if (txItem.isInstanceOf[TransactionalVector[_]]) vectors ::= txItem.asInstanceOf[TransactionalVector[_]]
else if (txItem.isInstanceOf[TransactionalRef[_]]) refs ::= txItem.asInstanceOf[TransactionalRef[_]]
} }
states (maps, vectors, refs)
} }
} }

View file

@ -6,6 +6,90 @@ package se.scalablesolutions.akka.kernel
import java.io.File import java.io.File
import org.apache.cassandra.config.DatabaseDescriptor
import org.apache.cassandra.service._
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
final object CassandraNode extends Logging {
val TABLE_NAME = "akka"
val ACTOR_KEY_PREFIX = "actor"
val ACTOR_MAP_COLUMN_FAMILY = "map"
// TODO: is this server thread-safe or needed to be wrapped up in an actor?
private[this] val server = new CassandraServer
def start = {
try {
server.start
log.info("Persistent storage has started up successfully");
} catch {
case e =>
log.error("Could not start up persistent storage")
throw e
}
}
def stop = server.shutdown
def insertActorStorageEntry(actorName: String, entry: String, content: String) = {
server.insert(
TABLE_NAME,
ACTOR_KEY_PREFIX + ":" + actorName,
ACTOR_MAP_COLUMN_FAMILY + ":" + entry,
content,
System.currentTimeMillis)
}
def insertActorStorageEntries(actorName: String, entries: List[Tuple2[String, String]]) = {
import java.util.{Map, HashMap, List, ArrayList}
val columns: Map[String, List[column_t]] = new HashMap
for (entry <- entries) {
val cls: List[column_t] = new ArrayList
cls.add(new column_t(entry._1, entry._2, System.currentTimeMillis))
columns.put(ACTOR_MAP_COLUMN_FAMILY, cls)
}
server.batch_insert_blocking(new batch_mutation_t(
TABLE_NAME,
ACTOR_KEY_PREFIX + ":" + actorName,
columns,
new HashMap[String, List[column_t]]))
}
def getActorStorageEntryFor(actorName: String, entry: String): Option[String] = {
try {
val column = server.get_column(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY + ":" + entry)
Some(column.value)
} catch { case e => None }
}
def getActorStorageFor(actorName: String): List[Tuple2[String, String]] = {
val columns = server.get_columns_since(TABLE_NAME, ACTOR_KEY_PREFIX, ACTOR_MAP_COLUMN_FAMILY, -1)
.toArray.toList.asInstanceOf[List[org.apache.cassandra.service.column_t]]
for {
column <- columns
col = (column.columnName, column.value)
} yield col
}
def getActorStorageSizeFor(actorName: String): Int =
server.get_column_count(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY)
def removeActorStorageFor(actorName: String) =
server.remove(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY)
def getActorStorageRange(actorName: String, start: Int, count: Int): List[Tuple2[String, String]] =
server.get_slice(TABLE_NAME, ACTOR_KEY_PREFIX + ":" + actorName, ACTOR_MAP_COLUMN_FAMILY, start, count)
.toArray.toList.asInstanceOf[List[Tuple2[String, String]]]
}
/*
* This code is only for starting up the Cassandra Thrift server, perhaps later
import scala.actors.Actor._
import com.facebook.thrift.protocol.TBinaryProtocol import com.facebook.thrift.protocol.TBinaryProtocol
import com.facebook.thrift.protocol.TProtocolFactory import com.facebook.thrift.protocol.TProtocolFactory
import com.facebook.thrift.server.TThreadPoolServer import com.facebook.thrift.server.TThreadPoolServer
@ -14,24 +98,7 @@ import com.facebook.thrift.transport.TTransportException
import com.facebook.thrift.transport.TTransportFactory import com.facebook.thrift.transport.TTransportFactory
import com.facebook.thrift.TProcessorFactory import com.facebook.thrift.TProcessorFactory
import org.apache.cassandra.config.DatabaseDescriptor private[this] val serverEngine: TThreadPoolServer = try {
import org.apache.cassandra.service._
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
final class CassandraNode extends Logging {
val server = try {
val cassandra = new CassandraServer
cassandra.start
cassandra
} catch {
case e =>
log.error("Could not start up persistent storage node")
throw e
}
private val serverEngine: TThreadPoolServer = try {
val pidFile = System.getProperty("pidfile") val pidFile = System.getProperty("pidfile")
if (pidFile != null) new File(pidFile).deleteOnExit(); if (pidFile != null) new File(pidFile).deleteOnExit();
val listenPort = DatabaseDescriptor.getThriftPort val listenPort = DatabaseDescriptor.getThriftPort
@ -54,20 +121,17 @@ final class CassandraNode extends Logging {
log.error("Could not start up persistent storage node.") log.error("Could not start up persistent storage node.")
throw e throw e
} }
private[this] val serverDaemon = actor {
def start = { receive {
scala.actors.Actor.actor { case Start =>
log.info("Persistent storage node starting up..."); log.info("Persistent storage node starting up...")
serverEngine.serve serverEngine.serve
case Stop =>
log.info("Persistent storage node shutting down...")
serverEngine.stop
//case Insert(..) =>
// server.
} }
log.info("Persistent storage node starting up 2222..."); }
server.insert("akka", "TestActor", "hash:data", "some data", System.currentTimeMillis) */
val column = server.get_column("akka", "TestActor", "hash:data")
log.info("column: " + column)
}
def stop = {
log.info("Persistent storage node shutting down...")
serverEngine.stop
}
}

View file

@ -51,8 +51,8 @@ abstract class Server extends Configuration
// def transform = se.scalablesolutions.akka.kernel.kernelConfig(restartStrategy.transform, servers.toArray.toList.asInstanceOf[List[Server]].map(_.transform)) // def transform = se.scalablesolutions.akka.kernel.kernelConfig(restartStrategy.transform, servers.toArray.toList.asInstanceOf[List[Server]].map(_.transform))
//} //}
class Component(@BeanProperty val intf: Class[_], class Component(@BeanProperty val intf: Class[_],
@BeanProperty val target: Class[_], @BeanProperty val target: Class[_],
@BeanProperty val lifeCycle: LifeCycle, @BeanProperty val lifeCycle: LifeCycle,
@BeanProperty val timeout: Int) extends Server { @BeanProperty val timeout: Int) extends Server {
def newWorker(proxy: ActiveObjectProxy) = se.scalablesolutions.akka.kernel.Worker(proxy.server, lifeCycle.transform) def newWorker(proxy: ActiveObjectProxy) = se.scalablesolutions.akka.kernel.Worker(proxy.server, lifeCycle.transform)
} }

View file

@ -13,7 +13,6 @@ import java.util.concurrent.atomic.AtomicReference
import java.util.concurrent.{ConcurrentLinkedQueue, LinkedBlockingQueue} import java.util.concurrent.{ConcurrentLinkedQueue, LinkedBlockingQueue}
object DataFlow { object DataFlow {
def thread(body: => Unit) = { def thread(body: => Unit) = {
val thread = new IsolatedEventBasedThread(body).start val thread = new IsolatedEventBasedThread(body).start
thread ! 'start thread ! 'start

View file

@ -86,18 +86,49 @@ class GenericServerContainer(
private[kernel] var serverFactory: () => GenericServer) extends Logging { private[kernel] var serverFactory: () => GenericServer) extends Logging {
require(id != null && id != "") require(id != null && id != "")
// TODO: see if we can parameterize class and add type safe getActor method
//class GenericServerContainer[T <: GenericServer](var factory: () => T) {
//def getActor: T = server
private[kernel] var lifeCycle: Option[LifeCycle] = None private[kernel] var lifeCycle: Option[LifeCycle] = None
private[kernel] var states: List[State[_,_]] = Nil
private[kernel] val lock = new ReadWriteLock private[kernel] val lock = new ReadWriteLock
private[kernel] val txItemsLock = new ReadWriteLock
private var server: GenericServer = _ private var server: GenericServer = _
private var currentConfig: Option[AnyRef] = None private var currentConfig: Option[AnyRef] = None
private var timeout = 5000 private var timeout = 5000
// TODO: see if we can parameterize class and add type safe getActor method
//class GenericServerContainer[T <: GenericServer](var factory: () => T) {
//def getActor: T = server
private[kernel] def transactionalItems: List[Transactional] = txItemsLock.withReadLock {
_transactionalMaps ::: _transactionalVectors ::: _transactionalRefs
}
// TX Maps
private[this] var _transactionalMaps: List[TransactionalMap[_, _]] = Nil
private[kernel] def transactionalMaps_=(maps: List[TransactionalMap[_, _]]) = txItemsLock.withWriteLock {
_transactionalMaps = maps
}
private[kernel] def transactionalMaps: List[TransactionalMap[_, _]] = txItemsLock.withReadLock {
_transactionalMaps
}
// TX Vectors
private[this] var _transactionalVectors: List[TransactionalVector[_]] = Nil
private[kernel] def transactionalVectors_=(vectors: List[TransactionalVector[_]]) = txItemsLock.withWriteLock {
_transactionalVectors = vectors
}
private[kernel] def transactionalVectors: List[TransactionalVector[_]] = txItemsLock.withReadLock {
_transactionalVectors
}
// TX Refs
private[this] var _transactionalRefs: List[TransactionalRef[_]] = Nil
private[kernel] def transactionalRefs_=(refs: List[TransactionalRef[_]]) = txItemsLock.withWriteLock {
_transactionalRefs = refs
}
private[kernel] def transactionalRefs: List[TransactionalRef[_]] = txItemsLock.withReadLock {
_transactionalRefs
}
/** /**
* Sends a one way message to the server - alias for <code>cast(message)</code>. * Sends a one way message to the server - alias for <code>cast(message)</code>.
* <p> * <p>

View file

@ -47,7 +47,7 @@ object Helpers extends Logging {
// implicit conversion between regular actor and actor with a type future // implicit conversion between regular actor and actor with a type future
implicit def actorWithFuture(a: Actor) = new ActorWithTypedFuture(a) implicit def actorWithFuture(a: Actor) = new ActorWithTypedFuture(a)
abstract class FutureWithTimeout[T](ch: InputChannel[Any]) extends Future[T](ch) { abstract class FutureWithTimeout[T](ch: InputChannel[T]) extends Future[T](ch) {
def receiveWithin(timeout: Int) : Option[T] def receiveWithin(timeout: Int) : Option[T]
override def respond(f: T => Unit): Unit = throw new UnsupportedOperationException("Does not support the Responder API") override def respond(f: T => Unit): Unit = throw new UnsupportedOperationException("Does not support the Responder API")
} }
@ -63,8 +63,8 @@ object Helpers extends Logging {
require(a != null) require(a != null)
def !!![A](msg: Any): FutureWithTimeout[A] = { def !!![A](msg: Any): FutureWithTimeout[A] = {
val ftch = new Channel[Any](Actor.self) val ftch = new Channel[A](Actor.self)
a.send(msg, ftch) a.send(msg, ftch.asInstanceOf[OutputChannel[Any]])
new FutureWithTimeout[A](ftch) { new FutureWithTimeout[A](ftch) {
def apply() = def apply() =
if (isSet) value.get.asInstanceOf[A] if (isSet) value.get.asInstanceOf[A]

View file

@ -9,9 +9,9 @@ package se.scalablesolutions.akka.kernel
//import org.apache.zookeeper.server.ServerConfig //import org.apache.zookeeper.server.ServerConfig
//import org.apache.zookeeper.server.NIOServerCnxn //import org.apache.zookeeper.server.NIOServerCnxn
import voldemort.client.{SocketStoreClientFactory, StoreClient, StoreClientFactory} //import voldemort.client.{SocketStoreClientFactory, StoreClient, StoreClientFactory}
import voldemort.server.{VoldemortConfig, VoldemortServer} //import voldemort.server.{VoldemortConfig, VoldemortServer}
import voldemort.versioning.Versioned //import voldemort.versioning.Versioned
import com.sun.grizzly.http.SelectorThread import com.sun.grizzly.http.SelectorThread
import com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory import com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory
@ -36,29 +36,29 @@ object Kernel extends Logging {
val JERSEY_REST_CLASSES_ROOT_PACKAGE = "se.scalablesolutions.akka.kernel" val JERSEY_REST_CLASSES_ROOT_PACKAGE = "se.scalablesolutions.akka.kernel"
val JERSEY_BASE_URI = UriBuilder.fromUri(JERSEY_SERVER_URL).port(getPort(JERSEY_SERVER_PORT)).build() val JERSEY_BASE_URI = UriBuilder.fromUri(JERSEY_SERVER_URL).port(getPort(JERSEY_SERVER_PORT)).build()
/*
val VOLDEMORT_SERVER_URL = "tcp://" + SERVER_URL val VOLDEMORT_SERVER_URL = "tcp://" + SERVER_URL
val VOLDEMORT_SERVER_PORT = 6666 val VOLDEMORT_SERVER_PORT = 6666
val VOLDEMORT_BOOTSTRAP_URL = VOLDEMORT_SERVER_URL + ":" + VOLDEMORT_SERVER_PORT val VOLDEMORT_BOOTSTRAP_URL = VOLDEMORT_SERVER_URL + ":" + VOLDEMORT_SERVER_PORT
val ZOO_KEEPER_SERVER_URL = SERVER_URL val ZOO_KEEPER_SERVER_URL = SERVER_URL
val ZOO_KEEPER_SERVER_PORT = 9898 val ZOO_KEEPER_SERVER_PORT = 9898
private[this] var storageFactory: StoreClientFactory = _
private[this] var cassandraNode: CassandraNode = _ private[this] var storageServer: VoldemortServer = _
*/
//private[this] var storageFactory: StoreClientFactory = _
//private[this] var storageServer: VoldemortServer = _
def main(args: Array[String]): Unit = { def main(args: Array[String]): Unit = {
log.info("Starting Akka kernel...") log.info("Starting Akka kernel...")
//startZooKeeper
//startVoldemort
startCassandra startCassandra
//val threadSelector = startJersey cassandraBenchmark
//val threadSelector = startJersey
// TODO: handle shutdown of Jersey in separate thread // TODO: handle shutdown of Jersey in separate thread
// TODO: spawn main in new thread an communicate using socket // TODO: spawn main in new thread an communicate using socket
//System.in.read //System.in.read
//threadSelector.stopEndpoint //threadSelector.stopEndpoint
//startZooKeeper
//startVoldemort
} }
private[akka] def startJersey: SelectorThread = { private[akka] def startJersey: SelectorThread = {
@ -70,10 +70,51 @@ object Kernel extends Logging {
} }
private[akka] def startCassandra = { private[akka] def startCassandra = {
cassandraNode = new CassandraNode CassandraNode.start
cassandraNode.start
} }
private def cassandraBenchmark = {
val NR_ENTRIES = 1000000
println("=================================================")
var start = System.currentTimeMillis
for (i <- 1 to NR_ENTRIES) CassandraNode.insertActorStorageEntry("test", i.toString, "data")
var end = System.currentTimeMillis
println("Writes per second: " + NR_ENTRIES / ((end - start).toDouble / 1000))
/*
FIXME: batch_insert fails with the following exception:
ERROR - Exception was generated at : 04/27/2009 15:26:35 on thread main
[B cannot be cast to org.apache.cassandra.db.WriteResponse
java.lang.ClassCastException: [B cannot be cast to org.apache.cassandra.db.WriteResponse
at org.apache.cassandra.service.WriteResponseResolver.resolve(WriteResponseResolver.java:50)
at org.apache.cassandra.service.WriteResponseResolver.resolve(WriteResponseResolver.java:31)
at org.apache.cassandra.service.QuorumResponseHandler.get(QuorumResponseHandler.java:101)
at org.apache.cassandra.service.StorageProxy.insertBlocking(StorageProxy.java:135)
at org.apache.cassandra.service.CassandraServer.batch_insert_blocking(CassandraServer.java:489)
at se.scalablesolutions.akka.kernel.CassandraNode$.insertHashEntries(CassandraNode.scala:59)
at se.scalablesolutions.akka.kernel.Kernel$.cassandraBenchmark(Kernel.scala:91)
at se.scalablesolutions.akka.kernel.Kernel$.main(Kernel.scala:52)
at se.scalablesolutions.akka.kernel.Kernel.main(Kernel.scala)
println("=================================================")
var start = System.currentTimeMillis
println(start)
val entries = new scala.collection.mutable.ArrayBuffer[Tuple2[String, String]]
for (i <- 1 to NR_ENTRIES) entries += (i.toString, "data")
CassandraNode.insertHashEntries("test", entries.toList)
var end = System.currentTimeMillis
println("Writes per second - batch: " + NR_ENTRIES / ((end - start).toDouble / 1000))
*/
println("=================================================")
start = System.currentTimeMillis
for (i <- 1 to NR_ENTRIES) CassandraNode.getActorStorageEntryFor("test", i.toString)
end = System.currentTimeMillis
println("Reads per second: " + NR_ENTRIES / ((end - start).toDouble / 1000))
System.exit(0)
}
// private[akka] def startVoldemort = { // private[akka] def startVoldemort = {
// // Start Voldemort server // // Start Voldemort server
// val config = VoldemortConfig.loadFromVoldemortHome(Boot.HOME) // val config = VoldemortConfig.loadFromVoldemortHome(Boot.HOME)

View file

@ -1,107 +0,0 @@
package org.apache.mina.example.scala.netcat
import _root_.scala.actors.Actor
import _root_.scala.actors.Actor._
import _root_.scala.actors.Exit
import _root_.scala.collection.immutable
import java.net.InetSocketAddress
import java.nio.charset.Charset
import org.apache.mina.common._
import org.apache.mina.filter.codec.ProtocolCodecFilter
import org.apache.mina.filter.codec.textline.TextLineCodecFactory
import org.apache.mina.integration.scala.common._
import org.apache.mina.integration.scala.common.IoHandlerEvent._
import org.apache.mina.integration.scala.common.IoServiceEvent._
import org.apache.mina.integration.scala.common.IoSessionCall._
import org.apache.mina.integration.scala.common.IoSessionConfigOption._
import org.apache.mina.integration.scala.util._
import org.apache.mina.integration.scala.util.CallableActor._
import org.apache.mina.transport.socket.nio.NioSocketConnector
/**
* (<b>Entry point</b>) NetCat client. NetCat client connects to the specified
* endpoint and prints out received data. NetCat client disconnects
* automatically when no data is read for 10 seconds.
*
* @author The Apache MINA Project (dev@mina.apache.org)
* @version $Rev:$
*/
object NetCat {
def handleSession(session: Actor) = {
loop {
react {
case Opened => {
// Set reader idle time to 10 seconds.
// sessionIdle(...) method will be invoked when no data is read
// for 10 seconds.
val config = immutable.Map.empty[Any, Any] + Tuple2(IdleTime(IdleStatus.READER_IDLE), 10)
session.callReact(SetConfig(config)) {
case OK(_) => ()
case Error(cause) => exit(('setConfigFailed, cause))
}
}
case Closed => {
// Print out total number of bytes read from the remote peer.
session.callReact(GetReadBytes) {
case OK(readBytes) => {
System.err.println
System.err.println("Total " + readBytes + " byte(s)");
exit()
}
case Error(cause) => exit(('getReadBytesFailed, cause))
}
}
case Idle(status) => {
// Close the connection if reader is idle.
if (status == IdleStatus.READER_IDLE) {
session.callReact(CloseOnFlush) {
case OK(_) => exit()
case Error(cause) => exit(('idleCloseFailed, cause))
}
}
}
case MessageReceived(buf: IoBuffer) => {
// Print out read buffer content.
while (buf.hasRemaining) {
System.out.print(buf.get.asInstanceOf[char])
}
System.out.flush()
}
// Consume other IoHandlerEvents, or exit if something goes wrong.
case ExceptionCaught(cause) => exit(('exceptionCaught, cause))
case _: IoHandlerEvent => () // Consume
case unexpected => exit(('unexpectedMessage, unexpected))
}
}
}
def main(args: Array[String]) {
var host = System.getProperty("netcat.host")
var portString = System.getProperty("netcat.port")
if ((host eq null) || (portString eq null)) {
// Read from command line
if (args.length != 2) {
System.out.println(this.getClass().getName() + " <hostname> <port>")
return
}
host = args(0)
portString = args(1)
}
val port = Integer.parseInt(portString)
// Create TCP/IP connector.
val connector = new NioSocketConnector()
connector.setConnectTimeout(30)
// Hook up our code, and start service.
val handlingReference = IoSessionActor.installHandling(connector, handleSession(_))
val cf = connector.connect(new InetSocketAddress(host, port))
cf.awaitUninterruptibly()
cf.getSession().getCloseFuture().awaitUninterruptibly()
handlingReference.removeHandling
connector.dispose()
}
}

View file

@ -13,7 +13,12 @@ trait Transactional {
private[kernel] def rollback private[kernel] def rollback
} }
sealed trait State[K, V] extends Transactional { /**
* Base trait for all state implementations (persistent or in-memory).
*
* TODO: Make this class inherit scala.collection.mutable.Map and/or java.util.Map
*/
trait TransactionalMap[K, V] extends Transactional {
def put(key: K, value: V) def put(key: K, value: V)
def remove(key: K) def remove(key: K)
def get(key: K): V def get(key: K): V
@ -24,87 +29,134 @@ sealed trait State[K, V] extends Transactional {
} }
/** /**
* Base class for all persistent state implementations should extend.
* Implements a Unit of Work, records changes into a change set.
*
* Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time. * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time.
*/ */
sealed class InMemoryState[K, V] extends State[K, V] { abstract class PersistentTransactionalMap[K, V] extends TransactionalMap[K, V] {
private[kernel] var state = new HashTrie[K, V] protected[kernel] val changeSet = new HashMap[K, V]
private[kernel] var snapshot = state
private[kernel] override def begin = { override def begin = {
snapshot = state
}
private[kernel] override def commit = {
snapshot = state
}
private[kernel] override def rollback = {
state = snapshot
}
override def put(key: K, value: V) = {
state = state.update(key, value)
}
override def remove(key: K) = {
state = state - key
}
def get(key: K): V = state.get(key).getOrElse { throw new NoSuchElementException("No value for key [" + key + "]") }
def contains(key: K): Boolean = state.contains(key)
def elements: Iterator[(K, V)] = state.elements
def size: Int = state.size
def clear = state = new HashTrie[K, V]
}
//final class InMemoryStringState extends InMemoryState[String, String]
//final class InMemoryObjectState extends InMemoryState[String, AnyRef]
//
/**
* Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time.
*/
trait UnitOfWork[K, V] extends State[K, V] with Transactional {
this: InMemoryState[K, V] =>
private[kernel] val changeSet = new HashMap[K, V]
abstract override def begin = {
super.begin
changeSet.clear changeSet.clear
} }
abstract override def put(key: K, value: V) = { override def put(key: K, value: V) = {
super.put(key, value)
changeSet += key -> value changeSet += key -> value
} }
abstract override def remove(key: K) = { override def remove(key: K) = {
super.remove(key)
changeSet -= key changeSet -= key
} }
def getRange(start: Int, count: Int)
}
/**
* Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time.
*/
class InMemoryTransactionalMap[K, V] extends TransactionalMap[K, V] {
protected[kernel] var state = new HashTrie[K, V]
protected[kernel] var snapshot = state
override def begin = snapshot = state
override def commit = snapshot = state
override def rollback = state = snapshot
override def put(key: K, value: V) = state = state.update(key, value)
override def get(key: K): V = state.get(key).getOrElse(throw new NoSuchElementException("No value for key [" + key + "]"))
override def remove(key: K) = state = state - key
override def contains(key: K): Boolean = state.contains(key)
override def elements: Iterator[(K, V)] = state.elements
override def size: Int = state.size
override def clear = state = new HashTrie[K, V]
}
/**
* Implements a persistent state based on the Cassandra distributed P2P key-value storage.
*/
class CassandraPersistentTransactionalMap(val actorName: String) extends PersistentTransactionalMap[String, String] {
override def begin = {}
override def rollback = {}
override def commit = {
// FIXME: should use batch function once the bug is resolved
for (entry <- changeSet) {
val (key, value) = entry
CassandraNode.insertActorStorageEntry(actorName, key, value)
}
}
override def get(key: String): String = CassandraNode.getActorStorageEntryFor(actorName, key)
.getOrElse(throw new NoSuchElementException("Could not find element for key [" + key + "]"))
override def contains(key: String): Boolean = CassandraNode.getActorStorageEntryFor(actorName, key).isDefined
override def size: Int = CassandraNode.getActorStorageSizeFor(actorName)
override def clear = CassandraNode.removeActorStorageFor(actorName)
override def getRange(start: Int, count: Int) = CassandraNode.getActorStorageRange(actorName, start, count)
override def elements: Iterator[Tuple2[String, String]] = {
new Iterator[Tuple2[String, String]] {
private val originalList: List[Tuple2[String, String]] = CassandraNode.getActorStorageFor(actorName)
private var elements = originalList.reverse
override def next: Tuple2[String, String]= synchronized {
val element = elements.head
elements = elements.tail
element
}
override def hasNext: Boolean = synchronized { !elements.isEmpty }
}
}
} }
//class VectorState[T] { /**
// private[kernel] var state: Vector[T] = EmptyVector * TODO: extend scala.Seq
// private[kernel] var snapshot = state * Base for all transactional vector implementations.
// private[kernel] var unitOfWork: List[T] = Nil */
// abstract class TransactionalVector[T] extends Transactional {
// private[kernel] def record = { def add(elem: T)
// snapshot = state def get(index: Int): T
// unitOfWork = Nil def size: Int
// } }
//
// def add(elem: T): VectorState[T] = { /**
// state = state + elem * Implements an in-memory transactional vector.
// unitOfWork ::= elem *
// } * Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time.
// */
// def get(index: Int): T = state(index) class InMemoryTransactionalVector[T] extends TransactionalVector[T] {
// private[kernel] var state: Vector[T] = EmptyVector
// def size: Int = state.size private[kernel] var snapshot = state
//}
// override def begin = snapshot = state
// override def commit = snapshot = state
override def rollback = state = snapshot
override def add(elem: T) = state = state + elem
override def get(index: Int): T = state(index)
override def size: Int = state.size
}
/**
* Implements a transactional reference.
*
* Not thread-safe, but should only be using from within an Actor, e.g. one single thread at a time.
*/
class TransactionalRef[T] extends Transactional {
private[kernel] var ref: Option[T] = None
private[kernel] var snapshot: Option[T] = None
override def begin = if (ref.isDefined) snapshot = Some(ref.get)
override def commit = if (ref.isDefined) snapshot = Some(ref.get)
override def rollback = if (snapshot.isDefined) ref = Some(snapshot.get)
def swap(elem: T) = ref = Some(elem)
def get: Option[T] = ref
def getOrElse(default: => T): T = ref.getOrElse(default)
def isDefined: Boolean= ref.isDefined
}

View file

@ -47,7 +47,7 @@ class Transaction extends Logging {
if (status == TransactionStatus.New) log.debug("Actor [%s] is starting NEW transaction", server) if (status == TransactionStatus.New) log.debug("Actor [%s] is starting NEW transaction", server)
else log.debug("Actor [%s] is participating in transaction", server) else log.debug("Actor [%s] is participating in transaction", server)
println("===== begin 2 " + server) println("===== begin 2 " + server)
server.states.foreach(_.begin) server.transactionalItems.foreach(_.begin)
participants ::= server participants ::= server
status = TransactionStatus.Active status = TransactionStatus.Active
} }
@ -80,13 +80,13 @@ class Transaction extends Logging {
ensureIsActiveOrAborted ensureIsActiveOrAborted
println("===== rollback " + server) println("===== rollback " + server)
log.debug("Actor [%s] has initiated transaction rollback, rolling back [%s]" , server, participants) log.debug("Actor [%s] has initiated transaction rollback, rolling back [%s]" , server, participants)
participants.foreach(_.states.foreach(_.rollback)) participants.foreach(_.transactionalItems.foreach(_.rollback))
status = TransactionStatus.Aborted status = TransactionStatus.Aborted
} }
def join(server: GenericServerContainer) = synchronized { def join(server: GenericServerContainer) = synchronized {
println("===== joining " + server) println("===== joining " + server)
server.states.foreach(_.begin) server.transactionalItems.foreach(_.begin)
participants ::= server participants ::= server
} }

View file

@ -7,11 +7,14 @@ package se.scalablesolutions.akka.kernel
import scala.actors._ import scala.actors._
import scala.actors.Actor._ import scala.actors.Actor._
import com.jteigen.scalatest.JUnit4Runner
import org.junit.runner.RunWith
import org.scalatest._ import org.scalatest._
/** /**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a> * @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/ */
@RunWith(classOf[JUnit4Runner])
class GenericServerContainerSpec extends Suite { class GenericServerContainerSpec extends Suite {
var inner: GenericServerContainerActor = null var inner: GenericServerContainerActor = null

View file

@ -4,6 +4,8 @@
package se.scalablesolutions.akka.kernel package se.scalablesolutions.akka.kernel
import com.jteigen.scalatest.JUnit4Runner
import org.junit.runner.RunWith
import org.scalatest._ import org.scalatest._
import scala.actors.Actor._ import scala.actors.Actor._
@ -11,6 +13,7 @@ import scala.actors.Actor._
/** /**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a> * @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/ */
@RunWith(classOf[JUnit4Runner])
class GenericServerSpec extends Suite { class GenericServerSpec extends Suite {
def testSendRegularMessage = { def testSendRegularMessage = {

View file

@ -9,11 +9,14 @@ import scala.actors.Actor._
import scala.collection.Map import scala.collection.Map
import scala.collection.mutable.HashMap import scala.collection.mutable.HashMap
import com.jteigen.scalatest.JUnit4Runner
import org.junit.runner.RunWith
import org.scalatest._ import org.scalatest._
/** /**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a> * @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/ */
@RunWith(classOf[JUnit4Runner])
class SupervisorSpec extends Suite { class SupervisorSpec extends Suite {
var messageLog: String = "" var messageLog: String = ""

View file

@ -4,6 +4,8 @@
package se.scalablesolutions.akka.kernel package se.scalablesolutions.akka.kernel
import com.jteigen.scalatest.JUnit4Runner
import org.junit.runner.RunWith
import org.scalatest._ import org.scalatest._
import scala.actors.Actor._ import scala.actors.Actor._
@ -11,6 +13,7 @@ import scala.actors.Actor._
/** /**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a> * @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/ */
@RunWith(classOf[JUnit4Runner])
class SupervisorStateSpec extends Suite { class SupervisorStateSpec extends Suite {
val dummyActor = new GenericServer { override def body: PartialFunction[Any, Unit] = { case _ => }} val dummyActor = new GenericServer { override def body: PartialFunction[Any, Unit] = { case _ => }}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -51,8 +51,17 @@
</repository> </repository>
<repository> <repository>
<id>java.net</id> <id>java.net</id>
<name>Java.net Legacy Repository for Maven</name>
<url>http://download.java.net/maven/1</url> <url>http://download.java.net/maven/1</url>
<layout>legacy</layout> <layout>legacy</layout>
</repository>
<repository>
<id>repository.jboss.org</id>
<name>JBoss Repository for Maven</name>
<url>http://repository.jboss.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository> </repository>
</repositories> </repositories>

View file

View file

View file

View file

View file

View file

@ -1,214 +0,0 @@
--- OVERVIEW ---
Scala Actors Behavior Module
Implements Erlang-style Behaviors for Scala; Supervisor, GenericServer, GenericEvent and GenericFiniteStateMachine allowing creating fault-tolerant actor-based enterprise systems.
The implementation consists of four main abstractions;
* Supervisor -- The Supervisor manages hierarchies of Scala actors and provides fault-tolerance in terms of different restart
semantics. The configuration and semantics is almost a 1-1 port of the Erlang Supervisor implementation, explained
here: http://www.erlang.org/doc/design_principles/sup_princ.html, read this document in order to understand how to
configure the Supervisor properly.
* GenericServer -- The GenericServer (which subclasses Actor) is a trait that forms the base for a server to be managed by a Supervisor.
The GenericServer is wrapped by a GenericServerContainer instance providing a necessary indirection needed to be able to
fully manage the life-cycle of the GenericServer.
* GenericEvent -- TBD
* GenericFiniteStateMachine -- TBD
--- CHECK OUT ---
The SCM system used is Git.
1. Download and install Git (google git).
2. Invoke 'git clone git://github.com/jboner/scala-otp.git'.
--- BUILD ---
The build system used is Maven.
1. Download and install Maven 2.
2. Step into the root dir 'scala-otp'.
3. Invoke 'mvn install'
This will build the project, run all tests, create a jar and upload it to your local Maven repository ready for use.
--- RUNTIME DEPENDENCIES ---
1. Scala 2.7.1-final
2. SLF4J 1.5.2
3. LogBack Classic 0.9.9
--- USAGE ---
Here is a small step-by-step runnable tutorial on how to create a server, configure it, use it, hotswap its
implementation etc. For more details on the API, look at the code or the tests.
You can find this code in the sample.scala file in the root directory. Run it by invoking 'scala -cp
target/scala-behavior-0.1-SNAPSHOT.jar:<path to slf4j and logback jars> sample.scala'
// =============================================
// 1. Import statements and Server messages
import scala.actors._
import scala.actors.Actor._
import scala.actors.behavior._
import scala.actors.behavior.Helpers._
sealed abstract class SampleMessage
case object Ping extends SampleMessage
case object Pong extends SampleMessage
case object OneWay extends SampleMessage
case object Die extends SampleMessage
// =============================================
// 2. Create the GenericServer by extending the GenericServer trait and override the 'body' method
class SampleServer extends GenericServer {
// This method implements the core server logic and naturally has to be overridden
override def body: PartialFunction[Any, Unit] = {
case Ping =>
println("Received Ping"); reply(Pong)
case OneWay =>
println("Received OneWay")
case Die =>
println("Received Die..dying...")
throw new RuntimeException("Received Die message")
}
// GenericServer also has some callback life-cycle methods, such as init(..) and shutdown(..)
}
// =============================================
// 3. Wrap our SampleServer in a GenericServerContainer and give it a name to be able to refer to it later.
object sampleServer1 extends GenericServerContainer("sample1", () => new SampleServer)
object sampleServer2 extends GenericServerContainer("sample2", () => new SampleServer)
// =============================================
// 4. Create a Supervisor configuration (and a SupervisorFactory) that is configuring our SampleServer (takes a list of
'Worker' configurations, one or many)
object factory extends SupervisorFactory {
override protected def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(AllForOne, 3, 10000),
Worker(
sampleServer1,
LifeCycle(Permanent, 1000)) ::
Worker(
sampleServer2,
LifeCycle(Permanent, 1000)) ::
Nil)
}
}
// =============================================
// 5. Create a new Supervisor with the custom factory
val supervisor = factory.newSupervisor
// =============================================
// 6. Start the Supervisor (which starts the server(s))
supervisor ! Start
// =============================================
// 7. Try to send a one way asyncronous message to our servers
sampleServer1 ! OneWay
// Try to get sampleServer2 from the Supervisor before sending a message
supervisor.getServer("sample2") match {
case Some(server2) => server2 ! OneWay
case None => println("server [sample2] could not be found")
}
// =============================================
// 8. Try to send an asyncronous message - receive a future - wait 100 ms (time-out) for the reply
val future = sampleServer1 !! Ping
val reply1 = future.receiveWithin(100) match {
case Some(reply) =>
println("Received reply: " + reply)
case None =>
println("Did not get a reply witin 100 ms")
}
// =============================================
// 9. Try to send a message (Die) telling the server to kill itself (throw an exception)
sampleServer1 ! Die
// =============================================
// 10. Send an asyncronous message and wait on a future. If it times out -> use error handler (in this case throw an
exception). It is likely that this call will time out since the server is in the middle of recovering from failure.
val reply2 = try {
sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 10) // time out is set to 10 ms (very low on purpose)
} catch { case e => println("Expected exception: " + e.toString); Pong }
// =============================================
// 11. Server should be up again. Try the same call again
val reply3 = try {
sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 1000)
} catch { case e => println("Expected exception: " + e.toString); Pong }
// Also check server number 2
sampleServer2 ! Ping
// =============================================
// 11. Try to hotswap the server implementation
sampleServer1.hotswap(Some({
case Ping =>
println("Hotswapped Ping")
}))
// =============================================
// 12. Try the hotswapped server out
sampleServer1 ! Ping
// =============================================
// 13. Hotswap again
sampleServer1.hotswap(Some({
case Pong =>
println("Hotswapped again, now doing Pong")
reply(Ping)
}))
// =============================================
// 14. Send an asyncronous message that will wait on a future. Method returns an Option[T] => if Some(result) -> return
result, if None -> print out an info message (or throw an exception or do whatever you like...)
val reply4 = (sampleServer1 !!! Pong).getOrElse({println("Time out when sending Pong"); Ping})
// Same invocation with pattern matching syntax.
val reply5 = sampleServer1 !!! Pong match {
case Some(result) => result
case None => println("Time out when sending Pong"); Ping
}
// =============================================
// 15. Hotswap back to original implementation by passing in None
sampleServer1.hotswap(None)
// =============================================
// 16. Test the final hotswap by sending an async message
sampleServer1 ! Ping
// =============================================
// 17. Shut down the supervisor and its server(s)
supervisor ! Stop

View file

@ -1,164 +0,0 @@
// =============================================
// 1. Import statements and Server messages
import scala.actors._
import scala.actors.Actor._
import scala.actors.behavior._
import scala.actors.behavior.Helpers._
sealed abstract class SampleMessage
case object Ping extends SampleMessage
case object Pong extends SampleMessage
case object OneWay extends SampleMessage
case object Die extends SampleMessage
// =============================================
// 2. Create the GenericServer by extending the GenericServer trait and override the 'body' method
class SampleServer extends GenericServer {
// This method implements the core server logic and naturally has to be overridden
override def body: PartialFunction[Any, Unit] = {
case Ping =>
println("Received Ping"); reply(Pong)
case OneWay =>
println("Received OneWay")
case Die =>
println("Received Die..dying...")
throw new RuntimeException("Received Die message")
}
// GenericServer also has some callback life-cycle methods, such as init(..) and shutdown(..)
}
// =============================================
// 3. Wrap our SampleServer in a GenericServerContainer and give it a name to be able to refer to it later.
object sampleServer1 extends GenericServerContainer("sample1", () => new SampleServer)
object sampleServer2 extends GenericServerContainer("sample2", () => new SampleServer)
// =============================================
// 4. Create a Supervisor configuration (and a SupervisorFactory) that is configuring our SampleServer (takes a list of 'Worker' configurations, one or many)
object factory extends SupervisorFactory {
override protected def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(AllForOne, 3, 10000),
Worker(
sampleServer1,
LifeCycle(Permanent, 1000)) ::
Worker(
sampleServer2,
LifeCycle(Permanent, 1000)) ::
Nil)
}
}
// =============================================
// 5. Create a new Supervisor with the custom factory
val supervisor = factory.newSupervisor
// =============================================
// 6. Start the Supervisor (which starts the server(s))
supervisor ! Start
// =============================================
// 7. Try to send a one way asyncronous message to our servers
sampleServer1 ! OneWay
// Try to get sampleServer2 from the Supervisor before sending a message
supervisor.getServer("sample2") match {
case Some(server2) => server2 ! OneWay
case None => println("server [sample2] could not be found")
}
// =============================================
// 8. Try to send an asyncronous message - receive a future - wait 100 ms (time-out) for the reply
val future = sampleServer1 !! Ping
val reply1 = future.receiveWithin(100) match {
case Some(reply) =>
println("Received reply: " + reply)
case None =>
println("Did not get a reply witin 100 ms")
}
// =============================================
// 9. Try to send a message (Die) telling the server to kill itself (throw an exception)
sampleServer1 ! Die
// =============================================
// 10. Send an asyncronous message and wait on a future. If it times out -> use error handler (in this case throw an exception). It is likely that this call will time out since the server is in the middle of recovering from failure.
val reply2 = try {
sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 10) // time out is set to 10 ms (very low on purpose)
} catch { case e => println("Expected exception: " + e.toString); Pong }
// =============================================
// 11. Server should be up again. Try the same call again
val reply3 = try {
sampleServer1 !!! (Ping, throw new RuntimeException("Time-out"), 1000)
} catch { case e => println("Expected exception: " + e.toString); Pong }
// Also check server number 2
sampleServer2 ! Ping
// =============================================
// 11. Try to hotswap the server implementation
sampleServer1.hotswap(Some({
case Ping =>
println("Hotswapped Ping")
}))
// =============================================
// 12. Try the hotswapped server out
sampleServer1 ! Ping
// =============================================
// 13. Hotswap again
sampleServer1.hotswap(Some({
case Pong =>
println("Hotswapped again, now doing Pong")
reply(Ping)
}))
// =============================================
// 14. Send an asyncronous message that will wait on a future. Method returns an Option[T] => if Some(result) -> return result, if None -> print out an info message (or throw an exception or do whatever you like...)
val reply4 = (sampleServer1 !!! Pong).getOrElse({println("Time out when sending Pong"); Ping})
// Same invocation with pattern matching syntax.
val reply5 = sampleServer1 !!! Pong match {
case Some(result) => result
case None => println("Time out when sending Pong"); Ping
}
// =============================================
// 15. Hotswap back to original implementation by passing in None
sampleServer1.hotswap(None)
// =============================================
// 16. Test the final hotswap by sending an async message
sampleServer1 ! Ping
// =============================================
// 17. Shut down the supervisor and its server(s)
supervisor ! Stop

View file

@ -1,282 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
import scala.actors._
import scala.actors.Actor._
import com.scalablesolutions.akka.supervisor.Helpers._
sealed abstract class GenericServerMessage
case class Init(config: AnyRef) extends GenericServerMessage
case class ReInit(config: AnyRef) extends GenericServerMessage
case class Shutdown(reason: AnyRef) extends GenericServerMessage
case class Terminate(reason: AnyRef) extends GenericServerMessage
case class HotSwap(code: Option[PartialFunction[Any, Unit]]) extends GenericServerMessage
/**
* Base trait for all user-defined servers/actors.
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
trait GenericServer extends Actor {
/**
* Template method implementing the server logic.
* To be implemented by subclassing server.
* <p/>
* Example code:
* <pre>
* override def body: PartialFunction[Any, Unit] = {
* case Ping =>
* println("got a ping")
* reply("pong")
*
* case OneWay =>
* println("got a oneway")
* }
* </pre>
*/
def body: PartialFunction[Any, Unit]
/**
* Callback method that is called during initialization.
* To be implemented by subclassing server.
*/
def init(config: AnyRef) {}
/**
* Callback method that is called during reinitialization after a server crash.
* To be implemented by subclassing server.
*/
def reinit(config: AnyRef) {}
/**
* Callback method that is called during termination.
* To be implemented by subclassing server.
*/
def shutdown(reason: AnyRef) {}
def act = loop { react { genericBase orElse actorBase } }
private def actorBase: PartialFunction[Any, Unit] = hotswap getOrElse body
private var hotswap: Option[PartialFunction[Any, Unit]] = None
private val genericBase: PartialFunction[Any, Unit] = {
case Init(config) => init(config)
case ReInit(config) => reinit(config)
case HotSwap(code) => hotswap = code
case Shutdown(reason) => shutdown(reason); reply('success)
case Terminate(reason) => exit(reason)
}
}
/**
* The container (proxy) for GenericServer, responsible for managing the life-cycle of the server;
* such as shutdown, restart, re-initialization etc.
* Each GenericServerContainer manages one GenericServer.
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class GenericServerContainer(val id: String, var serverFactory: () => GenericServer) extends Logging {
require(id != null && id != "")
// TODO: see if we can parameterize class and add type safe getActor method
//class GenericServerContainer[T <: GenericServer](var factory: () => T) {
//def getActor: T = server
var lifeCycle: Option[LifeCycle] = None
val lock = new ReadWriteLock
private var server: GenericServer = null
private var currentConfig: Option[AnyRef] = None
private var timeout = 5000
/**
* Sends a one way message to the server - alias for <code>cast(message)</code>.
* <p>
* Example:
* <pre>
* server ! Message
* </pre>
*/
def !(message: Any) = {
require(server != null)
lock.withReadLock { server ! message }
}
/**
* Sends a message to the server returns a FutureWithTimeout holding the future reply .
* <p>
* Example:
* <pre>
* val future = server !! Message
* future.receiveWithin(100) match {
* case None => ... // timed out
* case Some(reply) => ... // handle reply
* }
* </pre>
*/
def !![T](message: Any): FutureWithTimeout[T] = {
require(server != null)
lock.withReadLock { server !!! message }
}
/**
* Sends a message to the server and blocks indefinitely (no time out), waiting for the reply.
* <p>
* Example:
* <pre>
* val result: String = server !? Message
* </pre>
*/
def !?[T](message: Any): T = {
require(server != null)
val future: Future[T] = lock.withReadLock { server.!![T](message, {case t => t.asInstanceOf[T]}) }
Actor.receive {
case (future.ch ! arg) => arg.asInstanceOf[T]
}
}
/**
* Sends a message to the server and gets a future back with the reply. Returns
* an Option with either Some(result) if succesful or None if timeout.
* <p>
* Timeout specified by the <code>setTimeout(time: Int)</code> method.
* <p>
* Example:
* <pre>
* (server !!! Message).getOrElse(throw new RuntimeException("time out")
* </pre>
*/
def !!![T](message: Any): Option[T] = {
require(server != null)
val future: FutureWithTimeout[T] = lock.withReadLock { server !!! message }
future.receiveWithin(timeout)
}
/**
* Sends a message to the server and gets a future back with the reply.
* <p>
* Tries to get the reply within the timeout specified in the GenericServerContainer
* and else execute the error handler (which can return a default value, throw an exception
* or whatever is appropriate).
* <p>
* Example:
* <pre>
* server !!! (Message, throw new RuntimeException("time out"))
* // OR
* server !!! (Message, DefaultReturnValue)
* </pre>
*/
def !!![T](message: Any, errorHandler: => T): T = !!!(message, errorHandler, timeout)
/**
* Sends a message to the server and gets a future back with the reply.
* <p>
* Tries to get the reply within the timeout specified as parameter to the method
* and else execute the error handler (which can return a default value, throw an exception
* or whatever is appropriate).
* <p>
* Example:
* <pre>
* server !!! (Message, throw new RuntimeException("time out"), 1000)
* // OR
* server !!! (Message, DefaultReturnValue, 1000)
* </pre>
*/
def !!![T](message: Any, errorHandler: => T, time: Int): T = {
require(server != null)
val future: FutureWithTimeout[T] = lock.withReadLock { server !!! message }
future.receiveWithin(time) match {
case None => errorHandler
case Some(reply) => reply
}
}
/**
* Initializes the server by sending a Init(config) message.
*/
def init(config: AnyRef) = lock.withWriteLock {
currentConfig = Some(config)
server ! Init(config)
}
/**
* Re-initializes the server by sending a ReInit(config) message with the most recent configuration.
*/
def reinit = lock.withWriteLock {
currentConfig match {
case Some(config) => server ! ReInit(config)
case None => {}
}
}
/**
* Hotswaps the server body by sending it a HotSwap(code) with the new code
* block (PartialFunction) to be executed.
*/
def hotswap(code: Option[PartialFunction[Any, Unit]]) = lock.withReadLock { server ! HotSwap(code) }
/**
* Swaps the server factory, enabling creating of a completely new server implementation
* (upon failure and restart).
*/
def swapFactory(newFactory: () => GenericServer) = serverFactory = newFactory
/**
* Sets the timeout for the call(..) method, e.g. the maximum time to wait for a reply
* before bailing out. Sets the timeout on the future return from the call to the server.
*/
def setTimeout(time: Int) = timeout = time
/**
* Returns the next message in the servers mailbox.
*/
def nextMessage = lock.withReadLock { server ? }
/**
* Creates a new actor for the GenericServerContainer, and return the newly created actor.
*/
private[supervisor] def newServer(): GenericServer = lock.withWriteLock {
server = serverFactory()
server
}
/**
* Starts the server.
*/
private[supervisor] def start = lock.withReadLock { server.start }
/**
* Terminates the server with a reason by sending a Terminate(Some(reason)) message.
*/
private[supervisor] def terminate(reason: AnyRef) = lock.withReadLock { server ! Terminate(reason) }
/**
* Terminates the server with a reason by sending a Terminate(Some(reason)) message,
* the shutdownTime defines the maximal time to wait for the server to shutdown before
* killing it.
*/
private[supervisor] def terminate(reason: AnyRef, shutdownTime: Int) = lock.withReadLock {
if (shutdownTime > 0) {
log.debug("Waiting {} milliseconds for the server to shut down before killing it.", shutdownTime)
server !? (shutdownTime, Shutdown(reason)) match {
case Some('success) => log.debug("Server [{}] has been shut down cleanly.", id)
case None => log.warning("Server [{}] was **not able** to complete shutdown cleanly within its configured shutdown time [{}]", id, shutdownTime)
}
}
server ! Terminate(reason)
}
private[supervisor] def reconfigure(reason: AnyRef, restartedServer: GenericServer, supervisor: Supervisor) = lock.withWriteLock {
server = restartedServer
reinit
}
private[supervisor] def getServer: GenericServer = server
}

View file

@ -1,101 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
import java.util.concurrent.locks.ReentrantReadWriteLock
import scala.actors._
import scala.actors.Actor._
import net.lag.logging.Logger
class SystemFailure(cause: Throwable) extends RuntimeException(cause)
/**
* Base trait for all classes that wants to be able use the logging infrastructure.
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
trait Logging {
@transient val log = Logger.get(this.getClass.getName)
}
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
object Helpers extends Logging {
// ================================================
class ReadWriteLock {
private val rwl = new ReentrantReadWriteLock
private val readLock = rwl.readLock
private val writeLock = rwl.writeLock
def withWriteLock[T](body: => T): T = {
writeLock.lock
try {
body
} finally {
writeLock.unlock
}
}
def withReadLock[T](body: => T): T = {
readLock.lock
try {
body
} finally {
readLock.unlock
}
}
}
// ================================================
// implicit conversion between regular actor and actor with a type future
implicit def actorWithFuture(a: Actor) = new ActorWithTypedFuture(a)
abstract class FutureWithTimeout[T](ch: InputChannel[Any]) extends Future[T](ch) {
def receiveWithin(timeout: Int) : Option[T]
override def respond(f: T => Unit): Unit = throw new UnsupportedOperationException("Does not support the Responder API")
}
def receiveOrFail[T](future: => FutureWithTimeout[T], timeout: Int, errorHandler: => T): T = {
future.receiveWithin(timeout) match {
case None => errorHandler
case Some(reply) => reply
}
}
class ActorWithTypedFuture(a: Actor) {
require(a != null)
def !!![A](msg: Any): FutureWithTimeout[A] = {
val ftch = new Channel[Any](Actor.self)
a.send(msg, ftch)
new FutureWithTimeout[A](ftch) {
def apply() =
if (isSet) value.get.asInstanceOf[A]
else ch.receive {
case a =>
value = Some(a)
value.get.asInstanceOf[A]
}
def isSet = receiveWithin(0).isDefined
def receiveWithin(timeout: Int): Option[A] = value match {
case None => ch.receiveWithin(timeout) {
case TIMEOUT =>
log.debug("Future timed out while waiting for actor: {}", a)
None
case a =>
value = Some(a)
value.asInstanceOf[Option[A]]
}
case a => a.asInstanceOf[Option[A]]
}
}
}
}
}

View file

@ -1,358 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
import scala.actors._
import scala.actors.Actor._
import scala.collection.mutable.HashMap
import com.scalablesolutions.akka.supervisor.Helpers._
//====================================================
/**
* Configuration classes - not to be used as messages.
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
sealed abstract class ConfigElement
abstract class Server extends ConfigElement
abstract class FailOverScheme extends ConfigElement
abstract class Scope extends ConfigElement
case class SupervisorConfig(restartStrategy: RestartStrategy, worker: List[Server]) extends Server
case class Worker(serverContainer: GenericServerContainer, lifeCycle: LifeCycle) extends Server
case class RestartStrategy(scheme: FailOverScheme, maxNrOfRetries: Int, withinTimeRange: Int) extends ConfigElement
case object AllForOne extends FailOverScheme
case object OneForOne extends FailOverScheme
case class LifeCycle(scope: Scope, shutdownTime: Int) extends ConfigElement
case object Permanent extends Scope
case object Transient extends Scope
case object Temporary extends Scope
//====================================================
/**
* Messages that the supervisor responds to and returns.
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
sealed abstract class SupervisorMessage
case object Start extends SupervisorMessage
case object Stop extends SupervisorMessage
case class Configure(config: SupervisorConfig, factory: SupervisorFactory) extends SupervisorMessage
/**
* Abstract base class for all supervisor factories.
* <p>
* Example usage:
* <pre>
* class MySupervisorFactory extends SupervisorFactory {
*
* override protected def getSupervisorConfig: SupervisorConfig = {
* SupervisorConfig(
* RestartStrategy(OneForOne, 3, 10),
* Worker(
* myFirstActorInstance,
* LifeCycle(Permanent, 1000))
* ::
* Worker(
* mySecondActorInstance,
* LifeCycle(Permanent, 1000))
* :: Nil)
* }
* }
* </pre>
*
* Then create a concrete factory in which we mix in support for the specific implementation of the Service we want to use.
*
* <pre>
* object factory extends MySupervisorFactory
* </pre>
*
* Then create a new Supervisor tree with the concrete Services we have defined.
*
* <pre>
* val supervisor = factory.newSupervisor
* supervisor ! Start // start up all managed servers
* </pre>
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
abstract class SupervisorFactory extends Logging {
def newSupervisor: Supervisor = newSupervisorFor(getSupervisorConfig)
def newSupervisorFor(config: SupervisorConfig): Supervisor = config match {
case SupervisorConfig(restartStrategy, _) =>
val supervisor = create(restartStrategy)
supervisor.start
supervisor !? Configure(config, this) match {
case 'success => log.debug("Supervisor successfully configured")
case _ => log.error("Supervisor could not be configured")
}
supervisor
}
/**
* To be overridden by concrete factory.
* Should return the SupervisorConfig for the supervisor.
*/
protected def getSupervisorConfig: SupervisorConfig
protected def create(strategy: RestartStrategy): Supervisor = strategy match {
case RestartStrategy(scheme, maxNrOfRetries, timeRange) =>
scheme match {
case AllForOne => new Supervisor(new AllForOneStrategy(maxNrOfRetries, timeRange))
case OneForOne => new Supervisor(new OneForOneStrategy(maxNrOfRetries, timeRange))
}
}
}
//====================================================
/**
* TODO: document
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class Supervisor(faultHandler: FaultHandlingStrategy) extends Actor with Logging {
private val state = new SupervisorState(this, faultHandler)
/**
* Returns an Option with the GenericServerContainer for the server with the name specified.
* If the server is found then Some(server) is returned else None.
*/
def getServer(id: String): Option[GenericServerContainer] = state.getServerContainer(id)
/**
* Returns an the GenericServerContainer for the server with the name specified.
* If the server is not found then the error handler is invoked.
*/
def getServerOrElse(id: String, errorHandler: => GenericServerContainer): GenericServerContainer = {
getServer(id) match {
case Some(serverContainer) => serverContainer
case None => errorHandler
}
}
def act = {
self.trapExit = true
loop {
react {
case Configure(config, factory) =>
log.debug("Configuring supervisor:{} ", this)
configure(config, factory)
reply('success)
case Start =>
state.serverContainers.foreach { serverContainer =>
serverContainer.start
log.info("Starting server: {}", serverContainer.getServer)
}
case Stop =>
state.serverContainers.foreach { serverContainer =>
serverContainer.terminate('normal)
log.info("Stopping server: {}", serverContainer)
}
log.info("Stopping supervisor: {}", this)
exit('normal)
case Exit(failedServer, reason) =>
reason match {
case 'forced => {} // do nothing
case _ => state.faultHandler.handleFailure(state, failedServer, reason)
}
case unexpected => log.warning("Unexpected message [{}], ignoring...", unexpected)
}
}
}
private def configure(config: SupervisorConfig, factory: SupervisorFactory) = config match {
case SupervisorConfig(_, servers) =>
servers.map(server =>
server match {
case Worker(serverContainer, lifecycle) =>
serverContainer.lifeCycle = Some(lifecycle)
spawnLink(serverContainer)
case SupervisorConfig(_, _) => // recursive configuration
val supervisor = factory.newSupervisorFor(server.asInstanceOf[SupervisorConfig])
supervisor ! Start
state.addSupervisor(supervisor)
})
}
private[supervisor] def spawnLink(serverContainer: GenericServerContainer): GenericServer = {
val newServer = serverContainer.newServer()
newServer.start
self.link(newServer)
log.debug("Linking actor [{}] to supervisor [{}]", newServer, this)
state.addServerContainer(serverContainer)
newServer
}
}
//====================================================
/**
* TODO: document
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
abstract class FaultHandlingStrategy(val maxNrOfRetries: Int, val withinTimeRange: Int) extends Logging {
private[supervisor] var supervisor: Supervisor = _
private var nrOfRetries = 0
private var retryStartTime = currentTime
private[supervisor] def handleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = {
nrOfRetries += 1
if (timeRangeHasExpired) {
if (hasReachedMaximumNrOfRetries) {
log.info("Maximum of restarts [{}] for server [{}] has been reached - the supervisor including all its servers will now be shut down.", maxNrOfRetries, failedServer)
supervisor ! Stop // execution stops here
} else {
nrOfRetries = 0
retryStartTime = currentTime
}
}
doHandleFailure(state, failedServer, reason)
}
private[supervisor] def restart(serverContainer: GenericServerContainer, reason: AnyRef, state: SupervisorState) = {
preRestart(serverContainer)
serverContainer.lock.withWriteLock {
// TODO: this is the place to fail-over all pending messages in the failing actor's mailbox, if possible to get a hold of them
// e.g. something like 'serverContainer.getServer.getPendingMessages.map(newServer ! _)'
self.unlink(serverContainer.getServer)
serverContainer.lifeCycle match {
case None => throw new IllegalStateException("Server [" + serverContainer.id + "] does not have a life-cycle defined.")
case Some(LifeCycle(scope, shutdownTime)) =>
serverContainer.terminate(reason, shutdownTime)
scope match {
case Permanent =>
log.debug("Restarting server [{}] configured as PERMANENT.", serverContainer.id)
serverContainer.reconfigure(reason, supervisor.spawnLink(serverContainer), state.supervisor)
case Temporary =>
if (reason == 'normal) {
log.debug("Restarting server [{}] configured as TEMPORARY (since exited naturally).", serverContainer.id)
serverContainer.reconfigure(reason, supervisor.spawnLink(serverContainer), state.supervisor)
} else log.info("Server [{}] configured as TEMPORARY will not be restarted (received unnatural exit message).", serverContainer.id)
case Transient =>
log.info("Server [{}] configured as TRANSIENT will not be restarted.", serverContainer.id)
}
}
}
postRestart(serverContainer)
}
/**
* To be overriden by concrete strategies.
*/
protected def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef)
/**
* To be overriden by concrete strategies.
*/
protected def preRestart(serverContainer: GenericServerContainer) = {}
/**
* To be overriden by concrete strategies.
*/
protected def postRestart(serverContainer: GenericServerContainer) = {}
private def hasReachedMaximumNrOfRetries: Boolean = nrOfRetries > maxNrOfRetries
private def timeRangeHasExpired: Boolean = (currentTime - retryStartTime) > withinTimeRange
private def currentTime: Long = System.currentTimeMillis
}
//====================================================
/**
* TODO: document
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class AllForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int)
extends FaultHandlingStrategy(maxNrOfRetries, withinTimeRange) {
override def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = {
log.error("Server [{}] has failed due to [{}] - scheduling restart - scheme: ALL_FOR_ONE.", failedServer, reason)
for (serverContainer <- state.serverContainers) restart(serverContainer, reason, state)
state.supervisors.foreach(_ ! Exit(failedServer, reason))
}
}
//====================================================
/**
* TODO: document
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class OneForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int)
extends FaultHandlingStrategy(maxNrOfRetries, withinTimeRange) {
override def doHandleFailure(state: SupervisorState, failedServer: AbstractActor, reason: AnyRef) = {
log.error("Server [{}] has failed due to [{}] - scheduling restart - scheme: ONE_FOR_ONE.", failedServer, reason)
var serverContainer: Option[GenericServerContainer] = None
state.serverContainers.foreach {
container => if (container.getServer == failedServer) serverContainer = Some(container)
}
serverContainer match {
case None => throw new RuntimeException("Could not find a generic server for actor: " + failedServer)
case Some(container) => restart(container, reason, state)
}
}
}
//====================================================
/**
* TODO: document
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
private[supervisor] class SupervisorState(val supervisor: Supervisor, val faultHandler: FaultHandlingStrategy) extends Logging {
faultHandler.supervisor = supervisor
private val _lock = new ReadWriteLock
private val _serverContainerRegistry = new HashMap[String, GenericServerContainer]
private var _supervisors: List[Supervisor] = Nil
def supervisors: List[Supervisor] = _lock.withReadLock {
_supervisors
}
def addSupervisor(supervisor: Supervisor) = _lock.withWriteLock {
_supervisors = supervisor :: _supervisors
}
def serverContainers: List[GenericServerContainer] = _lock.withReadLock {
_serverContainerRegistry.values.toList
}
def getServerContainer(id: String): Option[GenericServerContainer] = _lock.withReadLock {
if (_serverContainerRegistry.contains(id)) Some(_serverContainerRegistry(id))
else None
}
def addServerContainer(serverContainer: GenericServerContainer) = _lock.withWriteLock {
_serverContainerRegistry += serverContainer.id -> serverContainer
}
def removeServerContainer(id: String) = _lock.withWriteLock {
getServerContainer(id) match {
case Some(serverContainer) => _serverContainerRegistry - id
case None => {}
}
}
}

View file

@ -1,202 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
import org.specs.runner.JUnit4
import org.specs.Specification
import scala.actors._
import scala.actors.Actor._
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class GenericServerContainerTest extends JUnit4(genericServerContainerSpec) // for JUnit4 and Maven
object genericServerContainerSpec extends Specification {
var inner: GenericServerContainerActor = null
var server: GenericServerContainer = null
def createProxy(f: () => GenericServer) = {
val server = new GenericServerContainer("server", f)
server.setTimeout(100)
server
}
inner = new GenericServerContainerActor
server = createProxy(() => inner)
server.newServer
server.start
"server should be initialized" in {
server.init("testInit")
Thread.sleep(100)
expect("initializing: testInit") {
inner.log
}
}
"server should terminate with a reason " in {
server.terminate("testTerminateWithReason", 100)
Thread.sleep(100)
expect("terminating: testTerminateWithReason") {
inner.log
}
}
"server respond to async oneway message" in {
server ! OneWay
Thread.sleep(100)
expect("got a oneway") {
inner.log
}
}
"server respond to async ping message" in {
server ! Ping
Thread.sleep(100)
expect("got a ping") {
inner.log
}
}
"server respond to !!!" in {
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
expect("got a ping") {
inner.log
}
}
"server respond to !?" in {
expect("pong") {
val res: String = server !? Ping
res
}
expect("got a ping") {
inner.log
}
}
"server respond to !!! with timeout" in {
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
expect("got a ping") {
inner.log
}
}
"server respond to !!! with timeout" in {
expect("error handler") {
server !!! (OneWay, "error handler")
}
expect("got a oneway") {
inner.log
}
}
"server respond to !!! and return future with timeout" in {
val future = server !! Ping
future.receiveWithin(100) match {
case None => fail("timed out") // timed out
case Some(reply) =>
expect("got a ping") {
inner.log
}
assert("pong" === reply)
}
}
"server respond to !!! and return future with timeout" in {
val future = server !! OneWay
future.receiveWithin(100) match {
case None =>
expect("got a oneway") {
inner.log
}
case Some(reply) =>
fail("expected a timeout, got Some(reply)")
}
}
"server respond do hotswap" in {
// using base
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
// hotswapping
server.hotswap(Some({
case Ping => reply("hotswapped pong")
}))
expect("hotswapped pong") {
(server !!! Ping).getOrElse("nil")
}
}
"server respond do double hotswap" in {
// using base
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
// hotswapping
server.hotswap(Some({
case Ping => reply("hotswapped pong")
}))
expect("hotswapped pong") {
(server !!! Ping).getOrElse("nil")
}
// hotswapping again
server.hotswap(Some({
case Ping => reply("hotswapped pong again")
}))
expect("hotswapped pong again") {
(server !!! Ping).getOrElse("nil")
}
}
"server respond do hotswap and then revert" in {
// using base
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
// hotswapping
server.hotswap(Some({
case Ping => reply("hotswapped pong")
}))
expect("hotswapped pong") {
(server !!! Ping).getOrElse("nil")
}
// restoring original base
server.hotswap(None)
expect("pong") {
(server !!! Ping).getOrElse("nil")
}
}
}
class GenericServerContainerActor extends GenericServer {
var log = ""
override def body: PartialFunction[Any, Unit] = {
case Ping =>
log = "got a ping"
reply("pong")
case OneWay =>
log = "got a oneway"
}
override def init(config: AnyRef) = log = "initializing: " + config
override def shutdown(reason: AnyRef) = log = "terminating: " + reason
}

View file

@ -1,40 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
import org.specs.runner.JUnit4
import org.specs.Specification
import scala.actors._
import scala.actors.Actor._
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class GenericServerTest extends JUnit4(genericServerSpec) // for JUnit4 and Maven
object genericServerSpec extends Specification {
"server should respond to a regular message" in {
val server = new TestGenericServerActor
server.start
server !? Ping match {
case reply: String =>
assert("got a ping" === server.log)
assert("pong" === reply)
case _ => fail()
}
}
}
class TestGenericServerActor extends GenericServer {
var log: String = ""
override def body: PartialFunction[Any, Unit] = {
case Ping =>
log = "got a ping"
reply("pong")
}
}

View file

@ -1,12 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
sealed abstract class TestMessage
case object Ping extends TestMessage
case object Pong extends TestMessage
case object OneWay extends TestMessage
case object Die extends TestMessage
case object NotifySupervisorExit extends TestMessage

View file

@ -1,77 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
import org.specs.runner.JUnit4
import org.specs.Specification
import scala.actors._
import scala.actors.Actor._
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class SupervisorStateTest extends JUnit4(supervisorStateSpec) // for JUnit4 and Maven
object supervisorStateSpec extends Specification {
val dummyActor = new GenericServer { override def body: PartialFunction[Any, Unit] = { case _ => }}
val newDummyActor = () => dummyActor
var state: SupervisorState = _
var proxy: GenericServerContainer = _
var supervisor: Supervisor = _
proxy = new GenericServerContainer("server1", newDummyActor)
object factory extends SupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(AllForOne, 3, 100),
Worker(
proxy,
LifeCycle(Permanent, 100))
:: Nil)
}
}
supervisor = factory.newSupervisor
state = new SupervisorState(supervisor, new AllForOneStrategy(3, 100))
"supervisor state should return added server" in {
state.addServerContainer(proxy)
state.getServerContainer("server1") match {
case None => fail("should have returned server")
case Some(server) =>
assert(server != null)
assert(server.isInstanceOf[GenericServerContainer])
assert(proxy === server)
}
}
"supervisor state should remove added server" in {
state.addServerContainer(proxy)
state.removeServerContainer("server1")
state.getServerContainer("server1") match {
case Some(_) => fail("should have returned None")
case None =>
}
state.getServerContainer("dummyActor") match {
case Some(_) => fail("should have returned None")
case None =>
}
}
"supervisor state should fail getting non-existent server by symbol" in {
state.getServerContainer("server2") match {
case Some(_) => fail("should have returned None")
case None =>
}
}
"supervisor state should fail getting non-existent server by actor" in {
state.getServerContainer("dummyActor") match {
case Some(_) => fail("should have returned None")
case None =>
}
}
}

View file

@ -1,434 +0,0 @@
/**
* Copyright (C) 2009 Scalable Solutions.
*/
package com.scalablesolutions.akka.supervisor
import org.specs.runner.JUnit4
import org.specs.Specification
import scala.actors._
import scala.actors.Actor._
import scala.collection.Map
import scala.collection.mutable.HashMap
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class SupervisorTest extends JUnit4(supervisorSpec) // for JUnit4 and Maven
object supervisorSpec extends Specification {
var messageLog: String = ""
val pingpong1 = new GenericServerContainer("pingpong1", () => new PingPong1Actor)
val pingpong2 = new GenericServerContainer("pingpong2", () => new PingPong2Actor)
val pingpong3 = new GenericServerContainer("pingpong3", () => new PingPong3Actor)
pingpong1.setTimeout(100)
pingpong2.setTimeout(100)
pingpong3.setTimeout(100)
@BeforeMethod
def setup = messageLog = ""
// ===========================================
"starting supervisor should start the servers" in {
val sup = getSingleActorAllForOneSupervisor
sup ! Start
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
}
// ===========================================
"started supervisor should be able to return started servers" in {
val sup = getSingleActorAllForOneSupervisor
sup ! Start
val server = sup.getServerOrElse("pingpong1", throw new RuntimeException("server not found"))
assert(server.isInstanceOf[GenericServerContainer])
assert(server === pingpong1)
}
// ===========================================
"started supervisor should fail returning non-existing server" in {
val sup = getSingleActorAllForOneSupervisor
sup ! Start
intercept(classOf[RuntimeException]) {
sup.getServerOrElse("wrong_name", throw new RuntimeException("server not found"))
}
}
// ===========================================
"supervisor should restart killed server with restart strategy one_for_one" in {
val sup = getSingleActorOneForOneSupervisor
sup ! Start
intercept(classOf[RuntimeException]) {
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("oneforone") {
messageLog
}
}
// ===========================================
"supervisor should restart used killed server with restart strategy one_for_one" in {
val sup = getSingleActorOneForOneSupervisor
sup ! Start
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("ping") {
messageLog
}
intercept(classOf[RuntimeException]) {
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("pingoneforone") {
messageLog
}
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingoneforoneping") {
messageLog
}
}
// ===========================================
"supervisor should restart killed server with restart strategy all_for_one" in {
val sup = getSingleActorAllForOneSupervisor
sup ! Start
intercept(classOf[RuntimeException]) {
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("allforone") {
messageLog
}
}
// ===========================================
"supervisor should restart used killed server with restart strategy all_for_one" in {
val sup = getSingleActorAllForOneSupervisor
sup ! Start
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("ping") {
messageLog
}
intercept(classOf[RuntimeException]) {
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("pingallforone") {
messageLog
}
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingallforoneping") {
messageLog
}
}
// ===========================================
"supervisor should restart killed multiple servers with restart strategy one_for_one" in {
val sup = getMultipleActorsOneForOneConf
sup ! Start
intercept(classOf[RuntimeException]) {
pingpong3 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("oneforone") {
messageLog
}
}
// ===========================================
"supervisor should restart killed multiple servers with restart strategy one_for_one" in {
val sup = getMultipleActorsOneForOneConf
sup ! Start
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong2 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong3 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingpingping") {
messageLog
}
intercept(classOf[RuntimeException]) {
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("pingpingpingoneforone") {
messageLog
}
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong2 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong3 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingpingpingoneforonepingpingping") {
messageLog
}
}
// ===========================================
"supervisor should restart killed muliple servers with restart strategy all_for_one" in {
val sup = getMultipleActorsAllForOneConf
sup ! Start
intercept(classOf[RuntimeException]) {
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("allforoneallforoneallforone") {
messageLog
}
}
// ===========================================
"supervisor should restart killed muliple servers with restart strategy all_for_one" in {
val sup = getMultipleActorsAllForOneConf
sup ! Start
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong2 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong3 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingpingping") {
messageLog
}
intercept(classOf[RuntimeException]) {
pingpong2 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("pingpingpingallforoneallforoneallforone") {
messageLog
}
expect("pong") {
(pingpong1 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong2 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pong") {
(pingpong3 !!! Ping).getOrElse("nil")
}
Thread.sleep(100)
expect("pingpingpingallforoneallforoneallforonepingpingping") {
messageLog
}
}
"supervisor should restart killed first-level server with restart strategy all_for_one" in {
val sup = getNestedSupervisorsAllForOneConf
sup ! Start
intercept(classOf[RuntimeException]) {
pingpong1 !!! (Die, throw new RuntimeException("TIME OUT"))
}
Thread.sleep(100)
expect("allforoneallforoneallforone") {
messageLog
}
}
// =============================================
// Creat some supervisors with different configurations
def getSingleActorAllForOneSupervisor: Supervisor = {
// Create an abstract SupervisorContainer that works for all implementations
// of the different Actors (Services).
//
// Then create a concrete container in which we mix in support for the specific
// implementation of the Actors we want to use.
object factory extends TestSupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(AllForOne, 3, 100),
Worker(
pingpong1,
LifeCycle(Permanent, 100))
:: Nil)
}
}
factory.newSupervisor
}
def getSingleActorOneForOneSupervisor: Supervisor = {
object factory extends TestSupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(OneForOne, 3, 100),
Worker(
pingpong1,
LifeCycle(Permanent, 100))
:: Nil)
}
}
factory.newSupervisor
}
def getMultipleActorsAllForOneConf: Supervisor = {
object factory extends TestSupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(AllForOne, 3, 100),
Worker(
pingpong1,
LifeCycle(Permanent, 100))
::
Worker(
pingpong2,
LifeCycle(Permanent, 100))
::
Worker(
pingpong3,
LifeCycle(Permanent, 100))
:: Nil)
}
}
factory.newSupervisor
}
def getMultipleActorsOneForOneConf: Supervisor = {
object factory extends TestSupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(OneForOne, 3, 100),
Worker(
pingpong1,
LifeCycle(Permanent, 100))
::
Worker(
pingpong2,
LifeCycle(Permanent, 100))
::
Worker(
pingpong3,
LifeCycle(Permanent, 100))
:: Nil)
}
}
factory.newSupervisor
}
def getNestedSupervisorsAllForOneConf: Supervisor = {
object factory extends TestSupervisorFactory {
override def getSupervisorConfig: SupervisorConfig = {
SupervisorConfig(
RestartStrategy(AllForOne, 3, 100),
Worker(
pingpong1,
LifeCycle(Permanent, 100))
::
SupervisorConfig(
RestartStrategy(AllForOne, 3, 100),
Worker(
pingpong2,
LifeCycle(Permanent, 100))
::
Worker(
pingpong3,
LifeCycle(Permanent, 100))
:: Nil)
:: Nil)
}
}
factory.newSupervisor
}
class PingPong1Actor extends GenericServer {
override def body: PartialFunction[Any, Unit] = {
case Ping =>
messageLog += "ping"
reply("pong")
case Die =>
throw new RuntimeException("Recieved Die message")
}
}
class PingPong2Actor extends GenericServer {
override def body: PartialFunction[Any, Unit] = {
case Ping =>
messageLog += "ping"
reply("pong")
case Die =>
throw new RuntimeException("Recieved Die message")
}
}
class PingPong3Actor extends GenericServer {
override def body: PartialFunction[Any, Unit] = {
case Ping =>
messageLog += "ping"
reply("pong")
case Die =>
throw new RuntimeException("Recieved Die message")
}
}
// =============================================
class TestAllForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends AllForOneStrategy(maxNrOfRetries, withinTimeRange) {
override def postRestart(serverContainer: GenericServerContainer) = {
messageLog += "allforone"
}
}
class TestOneForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends OneForOneStrategy(maxNrOfRetries, withinTimeRange) {
override def postRestart(serverContainer: GenericServerContainer) = {
messageLog += "oneforone"
}
}
abstract class TestSupervisorFactory extends SupervisorFactory {
override def create(strategy: RestartStrategy): Supervisor = strategy match {
case RestartStrategy(scheme, maxNrOfRetries, timeRange) =>
scheme match {
case AllForOne => new Supervisor(new TestAllForOneStrategy(maxNrOfRetries, timeRange))
case OneForOne => new Supervisor(new TestOneForOneStrategy(maxNrOfRetries, timeRange))
}
}
}
}