package examples.mega.client;

import java.rmi.RemoteException;

import java.util.Calendar;

public class DataTypes{

  private static final int id = 1234;
  private static final float salary = 123.4f;
  private static final char sex = 'm';
  private static final String address = "hi there";
  private static final double balance = 123456.7;
  private static final long pin = 1234567;
  private static final short length = 12;
  private static final Calendar date = Calendar.getInstance(); 

  public void invoke( MegaPort port ) throws RemoteException,
      InvokeFailedException {

    BaseData data = port.primitiveTypes( id, salary, ""+sex, address,
        balance, pin, length, date );

    checkData( "primitiveTypes", data );

    data = port.wrapperTypes( id, salary, ""+sex, address,
        balance, pin, length, date );

    checkData( "primitiveTypes", data );

    data = port.primitiveArrays( new int[]{id}, new float[]{salary}, 
        new String[]{""+sex}, new String[]{address}, new double[]{balance},
        new long[]{pin}, new short[]{length}, new Calendar[]{date} );

    invokeGeneric( port );
  }

  public void invokeGeneric( MegaPort port ) throws RemoteException,
      InvokeFailedException {

    Object[] result = port.genericTypes( "1", new String[]{"2","3"} );

    if( result == null || result.length != 3 ){
      throw new InvokeFailedException( "genericTypes" );
    }

    if( !"1".equals( result[0] ) ||
        !"2".equals( result[1] ) ||
        !"3".equals( result[2] ) ){

      throw new InvokeFailedException( "genericTypes" );
    }
  }

  public static BaseData getBaseData(){

    BaseData data = new BaseData();

    data.setId( id );
    data.setSalary( salary );
    data.setSex( ""+sex );
    data.setAddress( address );
    data.setBalance( balance );
    data.setPin( pin );
    data.setLength( length );
    data.setDate( date );

    return data;
  }

  public static void checkData( String message, BaseData data ) 
      throws InvokeFailedException{

    if( data.getId() != id ||
        data.getSalary() != salary ||
        !data.getSex().equals( ""+sex ) ||
        !data.getAddress().equals( address ) ||
        data.getPin() != pin ||
        data.getLength() != length /*||
        !data.getDate().equals( date )*/ ){

      new InvokeFailedException( message ).printStackTrace(); 
    }
  }
}

