From 4b48ff7b994c2eb30d06a19e68a1eecfcc9b82b5 Mon Sep 17 00:00:00 2001 From: jprocter Date: Wed, 14 Oct 2009 16:16:59 +0000 Subject: [PATCH] quick fix for nullpointer in column selection when saving jalview project (David M reported) --- src/jalview/gui/AlignFrame.java | 6 +- src/jalview/gui/AlignViewport.java | 8 +- src/jalview/gui/Jalview2XML.java | 204 ++++++++++++++++++++++-------------- 3 files changed, 134 insertions(+), 84 deletions(-) diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 45a0c85..db2eac1 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1249,7 +1249,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.historyList.push(command); viewport.redoList.clear(); updateEditMenuBar(); - viewport.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + viewport.hasHiddenColumns = (viewport.colSel!=null && viewport.colSel.getHiddenColumns() != null && viewport.colSel.getHiddenColumns().size()>0); } } @@ -1296,7 +1296,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (originalSource != null) { - originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + originalSource.hasHiddenColumns = (viewport.colSel!=null && viewport.colSel.getHiddenColumns() != null && viewport.colSel.getHiddenColumns().size()>0); originalSource.firePropertyChange("alignment", null, originalSource.alignment.getSequences()); } @@ -1324,7 +1324,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (originalSource != null) { - originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null; + originalSource.hasHiddenColumns = (viewport.colSel!=null && viewport.colSel.getHiddenColumns() != null && viewport.colSel.getHiddenColumns().size()>0); originalSource.firePropertyChange("alignment", null, originalSource.alignment.getSequences()); } diff --git a/src/jalview/gui/AlignViewport.java b/src/jalview/gui/AlignViewport.java index f279910..289fab7 100755 --- a/src/jalview/gui/AlignViewport.java +++ b/src/jalview/gui/AlignViewport.java @@ -232,9 +232,11 @@ public class AlignViewport implements SelectionSource if (hiddenColumns != null) { this.colSel = hiddenColumns; - if (hiddenColumns.getHiddenColumns() != null) + if (hiddenColumns.getHiddenColumns() != null && hiddenColumns.getHiddenColumns().size()>0) { hasHiddenColumns = true; + } else { + hasHiddenColumns = false; } } init(); @@ -267,9 +269,11 @@ public class AlignViewport implements SelectionSource if (hiddenColumns != null) { this.colSel = hiddenColumns; - if (hiddenColumns.getHiddenColumns() != null) + if (hiddenColumns.getHiddenColumns() != null && hiddenColumns.getHiddenColumns().size()>0) { hasHiddenColumns = true; + } else { + hasHiddenColumns = false; } } init(); diff --git a/src/jalview/gui/Jalview2XML.java b/src/jalview/gui/Jalview2XML.java index f9a2fa9..4d883c4 100755 --- a/src/jalview/gui/Jalview2XML.java +++ b/src/jalview/gui/Jalview2XML.java @@ -401,13 +401,13 @@ public class Jalview2XML * JarOutputStream * * @param ap - * panel to create jalview model for + * panel to create jalview model for * @param fileName - * name of alignment panel written to output stream + * name of alignment panel written to output stream * @param jout - * jar output stream + * jar output stream * @param out - * jar entry name + * jar entry name */ public JalviewModel SaveState(AlignmentPanel ap, String fileName, JarOutputStream jout) @@ -574,17 +574,21 @@ public class Jalview2XML AppJmol jmol; // This must have been loaded, is it still visible? JInternalFrame[] frames = Desktop.desktop.getAllFrames(); - String matchedFile=null; + String matchedFile = null; for (int f = frames.length - 1; f > -1; f--) { if (frames[f] instanceof AppJmol) { jmol = (AppJmol) frames[f]; - if (!jmol.pdbentry.getId().equals(entry.getId()) - && !(entry.getId().length()>4 - && entry.getId().toLowerCase().startsWith(jmol.pdbentry.getId().toLowerCase()))) + if (!jmol.pdbentry.getId().equals(entry.getId()) + && !(entry.getId().length() > 4 && entry.getId() + .toLowerCase().startsWith( + jmol.pdbentry.getId().toLowerCase()))) continue; - matchedFile = jmol.pdbentry.getFile(); // record the file so we can get at it if the ID match is ambiguous (e.g. 1QIP==1qipA) + matchedFile = jmol.pdbentry.getFile(); // record the file so we + // can get at it if the ID + // match is ambiguous (e.g. + // 1QIP==1qipA) StructureState state = new StructureState(); state.setVisible(true); state.setXpos(jmol.getX()); @@ -607,13 +611,13 @@ public class Jalview2XML } } - if (matchedFile!=null || entry.getFile() != null ) + if (matchedFile != null || entry.getFile() != null) { - if (entry.getFile()!=null) + if (entry.getFile() != null) { // use entry's file matchedFile = entry.getFile(); - } + } pdb.setFile(matchedFile); // entry.getFile()); if (pdbfiles == null) { @@ -685,9 +689,10 @@ public class Jalview2XML for (int p = 0; p < jac[i].aaWidth; p++) { Alcodon cmap = new Alcodon(); - if (jac[i].codons[p]!=null) + if (jac[i].codons[p] != null) { - // Null codons indicate a gapped column in the translated peptide alignment. + // Null codons indicate a gapped column in the translated peptide + // alignment. cmap.setPos1(jac[i].codons[p][0]); cmap.setPos2(jac[i].codons[p][1]); cmap.setPos3(jac[i].codons[p][2]); @@ -702,7 +707,7 @@ public class Jalview2XML for (int m = 0; m < pmaps.length; m++) { AlcodMap alcmap = new AlcodMap(); - alcmap.setDnasq(seqHash(dnas[m])); + alcmap.setDnasq(seqHash(dnas[m])); alcmap.setMapping(createVamsasMapping(pmaps[m], dnas[m], null, false)); alc.addAlcodMap(alcmap); @@ -1110,14 +1115,23 @@ public class Jalview2XML if (av.hasHiddenColumns) { - for (int c = 0; c < av.getColumnSelection().getHiddenColumns().size(); c++) + if (av.getColumnSelection() == null + || av.getColumnSelection().getHiddenColumns() == null) { - int[] region = (int[]) av.getColumnSelection().getHiddenColumns() - .elementAt(c); - HiddenColumns hc = new HiddenColumns(); - hc.setStart(region[0]); - hc.setEnd(region[1]); - view.addHiddenColumns(hc); + warn("REPORT BUG: avoided null columnselection bug (DMAM reported). Please contact Jim about this."); + } + else + { + for (int c = 0; c < av.getColumnSelection().getHiddenColumns() + .size(); c++) + { + int[] region = (int[]) av.getColumnSelection().getHiddenColumns() + .elementAt(c); + HiddenColumns hc = new HiddenColumns(); + hc.setStart(region[0]); + hc.setEnd(region[1]); + view.addHiddenColumns(hc); + } } } @@ -1164,7 +1178,7 @@ public class Jalview2XML * exist, the result of the hashcode call for the object. * * @param jvobj - * jalview data object + * jalview data object * @return unique ID for referring to jvobj */ private String makeHashCode(Object jvobj, String altCode) @@ -1195,7 +1209,7 @@ public class Jalview2XML * return local jalview object mapped to ID, if it exists * * @param idcode - * (may be null) + * (may be null) * @return null or object bound to idcode */ private Object retrieveExistingObj(String idcode) @@ -1426,8 +1440,8 @@ public class Jalview2XML /** * Load a jalview project archive from a jar file * - * @param file - - * HTTP URL or filename + * @param file + * - HTTP URL or filename */ public AlignFrame LoadJalviewAlign(final String file) { @@ -1733,13 +1747,13 @@ public class Jalview2XML * Load alignment frame from jalview XML DOM object * * @param object - * DOM + * DOM * @param file - * filename source string + * filename source string * @param loadTreesAndStructures - * when false only create Viewport + * when false only create Viewport * @param jprovider - * data source provider + * data source provider * @return alignment frame created from view stored in DOM */ AlignFrame LoadFromObject(JalviewModel object, String file, @@ -1913,14 +1927,17 @@ public class Jalview2XML Alcodon[] alcods = alc[i].getAlcodon(); for (int p = 0; p < cf.codons.length; p++) { - if (alcods[p].hasPos1() && alcods[p].hasPos2() && alcods[p].hasPos3()) + if (alcods[p].hasPos1() && alcods[p].hasPos2() + && alcods[p].hasPos3()) { // translated codons require three valid positions cf.codons[p] = new int[3]; cf.codons[p][0] = (int) alcods[p].getPos1(); cf.codons[p][1] = (int) alcods[p].getPos2(); cf.codons[p][2] = (int) alcods[p].getPos3(); - } else { + } + else + { cf.codons[p] = null; } } @@ -2139,7 +2156,8 @@ public class Jalview2XML sg.textColour = new java.awt.Color(groups[i].getTextCol1()); sg.textColour2 = new java.awt.Color(groups[i].getTextCol2()); - sg.setShowunconserved(groups[i].hasShowUnconserved() ? groups[i].isShowUnconserved() : false); + sg.setShowunconserved(groups[i].hasShowUnconserved() ? groups[i] + .isShowUnconserved() : false); sg.thresholdTextColour = groups[i].getTextColThreshold(); if (groups[i].getConsThreshold() != 0) @@ -2257,7 +2275,8 @@ public class Jalview2XML else { // update local tree attributes ? - // TODO: should check if tp has been manipulated by user - if so its settings shouldn't be modified + // TODO: should check if tp has been manipulated by user - if so its + // settings shouldn't be modified tp.setTitle(tree.getTitle()); tp.setBounds(new Rectangle(tree.getXpos(), tree.getYpos(), tree .getWidth(), tree.getHeight())); @@ -2268,9 +2287,10 @@ public class Jalview2XML tp.treeCanvas.ap = ap; // af.alignPanel; } - if (tp==null) + if (tp == null) { - warn("There was a problem recovering stored Newick tree: \n"+tree.getNewick()); + warn("There was a problem recovering stored Newick tree: \n" + + tree.getNewick()); continue; } @@ -2387,27 +2407,33 @@ public class Jalview2XML { // create a new Jmol window String state = ids[p].getStructureState(s).getContent(); - StringBuffer newFileLoc=null; - if (state.indexOf("load")>-1) { - newFileLoc = new StringBuffer(state.substring( - 0, state.indexOf("\"", state.indexOf("load")) + 1)); - - newFileLoc.append(jpdb.getFile()); - newFileLoc.append(state.substring(state.indexOf("\"", state - .indexOf("load \"") + 6))); - } else { - System.err.println("Ignoring incomplete Jmol state for PDB "+ids[p].getId()); - + StringBuffer newFileLoc = null; + if (state.indexOf("load") > -1) + { + newFileLoc = new StringBuffer(state.substring(0, state + .indexOf("\"", state.indexOf("load")) + 1)); + + newFileLoc.append(jpdb.getFile()); + newFileLoc.append(state.substring(state.indexOf("\"", + state.indexOf("load \"") + 6))); + } + else + { + System.err + .println("Ignoring incomplete Jmol state for PDB " + + ids[p].getId()); + newFileLoc = new StringBuffer(state); newFileLoc.append("; load \""); newFileLoc.append(jpdb.getFile()); newFileLoc.append("\";"); } - - if (newFileLoc!=null) { + + if (newFileLoc != null) + { new AppJmol(pdbFile, ids[p].getId(), seq, af.alignPanel, - newFileLoc.toString(), new java.awt.Rectangle(x, y, - width, height), sviewid); + newFileLoc.toString(), new java.awt.Rectangle(x, + y, width, height), sviewid); } } @@ -2554,7 +2580,8 @@ public class Jalview2XML af.viewport.textColour = new java.awt.Color(view.getTextCol1()); af.viewport.textColour2 = new java.awt.Color(view.getTextCol2()); af.viewport.thresholdTextColour = view.getTextColThreshold(); - af.viewport.setShowUnconserved(view.hasShowUnconserved() ? view.isShowUnconserved() : false); + af.viewport.setShowUnconserved(view.hasShowUnconserved() ? view + .isShowUnconserved() : false); af.viewport.setStartRes(view.getStartRes()); af.viewport.setStartSeq(view.getStartSeq()); @@ -2627,8 +2654,8 @@ public class Jalview2XML /* * if - * (view.getAnnotationColours().getColourScheme().equals("None")) { - * sg.cs = new AnnotationColourGradient( + * (view.getAnnotationColours().getColourScheme().equals("None" + * )) { sg.cs = new AnnotationColourGradient( * af.viewport.alignment.getAlignmentAnnotation()[i], new * java.awt.Color(view.getAnnotationColours(). getMinColour()), * new java.awt.Color(view.getAnnotationColours(). @@ -2689,16 +2716,22 @@ public class Jalview2XML Setting setting = jms.getFeatureSettings().getSetting(fs); if (setting.hasMincolour()) { - // TODO: determine how to set data independent bounds for a graduated colour scheme's range. - GraduatedColor gc = new GraduatedColor(new java.awt.Color(setting.getMincolour()), new java.awt.Color(setting.getColour()), - 0,1); - if (setting.hasThreshold()) { + // TODO: determine how to set data independent bounds for a graduated + // colour scheme's range. + GraduatedColor gc = new GraduatedColor(new java.awt.Color(setting + .getMincolour()), + new java.awt.Color(setting.getColour()), 0, 1); + if (setting.hasThreshold()) + { gc.setThresh(setting.getThreshold()); gc.setThreshType(setting.getThreshstate()); } - } else { + } + else + { af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour( - setting.getType(), new java.awt.Color(setting.getColour())); + setting.getType(), + new java.awt.Color(setting.getColour())); } renderOrder[fs] = setting.getType(); if (setting.hasOrder()) @@ -2817,7 +2850,8 @@ public class Jalview2XML SequenceI[] dsseqs = new SequenceI[dseqs.size()]; dseqs.copyInto(dsseqs); ds = new jalview.datamodel.Alignment(dsseqs); - debug("Created new dataset "+vamsasSet.getDatasetId()+" for alignment "+System.identityHashCode(al)); + debug("Created new dataset " + vamsasSet.getDatasetId() + + " for alignment " + System.identityHashCode(al)); addDatasetRef(vamsasSet.getDatasetId(), ds); } // set the dataset for the newly imported alignment. @@ -2830,11 +2864,11 @@ public class Jalview2XML /** * * @param vamsasSeq - * sequence definition to create/merge dataset sequence for + * sequence definition to create/merge dataset sequence for * @param ds - * dataset alignment + * dataset alignment * @param dseqs - * vector to add new dataset sequence to + * vector to add new dataset sequence to */ private void ensureJalviewDatasetSequence(Sequence vamsasSeq, AlignmentI ds, Vector dseqs) @@ -2924,7 +2958,9 @@ public class Jalview2XML } java.util.Hashtable datasetIds = null; + java.util.IdentityHashMap dataset2Ids = null; + private Alignment getDatasetFor(String datasetId) { if (datasetIds == null) @@ -2947,35 +2983,40 @@ public class Jalview2XML } datasetIds.put(datasetId, dataset); } + /** * make a new dataset ID for this jalview dataset alignment + * * @param dataset * @return */ private String getDatasetIdRef(jalview.datamodel.Alignment dataset) { - if (dataset.getDataset()!=null) + if (dataset.getDataset() != null) { warn("Serious issue! Dataset Object passed to getDatasetIdRef is not a Jalview DATASET alignment..."); } - String datasetId=makeHashCode(dataset, null); - if (datasetId==null) + String datasetId = makeHashCode(dataset, null); + if (datasetId == null) { // make a new datasetId and record it if (dataset2Ids == null) { dataset2Ids = new IdentityHashMap(); - } else { + } + else + { datasetId = (String) dataset2Ids.get(dataset); } - if (datasetId==null) + if (datasetId == null) { - datasetId = "ds"+dataset2Ids.size()+1; - dataset2Ids.put(dataset,datasetId); + datasetId = "ds" + dataset2Ids.size() + 1; + dataset2Ids.put(dataset, datasetId); } } return datasetId; } + private void addDBRefs(SequenceI datasetSequence, Sequence sequence) { for (int d = 0; d < sequence.getDBRefCount(); d++) @@ -3019,7 +3060,7 @@ public class Jalview2XML MappingChoice mc = m.getMappingChoice(); if (mc.getDseqFor() != null) { - String dsfor = ""+mc.getDseqFor(); + String dsfor = "" + mc.getDseqFor(); if (seqRefIds.containsKey(dsfor)) { /** @@ -3095,9 +3136,12 @@ public class Jalview2XML else { uniqueSetSuffix = ""; - jm.getJalviewModelSequence().getViewport(0).setId(null); // we don't overwrite the view we just copied + jm.getJalviewModelSequence().getViewport(0).setId(null); // we don't + // overwrite the + // view we just + // copied } - if (this.frefedSequence==null) + if (this.frefedSequence == null) { frefedSequence = new Vector(); } @@ -3109,8 +3153,9 @@ public class Jalview2XML af.closeMenuItem_actionPerformed(true); /* - * if(ap.av.alignment.getAlignmentAnnotation()!=null) { for(int i=0; i