switched picker shutdown to after finalize() call - simulating GUI shutdown after...
[vamsas.git] / src / uk / ac / vamsas / test / ExampleApplication.java
index 684bdf3..3722109 100644 (file)
@@ -7,6 +7,9 @@
 package uk.ac.vamsas.test;
 
 import uk.ac.vamsas.client.*;
+import uk.ac.vamsas.client.picking.IMessageHandler;
+import uk.ac.vamsas.client.picking.IPickManager;
+import uk.ac.vamsas.client.picking.Message;
 import uk.ac.vamsas.objects.core.VAMSAS;
 import uk.ac.vamsas.test.objects.Core;
 
@@ -15,183 +18,314 @@ import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.io.IOException;
 import java.util.Vector;
+
 /**
- * Toy vamsas command line client application demonstrating the API.
- * TODO: test appData get/set methods
- * TODO: verify and test pickManager and interaction between it and other session events
- * TODO: add more session interaction events (currently: modifies document on start up, then modifies every 2 updates before finalizing after 5 updates.
+ * Toy vamsas command line client application demonstrating the API. TODO: test
+ * appData get/set methods TODO: verify and test pickManager and interaction
+ * between it and other session events TODO: add more session interaction events
+ * (currently: modifies document on start up, then modifies every 2 updates
+ * before finalizing after 5 updates.
+ * 
  * @author jimp
  */
 
