package fucoin.actions.search; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import akka.actor.ActorRef; import akka.actor.UntypedActorContext; import fucoin.Wallet; //Used to return a Wallet reference (akka-style string which can // be transformed to an ActorRef) public class ActionSearchWalletReference extends Search{ public final String name; public final List<ActorRef> ttl = new ArrayList<ActorRef>(); public ActionSearchWalletReference(String name) { this.name = name; } @Override protected void onAction(ActorRef sender, ActorRef self, UntypedActorContext context, Wallet wallet) { log(wallet.getKnownNeighbors()+"contains "+name+"?"); ttl.add(self); ActionSearchWalletReferenceAnswer answer = null; if(this.name.equals(wallet.getName())){ answer = new ActionSearchWalletReferenceAnswer(name,wallet.getAddress(),ttl); }else if(wallet.backedUpNeighbors.containsKey(name)){ answer = new ActionSearchWalletReferenceAnswer(name,wallet.backedUpNeighbors.get(name).getAddress(),ttl); } else if(wallet.getKnownNeighbors().containsKey(name)){ answer = new ActionSearchWalletReferenceAnswer(name,wallet.getAddress(wallet.getKnownNeighbors().get(name)),ttl); } else if (ttl.size()<5){ for(ActorRef neighbor : wallet.getKnownNeighbors().values()){ if(!ttl.contains(neighbor)){ neighbor.tell(this, self); } } } //User unknown by this Wallet if(answer!=null&&ttl.size()>0){ ttl.get(ttl.size()-1).tell(answer, self); } } }