refactoring org to uk - never use f**ng eclipse
[vamsas.git] / src / org / vamsas / test / ExampleApplication.java
index a0c1ec2..b6597be 100644 (file)
@@ -1,4 +1,4 @@
-/*
+/**
  * Created on 14-Sep-2005
  *
  * TODO To change the template for this generated file go to
  */
 package org.vamsas.test;
 
+import uk.ac.vamsas.client.*;
+
+import java.awt.Event;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.IOException;
+import java.util.Vector;
 /**
- * Toy vamsas client application demonstrating the API.
+ * Toy vamsas command line client application demonstrating the API.
  * 
  * @author jimp
  */
 
 public class ExampleApplication {
-  public static String Usage="ExampleApplication <vamsasSessionURN> <action> [+<arguments>]\n<action> is one of :";
+  private static ClientHandle app;
+  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) {
+    // 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) {
+    // 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());
+        // merge new data into ours.
+        isUpdated=true; // tell main thread to reflect change...
+      }
+    });
+    // register close handler
+    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"));
+       }
+    });
+    
+    // register some more handlers to monitor the session :
+    
+    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());
+        // tell app add new client to its list of clients.
+      }
+    });
+    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.
+      }
+    });
+    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.
+      }
+    });
+    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 static String 
+       Usage="ExampleApplication <vamsasFileDirectory> <vamsasSessionURN> <action> [+<arguments>]\n"
+         +"<action> is one of :\n\tsave,update,close,watch";
+  
   private static boolean parseArgs(String args[]) {
     return true; // incorrect arguments.
   }
   public static void main(String[] args) {
-    if ((args.length<=1) || parseArgs(args)) {
+    if ((args.length<=2) || !parseArgs(args)) {
       System.err.print(Usage);
     }
+
     // get IClientFactory
+    try {
+      clientfactory = new uk.ac.vamsas.client.simpleclient.SimpleClientFactory(args[0]);
+    } catch (IOException e) {
+      System.err.println(e+"\n"+Usage);
+      System.exit(1);
+    }
+    
     // get an Iclient with session data
+    app = new ClientHandle("org.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 :");
+      String[] sessions = clientfactory.getCurrentSessions();
+      for (int s=0;s<sessions.length; s++)
+        System.err.println(sessions[s]);
+      System.exit(2);
+    }
+    addHandlers(vorbaclient);
+    try {
+      vorbaclient.joinSession();
+    }
+    catch (Exception se) {
+      se.printStackTrace();
+      System.err.println(se+" when joining session.\n"+Usage);
+      System.exit(1);
+    }
     // register an update listener and a close listener.
     // get document data
-    // do something with data
-    // , update document, or something.
-    // ..
+    try {
+      IClientDocument cdoc = vorbaclient.getClientDocument();
+      processVamsasDocument(cdoc);
+    } catch (Exception e) {
+      System.err.println("Unexpected exception when retrieving the client document for the first time!");
+      e.printStackTrace(System.err);
+      System.exit(1);
+    }
+
+    // Main application event loop - wait around and do stuff...
+    while (!isShuttingdown) {
+      // do something with data
+      // , update document, or something.
+      // ..
+      
+    }
     // call finalizeClient
+    vorbaclient.finalizeClient();
     // { meanwhile, eventHandlers are called to do any saves if need be }
+    // and all registered listeners will be deregistered to avoid deadlock.
+    
     // finish
   }
 }