completed protobuf protocol for remoting

This commit is contained in:
jboner 2009-07-18 00:16:32 +02:00
parent a4d22af64b
commit f26110e55c
23 changed files with 795 additions and 385 deletions

15
LICENSE Normal file
View file

@ -0,0 +1,15 @@
This software is licensed under the Apache 2 license, quoted below.
Copyright 2009 Scalable Solutions AB <http://scalablesolutions.se>
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy of
the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations under
the License.

View file

@ -1202,17 +1202,6 @@
<root url="jar://$MAVEN_REPOSITORY$/org/scala-tools/testing/scalatest/0.9.5/scalatest-0.9.5-sources.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/org/scala-tools/testing/scalatest/0.9.5/scalatest-0.9.5-sources.jar!/" />
</SOURCES> </SOURCES>
</library> </library>
<library name="Maven: com.jteigen.scalatest:junit4runner:1.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/jteigen/scalatest/junit4runner/1.0/junit4runner-1.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/jteigen/scalatest/junit4runner/1.0/junit4runner-1.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/jteigen/scalatest/junit4runner/1.0/junit4runner-1.0-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.scala-lang:scala-library:2.7.5"> <library name="Maven: org.scala-lang:scala-library:2.7.5">
<CLASSES> <CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.7.5/scala-library-2.7.5.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.7.5/scala-library-2.7.5.jar!/" />
@ -1445,6 +1434,17 @@
<root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/2.1.0/protobuf-java-2.1.0-sources.jar!/" /> <root url="jar://$MAVEN_REPOSITORY$/com/google/protobuf/protobuf-java/2.1.0/protobuf-java-2.1.0-sources.jar!/" />
</SOURCES> </SOURCES>
</library> </library>
<library name="Maven: sbinary:sbinary:0.3-alpha">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/sbinary/sbinary/0.3-alpha/sbinary-0.3-alpha.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/sbinary/sbinary/0.3-alpha/sbinary-0.3-alpha-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/sbinary/sbinary/0.3-alpha/sbinary-0.3-alpha-sources.jar!/" />
</SOURCES>
</library>
</component> </component>
<UsedPathMacros> <UsedPathMacros>
<macro name="MAVEN_REPOSITORY" description="Maven Local Repostiry" /> <macro name="MAVEN_REPOSITORY" description="Maven Local Repostiry" />

592
akka.iws
View file

