package org.astrogrid.ogsa.gcache;

import java.net.URL;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.globus.ogsa.utils.AnyHelper;
import org.globus.ogsa.utils.QueryHelper;
import org.gridforum.ogsi.ExtensibilityType;
import org.gridforum.ogsi.GridService;
import org.gridforum.ogsi.LocatorType;
import org.gridforum.ogsi.OGSIServiceGridLocator;
import org.gridforum.ogsi.ServiceDataValuesType;
import org.gridforum.ogsi.TerminationTimeType;


/**
 * Exercises an Gcache service enquiring the termination time
 * via a service datum.
 */
public class EndTimeClient {

  public static void main (String[] args) throws Exception {

    if (args.length != 1) {
      System.err.println("Usage: java org.astrogrid.ogsa.gcache.EndTimeClient "
                         + "<service-instance-URL>");
      return;
    }

    try {
      EndTimeClient.read(args[0]);
    }
    catch (Exception e) {
      System.err.println(e);
    }
  }


  private static void read (String handle) throws Exception {
    System.out.println("Service instance: " + handle);
    URL url = new URL(handle);

    // Find the gridService port on the existing service-instance.
    OGSIServiceGridLocator locator = new OGSIServiceGridLocator();
    GridService port = locator.getGridServicePort(url);

    // Invoke the port.
    System.out.println("About to call findServiceData().");
    ExtensibilityType query = QueryHelper.getNamesQuery("terminationTime");
    ExtensibilityType result = port.findServiceData(query);

    // Fomat and display the result of the enquiry.
    ServiceDataValuesType sd = AnyHelper.getAsServiceDataValues(result);
    TerminationTimeType t = (TerminationTimeType)
        AnyHelper.getAsSingleObject(sd, TerminationTimeType.class);
    Calendar c1 = t.getAfter().getDateTimeValue();
    Calendar c2 = GregorianCalendar.getInstance();
    long dtInSeconds = (c1.getTimeInMillis() - c2.getTimeInMillis()) / 1000;
    System.out.println("Time to live: " + dtInSeconds + " seconds");

    System.out.println("The test finished without exceptions.");
  }
}
