X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FVamsasApplication.java;h=13f6692f13a6a10bcc997fc7819f72fdb43e3875;hb=ad20cd92225f2ee8c251d39b00b90555d382a616;hp=9bc1ffa07463b3b36fc746ee9c5b32cf712197fe;hpb=50ad147ba0eb763fae29b364c80632abc1155e9c;p=jalview.git diff --git a/src/jalview/gui/VamsasApplication.java b/src/jalview/gui/VamsasApplication.java index 9bc1ffa..13f6692 100644 --- a/src/jalview/gui/VamsasApplication.java +++ b/src/jalview/gui/VamsasApplication.java @@ -1,20 +1,19 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4) - * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8) + * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * This program 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 General Public License for more details. + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * Jalview 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 General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ package jalview.gui; @@ -28,6 +27,7 @@ import jalview.structure.SelectionListener; import jalview.structure.SelectionSource; import jalview.structure.StructureSelectionManager; import jalview.structure.VamsasListener; +import jalview.structure.VamsasSource; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -45,7 +45,6 @@ import uk.ac.vamsas.client.ClientHandle; import uk.ac.vamsas.client.IClient; import uk.ac.vamsas.client.IClientDocument; import uk.ac.vamsas.client.InvalidSessionDocumentException; -import uk.ac.vamsas.client.NoDefaultSessionException; import uk.ac.vamsas.client.UserHandle; import uk.ac.vamsas.client.VorbaId; import uk.ac.vamsas.client.picking.IMessageHandler; @@ -62,7 +61,7 @@ import uk.ac.vamsas.objects.core.Seg; * @author jimp * */ -public class VamsasApplication implements SelectionSource +public class VamsasApplication implements SelectionSource, VamsasSource { IClient vclient = null; @@ -72,16 +71,19 @@ public class VamsasApplication implements SelectionSource Desktop jdesktop = null; // our jalview desktop reference + private boolean inInitialUpdate = true; + // Cache.preferences for vamsas client session arena // preferences for check for default session at startup. // user and organisation stuff. - public VamsasApplication(Desktop jdesktop, File sessionPath) + public VamsasApplication(Desktop jdesktop, File sessionPath, + String sessionName) { // JBPNote: // we should create a session URI from the sessionPath and pass it to // the clientFactory - but the vamsas api doesn't cope with that yet. this.jdesktop = jdesktop; - initClientSession(null, sessionPath); + initClientSession(null, sessionPath, sessionName); } private static uk.ac.vamsas.client.IClientFactory getClientFactory() @@ -115,7 +117,7 @@ public class VamsasApplication implements SelectionSource /** * @throws IOException - * or other if clientfactory instantiation failed. + * or other if clientfactory instantiation failed. * @return list of current sessions or null if no session exists. */ public static String[] getSessionList() throws Exception @@ -128,12 +130,18 @@ public class VamsasApplication implements SelectionSource * session * * @param sess - * null or a valid session url + * null or a valid session url * @param vamsasDocument - * null or a valid vamsas document file + * null or a valid vamsas document file * @return false if no vamsas connection was made */ - private boolean initClientSession(String sess, File vamsasDocument) + private void initClientSession(String sess, File vamsasDocument) + { + initClientSession(sess, vamsasDocument, null); + } + + private boolean initClientSession(String sess, File vamsasDocument, + String newDocSessionName) { try { @@ -149,8 +157,16 @@ public class VamsasApplication implements SelectionSource } try { - vclient = clientfactory.openAsNewSessionIClient(app, - vamsasDocument); + if (newDocSessionName != null) + { + vclient = clientfactory.openAsNewSessionIClient(app, + vamsasDocument, newDocSessionName); + } + else + { + vclient = clientfactory.openAsNewSessionIClient(app, + vamsasDocument); + } } catch (InvalidSessionDocumentException e) { JOptionPane @@ -206,14 +222,12 @@ public class VamsasApplication implements SelectionSource } catch (Error e) { Cache.log - .warn( - "Probable SERIOUS VAMSAS client incompatibility - carrying on regardless", + .warn("Probable SERIOUS VAMSAS client incompatibility - carrying on regardless", e); } catch (Exception e) { Cache.log - .warn( - "Probable VAMSAS client incompatibility - carrying on regardless", + .warn("Probable VAMSAS client incompatibility - carrying on regardless", e); } } @@ -225,8 +239,8 @@ public class VamsasApplication implements SelectionSource */ private ClientHandle getJalviewHandle() { - return new ClientHandle("jalview.bin.Jalview", jalview.bin.Cache - .getProperty("VERSION")); + return new ClientHandle("jalview.bin.Jalview", + jalview.bin.Cache.getProperty("VERSION")); } /** @@ -252,9 +266,11 @@ public class VamsasApplication implements SelectionSource addDocumentUpdateHandler(); addStoreDocumentHandler(); startSession(); + inInitialUpdate = true; Cache.log .debug("Jalview loading the Vamsas Session for the first time."); dealWithDocumentUpdate(false); // we don't push an update out to the + inInitialUpdate = false; // document yet. Cache.log.debug("... finished update for the first time."); } @@ -287,8 +303,7 @@ public class VamsasApplication implements SelectionSource } catch (Exception e) { Cache.log - .warn( - "Exception whilst refreshing jalview windows after a vamsas document update.", + .warn("Exception whilst refreshing jalview windows after a vamsas document update.", e); } } @@ -303,24 +318,32 @@ public class VamsasApplication implements SelectionSource Cache.log.info("Jalview updating to the Vamsas Session."); dealWithDocumentUpdate(true); - /* - * IClientDocument cdoc=null; try { cdoc = vclient.getClientDocument(); } - * catch (Exception e) { Cache.log.error("Failed to get client document - * for update."); // RAISE A WARNING DIALOG disableGui(false); return; } - * updateVamsasDocument(cdoc); updateJalviewGui(); - * cdoc.setVamsasRoots(cdoc.getVamsasRoots()); // propagate update flags - * back vclient.updateDocument(cdoc); - */ Cache.log.info("Jalview finished updating to the Vamsas Session."); - // TODO Auto-generated method stub } }); udthread.start(); } + /** + * leave a session, prompting the user to save if necessary + */ public void end_session() { + end_session(true); + } + + private boolean promptUser = true; + + /** + * leave a session, optionally prompting the user to save if necessary + * + * @param promptUser + * when true enable prompting by this application + */ + + public void end_session(boolean promptUser) + { if (!inSession()) throw new Error("Jalview not connected to Vamsas session."); Cache.log.info("Jalview disconnecting from the Vamsas Session."); @@ -328,8 +351,11 @@ public class VamsasApplication implements SelectionSource { if (joinedSession) { + boolean ourprompt = this.promptUser; + this.promptUser = promptUser; vclient.finalizeClient(); Cache.log.info("Jalview has left the session."); + this.promptUser = ourprompt; // restore default value } else { @@ -409,9 +435,11 @@ public class VamsasApplication implements SelectionSource * bindings is made. * * @param doc + * @return number of views stored in document (updated and new views) */ - public void updateVamsasDocument(IClientDocument doc) + public int updateVamsasDocument(IClientDocument doc) { + int storedviews = 0; ensureJvVamsas(); errorsDuringUpdate = false; errorsDuringAppUpdate = false; @@ -423,7 +451,7 @@ public class VamsasApplication implements SelectionSource if (frames == null) { - return; + return 0; } Hashtable skipList = new Hashtable(); Hashtable viewset = new Hashtable(); @@ -460,6 +488,7 @@ public class VamsasApplication implements SelectionSource } else { + storedviews++; // could try to eliminate sequenceSetId from skiplist .. // (skipList.containsKey(af.getViewport().getSequenceSetId())) // remember sequenceSetId so we can skip all the other views on @@ -505,6 +534,7 @@ public class VamsasApplication implements SelectionSource errorsDuringAppUpdate = true; } vds.clearSkipList(); + return storedviews; } private Entry baseProvEntry() @@ -521,10 +551,12 @@ public class VamsasApplication implements SelectionSource * do a vamsas document update or update jalview from the vamsas document * * @param fromJalview - * true to update from jalview to the vamsas document + * true to update from jalview to the vamsas document + * @return total number of stored alignments in the document after the update */ - protected void dealWithDocumentUpdate(boolean fromJalview) + protected int dealWithDocumentUpdate(boolean fromJalview) { + int storedviews = 0; // called by update handler for document update. Cache.log.debug("Updating jalview from changed vamsas document."); disableGui(true); @@ -540,7 +572,7 @@ public class VamsasApplication implements SelectionSource } if (fromJalview) { - this.updateVamsasDocument(cdoc); + storedviews += updateVamsasDocument(cdoc); if (Cache.log.isDebugEnabled()) { Cache.log @@ -582,10 +614,12 @@ public class VamsasApplication implements SelectionSource ee.printStackTrace(System.err); // recover object map backup, since its probably corrupted with references // to Vobjects that don't exist anymore. - this.recover_objectMappingBackup(); + recover_objectMappingBackup(); + storedviews = 0; } Cache.log.debug("Finished updating from document change."); disableGui(false); + return storedviews; } private void addDocumentUpdateHandler() @@ -612,24 +646,33 @@ public class VamsasApplication implements SelectionSource { public void propertyChange(PropertyChangeEvent evt) { - Cache.log - .debug("Asking user if the vamsas session should be stored."); - int reply = JOptionPane - .showInternalConfirmDialog( - Desktop.desktop, - "The current VAMSAS session has unsaved data - do you want to save it ?", - "VAMSAS Session Shutdown", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - - if (reply == JOptionPane.YES_OPTION) + if (client.promptUser) { - Cache.log.debug("Prompting for vamsas store filename."); - Desktop.instance.vamsasSave_actionPerformed(null); - Cache.log.debug("Finished attempt at storing document."); + Cache.log + .debug("Asking user if the vamsas session should be stored."); + int reply = JOptionPane + .showInternalConfirmDialog( + Desktop.desktop, + "The current VAMSAS session has unsaved data - do you want to save it ?", + "VAMSAS Session Shutdown", + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE); + + if (reply == JOptionPane.YES_OPTION) + { + Cache.log.debug("Prompting for vamsas store filename."); + Desktop.instance.vamsasSave_actionPerformed(null); + Cache.log + .debug("Finished attempt at storing document."); + } + Cache.log + .debug("finished dealing with REQUESTTOCLOSE event."); + } + else + { + Cache.log + .debug("Ignoring store document request (promptUser==false)"); } - Cache.log - .debug("finished dealing with REQUESTTOCLOSE event."); } }); Cache.log.debug("Added Jalview handler for vamsas document updates."); @@ -658,12 +701,18 @@ public class VamsasApplication implements SelectionSource * IO failed * * @throws Error - * if backup_objectMapping was not called. + * if backup_objectMapping was not called. */ public void recover_objectMappingBackup() { if (_backup_vobj2jv == null) { + if (inInitialUpdate) + { + // nothing to recover so just + return; + } + throw new Error( "IMPLEMENTATION ERROR: Cannot recover vamsas object mappings - no backup was made."); } @@ -706,8 +755,8 @@ public class VamsasApplication implements SelectionSource { final IPickManager pm = vclient.getPickManager(); final StructureSelectionManager ssm = StructureSelectionManager - .getStructureSelectionManager(); - final SelectionSource me = this; + .getStructureSelectionManager(Desktop.instance); + final VamsasApplication me = this; pm.registerMessageHandler(new IMessageHandler() { String last = null; @@ -739,8 +788,8 @@ public class VamsasApplication implements SelectionSource // Cache.log.debug("Handling Mouse over "+mm.getVorbaID()+" // bound to "+jvobj+" at "+mm.getPosition()); // position is character position in aligned sequence - ssm.mouseOverVamsasSequence((SequenceI) jvobj, mm - .getPosition()); + ssm.mouseOverVamsasSequence((SequenceI) jvobj, + mm.getPosition(), me); } } if (message instanceof uk.ac.vamsas.client.picking.SelectionMessage) @@ -748,12 +797,14 @@ public class VamsasApplication implements SelectionSource // we only care about AlignmentSequence selections SelectionMessage sm = (SelectionMessage) message; sm.validate(); - System.err.println("Received\n"+sm.getRawMessage()); - Object[] jvobjs = sm.getVorbaIDs()==null ? null : new Object[sm.getVorbaIDs().length]; - if (jvobjs==null) + System.err.println("Received\n" + sm.getRawMessage()); + Object[] jvobjs = sm.getVorbaIDs() == null ? null + : new Object[sm.getVorbaIDs().length]; + if (jvobjs == null) { - // TODO: rationalise : can only clear a selection over a referred to object - ssm.sendSelection(null,null,me); + // TODO: rationalise : can only clear a selection over a + // referred to object + ssm.sendSelection(null, null, me); return; } Class type = null; @@ -773,9 +824,9 @@ public class VamsasApplication implements SelectionSource ; if (type != jvobjs[o].getClass()) { - send=false; + send = false; // discard - can't cope with selections over mixed objects - continue; + // continue; } } SequenceGroup jselection = null; @@ -784,7 +835,8 @@ public class VamsasApplication implements SelectionSource { if (jvobjs.length == 1) { - // TODO if (sm.isNone())// send a message to select the specified columns over the + // TODO if (sm.isNone())// send a message to select the + // specified columns over the // given // alignment @@ -797,15 +849,17 @@ public class VamsasApplication implements SelectionSource SequenceI seq; boolean aligned = ((jalview.datamodel.Sequence) jvobjs[0]) .getDatasetSequence() != null; - int maxWidth=0; + int maxWidth = 0; if (aligned) { jselection = new SequenceGroup(); - jselection.addSequence(seq = - (jalview.datamodel.Sequence) jvobjs[0], false); + jselection.addSequence( + seq = (jalview.datamodel.Sequence) jvobjs[0], + false); maxWidth = seq.getLength(); } - for (int c = 1; aligned && jvobjs.length > 1 && c < jvobjs.length; c++) + for (int c = 1; aligned && jvobjs.length > 1 + && c < jvobjs.length; c++) { if (((jalview.datamodel.Sequence) jvobjs[c]) .getDatasetSequence() == null) @@ -816,12 +870,13 @@ public class VamsasApplication implements SelectionSource else { jselection.addSequence( - seq = (jalview.datamodel.Sequence) jvobjs[c], false); - if (maxWidth 0) ? 1 : 0; + + if (jselection.getStartRes() > 0 + && prange[p + l] == jselection.getStartRes()) + { + jselection.setStartRes(prange[p + l] - 1); + } + if (jselection.getEndRes() <= maxWidth + && prange[p + u] == (jselection.getEndRes() + 2)) { - if (jselection!=null) - { - // set the bounds of the selected area using the first interval. - jselection.setStartRes(prange[p]-1); - jselection.setEndRes(prange[p+1]-1); - rangeset=true; - } - } else { - // try to join up adjacent columns to make a larger selection - // lower and upper bounds - int l=(d<0) ? 1 : 0; - int u=(d>0) ? 1 : 0; - - if (jselection.getStartRes()>0 && prange[p+l]==jselection.getStartRes()) - { - jselection.setStartRes(prange[p+l]-1); - } - if (jselection.getEndRes()<=maxWidth && prange[p+u]==(jselection.getEndRes()+2)) - { - jselection.setEndRes(prange[p+u]-1); - } + jselection.setEndRes(prange[p + u] - 1); } // mark all the columns in the range. - for (int sr=prange[p],er=prange[p+1],de=er+d; sr!=de; sr+=d) + for (int sr = prange[p], er = prange[p + 1], de = er + + d; sr != de; sr += d) { - colsel.addElement(sr-1); + colsel.addElement(sr - 1); } } } @@ -906,7 +957,8 @@ public class VamsasApplication implements SelectionSource int i = -1; - public void mouseOver(SequenceI seq, int index) + public void mouseOver(SequenceI seq, int index, + VamsasSource source) { if (jv2vobj == null) return; @@ -915,8 +967,9 @@ public class VamsasApplication implements SelectionSource VorbaId v = (VorbaId) jv2vobj.get(seq); if (v != null) { - Cache.log.debug("Mouse over " + v.getId() + " bound to " - + seq + " at " + index); + // this should really be a trace message. + // Cache.log.debug("Mouse over " + v.getId() + " bound to " + // + seq + " at " + index); last = seq; i = index; MouseOverMessage message = new MouseOverMessage(v.getId(), @@ -932,9 +985,16 @@ public class VamsasApplication implements SelectionSource public void selection(SequenceGroup seqsel, ColumnSelection colsel, SelectionSource source) { + if (vobj2jv == null) + { + Cache.log + .warn("Selection listener still active for dead session."); + // not in a session. + return; + } if (source != me) { - AlignmentI visal=null; + AlignmentI visal = null; if (source instanceof AlignViewport) { visal = ((AlignViewport) source).getAlignment(); @@ -947,8 +1007,12 @@ public class VamsasApplication implements SelectionSource if (source instanceof AlignViewport) { // the empty selection. - sm = new SelectionMessage("jalview", new String[] { ((AlignViewport)source).getSequenceSetId()}, null, true); - } else { + sm = new SelectionMessage("jalview", new String[] + { ((AlignViewport) source).getSequenceSetId() }, null, + true); + } + else + { // the empty selection. sm = new SelectionMessage("jalview", null, null, true); } @@ -957,10 +1021,8 @@ public class VamsasApplication implements SelectionSource { String[] vobj = new String[seqsel.getSize()]; int o = 0; - Enumeration sels = seqsel.getSequences(null).elements(); - while (sels.hasMoreElements()) + for (SequenceI sel : seqsel.getSequences(null)) { - SequenceI sel = (SequenceI) sels.nextElement(); VorbaId v = (VorbaId) jv2vobj.get(sel); if (v != null) { @@ -975,39 +1037,57 @@ public class VamsasApplication implements SelectionSource t = null; } Input range = null; - if (seqsel!=null && colsel != null) + if (seqsel != null && colsel != null) { // deparse the colsel into positions on the vamsas alignment // sequences range = new Input(); - if (colsel.getSelected()!=null && colsel.getSelected().size()>0 && visal!=null && seqsel.getSize()==visal.getHeight()) + if (colsel.getSelected() != null + && colsel.getSelected().size() > 0 + && visal != null + && seqsel.getSize() == visal.getHeight()) { - // gather selected columns outwith the sequence positions too + // gather selected columns outwith the sequence positions + // too Enumeration cols = colsel.getSelected().elements(); while (cols.hasMoreElements()) { int ival = ((Integer) cols.nextElement()).intValue(); Pos p = new Pos(); - p.setI(ival+1); + p.setI(ival + 1); range.addPos(p); } - } else { - int[] intervals = colsel.getVisibleContigs(seqsel.getStartRes(), seqsel.getEndRes()+1); - for (int iv=0;iv 0) + { + sm = new SelectionMessage("jalview", vobj, range); + } + else + { + sm = null; + } + } + if (sm != null) + { + sm.validate(); // debug + Cache.log.debug("Selection Message\n" + sm.getRawMessage()); + pm.sendMessage(sm); } - sm.validate(); // debug - Cache.log.debug("Pick Message\n"+sm.getRawMessage()); - pm.sendMessage(sm); } } @@ -1020,4 +1100,13 @@ public class VamsasApplication implements SelectionSource } } } + + public String getCurrentSession() + { + if (vclient != null) + { + return (vclient.getSessionUrn()); + } + return null; + } }