@ -9,21 +9,24 @@
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/akka-kernel.iml" afterPath="$PROJECT_DIR$/kernel/akka-kernel.iml" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/akka-kernel.iml" afterPath="$PROJECT_DIR$/kernel/akka-kernel.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/akka-util-java-0.5.jar" afterPath="$PROJECT_DIR$/lib/akka-util-java-0.5.jar" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/akka-util-java-0.5.jar" afterPath="$PROJECT_DIR$/lib/akka-util-java-0.5.jar" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/fun-test-java/akka-fun-test-java.iml" afterPath="$PROJECT_DIR$/fun-test-java/akka-fun-test-java.iml" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/fun-test-java/akka-fun-test-java.iml" afterPath="$PROJECT_DIR$/fun-test-java/akka-fun-test-java.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/test/scala/RemoteActorSpec.scala" afterPath="$PROJECT_DIR$/kernel/src/test/scala/RemoteActorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala" afterPath="$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/samples-scala/akka-samples-scala.iml" afterPath="$PROJECT_DIR$/samples-scala/akka-samples-scala.iml" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/samples-scala/akka-samples-scala.iml" afterPath="$PROJECT_DIR$/samples-scala/akka-samples-scala.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.ipr" afterPath="$PROJECT_DIR$/akka.ipr" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.ipr" afterPath="$PROJECT_DIR$/akka.ipr" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/test/scala/CamelSpec.scala" afterPath="$PROJECT_DIR$/kernel/src/test/scala/CamelSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/util-java/akka-util-java.iml" afterPath="$PROJECT_DIR$/util-java/akka-util-java.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/pom.xml" afterPath="$PROJECT_DIR$/kernel/pom.xml" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/pom.xml" afterPath="$PROJECT_DIR$/kernel/pom.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java" afterPath="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto" afterPath="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto" afterPath="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/util-java/pom.xml" afterPath="$PROJECT_DIR$/util-java/pom.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" afterPath="$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" />
<change type="DELETED" beforePath="$PROJECT_DIR$/lib/protobuf-java-2.0.3.jar" afterPath="" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/test/scala/RemoteSupervisorSpec.scala" afterPath="$PROJECT_DIR$/kernel/src/test/scala/RemoteSupervisorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/samples-java/akka-samples-java.iml" afterPath="$PROJECT_DIR$/samples-java/akka-samples-java.iml" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/samples-java/akka-samples-java.iml" afterPath="$PROJECT_DIR$/samples-java/akka-samples-java.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/README.textile" afterPath="$PROJECT_DIR$/README.textile" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/kernel/src/test/scala/JerseySpec.scala" afterPath="$PROJECT_DIR$/kernel/src/test/scala/JerseySpec.scala" />
</list> </list>
<list readonly="true" id="6e842704-fac6-40e9-8a67-d02385f87db9" name="Default" comment="&#10;# Brief commit desciption here&#10;&#10;# Full commit description here (comment lines starting with '#' will not be included)&#10;&#10;" /> <list readonly="true" id="6e842704-fac6-40e9-8a67-d02385f87db9" name="Default" comment="&#10;# Brief commit desciption here&#10;&#10;# Full commit description here (comment lines starting with '#' will not be included)&#10;&#10;" />
<ignored path=".idea/workspace.xml" /> <ignored path=".idea/workspace.xml" />
@ -44,7 +47,46 @@
</component> </component>
<component name="DebuggerManager"> <component name="DebuggerManager">
<line_breakpoints> <line_breakpoints>
<breakpoint url="file://$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala" line="48" class="Class at Serializer.scala:48" package=""> <breakpoint url="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" line="118" class="Class at RemoteServer.scala:118" package="">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
<breakpoint url="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" line="111" class="Class at RemoteServer.scala:111" package="">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
<breakpoint url="file://$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" line="434" class="Class at Actor.scala:430" package="">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
<breakpoint url="file://$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" line="413" class="Class at Actor.scala:409" package="">
<option name="ENABLED" value="true" /> <option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" /> <option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" /> <option name="LOG_EXPRESSION_ENABLED" value="false" />
@ -120,82 +162,10 @@
<component name="FileColors" enabled="false" enabledForTabs="false" /> <component name="FileColors" enabled="false" enabledForTabs="false" />
<component name="FileEditorManager"> <component name="FileEditorManager">
<leaf> <leaf>
<file leaf-file-name="ActiveObject.scala" pinned="false" current="false" current-in-tab="false"> <file leaf-file-name="RemoteSupervisorSpec.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala"> <entry file="file://$PROJECT_DIR$/kernel/src/test/scala/RemoteSupervisorSpec.scala">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="12" column="56" selection-start="362" selection-end="362" vertical-scroll-proportion="0.0"> <state line="22" column="6" selection-start="544" selection-end="544" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="README.textile" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/README.textile">
<provider selected="true" editor-type-id="text-editor">
<state line="52" column="22" selection-start="3243" selection-end="3243" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="pom.xml" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state line="47" column="84" selection-start="1657" selection-end="1657" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="pom.xml" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/util-java/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="24" selection-start="954" selection-end="954" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteClient.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="154" column="0" selection-start="6361" selection-end="6361" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteServer.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="112" column="0" selection-start="4564" selection-end="4765" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteProtocol.proto" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto">
<provider selected="true" editor-type-id="text-editor">
<state line="51" column="33" selection-start="1162" selection-end="1162" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RequestReply.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="15" column="20" selection-start="325" selection-end="325" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Actor.scala" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="396" column="29" selection-start="14373" selection-end="14373" vertical-scroll-proportion="8.775623">
<folding /> <folding />
</state> </state>
</provider> </provider>
@ -204,7 +174,79 @@
<file leaf-file-name="Serializer.scala" pinned="false" current="false" current-in-tab="false"> <file leaf-file-name="Serializer.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala"> <entry file="file://$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="42" column="21" selection-start="1093" selection-end="1107" vertical-scroll-proportion="0.0"> <state line="68" column="12" selection-start="2009" selection-end="2009" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteServer.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="182" column="3" selection-start="8098" selection-end="8098" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="SimpleChannelUpstreamHandler.java" pinned="false" current="false" current-in-tab="false">
<entry file="jar://$MAVEN_REPOSITORY$/org/jboss/netty/netty/3.1.0.CR1/netty-3.1.0.CR1-sources.jar!/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java">
<provider selected="true" editor-type-id="text-editor">
<state line="132" column="0" selection-start="5170" selection-end="5170" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Actor.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="36" column="62" selection-start="1366" selection-end="1366" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="pom.xml" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/kernel/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state line="81" column="24" selection-start="2869" selection-end="2869" vertical-scroll-proportion="0.3256445">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteProtocol.proto" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="0" selection-start="990" selection-end="990" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ActiveObject.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="441" column="48" selection-start="20020" selection-end="20020" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RequestReply.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="14" column="63" selection-start="398" selection-end="398" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteClient.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="142" column="35" selection-start="5897" selection-end="5907" vertical-scroll-proportion="0.0">
<folding /> <folding />
</state> </state>
</provider> </provider>
@ -223,22 +265,22 @@
<component name="IdeDocumentHistory"> <component name="IdeDocumentHistory">
<option name="changedFiles"> <option name="changedFiles">
<list> <list>
<option value="$PROJECT_DIR$/kernel/src/main/scala/state/CassandraStorage.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/jersey/NodeWriter.scala" />
<option value="$PROJECT_DIR$/config/akka-reference.conf" />
<option value="$PROJECT_DIR$/README" />
<option value="$PROJECT_DIR$/config/storage-conf.xml" />
<option value="$PROJECT_DIR$/samples-scala/src/main/scala/SimpleService.scala" /> <option value="$PROJECT_DIR$/samples-scala/src/main/scala/SimpleService.scala" />
<option value="$PROJECT_DIR$/README.textile" />
<option value="$PROJECT_DIR$/util-java/pom.xml" />
<option value="$PROJECT_DIR$/kernel/src/test/scala/SupervisorSpec.scala" />
<option value="$PROJECT_DIR$/kernel/src/test/scala/RemoteSupervisorSpec.scala" />
<option value="$PROJECT_DIR$/kernel/src/test/scala/CamelSpec.scala" />
<option value="$PROJECT_DIR$/kernel/src/test/scala/JerseySpec.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala" /> <option value="$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala" />
<option value="$PROJECT_DIR$/kernel/src/test/scala/RemoteActorSpec.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala" />
<option value="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto" /> <option value="$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" /> <option value="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala" />
<option value="$PROJECT_DIR$/README.textile" />
<option value="$PROJECT_DIR$/kernel/pom.xml" />
<option value="$PROJECT_DIR$/util-java/pom.xml" />
<option value="$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" /> <option value="$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala" />
<option value="$PROJECT_DIR$/kernel/pom.xml" />
</list> </list>
</option> </option>
</component> </component>
@ -303,6 +345,88 @@
<option name="myItemId" value="akka-util-java" /> <option name="myItemId" value="akka-util-java" />
<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_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</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-util-java" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Maven: com.google.protobuf:protobuf-java:2.1.0" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="protobuf-java-2.1.0.jar" />
<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-util-java" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Maven: com.google.protobuf:protobuf-java:2.1.0" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="protobuf-java-2.1.0.jar" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="protobuf" />
<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-util-java" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Maven: com.google.protobuf:protobuf-java:2.1.0" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="protobuf-java-2.1.0.jar" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="protobuf" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ByteString" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ClassTreeNode" />
</PATH_ELEMENT>
</PATH> </PATH>
<PATH> <PATH>
<PATH_ELEMENT> <PATH_ELEMENT>
@ -473,6 +597,10 @@
<option name="myItemId" value="akka-kernel" /> <option name="myItemId" value="akka-kernel" />
<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_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
</PATH> </PATH>
<PATH> <PATH>
<PATH_ELEMENT> <PATH_ELEMENT>
@ -505,6 +633,14 @@
<option name="myItemId" value="src" /> <option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT> </PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="test" />
<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>
<PATH_ELEMENT> <PATH_ELEMENT>
@ -562,6 +698,36 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</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-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_ELEMENT>
<option name="myItemId" value="reactor" />
<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" />
@ -622,6 +788,36 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</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-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_ELEMENT>
<option name="myItemId" value="config" />
<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" />
@ -707,6 +903,92 @@
<option name="myItemId" value="akka" /> <option name="myItemId" value="akka" />
<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_ELEMENT>
<option name="myItemId" value="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="&lt; 1.6 &gt;" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</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="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="&lt; 1.6 &gt;" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="classes.jar" />
<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="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="&lt; 1.6 &gt;" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="classes.jar" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="lang" />
<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="Libraries" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.LibraryGroupNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="&lt; 1.6 &gt;" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="classes.jar" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="lang" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="RuntimeException" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ClassTreeNode" />
</PATH_ELEMENT>
</PATH> </PATH>
<PATH> <PATH>
<PATH_ELEMENT> <PATH_ELEMENT>
@ -788,7 +1070,7 @@
<recent name="actor" /> <recent name="actor" />
</key> </key>
</component> </component>
<component name="RunManager" selected="JUnit.All Tests Java"> <component name="RunManager" selected="JUnit.RemoteSupervisorSpec">
<configuration default="false" name="InMemoryStateTest.testRefShouldRollbackStateForStatefulServerInCaseOfFailure" type="JUnit" factoryName="JUnit" temporary="true" enabled="false" merge="false" sample_coverage="true" runner="emma"> <configuration default="false" name="InMemoryStateTest.testRefShouldRollbackStateForStatefulServerInCaseOfFailure" type="JUnit" factoryName="JUnit" temporary="true" enabled="false" merge="false" sample_coverage="true" runner="emma">
<pattern> <pattern>
<option name="PATTERN" value="se.scalablesolutions.akka.api.*" /> <option name="PATTERN" value="se.scalablesolutions.akka.api.*" />
@ -1964,9 +2246,8 @@
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32749078" sideWeight="0.5" order="9" side_tool="false" /> <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32749078" sideWeight="0.5" order="9" side_tool="false" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4362245" sideWeight="0.0" order="2" side_tool="false" x="4" y="22" width="1436" height="878" /> <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4362245" sideWeight="0.0" order="2" side_tool="false" x="4" y="22" width="1436" height="878" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32749078" sideWeight="0.5" order="6" side_tool="false" /> <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32749078" sideWeight="0.5" order="6" side_tool="false" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.23576063" sideWeight="0.55484694" order="1" side_tool="false" /> <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.18529199" sideWeight="0.55484694" order="1" side_tool="false" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39795917" sideWeight="0.5" order="3" side_tool="false" /> <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39795917" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32142857" 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.16818425" sideWeight="0.24354243" order="0" side_tool="true" x="1609" y="144" width="252" height="862" /> <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.16818425" sideWeight="0.24354243" order="0" side_tool="true" x="1609" y="144" width="252" height="862" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32694763" sideWeight="0.5" order="13" side_tool="false" /> <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32694763" sideWeight="0.5" order="13" side_tool="false" />
<window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32822478" sideWeight="0.5" order="16" side_tool="false" /> <window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32822478" sideWeight="0.5" order="16" side_tool="false" />
@ -1978,8 +2259,9 @@
<window_info id="Clojure REPL" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32749078" sideWeight="0.5" order="8" side_tool="false" /> <window_info id="Clojure REPL" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32749078" sideWeight="0.5" order="8" side_tool="false" />
<window_info id="Data Sources" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3294881" sideWeight="0.6875" 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.3294881" sideWeight="0.6875" order="3" side_tool="false" />
<window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.26479077" sideWeight="0.24617347" order="2" side_tool="true" /> <window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.26479077" sideWeight="0.24617347" order="2" side_tool="true" />
<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="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32142857" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3265306" sideWeight="0.0" order="14" side_tool="false" /> <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3265306" sideWeight="0.0" order="14" 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="FindBugs-IDEA" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32976654" sideWeight="0.5" order="12" 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="12" 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="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" />
@ -2021,116 +2303,114 @@
<option name="FILTER_TARGETS" value="false" /> <option name="FILTER_TARGETS" value="false" />
</component> </component>
<component name="editorHistoryManager"> <component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="14" selection-start="1697" selection-end="1697" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/jersey/NodeWriter.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="17" column="6" selection-start="379" selection-end="379" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config/storage-conf.xml">
<provider selected="true" editor-type-id="text-editor">
<state line="49" column="0" selection-start="1853" selection-end="1853" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/stm/Transaction.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="58" column="0" selection-start="1705" selection-end="1705" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/samples-scala/src/main/scala/SimpleService.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="29" column="50" selection-start="911" selection-end="911" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java"> <entry file="file://$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="327" column="31" selection-start="13195" selection-end="13195" vertical-scroll-proportion="0.0"> <state line="305" column="0" selection-start="12209" selection-end="12209" vertical-scroll-proportion="0.0">
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto"> <entry file="file://$PROJECT_DIR$/kernel/src/test/scala/JerseySpec.scala">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="51" column="33" selection-start="1162" selection-end="1162" vertical-scroll-proportion="0.0"> <state line="21" column="3" selection-start="587" selection-end="587" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="jar:///System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/../Classes/classes.jar!/java/lang/RuntimeException.class">
<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>
<entry file="jar://$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.7.5/scala-library-2.7.5-sources.jar!/scala/Predef.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="50" column="60" selection-start="1908" selection-end="1908" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/reactor/Future.scala">
<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>
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/RemoteActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="6" selection-start="652" selection-end="652" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/test/scala/RemoteSupervisorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="6" selection-start="544" selection-end="544" vertical-scroll-proportion="0.0">
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala"> <entry file="file://$PROJECT_DIR$/kernel/src/main/scala/util/Serializer.scala">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="42" column="21" selection-start="1093" selection-end="1107" vertical-scroll-proportion="0.0"> <state line="68" column="12" selection-start="2009" selection-end="2009" vertical-scroll-proportion="0.0">
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala"> <entry file="jar://$MAVEN_REPOSITORY$/org/jboss/netty/netty/3.1.0.CR1/netty-3.1.0.CR1-sources.jar!/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="15" column="20" selection-start="325" selection-end="325" vertical-scroll-proportion="0.0"> <state line="132" column="0" selection-start="5170" selection-end="5170" vertical-scroll-proportion="0.0">
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala"> <entry file="file://$PROJECT_DIR$/util-java/src/main/java/se/scalablesolutions/akka/kernel/nio/protobuf/RemoteProtocol.proto">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="154" column="0" selection-start="6361" selection-end="6361" vertical-scroll-proportion="0.0"> <state line="46" column="0" selection-start="990" selection-end="990" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="112" column="0" selection-start="4564" selection-end="4765" vertical-scroll-proportion="0.0">
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala"> <entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/ActiveObject.scala">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="12" column="56" selection-start="362" selection-end="362" vertical-scroll-proportion="0.0"> <state line="441" column="48" selection-start="20020" selection-end="20020" vertical-scroll-proportion="0.0">
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/README.textile"> <entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RequestReply.scala">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="52" column="22" selection-start="3243" selection-end="3243" vertical-scroll-proportion="0.0"> <state line="14" column="63" selection-start="398" selection-end="398" vertical-scroll-proportion="0.0">
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/util-java/pom.xml"> <entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteClient.scala">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="27" column="24" selection-start="954" selection-end="954" vertical-scroll-proportion="0.0"> <state line="142" column="35" selection-start="5897" selection-end="5907" vertical-scroll-proportion="0.0">
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/kernel/pom.xml"> <entry file="file://$PROJECT_DIR$/kernel/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="47" column="84" selection-start="1657" selection-end="1657" vertical-scroll-proportion="0.0"> <state line="182" column="3" selection-start="8098" selection-end="8098" vertical-scroll-proportion="0.0">
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala"> <entry file="file://$PROJECT_DIR$/kernel/src/main/scala/actor/Actor.scala">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state line="396" column="29" selection-start="14373" selection-end="14373" vertical-scroll-proportion="8.775623"> <state line="36" column="62" selection-start="1366" selection-end="1366" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/kernel/pom.xml">
<provider selected="true" editor-type-id="text-editor">
<state line="81" column="24" selection-start="2869" selection-end="2869" vertical-scroll-proportion="0.3256445">
<folding /> <folding />
</state> </state>
</provider> </provider>

