// Bamboo<http://bamboo-dht.org/> sample code
//
// $ export CLASSPATH=$BAMBOO_DIR/src/:`echo $BAMBOO_DIR/lib/*.jar|sed -e 's/ /:/g'`
// $ javac Lookup.java
//
// append the following line to node.cfg:
//  <My>
//    class my.Lookup
//  </My>
//
// $ ${BAMBOO_DIR}/bin/run-java bamboo.lss.DustDevil node.cfg

package my;

import bamboo.util.StandardStage;
import bamboo.lss.ASyncCore;
import bamboo.router.Router;
import seda.sandStorm.api.ConfigDataIF;
import java.util.Random;
import java.math.BigInteger;
import ostore.util.NodeId;
import bamboo.util.GuidTools;

public class Lookup extends StandardStage {

    protected Router router;

    public void init(ConfigDataIF config) throws Exception {
	super.init(config);
        acore.register_timer(1000, ready_cb, null);
    }
    
    public ASyncCore.TimerCB ready_cb = new ASyncCore.TimerCB() {
            public void timer_cb(Object user_data) {
                System.out.println("My node-id is " + my_node_id.toString());
                router = Router.instance(my_node_id);

                // generate a random key to lookup
                Random rand = new Random((int)now_ms());
                byte[] guid_bytes = new byte[21];
                rand.nextBytes(guid_bytes);
                guid_bytes[0] = 0;
                BigInteger guid = new BigInteger(guid_bytes);
                logger.info("looking up 0x" + GuidTools.guid_to_string(guid) + ".");
                
                Long start_time = new Long(timer_ms());
                router.lookup(guid, lookup_cb, start_time);
            }
        };

    // callback function when the lookup hits
    public Router.LookupCb lookup_cb = new Router.LookupCb() {
        public void lookup_cb(BigInteger lookup_id, BigInteger closest_id,
                              NodeId closest_addr, Object user_data) {
            long finish_time = timer_ms();
            long start_time = ((Long)user_data).longValue();
            long latency_ms = finish_time - start_time;
            logger.info ("found 0x" + GuidTools.guid_to_string(lookup_id) +
                         " on 0x" + GuidTools.guid_to_string(closest_id) +
                         ", " + closest_addr + " in " + latency_ms + " ms.");
        }
    };
}
