+ //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
+ ////////////////////////////////////////////////////\r
+ PrintWriter out = new PrintWriter(new OutputStreamWriter(jout,\r
+ "UTF-8"));\r
+\r
+ Vector shortNames = new Vector();\r
+\r
+ //REVERSE ORDER\r
+ for (int i = frames.length - 1; i > -1; i--)\r
+ {\r
+ if (frames[i] instanceof AlignFrame)\r
+ {\r
+ AlignFrame af = (AlignFrame) frames[i];\r
+\r
+ String shortName = af.getTitle();\r
+\r
+ if (shortName.indexOf(File.separatorChar) > -1)\r
+ {\r
+ shortName = shortName.substring(shortName.lastIndexOf(\r
+ File.separatorChar) + 1);\r
+ }\r
+\r
+ int count = 1;\r
+\r
+ while (shortNames.contains(shortName))\r
+ {\r
+ if (shortName.endsWith("_" + (count - 1)))\r
+ {\r
+ shortName = shortName.substring(0,\r
+ shortName.lastIndexOf("_"));\r
+ }\r
+\r
+ shortName = shortName.concat("_" + count);\r
+ count++;\r
+ }\r
+\r
+ shortNames.addElement(shortName);\r
+\r
+ if (!shortName.endsWith(".xml"))\r
+ {\r
+ shortName = shortName + ".xml";\r
+ }\r
+\r
+ SaveState(af, creation, shortName, jout, out);\r
+ }\r
+ }\r
+\r
+ out.close();\r
+ jout.close();\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ ex.printStackTrace();\r
+ }\r
+ }\r
+\r
+ // USE THIS METHOD TO SAVE A SINGLE ALIGNMENT WINDOW\r
+ public void SaveAlignment(AlignFrame af, String jarFile,\r
+ String fileName)\r
+ {\r
+ try\r
+ {\r
+ FileOutputStream fos = new FileOutputStream(jarFile);\r
+ JarOutputStream jout = new JarOutputStream(fos);\r
+\r
+ //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
+ ////////////////////////////////////////////////////\r
+ PrintWriter out = new PrintWriter(new OutputStreamWriter(jout,\r
+ "UTF-8"));\r
+\r
+ SaveState(af, System.currentTimeMillis(), fileName, jout, out);\r
+ out.close();\r
+ jout.close();\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ ex.printStackTrace();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param af DOCUMENT ME!\r
+ * @param timeStamp DOCUMENT ME!\r
+ * @param fileName DOCUMENT ME!\r
+ * @param jout DOCUMENT ME!\r
+ * @param out DOCUMENT ME!\r
+ */\r
+ public void SaveState(AlignFrame af, long timeStamp,\r
+ String fileName, JarOutputStream jout, PrintWriter out)\r
+ {\r
+ Vector seqids = new Vector();\r
+ Vector userColours = new Vector();\r
+\r
+ AlignViewport av = af.viewport;\r
+\r
+ JalviewModel object = new JalviewModel();\r
+ object.setVamsasModel(new jalview.schemabinding.version2.VamsasModel());\r
+\r
+ object.setCreationDate(new java.util.Date(timeStamp));\r
+ object.setVersion(jalview.bin.Cache.getProperty("VERSION"));\r
+\r
+ jalview.datamodel.AlignmentI jal = af.viewport.alignment;\r
+ jalview.datamodel.AlignmentI jalhidden = null;\r
+\r
+ if(av.hasHiddenRows)\r
+ {\r
+ jalhidden = jal;\r
+ jal = jal.getHiddenSequences().getFullAlignment();\r
+ }\r
+\r
+\r
+ SequenceSet vamsasSet = new SequenceSet();\r
+ Sequence vamsasSeq;\r
+ JalviewModelSequence jms = new JalviewModelSequence();\r
+\r
+ vamsasSet.setGapChar(jal.getGapCharacter() + "");\r
+\r
+ JSeq jseq;\r
+ Vector pdbfiles = null;\r
+\r
+ //SAVE SEQUENCES\r
+ int id = 0;\r
+ for (int i = 0; i < jal.getHeight(); i++)\r
+ {\r
+ seqids.add(jal.getSequenceAt(i));\r
+ vamsasSeq = new Sequence();\r
+ vamsasSeq.setId(id + "");\r
+ vamsasSeq.setName(jal.getSequenceAt(i).getName());\r
+ vamsasSeq.setSequence(jal.getSequenceAt(i).getSequence());\r
+ vamsasSeq.setDescription(jal.getSequenceAt(i).getDescription());\r
+\r
+ if(jal.getSequenceAt(i).getDatasetSequence().getDBRef()!=null)\r
+ {\r
+ jalview.datamodel.DBRefEntry [] dbrefs =\r
+ jal.getSequenceAt(i).getDatasetSequence().getDBRef();\r
+\r
+ for(int d=0; d<dbrefs.length; d++)\r
+ {\r
+ DBRef dbref = new DBRef();\r
+ dbref.setSource( dbrefs[d].getSource() );\r
+ dbref.setVersion( dbrefs[d].getVersion());\r
+ dbref.setAccessionId(dbrefs[d].getAccessionId());\r
+ vamsasSeq.addDBRef(dbref);\r
+ }\r
+ }\r
+\r
+ jseq = new JSeq();\r
+ jseq.setStart(jal.getSequenceAt(i).getStart());\r
+ jseq.setEnd(jal.getSequenceAt(i).getEnd());\r
+ jseq.setColour(jal.getSequenceAt(i).getColor().getRGB());\r
+\r
+ jseq.setId(id);\r
+\r
+ if (av.hasHiddenRows)\r
+ {\r
+ jseq.setHidden(jalhidden.getHiddenSequences().isHidden(\r
+ jal.getSequenceAt(i)));\r
+\r
+ if(jal.getSequenceAt(i).getHiddenSequences()!=null)\r
+ {\r
+ jalview.datamodel.SequenceI [] reps =\r
+ jal.getSequenceAt(i).getHiddenSequences().getSequencesInOrder(jal);\r
+\r
+ for(int h=0; h<reps.length; h++)\r
+ {\r
+ jseq.addHiddenSequences(\r
+ jal.findIndex(reps[h])\r
+ );\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ if(jal.getSequenceAt(i).getDatasetSequence().getSequenceFeatures()!=null)\r
+ {\r
+ jalview.datamodel.SequenceFeature[] sf\r
+ = jal.getSequenceAt(i).getDatasetSequence().getSequenceFeatures();\r
+ int index = 0;\r
+ while(index < sf.length)\r
+ {\r
+ Features features = new Features();\r
+\r
+ features.setBegin(sf[index].getBegin());\r
+ features.setEnd(sf[index].getEnd());\r
+ features.setDescription(sf[index].getDescription());\r
+ features.setType(sf[index].getType());\r
+ features.setFeatureGroup(sf[index].getFeatureGroup());\r
+ features.setScore(sf[index].getScore());\r
+ if(sf[index].links!=null)\r
+ {\r
+ for(int l=0; l<sf[index].links.size(); l++)\r
+ {\r
+ OtherData keyValue = new OtherData();\r
+ keyValue.setKey("LINK_"+l);\r
+ keyValue.setValue(sf[index].links.elementAt(l).toString());\r
+ features.addOtherData(keyValue);\r
+ }\r
+ }\r
+ if(sf[index].otherDetails!=null)\r
+ {\r
+ String key;\r
+ Enumeration keys = sf[index].otherDetails.keys();\r
+ while(keys.hasMoreElements())\r
+ {\r
+ key = keys.nextElement().toString();\r
+ OtherData keyValue = new OtherData();\r
+ keyValue.setKey( key );\r
+ keyValue.setValue(\r
+ sf[index].otherDetails.get(key).toString());\r
+ features.addOtherData(keyValue);\r
+ }\r
+ }\r
+\r
+ jseq.addFeatures(features);\r
+ index ++;\r
+ }\r
+ }\r
+\r
+ if(jal.getSequenceAt(i).getDatasetSequence().getPDBId()!=null)\r
+ {\r
+ Enumeration en = jal.getSequenceAt(i).getDatasetSequence().getPDBId().elements();\r
+ while(en.hasMoreElements())\r
+ {\r
+ Pdbids pdb = new Pdbids();\r
+ jalview.datamodel.PDBEntry entry\r
+ = (jalview.datamodel.PDBEntry)en.nextElement();\r
+\r
+ pdb.setId(entry.getId());\r
+ pdb.setType(entry.getType());\r
+\r
+ if(entry.getFile()!=null)\r
+ {\r
+ if(pdbfiles==null)\r
+ pdbfiles = new Vector();\r
+\r
+\r
+ if(!pdbfiles.contains(entry.getId()))\r
+ {\r
+ pdbfiles.addElement(entry.getId());\r
+ try\r
+ {\r
+ File file = new File(entry.getFile());\r
+ if(file.exists())\r
+ {\r
+ byte[] data = new byte[ (int) file.length()];\r
+ jout.putNextEntry(new JarEntry(entry.getId()));\r
+ DataInputStream dis = new DataInputStream(new\r
+ FileInputStream(file));\r
+ dis.readFully(data);\r
+\r
+ DataOutputStream dout = new DataOutputStream(jout);\r
+ dout.write(data, 0, data.length);\r
+ jout.closeEntry();\r
+ }\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ ex.printStackTrace();\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ if(entry.getProperty()!=null)\r
+ {\r
+ PdbentryItem item = new PdbentryItem();\r
+ Hashtable properties = entry.getProperty();\r
+ Enumeration en2 = properties.keys();\r
+ while(en2.hasMoreElements())\r
+ {\r
+ Property prop = new Property();\r
+ String key = en2.nextElement().toString();\r
+ prop.setName(key);\r
+ prop.setValue( properties.get(key).toString() );\r
+ item.addProperty(prop);\r
+ }\r
+ pdb.addPdbentryItem(item);\r
+ }\r
+\r
+ jseq.addPdbids(pdb);\r
+ }\r
+ }\r
+\r
+ jms.addJSeq(jseq);\r
+ vamsasSet.addSequence(vamsasSeq);\r
+ id++;\r
+ }\r
+\r
+ //SAVE TREES\r
+ ///////////////////////////////////\r
+ if (af.viewport.currentTree != null)\r
+ {\r
+ // FIND ANY ASSOCIATED TREES\r
+ // NOT IMPLEMENTED FOR HEADLESS STATE AT PRESENT\r
+ if (Desktop.desktop != null)\r