View file

@ -41,6 +41,7 @@
<orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: sbinary:sbinary:0.3-alpha" level="project" />
<orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" /> <orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" />

View file

@ -57,6 +57,7 @@
<orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: sbinary:sbinary:0.3-alpha" level="project" />
<orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" /> <orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" />
@ -82,7 +83,6 @@
<orderEntry type="library" exported="" name="Maven: org.slf4j:slf4j-api:1.4.3" level="project" /> <orderEntry type="library" exported="" name="Maven: org.slf4j:slf4j-api:1.4.3" level="project" />
<orderEntry type="library" exported="" name="Maven: log4j:log4j:1.2.13" level="project" /> <orderEntry type="library" exported="" name="Maven: log4j:log4j:1.2.13" level="project" />
<orderEntry type="library" name="Maven: org.scala-tools.testing:scalatest:0.9.5" level="project" /> <orderEntry type="library" name="Maven: org.scala-tools.testing:scalatest:0.9.5" level="project" />
<orderEntry type="library" name="Maven: com.jteigen.scalatest:junit4runner:1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: com.sun.jersey:jersey-client:1.1.0-ea" level="project" /> <orderEntry type="library" exported="" name="Maven: com.sun.jersey:jersey-client:1.1.0-ea" level="project" />
</component> </component>
</module> </module>

View file

@ -76,6 +76,11 @@
<artifactId>protobuf-java</artifactId> <artifactId>protobuf-java</artifactId>
<version>2.1.0</version> <version>2.1.0</version>
</dependency> </dependency>
<dependency>
<groupId>sbinary</groupId>
<artifactId>sbinary</artifactId>
<version>0.3</version>
</dependency>
<!-- For Cassandra --> <!-- For Cassandra -->
<dependency> <dependency>
@ -155,12 +160,12 @@
<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</version> <version>1.0</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency-->
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>

View file

