X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fuk%2Fac%2Fvamsas%2Ftest%2Fsimpleclient%2Fsimpleapp%2FVamsasClient.java;h=67db315538e50ad72102ae740e8223b44aae57cf;hb=844ccad5a3fcbedec17b2af66d460f31abc7cff1;hp=a5c37e8016b297106fb2ec57ed68ca76350a9873;hpb=214bb57444d657f49822ee9226728e720a11dafe;p=vamsas.git diff --git a/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasClient.java b/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasClient.java index a5c37e8..67db315 100644 --- a/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasClient.java +++ b/src/uk/ac/vamsas/test/simpleclient/simpleapp/VamsasClient.java @@ -1,187 +1,243 @@ -/** - * - */ -package uk.ac.vamsas.test.simpleclient.simpleapp; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.util.Hashtable; -import java.util.IdentityHashMap; -import java.util.Vector; -import java.util.jar.JarOutputStream; - -import javax.swing.JInternalFrame; - -import org.vamsas.test.simpleclient.ArchiveClient; -import org.vamsas.test.simpleclient.ClientDoc; - -import uk.ac.vamsas.client.UserHandle; -import uk.ac.vamsas.client.simpleclient.FileWatcher; -import uk.ac.vamsas.client.simpleclient.VamsasArchive; -import uk.ac.vamsas.client.simpleclient.VamsasFile; -import uk.ac.vamsas.objects.core.Entry; -import uk.ac.vamsas.objects.core.VamsasDocument; - -/** - * @author jimp - * - */ -public class VamsasClient extends ArchiveClient { - org.apache.commons.logging.Log log=org.apache.commons.logging.LogFactory.getLog(VamsasClient.class); - /** - * create a new vamsas client session from the archive at sessionPath. - * @param sessionPath - */ - public VamsasClient(File sessionPath) { - super(System.getProperty("user.name"),System.getProperty("host.name"), "SimpleVamsasClientApp","0.1", - sessionPath); - } - /** - * Called by gui to read anything from the vamsas session into the apps datamodel - * after it has started up. - * - */ - public void initial_update() { - log.info("Jalview loading the Vamsas Session."); - // load in the vamsas archive for the first time - ClientDoc cdoc = this.getUpdateable(); - updateJalview(cdoc); - // TODO: flush any new VorbaIds to the document : updateVamsasClient may actually generate new Vamsas Document data in the form of vamsas element ids - these should be written back to the document. - //doUpdate(cdoc); // JBPNote: this should flush new VorbaIds but I've not tested it yet. - cdoc.closeDoc(); - // then tell app to update its display based on the datamodel changes. - } - VamsasClientWatcher watcher=null; - /** - * Called by app when internal datamodel should exported (syncrhonised outwards) to vamsas document - * - */ - public void push_update() { - - watchForChange=false; // this makes any watch(long) loops return. - // we should also wait arount for this.WATCH_SLEEP to really make sure the watcher thread has stopped. - try { - Thread.sleep(WATCH_SLEEP); - } catch (Exception e) { - - }; - - ClientDoc cdoc = getUpdateable(); - updateVamsasDocument(cdoc); - doUpdate(cdoc); - cdoc.closeDoc(); - cdoc=null; - watchForChange=true; - startWatcher(); - } - public void end_session() { - watchForChange=false; // this makes any watch(long) loops return. - // we should also wait arount for this.WATCH_SLEEP to really make sure the watcher thread has stopped. - try { - Thread.sleep(WATCH_SLEEP); - } catch (Exception e) { - - }; - - // stop any update/watcher thread. - log.info("VamsasClientApplication disconnecting from the Vamsas Session."); - } - public void updateJalview(ClientDoc cdoc) { - ensureVamsasBindings(); - VamsasDatastore vds = new VamsasDatastore(cdoc, vobj2jv, jv2vobj, baseProvEntry()); - vds.updateToJalview(); - } - private void ensureVamsasBindings() { - if (jv2vobj==null) { - jv2vobj = new IdentityHashMap(); - vobj2jv = new Hashtable(); - } - } - /** - * App's object binding to VorbaIds - */ - IdentityHashMap jv2vobj = null; - Hashtable vobj2jv = null; - /** - * called with a vamsas document which will be updated with new data from the app - * @param doc - */ - public void updateVamsasDocument(ClientDoc doc) { - ensureVamsasBindings(); - VamsasDatastore vds = new VamsasDatastore(doc, vobj2jv, jv2vobj, baseProvEntry()); - // wander through frames - vds.storeVAMSAS(new Object()); // Object is the apps datamodel ;) - } - /** - * - * @return a base provenance entry used by the VamsasDatastore object to get attributes from. this isn't particularly elegant either. - */ - private Entry baseProvEntry() { - uk.ac.vamsas.objects.core.Entry pentry = new uk.ac.vamsas.objects.core.Entry(); - pentry.setUser(this.getProvenanceUser()); - pentry.setApp(this.getClientHandle().getClientName()); - pentry.setDate(new org.exolab.castor.types.Date(new java.util.Date())); - pentry.setAction("created"); - return pentry; - } - protected class VamsasClientWatcher extends Thread implements Runnable { - /* (non-Javadoc) - * @see java.lang.Thread#run() - */ - VamsasClient client=null; - VamsasClientWatcher(VamsasClient client) { - this.client = client; - } - boolean running=false; - public void run() { - running=true; - while (client.watchForChange) { - ClientDoc docio = client.watch(0); - if (docio!=null) { - // VamsasClient GUI bits should be disabled whilst an update is in progress so the user doesn't screw anything up. - client.disableGui(true); - log.debug("Updating VamsasClient app from changed vamsas document."); - client.updateJalview(docio); - log.debug("Finished updating from document change."); - docio.closeDoc(); - docio=null; - client.disableGui(false); - } - } - running=false; - - } - - } - /** - * @param args - */ - public static void main(String[] args) { - // TODO Auto-generated method stub - - } - /** - * disable (if b is true) or enable (if b is true) the VamsasClient's vamsas session gui bits whilst a document change is being updated to the app. - * @param b - */ - public void disableGui(boolean b) { - // in jalview, we turn off the VAMSAS Session menu : Desktop.instance.setVamsasUpdate(b); - } - /** - * spawn a new thread to start the VamsasClientWatcher. - * - */ - public void startWatcher() { - if (watcher==null) - watcher=new VamsasClientWatcher(this); - Thread thr = new Thread() { - public void run() { - watcher.start(); - } - }; - thr.start(); - } - -} +/* + * This file is part of the Vamsas Client version 0.1. + * Copyright 2009 by Jim Procter, Iain Milne, Pierre Marguerite, + * Andrew Waterhouse and Dominik Lindner. + * + * Earlier versions have also been incorporated into Jalview version 2.4 + * since 2008, and TOPALi version 2 since 2007. + * + * The Vamsas Client is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Vamsas Client is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the Vamsas Client. If not, see . + */ +package uk.ac.vamsas.test.simpleclient.simpleapp; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Hashtable; +import java.util.IdentityHashMap; +import java.util.Vector; +import java.util.jar.JarOutputStream; + +import javax.swing.JInternalFrame; + +import uk.ac.vamsas.client.UserHandle; +import uk.ac.vamsas.client.simpleclient.FileWatcher; +import uk.ac.vamsas.client.simpleclient.VamsasArchive; +import uk.ac.vamsas.client.simpleclient.VamsasFile; +import uk.ac.vamsas.objects.core.Entry; +import uk.ac.vamsas.objects.core.VamsasDocument; +import uk.ac.vamsas.test.simpleclient.ArchiveClient; +import uk.ac.vamsas.test.simpleclient.ClientDoc; + +/** + * @author jimp + * + */ +public class VamsasClient extends ArchiveClient { + org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory + .getLog(VamsasClient.class); + + /** + * create a new vamsas client session from the archive at sessionPath. + * + * @param sessionPath + */ + public VamsasClient(File sessionPath) { + super(System.getProperty("user.name"), System.getProperty("host.name"), + "SimpleVamsasClientApp", "0.1", sessionPath); + } + + /** + * Called by gui to read anything from the vamsas session into the apps + * datamodel after it has started up. + * + */ + public void initial_update() { + log.info("Jalview loading the Vamsas Session."); + // load in the vamsas archive for the first time + ClientDoc cdoc = this.getUpdateable(); + updateJalview(cdoc); + // TODO: flush any new VorbaIds to the document : updateVamsasClient may + // actually generate new Vamsas Document data in the form of vamsas element + // ids - these should be written back to the document. + // doUpdate(cdoc); // JBPNote: this should flush new VorbaIds but I've not + // tested it yet. + cdoc.closeDoc(); + // then tell app to update its display based on the datamodel changes. + } + + VamsasClientWatcher watcher = null; + + /** + * Called by app when internal datamodel should exported (syncrhonised + * outwards) to vamsas document + * + */ + public void push_update() { + + watchForChange = false; // this makes any watch(long) loops return. + // we should also wait arount for this.WATCH_SLEEP to really make sure the + // watcher thread has stopped. + try { + Thread.sleep(WATCH_SLEEP); + } catch (Exception e) { + + } + ; + + ClientDoc cdoc = getUpdateable(); + updateVamsasDocument(cdoc); + doUpdate(cdoc); + cdoc.closeDoc(); + cdoc = null; + watchForChange = true; + startWatcher(); + } + + public void end_session() { + watchForChange = false; // this makes any watch(long) loops return. + // we should also wait arount for this.WATCH_SLEEP to really make sure the + // watcher thread has stopped. + try { + Thread.sleep(WATCH_SLEEP); + } catch (Exception e) { + + } + ; + + // stop any update/watcher thread. + log.info("VamsasClientApplication disconnecting from the Vamsas Session."); + } + + public void updateJalview(ClientDoc cdoc) { + ensureVamsasBindings(); + VamsasDatastore vds = new VamsasDatastore(cdoc, vobj2jv, jv2vobj, + baseProvEntry()); + vds.updateToJalview(); + } + + private void ensureVamsasBindings() { + if (jv2vobj == null) { + jv2vobj = new IdentityHashMap(); + vobj2jv = new Hashtable(); + } + } + + /** + * App's object binding to VorbaIds + */ + IdentityHashMap jv2vobj = null; + + Hashtable vobj2jv = null; + + /** + * called with a vamsas document which will be updated with new data from the + * app + * + * @param doc + */ + public void updateVamsasDocument(ClientDoc doc) { + ensureVamsasBindings(); + VamsasDatastore vds = new VamsasDatastore(doc, vobj2jv, jv2vobj, + baseProvEntry()); + // wander through frames + vds.storeVAMSAS(new Object()); // Object is the apps datamodel ;) + } + + /** + * + * @return a base provenance entry used by the VamsasDatastore object to get + * attributes from. this isn't particularly elegant either. + */ + private Entry baseProvEntry() { + uk.ac.vamsas.objects.core.Entry pentry = new uk.ac.vamsas.objects.core.Entry(); + pentry.setUser(this.getProvenanceUser()); + pentry.setApp(this.getClientHandle().getClientName()); + pentry.setDate(new java.util.Date()); + pentry.setAction("created"); + return pentry; + } + + protected class VamsasClientWatcher extends Thread implements Runnable { + /* + * (non-Javadoc) + * + * @see java.lang.Thread#run() + */ + VamsasClient client = null; + + VamsasClientWatcher(VamsasClient client) { + this.client = client; + } + + boolean running = false; + + public void run() { + running = true; + while (client.watchForChange) { + ClientDoc docio = client.watch(0); + if (docio != null) { + // VamsasClient GUI bits should be disabled whilst an update is in + // progress so the user doesn't screw anything up. + client.disableGui(true); + log.debug("Updating VamsasClient app from changed vamsas document."); + client.updateJalview(docio); + log.debug("Finished updating from document change."); + docio.closeDoc(); + docio = null; + client.disableGui(false); + } + } + running = false; + + } + + } + + /** + * @param args + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + + /** + * disable (if b is true) or enable (if b is true) the VamsasClient's vamsas + * session gui bits whilst a document change is being updated to the app. + * + * @param b + */ + public void disableGui(boolean b) { + // in jalview, we turn off the VAMSAS Session menu : + // Desktop.instance.setVamsasUpdate(b); + } + + /** + * spawn a new thread to start the VamsasClientWatcher. + * + */ + public void startWatcher() { + if (watcher == null) + watcher = new VamsasClientWatcher(this); + Thread thr = new Thread() { + public void run() { + watcher.start(); + } + }; + thr.start(); + } + +}