Guest User

Untitled

a guest
Dec 12th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. trait WebNode[Data,Request] extends Actor with Node {
  2.  
  3. // pathways coming into the node
  4. protected val in = mutable.Set[ActorRef]()
  5. // pathways going out of the node
  6. protected val out = mutable.Set[ActorRef]()
  7. // used to only handle a request once that travels
  8. // through the web
  9. protected var lastId:Option[UUID] = None
  10.  
  11. def collect(req:Request): Option[Data]
  12.  
  13. def selfNode = WebNodeRef(self, in.toList, out.toList)
  14.  
  15. override def send(actorRef:ActorRef, m:Any) {
  16. recordOutput(actorRef)
  17. actorRef tell (m, self)
  18. }
  19. override def forward(actorRef:ActorRef, m:Any) {
  20. recordOutput(actorRef)
  21. actorRef forward m
  22. }
  23. override def actorOf(props:Props):ActorRef = {
  24. val actorRef = context.actorOf(props)
  25. recordOutput(actorRef)
  26. actorRef
  27. }
  28. override def reply(m:Any) {
  29. recordOutput(sender)
  30. sender ! m
  31. }
  32. def recordOutput(actorRef:ActorRef) {
  33. out.add(actorRef)
  34. }
  35. def recordInput(actorRef:ActorRef) {
  36. if (actorRef != context.system.deadLetters){
  37. in.add(actorRef)
  38. }
  39. }
  40.  
  41. def wrappedReceive:Receive = {
  42. case m:Any if ! m.isInstanceOf[(Request,Spider)] =>
  43. recordInput(sender)
  44. before(m)
  45. super.receive(m)
  46. after(m)
  47. }
  48.  
  49. abstract override def receive = handleRequest orElse wrappedReceive
  50.  
  51. def before:Receive
  52.  
  53. def after:Receive
  54.  
  55. def sendSpiders(ref: ActorRef, data: Data, msg: (Request,Spider), collected: Set[ActorRef]) {
  56. val (request, spider) = msg
  57. val newTrail = spider.trail.copy(collected = collected + self)
  58. val newSpider = spider.copy(trail = newTrail)
  59. in.filterNot(in => collected.contains(in)).foreach(_ ! (request,newSpider))
  60. out.filterNot(out => collected.contains(out)) foreach (_ ! (request,newSpider))
  61. }
  62.  
  63. def handleRequest:Receive = {
  64. case (req:Request, spider @ Spider(ref,WebTrail(collected, uuid))) if !lastId.exists(_ == uuid) =>
  65. lastId = Some(uuid)
  66. collect(req).map { data =>
  67. sendSpiders(ref, data, (req,spider), collected)
  68. }
  69. }
  70. }
Add Comment
Please, Sign In to add comment