-public class ExampleApplication {
+public class ExampleApplication
+{
   private static ClientHandle app;
-  private static UserHandle user; // TODO: make this something defined by the api
+
+  private static UserHandle user; // TODO: make this something defined by the
+  // api
+
   private static IClientFactory clientfactory;
+
   private static IClient vorbaclient;
+
   private static byte[] mydata;
+
   private static Vector vamsasObjects;
+
   private static boolean isUpdated = false;
+
   private static boolean isShuttingdown = false;
+
   private static boolean isFinalizing = false;
-  private static void processVamsasDocument(IClientDocument doc) {
+
+  private static void processVamsasDocument(IClientDocument doc)
+  {
     doc.addVamsasRoot(Core.getDemoVamsas());
     vorbaclient.updateDocument(doc);
     // merge vamsasObjects with vamsas objects in document
     // get this apps 'mydata' if it hasn't got it already.
     // .. access this application's 'public' mydata' if there is any.
   }
-  private static void addHandlers(IClient avorbaclient) {
+
+  private static void addHandlers(IClient avorbaclient)
+  {
     // make a non-volatile reference to the client instance.
     final IClient vorbaclient = avorbaclient;
     // register update handler
     vorbaclient.addDocumentUpdateHandler(new PropertyChangeListener() {
-      public void propertyChange(PropertyChangeEvent evt) {
-        System.out.println("Vamsas document update for "+evt.getPropertyName()
-            +": "+evt.getOldValue()+" to "+evt.getNewValue());
+      public void propertyChange(PropertyChangeEvent evt)
+      {
+        System.out.println("Vamsas document update for "
+            + evt.getPropertyName() + ": " + evt.getOldValue()
+            + " to " + evt.getNewValue());
         // merge new data into ours.
         // example - output doc
-        try {
+        try
+        {
           IClientDocument cdoc = vorbaclient.getClientDocument();
-          uk.ac.vamsas.test.simpleclient.ArchiveReports.rootReport(cdoc.getVamsasRoots(), true, System.out);
+          uk.ac.vamsas.test.simpleclient.ArchiveReports.rootReport(
+              cdoc.getVamsasRoots(), true, System.out);
           vorbaclient.updateDocument(cdoc);
-        } catch (Exception e) {
-          System.err.println("Exception whilst dumping document tree after an update.");
+        }
+        catch (Exception e)
+        {
+          System.err
+          .println("Exception whilst dumping document tree after an update.");
           e.printStackTrace(System.err);
         }
-        isUpdated=true; // tell main thread to reflect change...
+        isUpdated = true; // tell main thread to reflect change...
       }
     });
     // register close handler
-    vorbaclient.addVorbaEventHandler(Events.DOCUMENT_REQUESTTOCLOSE, 
+    vorbaclient.addVorbaEventHandler(Events.DOCUMENT_REQUESTTOCLOSE,
         new PropertyChangeListener() {
-       public void propertyChange(PropertyChangeEvent evt) {
-         System.out.println("Received request to close vamsas document.");
-         // ask user for a filename to save it to. 
-         // Then pass it to the vorba object...
-         vorbaclient.storeDocument(new java.io.File("UserLocation"));
-       }
+      public void propertyChange(PropertyChangeEvent evt)
+      {
+        System.out
+        .println("Received request to close vamsas document.");
+        // ask user for a filename to save it to.
+        // Then pass it to the vorba object...
+        vorbaclient.storeDocument(new java.io.File(
+        "UserLocation"));
+      }
     });
-    
+
     // register some more handlers to monitor the session :
-    
-    vorbaclient.addVorbaEventHandler(Events.CLIENT_CREATION, 
+
+    vorbaclient.addVorbaEventHandler(Events.CLIENT_CREATION,
         new PropertyChangeListener() {
-      public void propertyChange(PropertyChangeEvent evt) {
-        System.out.println("New Vamsas client for "+evt.getPropertyName()
-            +": "+evt.getOldValue()+" to "+evt.getNewValue());
+      public void propertyChange(PropertyChangeEvent evt)
+      {
+        System.out.println("New Vamsas client for "
+            + evt.getPropertyName() + ": "
+            + evt.getOldValue() + " to "
+            + evt.getNewValue());
         // tell app add new client to its list of clients.
       }
     });
-    vorbaclient.addVorbaEventHandler(Events.CLIENT_FINALIZATION, 
+    vorbaclient.addVorbaEventHandler(Events.CLIENT_FINALIZATION,
         new PropertyChangeListener() {
-      public void propertyChange(PropertyChangeEvent evt) {
-        System.out.println("Vamsas client finalizing for "+evt.getPropertyName()
-            +": "+evt.getOldValue()+" to "+evt.getNewValue());
-        // tell app to update its list of clients to communicate with.
+      public void propertyChange(PropertyChangeEvent evt)
+      {
+        System.out.println("Vamsas client finalizing for "
+            + evt.getPropertyName() + ": "
+            + evt.getOldValue() + " to "
+            + evt.getNewValue());
+        // tell app to update its list of clients to communicate
+        // with.
       }
     });
-    vorbaclient.addVorbaEventHandler(Events.SESSION_SHUTDOWN, 
+    vorbaclient.addVorbaEventHandler(Events.SESSION_SHUTDOWN,
         new PropertyChangeListener() {
-      public void propertyChange(PropertyChangeEvent evt) {
-        System.out.println("Session "+evt.getPropertyName()+" is shutting down.");
-        // tell app to finalize its session data before shutdown.
+      public void propertyChange(PropertyChangeEvent evt)
+      {
+        System.out.println("Session " + evt.getPropertyName()
+            + " is shutting down.");
+        // tell app to finalize its session data before
+        // shutdown.
       }
     });
-    vorbaclient.addVorbaEventHandler(Events.DOCUMENT_FINALIZEAPPDATA, 
+    vorbaclient.addVorbaEventHandler(Events.DOCUMENT_FINALIZEAPPDATA,
         new PropertyChangeListener() {
-      public void propertyChange(PropertyChangeEvent evt) {
-        System.out.println("Application received a DOCUMENT_FINALIZEAPPDATA event.");
-        // tell app to finalize its session data prior to the storage of the current session as an archive.
+      public void propertyChange(PropertyChangeEvent evt)
+      {
+        System.out
+        .println("Application received a DOCUMENT_FINALIZEAPPDATA event.");
+        // tell app to finalize its session data prior to the
+        // storage of the current session as an archive.
       }
     });
-    
+
   }
-  public static String 
-       Usage="ExampleApplication [session urn] watch/n( future usage is :/n <vamsasFileDirectory> <vamsasSessionURN> <action> [+<arguments>]\n"
-         +"<action> is one of :\n\tsave,update,close,watch";
-  static String sess=null;
-  private static boolean parseArgs(String args[]) {
-    if (args.length==0) {
+
+  public static String Usage = "ExampleApplication [session urn] watch/n( future usage is :/n <vamsasFileDirectory> <vamsasSessionURN> <action> [+<arguments>]\n"
+    + "<action> is one of :\n\tsave,update,close,watch";
+
+  static String sess = null;
+
+  private static boolean parseArgs(String args[])
+  {
+    if (args.length == 0)
+    {
       return false;
     }
-    if (!args[0].toLowerCase().equals("watch")) {
-      sess=args[0];
+    if (!args[0].toLowerCase().equals("watch"))
+    {
+      sess = args[0];
     }
     return true;
   }
-  public static void main(String[] args) {
 
-    if (!parseArgs(args)) {
+  public static void main(String[] args)
+  {
+    class ExamplePicker extends Thread
+    {
+      String me = null;
+
+      public IPickManager pm = null;
+
+      ExamplePicker(String me, IPickManager pm)
+      {
+        this.me = me;
+        this.pm = pm;
+      }
+
+      public void run()
+      {
+        int mcount = 1;
+        while (pm != null)
+        {
+          try { Thread.sleep(1000 + (long) Math.random() * 10000); }
+          catch (Exception e) {}
+
+          if (pm != null)
+          {
+            pm.sendMessage(new uk.ac.vamsas.client.picking.CustomMessage("Message " + mcount++ + " from " + me));
+          }
+        }
+      }
+
+    }
+
+    if (!parseArgs(args))
+    {
       System.err.print(Usage);
     }
     // get IClientFactory
-    try {
+    try
+    {
       clientfactory = new uk.ac.vamsas.client.simpleclient.SimpleClientFactory();
-    } catch (IOException e) {
-      System.err.println(e+"\n"+Usage);
+    }
+    catch (IOException e)
+    {
+      System.err.println(e + "\n" + Usage);
       System.exit(1);
     }
-    
+
     // get an Iclient with session data
-    app = new ClientHandle("uk.ac.vamsas.test.ExampleApplication","0.1");
-    user = new UserHandle("arnolduser","deathsdoor");
-    try {
+    app = new ClientHandle("uk.ac.vamsas.test.ExampleApplication", "0.1");
+    user = new UserHandle("arnolduser", "deathsdoor");
+    try
+    {
       vorbaclient = clientfactory.getIClient(app, user);
-    } catch (NoDefaultSessionException e) {
-      System.err.println("There appear to be several sessions to choose from :");
+    }
+    catch (NoDefaultSessionException e)
+    {
+      System.err
+      .println("There appear to be several sessions to choose from :");
       String[] sessions = clientfactory.getCurrentSessions();
-      for (int s=0;s<sessions.length; s++)
+      for (int s = 0; s < sessions.length; s++)
         System.err.println(sessions[s]);
       System.exit(2);
     }
     addHandlers(vorbaclient);
-    try {
+    try
+    {
       vorbaclient.joinSession();
     }
-    catch (Exception se) {
+    catch (Exception se)
+    {
       se.printStackTrace();
-      System.err.println(se+" when joining session.\n"+Usage);
+      System.err.println(se + " when joining session.\n" + Usage);
       System.exit(1);
     }
     // register an update listener and a close listener.
     // get document data
-    try {
+    try
+    {
       IClientDocument cdoc = vorbaclient.getClientDocument();
       processVamsasDocument(cdoc);
-    } catch (Exception e) {
-      System.err.println("Unexpected exception when retrieving the client document for the first time!");
+    }
+    catch (Exception e)
+    {
+      System.err
+      .println("Unexpected exception when retrieving the client document for the first time!");
       e.printStackTrace(System.err);
       System.exit(1);
     }
-    int update=0;
-    // Main application event loop - wait around and do stuff...
-    while (!isShuttingdown && update<5) {
+    int update = 0;
+    ExamplePicker picker = new ExamplePicker(vorbaclient.getClientHandle()
+        .getClientUrn(), vorbaclient.getPickManager());
+
+    picker.start();
+    if (picker.pm!=null) {
+      picker.pm.registerMessageHandler(new IMessageHandler() {
+
+        public void handleMessage(Message message)
+        {
+          System.out
+          .println("Received |" + message.getRawMessage() + "|");
+        }
+
+      });
+    }
+    while (!isShuttingdown && update < 5)
+    {
       // do something with data
       // , update document, or something.
       // ..
-      if (isUpdated) {
-        System.out.println("Update handler called "+(++update)+" times");
-        System.out.println("******************************************");
-        isUpdated=false; // TODO: saner update det method.
-        if (update % 2==1) {
-          try {
+      if (isUpdated)
+      {
+        System.out.println("Update handler called " + (++update)
+            + " times");
+        System.out
+        .println("******************************************");
+        isUpdated = false; // TODO: saner update det method.
+        if (update % 2 == 1)
+        {
+          try
+          {
             IClientDocument cdoc = vorbaclient.getClientDocument();
             processVamsasDocument(cdoc);
           }
-          catch (Exception e) {
-            System.err.println("Error when updating document after an even numbered update.");
+          catch (Exception e)
+          {
+            System.err
+            .println("Error when updating document after an even numbered update.");
             e.printStackTrace(System.err);
           }
         }
       }
-      try { Thread.sleep(15); } catch (Exception e) {};
+
+      try      { Thread.sleep(15); }
+      catch (Exception e) {}
+
     }
     System.out.println("Finalizing.");
-      // call finalizeClient
+    // call finalizeClient
     vorbaclient.finalizeClient();
+    System.out.println("Shutting down picker.");
+    picker.pm = null;
+    while (picker.isAlive())
+    {
+      System.out.println("Waiting for picker to die...");
+      try
+      {
+        Thread.sleep(1000);
+      }
+      catch (Exception e)
+      {
+      }
+      ;
+    }
+
     // { meanwhile, eventHandlers are called to do any saves if need be }
     // and all registered listeners will be deregistered to avoid deadlock.
-    
+
     // finish
+    System.out.println("Byee!");
   }
+
 }