// copyright 1997, 1998 objectspace

package JThread.examples.trader;

import java.io.*;
import com.objectspace.lib.timer.*;
import com.objectspace.voyager.*;
import com.objectspace.voyager.agent.*;
import com.objectspace.voyager.mobility.MobilityException;
import examples.stockmarket.*;
import JThread.voyager.*;

public class Trader implements ITrader, Serializable
  {
  private Stopwatch _agent_runtime;
  private Stopwatch _shutdown_time;
  private Stopwatch _restart_time;
  
  public Trader()
    {
    _agent_runtime = new Stopwatch();
    _shutdown_time = new Stopwatch();
    _restart_time = new Stopwatch();
    System.out.println( "construct trader" );
    }

  public void finalize()
    {
    System.out.println( "finalize trader" );
    }

  public void run() {
    // System.out.println("at run");
    // create remote stockmarket
    _agent_runtime.start();
    String marketClass = Stockmarket.class.getName();
    try {
        IStockmarket market = (IStockmarket) Factory.create( marketClass, "//localhost:8000" );
        work(market);
    } catch(Exception e) {
        System.out.println("in run: " + e);
    }
    _agent_runtime.stop();
    System.out.println("total agent time = " + _agent_runtime.getTotalTime() + "ms");
  }
  
  public void work( IStockmarket market ) throws MoveException
    {
       // System.out.println("at work");
    System.out.println( "remote trade" );
    tradeAt( market ); // trade with remote market
    System.out.println( "local trade" );
    
    Migration.moveTo( "//localhost:8000" ); // migrate to market and continue

    System.out.println( "at remote market" );
    tradeAt( market ); // trade with local market
    Agent.of( this ).setAutonomous( false ); // allow myself to be gc'ed
    }
  
  private void tradeAt( IStockmarket market )
    {
    System.out.println( "start trade" );
    Stopwatch watch = new Stopwatch();
    watch.start();

    for( int i = 0; i < 1000; i++ ) // do 1000 trades
       market.buy( 100, "SUN" );

    watch.stop();
    System.out.println( "stop trade" );
    System.out.println( "time = " + watch.getTotalTime() + "ms" );
    }
  }
