new savestate method
[jalview.git] / src / jalview / gui / Jalview2XML.java
1 package jalview.gui;\r
2 \r
3 import java.io.*;\r
4 import java.util.*;\r
5 import java.util.jar.*;\r
6 \r
7 import jalview.binding.*;\r
8 import jalview.schemes.*;\r
9 import javax.swing.JInternalFrame;\r
10 \r
11 \r
12 public class Jalview2XML\r
13 {\r
14 \r
15   // SAVES SEVERAL ALIGNEMENT WINDOWS TO SAME JARFILE\r
16   public static void SaveState(File statefile)\r
17   {\r
18       long creation = System.currentTimeMillis();\r
19       JInternalFrame[] frames = Desktop.desktop.getAllFrames();\r
20       try{\r
21         FileOutputStream fos = new FileOutputStream(statefile);\r
22         JarOutputStream jout = new JarOutputStream(fos);\r
23         //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
24         ////////////////////////////////////////////////////\r
25         PrintWriter out = new PrintWriter(new OutputStreamWriter(jout, "UTF-8"));\r
26 \r
27         Vector shortNames = new Vector();\r
28         for (int i = 0; i < frames.length; i++)\r
29         {\r
30           if (frames[i] instanceof AlignFrame)\r
31           {\r
32             AlignFrame af = (AlignFrame) frames[i];\r
33 \r
34             String shortName = af.getTitle();\r
35 \r
36             shortName = shortName.replace('/', '_');\r
37             shortName = shortName.replace('\\', '_');\r
38 \r
39             int count=1;\r
40             while( shortNames.contains(shortName) )\r
41             {\r
42               if(shortName.endsWith("_"+(count-1)))\r
43                 shortName = shortName.substring(0, shortName.lastIndexOf("_"));\r
44 \r
45               shortName = shortName.concat("_"+count);\r
46               count++;\r
47             }\r
48             shortNames.addElement(shortName);\r
49 \r
50             if(!shortName.endsWith(".xml"))\r
51               shortName = shortName+".xml";\r
52 \r
53             SaveState( af, creation, shortName, jout, out);\r
54            }\r
55         }\r
56         out.close();\r
57         jout.close();\r
58       }\r
59       catch(Exception ex){ex.printStackTrace();}\r
60   }\r
61 \r
62   // USE THIS METHOD TO SAVE A SINGLE ALIGNMENT WINDOW\r
63   public static void SaveState( AlignFrame af, String jarFile, String fileName)\r
64   {\r
65     try{\r
66       FileOutputStream fos = new FileOutputStream(jarFile);\r
67       JarOutputStream jout = new JarOutputStream(fos);\r
68       //NOTE UTF-8 MUST BE USED FOR WRITING UNICODE CHARS\r
69       ////////////////////////////////////////////////////\r
70       PrintWriter out = new PrintWriter(new OutputStreamWriter(jout, "UTF-8"));\r
71 \r
72       SaveState(af, System.currentTimeMillis(), fileName, jout, out);\r
73       out.close();\r
74       jout.close();\r
75     }catch(Exception ex){}\r
76   }\r
77 \r
78   public static void SaveState( AlignFrame af, long timeStamp,\r
79       String fileName, JarOutputStream jout, PrintWriter out)\r
80   {\r
81 \r
82     Vector seqids = new Vector();\r
83 \r
84     AlignViewport av = af.viewport;\r
85 \r
86     JalviewModel object = new JalviewModel();\r
87     object.setVamsasModel( new VamsasModel() );\r
88 \r
89     object.setCreationDate( new java.util.Date(timeStamp) );\r
90 \r
91     jalview.datamodel.AlignmentI jal = af.viewport.alignment;\r
92 \r
93     SequenceSet vamsasSet = new SequenceSet();\r
94     Sequence vamsasSeq;\r
95     JalviewModelSequence jms = new JalviewModelSequence();\r
96 \r
97     vamsasSet.setGapChar(jal.getGapCharacter()+"");\r
98 \r
99     JSeq jseq;\r
100 \r
101 \r
102     //SAVE SEQUENCES\r
103     int id = 0;\r
104     for(int i=0; i<jal.getHeight(); i++)\r
105     {\r
106       seqids.add(jal.getSequenceAt(i));\r
107 \r
108       vamsasSeq = new Sequence( );\r
109       vamsasSeq.setId(id+"");\r
110       vamsasSeq.setName(jal.getSequenceAt(i).getName());\r
111       vamsasSeq.setSequence(jal.getSequenceAt(i).getSequence());\r
112 \r
113       jseq = new JSeq();\r
114       jseq.setStart(jal.getSequenceAt(i).getStart());\r
115       jseq.setEnd(jal.getSequenceAt(i).getEnd());\r
116 \r
117       jseq.setColour(jal.getSequenceAt(i).getColor().getRGB());\r
118 \r
119       jseq.setId( id );\r
120 \r
121       jms.addJSeq(jseq);\r
122       vamsasSet.addSequence(vamsasSeq);\r
123       id++;\r
124     }\r
125 \r
126     //SAVE TREES\r
127     if(af.viewport.currentTree!=null)\r
128     {\r
129       object.getVamsasModel().addTree(af.viewport.currentTree.toString());\r
130     }\r
131 \r
132     //SAVE ANNOTATIONS\r
133     if(jal.getAlignmentAnnotation()!=null)\r
134     {\r
135 \r
136       jalview.datamodel.AlignmentAnnotation [] aa = jal.getAlignmentAnnotation();\r
137       for(int i=0; i<aa.length; i++)\r
138       {\r
139         if(aa[i].label.equals("Quality")\r
140         || aa[i].label.equals("Conservation")\r
141         || aa[i].label.equals("Consensus"))\r
142        {    continue;}\r
143 \r
144         Annotation an = new Annotation();\r
145         an.setDescription(aa[i].description);\r
146         an.setGraph(aa[i].isGraph);\r
147         an.setLabel(aa[i].label);\r
148 \r
149         AnnotationElement ae;\r
150 \r
151         for(int a=0; a<aa[i].annotations.length; a++)\r
152         {\r
153           if(aa[i]==null || aa[i].annotations[a]==null)\r
154             continue;\r
155 \r
156           ae = new AnnotationElement();\r
157           ae.setDescription(aa[i].annotations[a].description);\r
158           ae.setDisplayCharacter(aa[i].annotations[a].displayCharacter);\r
159           ae.setValue(aa[i].annotations[a].value);\r
160           ae.setPosition(a);\r
161           ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure+"");\r
162           an.addAnnotationElement(ae);\r
163         }\r
164 \r
165         vamsasSet.addAnnotation(an);\r
166       }\r
167 \r
168     }\r
169 \r
170     //SAVE GROUPS\r
171     if(jal.getGroups()!=null)\r
172     {\r
173       JGroup [] groups = new JGroup[jal.getGroups().size()];\r
174       for(int i=0; i<groups.length; i++)\r
175       {\r
176         groups[i] = new JGroup();\r
177         jalview.datamodel.SequenceGroup sg\r
178             = (jalview.datamodel.SequenceGroup)jal.getGroups().elementAt(i);\r
179         groups[i].setStart( sg.getStartRes() );\r
180         groups[i].setEnd( sg.getEndRes() );\r
181         groups[i].setName( sg.getName());\r
182 \r
183         if(sg.cs instanceof ConservationColourScheme)\r
184           groups[i].setConsThreshold( ((ConservationColourScheme)sg.cs).inc);\r
185 \r
186         if (sg.cs instanceof ResidueColourScheme)\r
187           groups[i].setPidThreshold( ( (ResidueColourScheme) sg.cs).getThreshold());\r
188        else if (sg.cs instanceof ScoreColourScheme)\r
189          groups[i].setPidThreshold( ( (ScoreColourScheme) sg.cs).getThreshold());\r
190 \r
191 \r
192         groups[i].setColour( ColourSchemeProperty.getColourName(sg.cs) );\r
193         groups[i].setOutlineColour(sg.getOutlineColour().getRGB());\r
194         groups[i].setDisplayBoxes(sg.getDisplayBoxes());\r
195         groups[i].setDisplayText(sg.getDisplayText());\r
196         groups[i].setColourText(sg.getColourText());\r
197 \r
198         for(int s=0; s<sg.getSize(); s++)\r
199         {\r
200           jalview.datamodel.Sequence seq = (jalview.datamodel.Sequence)sg.getSequenceAt(s);\r
201           int index = seqids.indexOf(seq);\r
202           groups[i].addSeq(index);\r
203         }\r
204 \r
205       }\r
206 \r
207       jms.setJGroup(groups);\r
208 \r
209     }\r
210 \r
211     ///////////SAVE VIEWPORT\r
212     Viewport view = new Viewport();\r
213    view.setTitle(af.getTitle());\r
214    view.setXpos(af.getX());\r
215    view.setYpos(af.getY());\r
216    view.setWidth(af.getWidth());\r
217    view.setHeight(af.getHeight());\r
218    view.setStartRes(av.startRes);\r
219    view.setStartSeq(av.startSeq);\r
220    view.setBgColour( ColourSchemeProperty.getColourName\r
221                      ( av.getGlobalColourScheme()));\r
222 \r
223    ColourSchemeI cs = av.getGlobalColourScheme();\r
224    if(cs instanceof ConservationColourScheme)\r
225      view.setConsThreshold( ((ConservationColourScheme)cs).inc);\r
226 \r
227    if (cs instanceof ResidueColourScheme)\r
228      view.setPidThreshold( ( (ResidueColourScheme) cs).getThreshold());\r
229   else if (cs instanceof ScoreColourScheme)\r
230      view.setPidThreshold( ( (ScoreColourScheme) cs).getThreshold());\r
231 \r
232 \r
233    view.setConservationSelected(av.getConservationSelected());\r
234    view.setPidSelected(av.getAbovePIDThreshold());\r
235    view.setFontName(av.font.getFontName());\r
236    view.setFontSize(av.font.getSize());\r
237    view.setFontStyle(av.font.getStyle());\r
238    view.setRenderGaps(av.renderGaps);\r
239    view.setShowAnnotation(av.getShowAnnotation());\r
240    view.setShowBoxes(av.getShowBoxes());\r
241    view.setShowColourText(av.getColourText());\r
242    view.setShowConservation(av.showConservation);\r
243    view.setShowFullId(av.getShowFullId());\r
244    view.setShowIdentity(av.showIdentity);\r
245    view.setShowQuality(av.showQuality);\r
246    view.setShowSequenceFeatures(av.showSequenceFeatures);\r
247    view.setShowText(av.getShowText());\r
248    view.setWrapAlignment(av.getWrapAlignment());\r
249 \r
250    jms.addViewport( view );\r
251 \r
252     object.setJalviewModelSequence(jms);\r
253     object.getVamsasModel().addSequenceSet(vamsasSet);\r
254 \r
255 \r
256     try\r
257     {\r
258      if(!fileName.endsWith(".xml"))\r
259               fileName = fileName+".xml";\r
260 \r
261      JarEntry entry = new JarEntry(fileName);\r
262      jout.putNextEntry(entry);\r
263 \r
264       object.marshal(out);\r
265     }\r
266     catch (Exception ex)\r
267     {\r
268       ex.printStackTrace();\r
269     }\r
270   }\r
271 \r
272 \r
273   public static void LoadJalviewAlign(String file)\r
274   {\r
275     JalviewModel object = new JalviewModel();\r
276     try{\r
277       //UNMARSHALLER SEEMS TO CLOSE JARINPUTSTREAM, MOST ANNOYING\r
278       JarInputStream jin = new JarInputStream(new FileInputStream(file));\r
279       JarEntry jarentry=null;\r
280       int entryCount = 1;\r
281       do{\r
282         jin = new JarInputStream(new FileInputStream(file));\r
283         for(int i=0; i<entryCount; i++)\r
284           jarentry = jin.getNextJarEntry();\r
285 \r
286         if(jarentry!=null)\r
287         {\r
288           InputStreamReader in = new InputStreamReader(jin, "UTF-8");\r
289           object = (JalviewModel) object.unmarshal(in);\r
290           LoadFromObject(object);\r
291           entryCount++;\r
292         }\r
293       }while(jarentry!=null);\r
294 \r
295     }\r
296     catch(Exception ex)\r
297     {   System.out.println("HERE"+ex); return; }\r
298 \r
299   }\r
300 \r
301   static void LoadFromObject(JalviewModel object)\r
302   {\r
303      Vector seqids = new Vector();\r
304      SequenceSet vamsasSet = object.getVamsasModel().getSequenceSet(0);\r
305      Sequence [] vamsasSeq = vamsasSet.getSequence();\r
306 \r
307      JalviewModelSequence jms = object.getJalviewModelSequence();\r
308      //////////////////////////////////\r
309      //LOAD SEQUENCES\r
310      jalview.datamodel.Sequence [] jseqs = new jalview.datamodel.Sequence[vamsasSeq.length];\r
311      JSeq [] JSEQ = object.getJalviewModelSequence().getJSeq();\r
312      for(int i=0; i<vamsasSeq.length; i++)\r
313      {\r
314        jseqs[i] = new jalview.datamodel.Sequence(vamsasSeq[i].getName(),\r
315                                                  vamsasSeq[i].getSequence());\r
316 \r
317        jseqs[i].setStart( JSEQ[i].getStart());\r
318        jseqs[i].setEnd( JSEQ[i].getEnd());\r
319        jseqs[i].setColor( new java.awt.Color(JSEQ[i].getColour()) );\r
320        seqids.add(jseqs[i]);\r
321      }\r
322 \r
323      /////////////////////////////////\r
324      jalview.datamodel.Alignment al = new jalview.datamodel.Alignment(jseqs);\r
325      /////////////////////////////////\r
326 \r
327      //////////////////////////////////\r
328      //LOAD ANNOTATIONS\r
329      if(vamsasSet.getAnnotation()!=null)\r
330      {\r
331        Annotation[] an = vamsasSet.getAnnotation();\r
332        for (int i = 0; i < an.length; i++)\r
333        {\r
334          AnnotationElement[] ae = an[i].getAnnotationElement();\r
335          jalview.datamodel.Annotation anot[]\r
336              = new jalview.datamodel.Annotation[al.getWidth()];\r
337          for (int aa = 0; aa < ae.length; aa++)\r
338          {\r
339            anot[ae[aa].getPosition()]\r
340                = new jalview.datamodel.Annotation(\r
341                    ae[aa].getDisplayCharacter(),\r
342                    ae[aa].getDescription(),\r
343                    ae[aa].getSecondaryStructure().charAt(0),\r
344                    ae[aa].getValue()\r
345                );\r
346          }\r
347 \r
348 \r
349           jalview.datamodel.AlignmentAnnotation jaa = null;\r
350           if(an[i].getGraph())\r
351             jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
352                                         an[i].getDescription(), anot,\r
353                                         0,0,1);\r
354           else\r
355             jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),\r
356                                         an[i].getDescription(), anot);\r
357           al.addAnnotation(jaa);\r
358        }\r
359      }\r
360 \r
361       /////////////////////////////////\r
362       // LOAD VIEWPORT\r
363       Viewport[] views = jms.getViewport();\r
364       Viewport view = views[0]; // DEAL WITH MULTIPLE VIEWPORTS LATER\r
365 \r
366       AlignFrame af = new AlignFrame(al);\r
367     //  af.changeColour() );\r
368 \r
369     /////////////////////////\r
370     //LOAD GROUPS\r
371     if (jms.getJGroupCount()>0)\r
372     {\r
373       JGroup[] groups = jms.getJGroup();\r
374       for (int i = 0; i < groups.length; i++)\r
375       {\r
376        ColourSchemeI cs = ColourSchemeProperty.getColour(al, groups[i].getColour() );\r
377        if (cs instanceof ResidueColourScheme)\r
378          ( (ResidueColourScheme) cs).setThreshold(groups[i].getPidThreshold());\r
379        else if (cs instanceof ScoreColourScheme)\r
380       ( (ScoreColourScheme) cs).setThreshold(groups[i].getPidThreshold());\r
381 \r
382         jalview.datamodel.SequenceGroup sg = new jalview.datamodel.SequenceGroup\r
383                 (groups[i].getName(),\r
384                  cs,\r
385                  groups[i].getDisplayBoxes(),\r
386                  groups[i].getDisplayText(),\r
387                  groups[i].getColourText(),\r
388                  groups[i].getStart(),\r
389                  groups[i].getEnd()) ;\r
390         sg.setOutlineColour( new java.awt.Color(groups[i].getOutlineColour()));\r
391         int [] ids = groups[i].getSeq();\r
392         for(int s=0; s<ids.length; s++)\r
393             sg.addSequence( (jalview.datamodel.SequenceI)seqids.elementAt( ids[s] ));\r
394 \r
395         if(groups[i].getConsThreshold()!=0)\r
396         {\r
397           jalview.analysis.Conservation c = new jalview.analysis.Conservation("All",\r
398               ResidueProperties.propHash, 3,\r
399               sg.sequences, 0,\r
400               sg.getWidth() - 1);\r
401           c.calculate();\r
402           c.verdict(false, 25);\r
403           cs = new ConservationColourScheme(c, cs);\r
404           sg.cs = cs;\r
405         }\r
406 \r
407 \r
408         al.addGroup(sg);\r
409       }\r
410     }\r
411 \r
412 \r
413     Desktop.addInternalFrame(af, view.getTitle(), AlignFrame.NEW_WINDOW_WIDTH, AlignFrame.NEW_WINDOW_HEIGHT);\r
414     af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(), view.getHeight());\r
415     af.viewport.setStartRes( view.getStartRes() );\r
416     af.viewport.setStartSeq( view.getStartSeq() );\r
417     af.viewport.showConservation = view.getShowConservation();\r
418     af.viewport.showQuality = view.getShowQuality();\r
419     af.viewport.showIdentity= view.getShowIdentity();\r
420     af.viewport.setAbovePIDThreshold( view.getPidSelected() );\r
421     af.viewport.setColourText( view.getShowColourText() );\r
422     af.viewport.setConservationSelected( view.getConservationSelected());\r
423     af.viewport.setShowFullId( view.getShowFullId());\r
424     af.viewport.setFont( new java.awt.Font( view.getFontName(),\r
425                                             view.getFontStyle(),\r
426                                             view.getFontSize()));\r
427     af.alignPanel.fontChanged();\r
428     af.viewport.setRenderGaps( view.getRenderGaps() );\r
429 \r
430     af.viewport.setWrapAlignment( view.getWrapAlignment() );\r
431     if(view.getWrapAlignment())\r
432     {\r
433       af.alignPanel.setWrapAlignment(view.getWrapAlignment());\r
434     }\r
435     else\r
436     {\r
437       af.viewport.setShowAnnotation(view.getShowAnnotation());\r
438       af.alignPanel.setAnnotationVisible(view.getShowAnnotation());\r
439     }\r
440 \r
441     af.viewport.setShowBoxes( view.getShowBoxes() );\r
442     af.viewport.setShowText( view.getShowText() );\r
443 \r
444     af.viewport.setGlobalColourScheme( ColourSchemeProperty.getColour(al, view.getBgColour()));\r
445     af.viewport.setColourAppliesToAllGroups(false);\r
446     af.changeColour( af.viewport.getGlobalColourScheme() );\r
447     af.viewport.setColourAppliesToAllGroups(true);\r
448 \r
449     ColourSchemeI cs = af.viewport.getGlobalColourScheme();\r
450     if(cs instanceof ConservationColourScheme)\r
451       ( (ConservationColourScheme) cs).inc = view.getConsThreshold();\r
452 \r
453     if (cs instanceof ResidueColourScheme)\r
454       ( (ResidueColourScheme) cs).setThreshold(view.getPidThreshold());\r
455     else if (cs instanceof ScoreColourScheme)\r
456       ( (ScoreColourScheme) cs).setThreshold(view.getPidThreshold());\r
457 \r
458     //LOAD TREES - THIS RELEASE ONLY ALLOWS 1 TREE\r
459     if(object.getVamsasModel().getTreeCount()>0)\r
460     {\r
461       try{\r
462         af.ShowNewickTree(new jalview.io.NewickFile(\r
463             (String)object.getVamsasModel().getTree(0)), "Tree");\r
464       }catch(Exception ex){ex.printStackTrace();}\r
465     }\r
466 \r
467   }\r
468 }\r
469 \r
470 \r
471 \r