@ -4,16 +4,16 @@
package se.scalablesolutions.akka.kernel.actor package se.scalablesolutions.akka.kernel.actor
import com.google.protobuf.ByteString
import java.io.File import java.io.File
import java.lang.reflect.{InvocationTargetException, Method} import java.lang.reflect.{InvocationTargetException, Method}
import java.net.InetSocketAddress import java.net.InetSocketAddress
import kernel.config.ScalaConfig._ import kernel.config.ScalaConfig._
import kernel.reactor.{MessageDispatcher, FutureResult} import kernel.reactor.{MessageDispatcher, FutureResult}
import kernel.util.{HashCode, Serializer, JSONSerializer} import kernel.util.{HashCode, Serializer, JavaJSONSerializer}
import kernel.nio.RemoteRequestIdFactory import kernel.nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
import kernel.config.JavaConfig.RestartCallbacks import kernel.nio.{RemoteClient, RemoteServer, RemoteRequestIdFactory}
import kernel.nio.protobuf.RemoteProtocol.RemoteRequest
import org.codehaus.aspectwerkz.intercept.{Advisable, AroundAdvice} import org.codehaus.aspectwerkz.intercept.{Advisable, AroundAdvice}
import org.codehaus.aspectwerkz.joinpoint.{MethodRtti, JoinPoint} import org.codehaus.aspectwerkz.joinpoint.{MethodRtti, JoinPoint}
@ -38,8 +38,6 @@ object Annotations {
*/ */
class ActiveObjectFactory { class ActiveObjectFactory {
protected[this] val serializer: Serializer = JSONSerializer
// FIXME How to pass the MessageDispatcher on from active object to child??????? // FIXME How to pass the MessageDispatcher on from active object to child???????
def newInstance[T](target: Class[T], timeout: Long): T = def newInstance[T](target: Class[T], timeout: Long): T =
@ -257,6 +255,8 @@ sealed class ActorAroundAdvice(val target: Class[_],
val actor: Dispatcher, val actor: Dispatcher,
val remoteAddress: Option[InetSocketAddress], val remoteAddress: Option[InetSocketAddress],
val timeout: Long) extends AroundAdvice { val timeout: Long) extends AroundAdvice {
private val serializer: Serializer = JavaJSONSerializer
val id = target.getName val id = target.getName
actor.timeout = timeout actor.timeout = timeout
actor.start actor.start
@ -281,19 +281,24 @@ sealed class ActorAroundAdvice(val target: Class[_],
private def remoteDispatch(joinpoint: JoinPoint): AnyRef = { private def remoteDispatch(joinpoint: JoinPoint): AnyRef = {
val rtti = joinpoint.getRtti.asInstanceOf[MethodRtti] val rtti = joinpoint.getRtti.asInstanceOf[MethodRtti]
val oneWay = isOneWay(rtti) val oneWay = isOneWay(rtti)
val message = rtti.getParameterValues val (message: AnyRef, isEscaped) = escapeArguments(rtti.getParameterValues)
val supervisorId = {
val id = actor.registerSupervisorAsRemoteActor
if (id.isDefined) id.get
else null
}
val request = RemoteRequest.newBuilder val request = RemoteRequest.newBuilder
.setId(RemoteRequestIdFactory.nextId) .setId(RemoteRequestIdFactory.nextId)
.setMessage(serializer.out(message)) .setMessage(ByteString.copyFrom(serializer.out(message)))
.setMessageType(message.getClass.getName) .setMessageType(message.getClass.getName)
.setMethod(rtti.getMethod.getName) .setMethod(rtti.getMethod.getName)
.setTarget(target.getName) .setTarget(target.getName)
.setTimeout(timeout) .setTimeout(timeout)
.setSupervisorUuid(actor.registerSupervisorAsRemoteActor) .setSupervisorUuid(supervisorId)
.setIsActor(false) .setIsActor(false)
.setIsOneWay(oneWay) .setIsOneWay(oneWay)
.setIsEscaped(false) .setIsEscaped(false)
.build .build
val future = RemoteClient.clientFor(remoteAddress.get).send(request) val future = RemoteClient.clientFor(remoteAddress.get).send(request)
if (oneWay) null // for void methods if (oneWay) null // for void methods
else { else {
@ -315,6 +320,18 @@ sealed class ActorAroundAdvice(val target: Class[_],
private def isOneWay(rtti: MethodRtti) = private def isOneWay(rtti: MethodRtti) =
rtti.getMethod.getReturnType == java.lang.Void.TYPE || rtti.getMethod.getReturnType == java.lang.Void.TYPE ||
rtti.getMethod.isAnnotationPresent(Annotations.oneway) rtti.getMethod.isAnnotationPresent(Annotations.oneway)
private def escapeArguments(args: Array[Object]): Tuple2[Array[Object], Boolean] = {
var isEscaped = false
val escapedArgs = for (arg <- args) yield {
val clazz = arg.getClass
if (clazz.getName.contains("$$ProxiedByAW")) {
isEscaped = true
"$$ProxiedByAW" + clazz.getSuperclass.getName
} else arg
}
(escapedArgs, isEscaped)
}
} }
/** /**
@ -414,12 +431,14 @@ private[kernel] class Dispatcher(val callbacks: Option[RestartCallbacks]) extend
var hasMutableArgument = false var hasMutableArgument = false
for (arg <- args.toList) { for (arg <- args.toList) {
if (!arg.isInstanceOf[String] && if (!arg.isInstanceOf[String] &&
!arg.isInstanceOf[Byte] &&
!arg.isInstanceOf[Int] && !arg.isInstanceOf[Int] &&
!arg.isInstanceOf[Long] && !arg.isInstanceOf[Long] &&
!arg.isInstanceOf[Float] && !arg.isInstanceOf[Float] &&
!arg.isInstanceOf[Double] && !arg.isInstanceOf[Double] &&
!arg.isInstanceOf[Boolean] && !arg.isInstanceOf[Boolean] &&
!arg.isInstanceOf[Char] && !arg.isInstanceOf[Char] &&
!arg.isInstanceOf[java.lang.Byte] &&
!arg.isInstanceOf[java.lang.Integer] && !arg.isInstanceOf[java.lang.Integer] &&
!arg.isInstanceOf[java.lang.Long] && !arg.isInstanceOf[java.lang.Long] &&
!arg.isInstanceOf[java.lang.Float] && !arg.isInstanceOf[java.lang.Float] &&

View file

@ -4,6 +4,7 @@
package se.scalablesolutions.akka.kernel.actor package se.scalablesolutions.akka.kernel.actor
import com.google.protobuf.ByteString
import java.net.InetSocketAddress import java.net.InetSocketAddress
import java.util.concurrent.CopyOnWriteArraySet import java.util.concurrent.CopyOnWriteArraySet
@ -11,9 +12,10 @@ import kernel.reactor._
import kernel.config.ScalaConfig._ import kernel.config.ScalaConfig._
import kernel.stm.TransactionManagement import kernel.stm.TransactionManagement
import kernel.util.Helpers.ReadWriteLock import kernel.util.Helpers.ReadWriteLock
import kernel.util.{Serializer, JSONSerializer, Logging} import kernel.util.{Serializer, ScalaJSONSerializer, Logging}
import kernel.nio._
import kernel.nio.protobuf._ import kernel.nio.protobuf._
import kernel.nio.{RemoteServer, RemoteClient, RemoteRequestIdFactory}
import nio.protobuf.RemoteProtocol.RemoteRequest import nio.protobuf.RemoteProtocol.RemoteRequest
sealed abstract class LifecycleMessage sealed abstract class LifecycleMessage
@ -34,6 +36,10 @@ class ActorMessageInvoker(val actor: Actor) extends MessageInvoker {
def invoke(handle: MessageInvocation) = actor.invoke(handle) def invoke(handle: MessageInvocation) = actor.invoke(handle)
} }
def deserialize(array : Array[Byte]) : MediaContent = fromByteArray[MediaContent](array)
def serialize(content : MediaContent) : Array[Byte] = toByteArray(content)
object Actor { object Actor {
val TIMEOUT = kernel.Kernel.config.getInt("akka.actor.timeout", 5000) val TIMEOUT = kernel.Kernel.config.getInt("akka.actor.timeout", 5000)
val SERIALIZE_MESSAGES = kernel.Kernel.config.getBool("akka.actor.serialize-messages", false) val SERIALIZE_MESSAGES = kernel.Kernel.config.getBool("akka.actor.serialize-messages", false)
@ -44,6 +50,7 @@ trait Actor extends Logging with TransactionManagement {
private[this] val remoteFlagLock = new ReadWriteLock private[this] val remoteFlagLock = new ReadWriteLock
private[this] val transactionalFlagLock = new ReadWriteLock private[this] val transactionalFlagLock = new ReadWriteLock
private var hotswap: Option[PartialFunction[Any, Unit]] = None private var hotswap: Option[PartialFunction[Any, Unit]] = None
private var config: Option[AnyRef] = None private var config: Option[AnyRef] = None
@volatile protected[this] var isTransactional = false @volatile protected[this] var isTransactional = false
@ -54,7 +61,7 @@ trait Actor extends Logging with TransactionManagement {
protected[this] val linkedActors = new CopyOnWriteArraySet[Actor] protected[this] val linkedActors = new CopyOnWriteArraySet[Actor]
protected[actor] var lifeCycleConfig: Option[LifeCycle] = None protected[actor] var lifeCycleConfig: Option[LifeCycle] = None
protected[this] val serializer: Serializer = JSONSerializer protected[this] val serializer: Serializer = ScalaJSONSerializer
// ==================================== // ====================================
// ==== USER CALLBACKS TO OVERRIDE ==== // ==== USER CALLBACKS TO OVERRIDE ====
@ -312,6 +319,7 @@ trait Actor extends Logging with TransactionManagement {
if (!linkedActors.contains(actor)) throw new IllegalStateException("Actor [" + actor + "] is not a linked actor, can't unlink") if (!linkedActors.contains(actor)) throw new IllegalStateException("Actor [" + actor + "] is not a linked actor, can't unlink")
linkedActors.remove(actor) linkedActors.remove(actor)
actor.supervisor = None actor.supervisor = None
log.debug("Unlinking actor [%s] from actor [%s]", actor, this) log.debug("Unlinking actor [%s] from actor [%s]", actor, this)
} else throw new IllegalStateException("Actor has not been started, you need to invoke 'actor.start' before using it") } else throw new IllegalStateException("Actor has not been started, you need to invoke 'actor.start' before using it")
} }
@ -393,19 +401,18 @@ trait Actor extends Logging with TransactionManagement {
private def postMessageToMailbox(message: AnyRef): Unit = remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime private def postMessageToMailbox(message: AnyRef): Unit = remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime
if (remoteAddress.isDefined) { if (remoteAddress.isDefined) {
val request = RemoteRequest.newBuilder val requestBuilder = RemoteRequest.newBuilder
.setId(RemoteRequestIdFactory.nextId) .setId(RemoteRequestIdFactory.nextId)
.setMessage(serializer.out(message)) .setMessage(ByteString.copyFrom(serializer.out(message)))
.setMessageType(message.getClass.getName) .setMessageType(message.getClass.getName)
.setMethod(null) .setTarget(this.getClass.getName)
.setTarget(this.getClass.getName) .setTimeout(timeout)
.setTimeout(timeout) .setIsActor(true)
.setSupervisorUuid(registerSupervisorAsRemoteActor) .setIsOneWay(true)
.setIsActor(true) .setIsEscaped(false)
.setIsOneWay(true) val id = registerSupervisorAsRemoteActor
.setIsEscaped(false) if (id.isDefined) requestBuilder.setSupervisorUuid(id.get)
.build RemoteClient.clientFor(remoteAddress.get).send(requestBuilder.build)
RemoteClient.clientFor(remoteAddress.get).send(request)
} else { } else {
val handle = new MessageInvocation(this, message, None, TransactionManagement.threadBoundTx.get) val handle = new MessageInvocation(this, message, None, TransactionManagement.threadBoundTx.get)
mailbox.append(handle) mailbox.append(handle)
@ -415,19 +422,18 @@ trait Actor extends Logging with TransactionManagement {
private def postMessageToMailboxAndCreateFutureResultWithTimeout(message: AnyRef, timeout: Long): CompletableFutureResult = remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime private def postMessageToMailboxAndCreateFutureResultWithTimeout(message: AnyRef, timeout: Long): CompletableFutureResult = remoteFlagLock.withReadLock { // the price you pay for being able to make an actor remote at runtime
if (remoteAddress.isDefined) { if (remoteAddress.isDefined) {
val request = RemoteRequest.newBuilder val requestBuilder = RemoteRequest.newBuilder
.setId(RemoteRequestIdFactory.nextId) .setId(RemoteRequestIdFactory.nextId)
.setMessage(serializer.out(message)) .setMessage(ByteString.copyFrom(serializer.out(message)))
.setMethod(null) .setMessageType(message.getClass.getName)
.setMessageType(message.getClass.getName) .setTarget(this.getClass.getName)
.setTarget(this.getClass.getName) .setTimeout(timeout)
.setTimeout(timeout) .setIsActor(true)
.setSupervisorUuid(registerSupervisorAsRemoteActor) .setIsOneWay(false)
.setIsActor(true) .setIsEscaped(false)
.setIsOneWay(false) val id = registerSupervisorAsRemoteActor
.setIsEscaped(false) if (id.isDefined) requestBuilder.setSupervisorUuid(id.get)
.build val future = RemoteClient.clientFor(remoteAddress.get).send(requestBuilder.build)
val future = RemoteClient.clientFor(remoteAddress.get).send(request)
if (future.isDefined) future.get if (future.isDefined) future.get
else throw new IllegalStateException("Expected a future from remote call to actor " + toString) else throw new IllegalStateException("Expected a future from remote call to actor " + toString)
} else { } else {
@ -579,25 +585,31 @@ trait Actor extends Logging with TransactionManagement {
dispatcher.registerHandler(this, new ActorMessageInvoker(this)) dispatcher.registerHandler(this, new ActorMessageInvoker(this))
} }
/*
private def serializeMessage(message: AnyRef): AnyRef = if (Actor.SERIALIZE_MESSAGES) { private def serializeMessage(message: AnyRef): AnyRef = if (Actor.SERIALIZE_MESSAGES) {
if (!message.isInstanceOf[String] && if (!message.isInstanceOf[String] &&
!message.isInstanceOf[Byte] &&
!message.isInstanceOf[Int] && !message.isInstanceOf[Int] &&
!message.isInstanceOf[Long] && !message.isInstanceOf[Long] &&
!message.isInstanceOf[Float] && !message.isInstanceOf[Float] &&
!message.isInstanceOf[Double] && !message.isInstanceOf[Double] &&
!message.isInstanceOf[Boolean] && !message.isInstanceOf[Boolean] &&
!message.isInstanceOf[Char] && !message.isInstanceOf[Char] &&
!message.isInstanceOf[java.lang.Integer] && !message.isInstanceOf[Tuple2[_,_]] &&
!message.isInstanceOf[java.lang.Long] && !message.isInstanceOf[Tuple3[_,_,_]] &&
!message.isInstanceOf[java.lang.Float] && !message.isInstanceOf[Tuple4[_,_,_,_]] &&
!message.isInstanceOf[java.lang.Double] && !message.isInstanceOf[Tuple5[_,_,_,_,_]] &&
!message.isInstanceOf[java.lang.Boolean] && !message.isInstanceOf[Tuple6[_,_,_,_,_,_]] &&
!message.isInstanceOf[java.lang.Character] && !message.isInstanceOf[Tuple7[_,_,_,_,_,_,_]] &&
!message.isInstanceOf[Tuple8[_,_,_,_,_,_,_,_]] &&
!message.isInstanceOf[Array[_]] &&
!message.isInstanceOf[List[_]] &&
!message.isInstanceOf[scala.collection.immutable.Map[_,_]] &&
!message.isInstanceOf[scala.collection.immutable.Set[_]] &&
!message.isInstanceOf[scala.collection.immutable.Tree[_,_]] &&
!message.getClass.isAnnotationPresent(Annotations.immutable)) { !message.getClass.isAnnotationPresent(Annotations.immutable)) {
serializer.deepClone(message) serializer.deepClone(message)
} else message } else message
} else message } else message
*/
override def toString(): String = "Actor[" + uuid + ":" + id + "]" override def toString(): String = "Actor[" + uuid + ":" + id + "]"
} }

View file

@ -7,15 +7,18 @@ package se.scalablesolutions.akka.kernel.nio
import java.net.InetSocketAddress import java.net.InetSocketAddress
import java.util.concurrent.{Executors, ConcurrentMap, ConcurrentHashMap} import java.util.concurrent.{Executors, ConcurrentMap, ConcurrentHashMap}
import kernel.nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
import kernel.actor.{Exit, Actor} import kernel.actor.{Exit, Actor}
import kernel.reactor.{DefaultCompletableFutureResult, CompletableFutureResult} import kernel.reactor.{DefaultCompletableFutureResult, CompletableFutureResult}
import kernel.util.{JSONSerializer, Logging} import kernel.util.{Serializer, ScalaJSONSerializer, JavaJSONSerializer, Logging}
import org.jboss.netty.bootstrap.ClientBootstrap
import org.jboss.netty.channel._ import org.jboss.netty.channel._
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory
import org.jboss.netty.handler.codec.serialization.{ObjectEncoder, ObjectDecoder} import org.jboss.netty.handler.codec.frame.{LengthFieldBasedFrameDecoder, LengthFieldPrepender}
import org.jboss.netty.bootstrap.ClientBootstrap import org.jboss.netty.handler.codec.protobuf.{ProtobufDecoder, ProtobufEncoder}
import protobuf.RemoteProtocol.RemoteReply import protobuf.RemoteProtocol
import scala.collection.mutable.HashMap import scala.collection.mutable.HashMap
object RemoteClient extends Logging { object RemoteClient extends Logging {
@ -45,9 +48,8 @@ class RemoteClient(hostname: String, port: Int) extends Logging {
Executors.newCachedThreadPool) Executors.newCachedThreadPool)
private val bootstrap = new ClientBootstrap(channelFactory) private val bootstrap = new ClientBootstrap(channelFactory)
private val handler = new RemoteClientHandler(futures, supervisors)
bootstrap.getPipeline.addLast("handler", handler) bootstrap.setPipelineFactory(new RemoteClientPipelineFactory(futures, supervisors))
bootstrap.setOption("tcpNoDelay", true) bootstrap.setOption("tcpNoDelay", true)
bootstrap.setOption("keepAlive", true) bootstrap.setOption("keepAlive", true)
@ -76,15 +78,14 @@ class RemoteClient(hostname: String, port: Int) extends Logging {
} }
def send(request: RemoteRequest): Option[CompletableFutureResult] = if (isRunning) { def send(request: RemoteRequest): Option[CompletableFutureResult] = if (isRunning) {
val escapedRequest = request//escapeRequest(request) if (request.getIsOneWay) {
if (escapedRequest.isOneWay) { connection.getChannel.write(request)
connection.getChannel.write(escapedRequest)
None None
} else { } else {
futures.synchronized { futures.synchronized {
val futureResult = new DefaultCompletableFutureResult(request.timeout) val futureResult = new DefaultCompletableFutureResult(request.getTimeout)
futures.put(request.id, futureResult) futures.put(request.getId, futureResult)
connection.getChannel.write(escapedRequest) connection.getChannel.write(request)
Some(futureResult) Some(futureResult)
} }
} }
@ -99,20 +100,18 @@ class RemoteClient(hostname: String, port: Int) extends Logging {
else supervisors.remove(actor.supervisor.get.uuid) else supervisors.remove(actor.supervisor.get.uuid)
def deregisterSupervisorWithUuid(uuid: String) = supervisors.remove(uuid) def deregisterSupervisorWithUuid(uuid: String) = supervisors.remove(uuid)
}
private def escapeRequest(request: RemoteRequest) = { class RemoteClientPipelineFactory(futures: ConcurrentMap[Long, CompletableFutureResult],
if (request.message.isInstanceOf[Array[Object]]) { supervisors: ConcurrentMap[String, Actor]) extends ChannelPipelineFactory {
val args = request.message.asInstanceOf[Array[Object]].toList.asInstanceOf[scala.List[Object]] def getPipeline: ChannelPipeline = {
var isEscaped = false val p = Channels.pipeline()
val escapedArgs = for (arg <- args) yield { p.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4));
val clazz = arg.getClass p.addLast("protobufDecoder", new ProtobufDecoder(RemoteProtocol.RemoteReply.getDefaultInstance));
if (clazz.getName.contains("$$ProxiedByAW")) { p.addLast("frameEncoder", new LengthFieldPrepender(4));
isEscaped = true p.addLast("protobufEncoder", new ProtobufEncoder());
new ProxyWrapper(clazz.getSuperclass.getName) p.addLast("handler", new RemoteClientHandler(futures, supervisors))
} else arg p
}
request.cloneWithNewMessage(escapedArgs, isEscaped)
} else request
} }
} }
@ -128,41 +127,36 @@ class RemoteClientHandler(val futures: ConcurrentMap[Long, CompletableFutureResu
super.handleUpstream(ctx, event) super.handleUpstream(ctx, event)
} }
override def channelOpen(ctx: ChannelHandlerContext, event: ChannelStateEvent) = {
//event.getChannel.getPipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4));
//event.getChannel.getPipeline.addLast("protobufDecoder", new ProtobufDecoder(LocalTimeProtocol.LocalTimes.getDefaultInstance()));
//event.getChannel.getPipeline.addLast("frameEncoder", new LengthFieldPrepender(4));
//event.getChannel.getPipeline.addLast("protobufEncoder", new ProtobufEncoder());
event.getChannel.getPipeline.addFirst("encoder", new ObjectEncoder)
event.getChannel.getPipeline.addFirst("decoder", new ObjectDecoder)
}
override def channelConnected(ctx: ChannelHandlerContext, event: ChannelStateEvent) {
// Send the first message if this handler is a client-side handler.
// if (!firstMessage.isEmpty) e.getChannel.write(firstMessage)
}
override def messageReceived(ctx: ChannelHandlerContext, event: MessageEvent) { override def messageReceived(ctx: ChannelHandlerContext, event: MessageEvent) {
try { try {
val result = event.getMessage val result = event.getMessage
if (result.isInstanceOf[RemoteReply]) { if (result.isInstanceOf[RemoteReply]) {
val reply = result.asInstanceOf[RemoteReply] val reply = result.asInstanceOf[RemoteReply]
log.debug("Received RemoteReply[\n%s]", reply.toString)
val future = futures.get(reply.getId) val future = futures.get(reply.getId)
val messageBytes = reply.getMessage if (reply.getIsSuccessful) {
val messageType = reply.getMessageType val messageBytes = reply.getMessage.toByteArray
val messageClass = Class.forName(messageType) val messageType = reply.getMessageType
val message = JSONSerializer.in(messageBytes, messageClass) val messageClass = Class.forName(messageType)
if (reply.successful) future.completeWithResult(message) val message =
else { if (reply.isActor) ScalaJSONSerializer.in(messageBytes, Some(messageClass))
val supervisorUuid = reply.getSupervisorUuid else JavaJSONSerializer.in(messageBytes, Some(messageClass))
if (supervisorUuid != null) { future.completeWithResult(message)
} else {
if (reply.hasSupervisorUuid) {
val supervisorUuid = reply.getSupervisorUuid
if (!supervisors.containsKey(supervisorUuid)) throw new IllegalStateException("Expected a registered supervisor for UUID [" + supervisorUuid + "] but none was found") if (!supervisors.containsKey(supervisorUuid)) throw new IllegalStateException("Expected a registered supervisor for UUID [" + supervisorUuid + "] but none was found")
val supervisedActor = supervisors.get(supervisorUuid) val supervisedActor = supervisors.get(supervisorUuid)
if (!supervisedActor.supervisor.isDefined) throw new IllegalStateException("Can't handle restart for remote actor " + supervisedActor + " since its supervisor has been removed") if (!supervisedActor.supervisor.isDefined) throw new IllegalStateException("Can't handle restart for remote actor " + supervisedActor + " since its supervisor has been removed")
else supervisedActor.supervisor.get ! Exit(supervisedActor, new RuntimeException(reply.getException)) else supervisedActor.supervisor.get ! Exit(supervisedActor, new RuntimeException(reply.getException))
} }
future.completeWithException(null, new RuntimeException(reply.getException)) val exception = reply.getException
val exceptionType = Class.forName(exception.substring(0, exception.indexOf('$')))
val exceptionMessage = exception.substring(exception.indexOf('$') + 1, exception.length)
val exceptionInstance = exceptionType
.getConstructor(Array[Class[_]](classOf[String]): _*)
.newInstance(exceptionMessage).asInstanceOf[Throwable]
future.completeWithException(null, exceptionInstance)
} }
futures.remove(reply.getId) futures.remove(reply.getId)
} else throw new IllegalArgumentException("Unknown message received in remote client handler: " + result) } else throw new IllegalArgumentException("Unknown message received in remote client handler: " + result)
@ -175,6 +169,7 @@ class RemoteClientHandler(val futures: ConcurrentMap[Long, CompletableFutureResu
override def exceptionCaught(ctx: ChannelHandlerContext, event: ExceptionEvent) { override def exceptionCaught(ctx: ChannelHandlerContext, event: ExceptionEvent) {
log.error("Unexpected exception from downstream in remote client: %s", event.getCause) log.error("Unexpected exception from downstream in remote client: %s", event.getCause)
event.getCause.printStackTrace
event.getChannel.close event.getChannel.close
} }
} }

View file

@ -9,18 +9,18 @@ import java.net.InetSocketAddress
import java.util.concurrent.{ConcurrentHashMap, Executors} import java.util.concurrent.{ConcurrentHashMap, Executors}
import kernel.actor._ import kernel.actor._
import kernel.stm.TransactionManagement import kernel.util.{Serializer, ScalaJSONSerializer, JavaJSONSerializer, Logging}
import kernel.util.{JSONSerializer, Logging} import protobuf.RemoteProtocol
import protobuf.RemoteProtocol.{RemoteReply, RemoteRequest}
import org.jboss.netty.bootstrap.ServerBootstrap import org.jboss.netty.bootstrap.ServerBootstrap
import org.jboss.netty.channel._ import org.jboss.netty.channel._
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory
import org.jboss.netty.handler.codec.frame.{LengthFieldBasedFrameDecoder, LengthFieldPrepender} import org.jboss.netty.handler.codec.frame.{LengthFieldBasedFrameDecoder, LengthFieldPrepender}
import org.jboss.netty.handler.codec.protobuf.{ProtobufDecoder, ProtobufEncoder} import org.jboss.netty.handler.codec.protobuf.{ProtobufDecoder, ProtobufEncoder}
import org.jboss.netty.handler.codec.serialization.ObjectDecoder import com.google.protobuf.ByteString
import org.jboss.netty.handler.codec.serialization.ObjectEncoder
import protobuf.RemoteProtocol.{RemoteReply, RemoteRequest}
class RemoteServer extends Logging { class RemoteServer extends Logging {
def start = RemoteServer.start def start = RemoteServer.start
} }
@ -41,8 +41,8 @@ object RemoteServer extends Logging {
private val bootstrap = new ServerBootstrap(factory) private val bootstrap = new ServerBootstrap(factory)
// FIXME provide different codecs (Thrift, Avro, Protobuf, JSON) // FIXME provide different codecs (Thrift, Avro, Protobuf, JSON)
private val handler = new AkkaServerHandler private val handler = new RemoteServerHandler
bootstrap.getPipeline.addLast("handler", handler) bootstrap.setPipelineFactory(new RemoteServerPipelineFactory)
bootstrap.setOption("child.tcpNoDelay", true) bootstrap.setOption("child.tcpNoDelay", true)
bootstrap.setOption("child.keepAlive", true) bootstrap.setOption("child.keepAlive", true)
bootstrap.setOption("child.reuseAddress", true) bootstrap.setOption("child.reuseAddress", true)
@ -57,8 +57,20 @@ object RemoteServer extends Logging {
} }
} }
class RemoteServerPipelineFactory extends ChannelPipelineFactory {
def getPipeline: ChannelPipeline = {
val p = Channels.pipeline()
p.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4))
p.addLast("protobufDecoder", new ProtobufDecoder(RemoteProtocol.RemoteRequest.getDefaultInstance))
p.addLast("frameEncoder", new LengthFieldPrepender(4))
p.addLast("protobufEncoder", new ProtobufEncoder)
p.addLast("handler", new RemoteServerHandler)
p
}
}
@ChannelPipelineCoverage { val value = "all" } @ChannelPipelineCoverage { val value = "all" }
class AkkaServerHandler extends SimpleChannelUpstreamHandler with Logging { class RemoteServerHandler extends SimpleChannelUpstreamHandler with Logging {
private val activeObjectFactory = new ActiveObjectFactory private val activeObjectFactory = new ActiveObjectFactory
private val activeObjects = new ConcurrentHashMap[String, AnyRef] private val activeObjects = new ConcurrentHashMap[String, AnyRef]
private val actors = new ConcurrentHashMap[String, Actor] private val actors = new ConcurrentHashMap[String, Actor]
@ -70,20 +82,6 @@ class AkkaServerHandler extends SimpleChannelUpstreamHandler with Logging {
super.handleUpstream(ctx, event) super.handleUpstream(ctx, event)
} }
override def channelOpen(ctx: ChannelHandlerContext, event: ChannelStateEvent) = {
//event.getChannel.getPipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4));
//event.getChannel.getPipeline.addLast("protobufDecoder", new ProtobufDecoder(LocalTimeProtocol.LocalTimes.getDefaultInstance()));
//event.getChannel.getPipeline.addLast("frameEncoder", new LengthFieldPrepender(4));
//event.getChannel.getPipeline.addLast("protobufEncoder", new ProtobufEncoder());
event.getChannel.getPipeline.addFirst("encoder", new ObjectEncoder)
event.getChannel.getPipeline.addFirst("decoder", new ObjectDecoder)
}
override def channelConnected(ctx: ChannelHandlerContext, event: ChannelStateEvent) = {
//e.getChannel.write(firstMessage)
}
override def messageReceived(ctx: ChannelHandlerContext, event: MessageEvent) = { override def messageReceived(ctx: ChannelHandlerContext, event: MessageEvent) = {
val message = event.getMessage val message = event.getMessage
if (message == null) throw new IllegalStateException("Message in remote MessageEvent is null: " + event) if (message == null) throw new IllegalStateException("Message in remote MessageEvent is null: " + event)
@ -91,82 +89,100 @@ class AkkaServerHandler extends SimpleChannelUpstreamHandler with Logging {
} }
override def exceptionCaught(ctx: ChannelHandlerContext, event: ExceptionEvent) = { override def exceptionCaught(ctx: ChannelHandlerContext, event: ExceptionEvent) = {
event.getCause.printStackTrace
log.error("Unexpected exception from remote downstream: %s", event.getCause) log.error("Unexpected exception from remote downstream: %s", event.getCause)
event.getCause.printStackTrace
event.getChannel.close event.getChannel.close
} }
private def handleRemoteRequest(request: RemoteRequest, channel: Channel) = { private def handleRemoteRequest(request: RemoteRequest, channel: Channel) = {
log.debug(request.toString) log.debug("Received RemoteRequest[\n%s]", request.toString)
if (request.isActor) dispatchToActor(request, channel) if (request.getIsActor) dispatchToActor(request, channel)
else dispatchToActiveObject(request, channel) else dispatchToActiveObject(request, channel)
} }
private def dispatchToActor(request: RemoteRequest, channel: Channel) = { private def dispatchToActor(request: RemoteRequest, channel: Channel) = {
log.debug("Dispatching to remote actor [%s]", request.target) log.debug("Dispatching to remote actor [%s]", request.getTarget)
val actor = createActor(request.target, request.timeout) val actor = createActor(request.getTarget, request.getTimeout)
actor.start actor.start
val messageBytes = request.getMessage val messageClass = Class.forName(request.getMessageType)
val messageType = request.getMessageType val message = ScalaJSONSerializer.in(request.getMessage.toByteArray, Some(messageClass))
val messageClass = Class.forName(messageType) if (request.getIsOneWay) actor ! message
val message = JSONSerializer.in(messageBytes, messageClass)
if (request.isOneWay) actor ! message
else { else {
try { try {
val resultOrNone = actor !! message val resultOrNone = actor !! message
val result: AnyRef = if (resultOrNone.isDefined) resultOrNone.get else null val result: AnyRef = if (resultOrNone.isDefined) resultOrNone.get else null
log.debug("Returning result from actor invocation [%s]", result) log.debug("Returning result from actor invocation [%s]", result)
val replyMessage = JSONSerializer.out(result) val replyMessage = ScalaJSONSerializer.out(result)
val reply = RemoteReply.newBuilder val replyBuilder = RemoteReply.newBuilder
.setId(request.getId) .setId(request.getId)
.setMessage(replyMessage) .setMessage(ByteString.copyFrom(replyMessage))
.setMessageType(result.getClass.getName) .setMessageType(result.getClass.getName)
.setIsSuccessful(true) .setIsSuccessful(true)
.setSupervisorUuid(request.getSupervisorUuid) .setIsActor(true)
.build if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
channel.write(reply) channel.write(replyBuilder.build)
} catch { } catch {
case e: Throwable => case e: Throwable =>
log.error("Could not invoke remote actor [%s] due to: %s", request.target, e) log.error("Could not invoke remote actor [%s] due to: %s", request.getTarget, e)
e.printStackTrace e.printStackTrace
val reply = RemoteReply.newBuilder val replyBuilder = RemoteReply.newBuilder
.setId(request.getId) .setId(request.getId)
.setException(e.toString) .setException(e.getClass.getName + "$" + e.getMessage)
.setIsSuccessful(false) .setIsSuccessful(false)
.setSupervisorUuid(request.getSupervisorUuid) .setIsActor(true)
.build if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
channel.write(reply) channel.write(replyBuilder.build)
} }
} }
} }
private def dispatchToActiveObject(request: RemoteRequest, channel: Channel) = { private def dispatchToActiveObject(request: RemoteRequest, channel: Channel) = {
log.debug("Dispatching to remote active object [%s :: %s]", request.method, request.target) log.debug("Dispatching to remote active object [%s :: %s]", request.getMethod, request.getTarget)
val activeObject = createActiveObject(request.target, request.timeout) val activeObject = createActiveObject(request.getTarget, request.getTimeout)
val args = request.message.asInstanceOf[scala.List[AnyRef]] val args: scala.List[AnyRef] = JavaJSONSerializer.in(request.getMessage.toByteArray, Some(classOf[scala.List[AnyRef]]))
val argClasses = args.map(_.getClass) val argClasses = args.map(_.getClass)
val (unescapedArgs, unescapedArgClasses) = unescapeArgs(args, argClasses, request.timeout) val (unescapedArgs, unescapedArgClasses) = unescapeArgs(args, argClasses, request.getTimeout)
//continueTransaction(request) //continueTransaction(request)
try { try {
val messageReceiver = activeObject.getClass.getDeclaredMethod(request.method, unescapedArgClasses: _*) val messageReceiver = activeObject.getClass.getDeclaredMethod(request.getMethod, unescapedArgClasses: _*)
if (request.isOneWay) messageReceiver.invoke(activeObject, unescapedArgs: _*) if (request.getIsOneWay) messageReceiver.invoke(activeObject, unescapedArgs: _*)
else { else {
val result = messageReceiver.invoke(activeObject, unescapedArgs: _*) val result = messageReceiver.invoke(activeObject, unescapedArgs: _*)
log.debug("Returning result from remote active object invocation [%s]", result) log.debug("Returning result from remote active object invocation [%s]", result)
//channel.write(request.newReplyWithMessage(result, TransactionManagement.threadBoundTx.get)) val replyMessage = JavaJSONSerializer.out(result)
channel.write(request.newReplyWithMessage(result, null)) val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setMessage(ByteString.copyFrom(replyMessage))
.setMessageType(result.getClass.getName)
.setIsSuccessful(true)
.setIsActor(false)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
channel.write(replyBuilder.build)
} }
} catch { } catch {
case e: InvocationTargetException => case e: InvocationTargetException =>
log.error("Could not invoke remote active object [%s :: %s] due to: %s", request.method, request.target, e.getCause) log.error("Could not invoke remote active object [%s :: %s] due to: %s", request.getMethod, request.getTarget, e.getCause)
e.getCause.printStackTrace e.getCause.printStackTrace
channel.write(request.newReplyWithException(e.getCause)) val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setException(e.getCause.getClass.getName + "$" + e.getCause.getMessage)
.setException(e.getCause.toString)
.setIsSuccessful(false)
.setIsActor(false)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
channel.write(replyBuilder.build)
case e: Throwable => case e: Throwable =>
log.error("Could not invoke remote active object [%s :: %s] due to: %s", request.method, request.target, e) log.error("Could not invoke remote active object [%s :: %s] due to: %s", request.getMethod, request.getTarget, e)
e.printStackTrace e.printStackTrace
channel.write(request.newReplyWithException(e)) val replyBuilder = RemoteReply.newBuilder
.setId(request.getId)
.setException(e.getClass.getName + "$" + e.getMessage)
.setIsSuccessful(false)
.setIsActor(false)
if (request.hasSupervisorUuid) replyBuilder.setSupervisorUuid(request.getSupervisorUuid)
channel.write(replyBuilder.build)
} }
} }
@ -184,8 +200,10 @@ class AkkaServerHandler extends SimpleChannelUpstreamHandler with Logging {
val unescapedArgClasses = new Array[Class[_]](args.size) val unescapedArgClasses = new Array[Class[_]](args.size)
val escapedArgs = for (i <- 0 until args.size) { val escapedArgs = for (i <- 0 until args.size) {
if (args(i).isInstanceOf[ProxyWrapper]) { val arg = args(i)
val proxyName = args(i).asInstanceOf[ProxyWrapper].proxyName if (arg.isInstanceOf[String] && arg.asInstanceOf[String] == "$$ProxiedByAW") {
val argString = arg.asInstanceOf[String]
val proxyName = argString.substring(argString.indexOf("$$ProxiedByAW"), argString.length)
val activeObject = createActiveObject(proxyName, timeout) val activeObject = createActiveObject(proxyName, timeout)
unescapedArgs(i) = activeObject unescapedArgs(i) = activeObject
unescapedArgClasses(i) = Class.forName(proxyName) unescapedArgClasses(i) = Class.forName(proxyName)

View file

@ -8,12 +8,12 @@ import java.util.concurrent.atomic.AtomicLong
import kernel.stm.Transaction import kernel.stm.Transaction
import kernel.util.HashCode import kernel.util.HashCode
// FIXME: will not work - can clash with other host's requests - need te prepend with hostname
object RemoteRequestIdFactory { object RemoteRequestIdFactory {
private val id = new AtomicLong private val id = new AtomicLong
def nextId = id.getAndIncrement def nextId = id.getAndIncrement
} }
@serializable class ProxyWrapper(val proxyName: String)
/* /*
@serializable class RemoteRequest(val message: AnyRef, @serializable class RemoteRequest(val message: AnyRef,
val method: String, val method: String,

View file

@ -40,7 +40,33 @@ object JavaSerializationSerializer extends Serializer {
/** /**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a> * @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/ */
object JSONSerializer extends Serializer { object JavaJSONSerializer extends Serializer {
import org.codehaus.jackson.map.ObjectMapper
private val json = new ObjectMapper
def out(obj: AnyRef): Array[Byte] = {
if (!json.canSerialize(obj.getClass)) throw new IllegalArgumentException("Can not serialize [" + obj + "] to JSON, please provide a JSON serializable object.")
val bos = new ByteArrayOutputStream
val out = new ObjectOutputStream(bos)
json.writeValue(out, obj)
out.close
bos.toByteArray
}
def in(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = {
if (!clazz.isDefined) throw new IllegalArgumentException("Can't deserialize JSON to instance if no class is provided")
val in = new ObjectInputStream(new ByteArrayInputStream(bytes))
val obj = json.readValue(in, clazz.get).asInstanceOf[AnyRef]
in.close
obj
}
}
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
object ScalaJSONSerializer extends Serializer {
import org.codehaus.jackson.map.ObjectMapper import org.codehaus.jackson.map.ObjectMapper
private val json = new ObjectMapper private val json = new ObjectMapper

View file

@ -9,7 +9,7 @@ import annotation.oneway
import kernel.config.ScalaConfig._ import kernel.config.ScalaConfig._
import com.google.inject.{AbstractModule, Scopes} import com.google.inject.{AbstractModule, Scopes}
import com.jteigen.scalatest.JUnit4Runner //import com.jteigen.scalatest.JUnit4Runner
import org.apache.camel.component.bean.ProxyHelper import org.apache.camel.component.bean.ProxyHelper
import org.junit.runner.RunWith import org.junit.runner.RunWith
@ -32,7 +32,7 @@ import org.apache.camel.impl.DefaultCamelContext
/** /**
* @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]) //@RunWith(classOf[JUnit4Runner])
class CamelSpec extends Spec with ShouldMatchers { class CamelSpec extends Spec with ShouldMatchers {
describe("A Camel routing scheme") { describe("A Camel routing scheme") {

View file

@ -19,7 +19,7 @@ import com.google.inject.{AbstractModule, Scopes}
import org.scalatest.Spec import org.scalatest.Spec
import org.scalatest.matchers.ShouldMatchers import org.scalatest.matchers.ShouldMatchers
import com.jteigen.scalatest.JUnit4Runner //simport com.jteigen.scalatest.JUnit4Runner
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.junit.Test import org.junit.Test
import org.junit.Assert._ import org.junit.Assert._
@ -27,7 +27,7 @@ import org.junit.Assert._
/** /**
* @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]) //@RunWith(classOf[JUnit4Runner])
class JerseySpec extends Spec with ShouldMatchers { class JerseySpec extends Spec with ShouldMatchers {
describe("A Jersey REST service") { describe("A Jersey REST service") {

View file

@ -40,7 +40,7 @@ class RemoteActorSpec extends TestCase {
@Test @Test
def testSendOneWay = { def testSendOneWay = {
implicit val timeout = 5000L implicit val timeout = 500000000L
val actor = new RemoteActorSpecActorUnidirectional val actor = new RemoteActorSpecActorUnidirectional
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT) actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
actor.start actor.start
@ -52,7 +52,7 @@ class RemoteActorSpec extends TestCase {
@Test @Test
def testSendReplySync = { def testSendReplySync = {
implicit val timeout = 5000L implicit val timeout = 500000000L
val actor = new RemoteActorSpecActorBidirectional val actor = new RemoteActorSpecActorBidirectional
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT) actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
actor.start actor.start
@ -63,7 +63,7 @@ class RemoteActorSpec extends TestCase {
@Test @Test
def testSendReplyAsync = { def testSendReplyAsync = {
implicit val timeout = 5000L implicit val timeout = 500000000L
val actor = new RemoteActorSpecActorBidirectional val actor = new RemoteActorSpecActorBidirectional
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT) actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
actor.start actor.start
@ -74,7 +74,7 @@ class RemoteActorSpec extends TestCase {
@Test @Test
def testSendReceiveException = { def testSendReceiveException = {
implicit val timeout = 5000L implicit val timeout = 500000000L
val actor = new RemoteActorSpecActorBidirectional val actor = new RemoteActorSpecActorBidirectional
actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT) actor.makeRemote(RemoteServer.HOSTNAME, RemoteServer.PORT)
actor.start actor.start

View file

@ -8,7 +8,7 @@ import kernel.nio.{RemoteClient, RemoteServer}
import kernel.actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor} import kernel.actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor}
import kernel.config.ScalaConfig._ import kernel.config.ScalaConfig._
import com.jteigen.scalatest.JUnit4Runner //import com.jteigen.scalatest.JUnit4Runner
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.scalatest.Suite import org.scalatest.Suite
@ -19,7 +19,7 @@ object Log {
/** /**
* @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]) //@RunWith(classOf[JUnit4Runner])
class RemoteSupervisorSpec extends junit.framework.TestCase with Suite { class RemoteSupervisorSpec extends junit.framework.TestCase with Suite {
Kernel.config Kernel.config

View file

@ -7,14 +7,14 @@ package se.scalablesolutions.akka.kernel
import kernel.actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor} import kernel.actor.{Supervisor, SupervisorFactory, Actor, StartSupervisor}
import kernel.config.ScalaConfig._ import kernel.config.ScalaConfig._
import com.jteigen.scalatest.JUnit4Runner //import com.jteigen.scalatest.JUnit4Runner
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.scalatest.Suite import org.scalatest.Suite
/** /**
* @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]) //@RunWith(classOf[JUnit4Runner])
class SupervisorSpec extends junit.framework.TestCase with Suite { class SupervisorSpec extends junit.framework.TestCase with Suite {
var messageLog: String = "" var messageLog: String = ""

Binary file not shown.

BIN
lib/sbinary-0.3.jar Normal file

Binary file not shown.

View file

@ -41,6 +41,7 @@
<orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: sbinary:sbinary:0.3-alpha" level="project" />
<orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" /> <orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" />

View file

@ -41,6 +41,7 @@
<orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.apache:zookeeper:3.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-core-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: sbinary:sbinary:0.3-alpha" level="project" />
<orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" /> <orderEntry type="library" exported="" name="Maven: org.apache.cassandra:cassandra:0.4.0-dev" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: com.facebook:thrift:1.0" level="project" />
<orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" /> <orderEntry type="library" exported="" name="Maven: com.facebook:fb303:1.0" level="project" />

View file

@ -39,7 +39,7 @@ public final class RemoteProtocol {
public boolean hasMessage() { return hasMessage; } public boolean hasMessage() { return hasMessage; }
public com.google.protobuf.ByteString getMessage() { return message_; } public com.google.protobuf.ByteString getMessage() { return message_; }
// required string method = 2; // optional string method = 2;
public static final int METHOD_FIELD_NUMBER = 2; public static final int METHOD_FIELD_NUMBER = 2;
private boolean hasMethod; private boolean hasMethod;
private java.lang.String method_ = ""; private java.lang.String method_ = "";
@ -60,7 +60,7 @@ public final class RemoteProtocol {
public boolean hasTimeout() { return hasTimeout; } public boolean hasTimeout() { return hasTimeout; }
public long getTimeout() { return timeout_; } public long getTimeout() { return timeout_; }
// required string supervisorUuid = 5; // optional string supervisorUuid = 5;
public static final int SUPERVISORUUID_FIELD_NUMBER = 5; public static final int SUPERVISORUUID_FIELD_NUMBER = 5;
private boolean hasSupervisorUuid; private boolean hasSupervisorUuid;
private java.lang.String supervisorUuid_ = ""; private java.lang.String supervisorUuid_ = "";
@ -105,10 +105,8 @@ public final class RemoteProtocol {
@Override @Override
public final boolean isInitialized() { public final boolean isInitialized() {
if (!hasMessage) return false; if (!hasMessage) return false;
if (!hasMethod) return false;
if (!hasTarget) return false; if (!hasTarget) return false;
if (!hasTimeout) return false; if (!hasTimeout) return false;
if (!hasSupervisorUuid) return false;
if (!hasIsActor) return false; if (!hasIsActor) return false;
if (!hasIsOneWay) return false; if (!hasIsOneWay) return false;
if (!hasIsEscaped) return false; if (!hasIsEscaped) return false;
@ -471,7 +469,7 @@ public final class RemoteProtocol {
return this; return this;
} }
// required string method = 2; // optional string method = 2;
public boolean hasMethod() { public boolean hasMethod() {
return result.hasMethod(); return result.hasMethod();
} }
@ -531,7 +529,7 @@ public final class RemoteProtocol {
return this; return this;
} }
// required string supervisorUuid = 5; // optional string supervisorUuid = 5;
public boolean hasSupervisorUuid() { public boolean hasSupervisorUuid() {
return result.hasSupervisorUuid(); return result.hasSupervisorUuid();
} }
@ -690,42 +688,46 @@ public final class RemoteProtocol {
public boolean hasId() { return hasId; } public boolean hasId() { return hasId; }
public long getId() { return id_; } public long getId() { return id_; }
// required bytes message = 3; // optional bytes message = 3;
public static final int MESSAGE_FIELD_NUMBER = 3; public static final int MESSAGE_FIELD_NUMBER = 3;
private boolean hasMessage; private boolean hasMessage;
private com.google.protobuf.ByteString message_ = com.google.protobuf.ByteString.EMPTY; private com.google.protobuf.ByteString message_ = com.google.protobuf.ByteString.EMPTY;
public boolean hasMessage() { return hasMessage; } public boolean hasMessage() { return hasMessage; }
public com.google.protobuf.ByteString getMessage() { return message_; } public com.google.protobuf.ByteString getMessage() { return message_; }
// required string exception = 4; // optional string exception = 4;
public static final int EXCEPTION_FIELD_NUMBER = 4; public static final int EXCEPTION_FIELD_NUMBER = 4;
private boolean hasException; private boolean hasException;
private java.lang.String exception_ = ""; private java.lang.String exception_ = "";
public boolean hasException() { return hasException; } public boolean hasException() { return hasException; }
public java.lang.String getException() { return exception_; } public java.lang.String getException() { return exception_; }
// required string supervisorUuid = 5; // optional string supervisorUuid = 5;
public static final int SUPERVISORUUID_FIELD_NUMBER = 5; public static final int SUPERVISORUUID_FIELD_NUMBER = 5;
private boolean hasSupervisorUuid; private boolean hasSupervisorUuid;
private java.lang.String supervisorUuid_ = ""; private java.lang.String supervisorUuid_ = "";
public boolean hasSupervisorUuid() { return hasSupervisorUuid; } public boolean hasSupervisorUuid() { return hasSupervisorUuid; }
public java.lang.String getSupervisorUuid() { return supervisorUuid_; } public java.lang.String getSupervisorUuid() { return supervisorUuid_; }
// required string messageType = 6; // optional string messageType = 6;
public static final int MESSAGETYPE_FIELD_NUMBER = 6; public static final int MESSAGETYPE_FIELD_NUMBER = 6;
private boolean hasMessageType; private boolean hasMessageType;
private java.lang.String messageType_ = ""; private java.lang.String messageType_ = "";
public boolean hasMessageType() { return hasMessageType; } public boolean hasMessageType() { return hasMessageType; }
public java.lang.String getMessageType() { return messageType_; } public java.lang.String getMessageType() { return messageType_; }
// required bool isActor = 7;
public static final int ISACTOR_FIELD_NUMBER = 7;
private boolean hasIsActor;
private boolean isActor_ = false;
public boolean hasIsActor() { return hasIsActor; }
public boolean getIsActor() { return isActor_; }
@Override @Override
public final boolean isInitialized() { public final boolean isInitialized() {
if (!hasIsSuccessful) return false; if (!hasIsSuccessful) return false;
if (!hasId) return false; if (!hasId) return false;
if (!hasMessage) return false; if (!hasIsActor) return false;
if (!hasException) return false;
if (!hasSupervisorUuid) return false;
if (!hasMessageType) return false;
return true; return true;
} }
@ -750,6 +752,9 @@ public final class RemoteProtocol {
if (hasMessageType()) { if (hasMessageType()) {
output.writeString(6, getMessageType()); output.writeString(6, getMessageType());
} }
if (hasIsActor()) {
output.writeBool(7, getIsActor());
}
getUnknownFields().writeTo(output); getUnknownFields().writeTo(output);
} }
@ -784,6 +789,10 @@ public final class RemoteProtocol {
size += com.google.protobuf.CodedOutputStream size += com.google.protobuf.CodedOutputStream
.computeStringSize(6, getMessageType()); .computeStringSize(6, getMessageType());
} }
if (hasIsActor()) {
size += com.google.protobuf.CodedOutputStream
.computeBoolSize(7, getIsActor());
}
size += getUnknownFields().getSerializedSize(); size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size; memoizedSerializedSize = size;
return size; return size;
@ -943,6 +952,9 @@ public final class RemoteProtocol {
if (other.hasMessageType()) { if (other.hasMessageType()) {
setMessageType(other.getMessageType()); setMessageType(other.getMessageType());
} }
if (other.hasIsActor()) {
setIsActor(other.getIsActor());
}
this.mergeUnknownFields(other.getUnknownFields()); this.mergeUnknownFields(other.getUnknownFields());
return this; return this;
} }
@ -1001,6 +1013,10 @@ public final class RemoteProtocol {
setMessageType(input.readString()); setMessageType(input.readString());
break; break;
} }
case 56: {
setIsActor(input.readBool());
break;
}
} }
} }
} }
@ -1042,7 +1058,7 @@ public final class RemoteProtocol {
return this; return this;
} }
// required bytes message = 3; // optional bytes message = 3;
public boolean hasMessage() { public boolean hasMessage() {
return result.hasMessage(); return result.hasMessage();
} }
@ -1063,7 +1079,7 @@ public final class RemoteProtocol {
return this; return this;
} }
// required string exception = 4; // optional string exception = 4;
public boolean hasException() { public boolean hasException() {
return result.hasException(); return result.hasException();
} }
@ -1084,7 +1100,7 @@ public final class RemoteProtocol {
return this; return this;
} }
// required string supervisorUuid = 5; // optional string supervisorUuid = 5;
public boolean hasSupervisorUuid() { public boolean hasSupervisorUuid() {
return result.hasSupervisorUuid(); return result.hasSupervisorUuid();
} }
@ -1105,7 +1121,7 @@ public final class RemoteProtocol {
return this; return this;
} }
// required string messageType = 6; // optional string messageType = 6;
public boolean hasMessageType() { public boolean hasMessageType() {
return result.hasMessageType(); return result.hasMessageType();
} }
@ -1125,6 +1141,24 @@ public final class RemoteProtocol {
result.messageType_ = ""; result.messageType_ = "";
return this; return this;
} }
// required bool isActor = 7;
public boolean hasIsActor() {
return result.hasIsActor();
}
public boolean getIsActor() {
return result.getIsActor();
}
public Builder setIsActor(boolean value) {
result.hasIsActor = true;
result.isActor_ = value;
return this;
}
public Builder clearIsActor() {
result.hasIsActor = false;
result.isActor_ = false;
return this;
}
} }
static { static {
@ -1155,14 +1189,14 @@ public final class RemoteProtocol {
"rotobuf/RemoteProtocol.proto\022-se.scalabl" + "rotobuf/RemoteProtocol.proto\022-se.scalabl" +
"esolutions.akka.kernel.nio.protobuf\"\300\001\n\r" + "esolutions.akka.kernel.nio.protobuf\"\300\001\n\r" +
"RemoteRequest\022\017\n\007message\030\001 \002(\014\022\016\n\006method" + "RemoteRequest\022\017\n\007message\030\001 \002(\014\022\016\n\006method" +
"\030\002 \002(\t\022\016\n\006target\030\003 \002(\t\022\017\n\007timeout\030\004 \002(\004\022" + "\030\002 \001(\t\022\016\n\006target\030\003 \002(\t\022\017\n\007timeout\030\004 \002(\004\022" +
"\026\n\016supervisorUuid\030\005 \002(\t\022\017\n\007isActor\030\006 \002(\010" + "\026\n\016supervisorUuid\030\005 \001(\t\022\017\n\007isActor\030\006 \002(\010" +
"\022\020\n\010isOneWay\030\007 \002(\010\022\021\n\tisEscaped\030\010 \002(\010\022\n\n" + "\022\020\n\010isOneWay\030\007 \002(\010\022\021\n\tisEscaped\030\010 \002(\010\022\n\n" +
"\002id\030\t \002(\004\022\023\n\013messageType\030\n \002(\t\"\200\001\n\013Remot" + "\002id\030\t \002(\004\022\023\n\013messageType\030\n \002(\t\"\221\001\n\013Remot" +
"eReply\022\024\n\014isSuccessful\030\001 \002(\010\022\n\n\002id\030\002 \002(\004" + "eReply\022\024\n\014isSuccessful\030\001 \002(\010\022\n\n\002id\030\002 \002(\004" +
"\022\017\n\007message\030\003 \002(\014\022\021\n\texception\030\004 \002(\t\022\026\n\016" + "\022\017\n\007message\030\003 \001(\014\022\021\n\texception\030\004 \001(\t\022\026\n\016" +
"supervisorUuid\030\005 \002(\t\022\023\n\013messageType\030\006 \002(" + "supervisorUuid\030\005 \001(\t\022\023\n\013messageType\030\006 \001(" +
"\tB\002H\001"; "\t\022\017\n\007isActor\030\007 \002(\010B\002H\001";
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
public com.google.protobuf.ExtensionRegistry assignDescriptors( public com.google.protobuf.ExtensionRegistry assignDescriptors(
@ -1181,7 +1215,7 @@ public final class RemoteProtocol {
internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_fieldAccessorTable = new internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable( com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_descriptor, internal_static_se_scalablesolutions_akka_kernel_nio_protobuf_RemoteReply_descriptor,
new java.lang.String[] { "IsSuccessful", "Id", "Message", "Exception", "SupervisorUuid", "MessageType", }, new java.lang.String[] { "IsSuccessful", "Id", "Message", "Exception", "SupervisorUuid", "MessageType", "IsActor", },
se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.class, se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.class,
se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.Builder.class); se.scalablesolutions.akka.kernel.nio.protobuf.RemoteProtocol.RemoteReply.Builder.class);
return null; return null;

View file

@ -13,7 +13,6 @@ package se.scalablesolutions.akka.kernel.nio.protobuf;
option optimize_for = SPEED; option optimize_for = SPEED;
/* /*
val id: Long,
val message: Array[Byte], val message: Array[Byte],
val method: String, val method: String,
val target: String, val target: String,
@ -22,13 +21,15 @@ val supervisorUuid: String
val isOneWay: Boolean, val isOneWay: Boolean,
val isActor: Boolean, val isActor: Boolean,
val isEscaped: Boolean, val isEscaped: Boolean,
val id: Long,
val messageType: String,
*/ */
message RemoteRequest { message RemoteRequest {
required bytes message = 1; required bytes message = 1;
required string method = 2; optional string method = 2;
required string target = 3; required string target = 3;
required uint64 timeout = 4; required uint64 timeout = 4;
required string supervisorUuid = 5; optional string supervisorUuid = 5;
required bool isActor = 6; required bool isActor = 6;
required bool isOneWay = 7; required bool isOneWay = 7;
required bool isEscaped = 8; required bool isEscaped = 8;
@ -42,12 +43,14 @@ val id: Long,
val message: Array[Byte], val message: Array[Byte],
val exception: Throwable, val exception: Throwable,
val supervisorUuid: String val supervisorUuid: String
val isActor: Boolean,
*/ */
message RemoteReply { message RemoteReply {
required bool isSuccessful = 1; required bool isSuccessful = 1;
required uint64 id = 2; required uint64 id = 2;
required bytes message = 3; optional bytes message = 3;
required string exception = 4; optional string exception = 4;
required string supervisorUuid = 5; optional string supervisorUuid = 5;
required string messageType = 6; optional string messageType = 6;
required bool isActor = 7;
} }