Created
December 28, 2013 00:54
-
-
Save jconwell/8154730 to your computer and use it in GitHub Desktop.
Testing utility actor to mimic the messaging behavior of an actor a test might interact with, but without actually creating an instance of the actor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.turbo.akka; | |
import akka.actor.UntypedActor; | |
import akka.event.Logging; | |
import akka.event.LoggingAdapter; | |
import java.util.HashMap; | |
import java.util.Map; | |
/** | |
* Utility actor that is configured with a set of incoming messages types and response instances | |
*/ | |
public class ParrotActor extends UntypedActor { | |
private final LoggingAdapter LOG = Logging.getLogger(getContext().system(), this); | |
/** | |
* Init empty squawk map | |
*/ | |
public ParrotActor() { | |
this.replyMap = new HashMap<Class, Object>(); | |
} | |
/** | |
* Init with pre-populated squawk map | |
* @param replyMap | |
*/ | |
public ParrotActor(Map<Class, Object> replyMap) { | |
this.replyMap = replyMap; | |
} | |
private final Map<Class, Object> replyMap; | |
@Override | |
public void onReceive(Object o) throws Exception { | |
//check if we need to add a squawk | |
if (o instanceof Squawk) { | |
Squawk squawk = (Squawk) o; | |
if (((Squawk) o).msg == null) { | |
replyMap.remove(squawk.type); | |
LOG.info("Removed Squawk for type : " + squawk.type); | |
} | |
else { | |
replyMap.put(squawk.type, squawk.msg); | |
LOG.info("Added new Squawk for type : " + squawk.type); | |
} | |
return; | |
} | |
//try to squawk | |
Object reply = replyMap.get(o.getClass()); | |
if (reply != null) { | |
sender().tell(reply, getSelf()); | |
LOG.info("Squawk! " + o.toString() + ". Sent: " + reply.toString()); | |
return; | |
} | |
unhandled(o); | |
} | |
/** | |
* Pass this as a msg to ParrotActor to add a new squawk to list of | |
* parroted messages | |
*/ | |
public static class Squawk { | |
public final Class type; | |
public final Object msg; | |
public Squawk(Class type, Object msg) { | |
this.type = type; | |
this.msg = msg; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment