diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/core/actors/NetworkContainerActor.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/core/actors/NetworkContainerActor.scala new file mode 100644 index 0000000000000000000000000000000000000000..ba0ee07744458c794711451ba825055a20def96c --- /dev/null +++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/core/actors/NetworkContainerActor.scala @@ -0,0 +1,22 @@ +package fr.univ_lille.cristal.emeraude.n2s3.core.actors + +import fr.univ_lille.cristal.emeraude.n2s3.core.NetworkContainer +import fr.univ_lille.cristal.emeraude.n2s3.support.actors.{ActorCompanion, SinglePropsBuilder} + +/** + * Actor companion of [[NetworkContainerActor]]. + * It defines a way to create new [[NetworkContainerActor]] instances + */ +object NetworkContainerActor extends ActorCompanion{ + + /** + * Returns a props builder for a [[NetworkContainerActor]] + */ + def newPropsBuilder() = new SinglePropsBuilder[NetworkContainerActor]() +} + + +/** + * NetworkEntityActor that contains a NetworkContainer as NetworkEntity + */ +class NetworkContainerActor extends NetworkEntityActor(new NetworkContainer) \ No newline at end of file diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/core/actors/NetworkEntityActor.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/core/actors/NetworkEntityActor.scala index ecc8a55c9c4532763ec1b8ab4df62c5a9c6c7ee3..b3cd7e156e85f416aebf7ddf359605b59c30ec8c 100644 --- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/core/actors/NetworkEntityActor.scala +++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/core/actors/NetworkEntityActor.scala @@ -6,17 +6,18 @@ package fr.univ_lille.cristal.emeraude.n2s3.core.actors import akka.actor.{Actor, Props} import fr.univ_lille.cristal.emeraude.n2s3.core._ -import fr.univ_lille.cristal.emeraude.n2s3.core.actors.NetworkEntityActor.{ExplicitSenderRoutedMessage, ImplicitSenderRoutedMessage} +import fr.univ_lille.cristal.emeraude.n2s3.core.actors.NetworkEntityActor.{CheckMailbox, ExplicitSenderRoutedMessage, ImplicitSenderRoutedMessage} import fr.univ_lille.cristal.emeraude.n2s3.core.exceptions.{UnknownDestinationException, UnknownPathException} -import fr.univ_lille.cristal.emeraude.n2s3.support.actors -import fr.univ_lille.cristal.emeraude.n2s3.support.actors.{ActorCompanion, Message, PropsBuilder, SinglePropsBuilder} +import fr.univ_lille.cristal.emeraude.n2s3.support +import fr.univ_lille.cristal.emeraude.n2s3.support.actors.{Message, PropsBuilder} import scala.collection.mutable /** - * Companion object of NetworkContainerActor + * Companion object of [[NetworkEntityActor]]. + * Includes common messages used by [[NetworkEntityActor]] and a builder to instantiate actors. */ -object NetworkEntityActor extends actors.ActorCompanion { +object NetworkEntityActor extends support.actors.ActorCompanion { /** * Message used to add a child to the target NetworkContainer. @@ -48,49 +49,19 @@ object NetworkEntityActor extends actors.ActorCompanion { case class SynchronizedRoutedMessage(to: Traversable[Any], message: Message, sender : NetworkEntityPath) /** - * Create the PropsBuilder of NetworkEntityActor class - * - * @return new PropsBuilder + * Message used when the limits of local messages processed is reached. + * This one alone to resume immediately the messageQueue processing in case of there's no incoming messages */ - def newPropsBuilder() = new NetworkEntityActorPropsBuilder -} - - -/** - * Abstract representation of an actor that contains a NetworkEntity - * This actor is used to make the interface between the NetworkEntity (e.g. neurons, neuron containers) it contains and the external system - * - * It may receive messages that it will treat itself or messages it will forward to it's children entities - * The latter handle two kind of messages : - * - ExplicitSenderRoutedMessage includes the actor where the response should be sent - * - ImplicitSenderRoutedMessage will send the message's response to de implicit sender set by Akka - * - * Other messages are processed by the actor itself - * - * This class keeps a queue of messages that are not yet processed. - * - * Each message generated by a local NetworkEntity is added to this queue in order to let the current entity - * finish processing before starting the following. However, in the case of local ask pattern, the message is instantly processed - * and the response can be returned immediately. - * - * Local ask should be avoided if possible - * In case of mutual local ask, the actor will be in state of deadlock - * - * For examples of usages, see @NetworkContainer - */ + private object CheckMailbox -object NetworkContainerActor extends ActorCompanion{ - def newPropsBuilder() = new SinglePropsBuilder[NetworkContainerActor]() + /** + * Returns a PropsBuilder for a [[NetworkEntityActor]] + */ + def newPropsBuilder() = new NetworkEntityActorPropsBuilder } /** - * mixin of NetworkContainer with NetworkEntityActor - */ -class NetworkContainerActor extends NetworkEntityActor(new NetworkContainer) - -/** - * Specialization of PropsBuilder used to construct NetworkEntityActor. - * This class allow to set the root entity + * Specialized PropsBuilder used to construct a NetworkEntityActor. */ class NetworkEntityActorPropsBuilder extends PropsBuilder { private var entity: NetworkEntity = _ @@ -104,28 +75,32 @@ class NetworkEntityActorPropsBuilder extends PropsBuilder { } /** - * specialization of NetworkEntityActor used to provide the root ReferenceableNetworkEntity in constructor parameter instead of specify it in mixin - * This class is responsible for making the bridge between the actor and the content entity + * Actor to interact with a network entity (e.g. neurons, neuron containers) + * Receives messages that it may treat itself or forward to it's children entities + * The latter handle two kind of messages : + * - [[ExplicitSenderRoutedMessage]] includes the actor where the response should be sent + * - [[ImplicitSenderRoutedMessage]] will send the message's response to de implicit sender set by Akka + * + * Other messages are processed by the actor itself. * - * @param entity is the root ReferenceableNetworkEntity of the actor + * This class keeps a queue of messages that are not yet processed. + * + * Each message generated by a local NetworkEntity is added to this queue in order to let the current entity + * finish processing before starting the following. However, in the case of local ask pattern, the message is instantly processed + * and the response can be returned immediately. + * + * Local ask should be avoided if possible + * In case of mutual local ask, the actor will be in state of deadlock + * + * For examples of usages, see [[NetworkContainer]] + * @param entity is the root Networkentity contained by the actor */ class NetworkEntityActor(val entity : NetworkEntity) extends Actor { - override def preRestart(reason: Throwable, message: Option[Any]): Unit = { - println("[DEBUG] Restart Actor "+self+" : "+reason+(if(message.isDefined) " | "+message.get else "")) - super.preRestart(reason, message) - } - entity.container = this -// entity.setParent(this, this) - - def resolvePath(target : Traversable[Any]) : NetworkEntity = { - entity.resolvePath(target) - } /** * Queue which contains next message to process - * * Each message are accompanied by the target NetworkEntity and the sender NetworkEntityReference */ private val messageQueue = mutable.Queue[(Message, NetworkEntity, NetworkEntityReference)]() @@ -135,11 +110,14 @@ class NetworkEntityActor(val entity : NetworkEntity) extends Actor { */ private val maxMessageProcess = 10 - /** - * Message used when the limits of local messages processed is reached. - * This one alone to resume immediately the messageQueue processing in case of there's no incoming messages - */ - private object CheckMailbox + override def preRestart(reason: Throwable, message: Option[Any]): Unit = { + println("[DEBUG] Restart Actor " + self + " : " + reason + (if(message.isDefined) " | " + message.get else "" )) + super.preRestart(reason, message) + } + + def resolvePath(target : Traversable[Any]) : NetworkEntity = { + entity.resolvePath(target) + } /**