bbbc122e2b8666d97819ba8f998785e2a8c7955a
[jalview.git] / src / jalview / io / JSONFile.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21
22 package jalview.io;
23
24 import jalview.api.AlignViewportI;
25 import jalview.api.ComplexAlignFile;
26 import jalview.api.FeatureRenderer;
27 import jalview.api.FeaturesDisplayedI;
28 import jalview.datamodel.AlignmentAnnotation;
29 import jalview.datamodel.Annotation;
30 import jalview.datamodel.ColumnSelection;
31 import jalview.datamodel.HiddenSequences;
32 import jalview.datamodel.Sequence;
33 import jalview.datamodel.SequenceFeature;
34 import jalview.datamodel.SequenceGroup;
35 import jalview.datamodel.SequenceI;
36 import jalview.json.binding.v1.AlignmentAnnotationPojo;
37 import jalview.json.binding.v1.AlignmentPojo;
38 import jalview.json.binding.v1.AlignmentPojo.JalviewBioJsColorSchemeMapper;
39 import jalview.json.binding.v1.AnnotationPojo;
40 import jalview.json.binding.v1.SequenceFeaturesPojo;
41 import jalview.json.binding.v1.SequenceGrpPojo;
42 import jalview.json.binding.v1.SequencePojo;
43 import jalview.schemes.ColourSchemeI;
44 import jalview.schemes.ColourSchemeProperty;
45
46 import java.awt.Color;
47 import java.io.IOException;
48 import java.io.Reader;
49 import java.util.ArrayList;
50 import java.util.Hashtable;
51 import java.util.Iterator;
52 import java.util.List;
53 import java.util.Vector;
54
55 import org.json.simple.JSONArray;
56 import org.json.simple.JSONObject;
57 import org.json.simple.parser.JSONParser;
58
59 public class JSONFile extends AlignFile implements ComplexAlignFile
60 {
61   private ColourSchemeI colourScheme;
62
63   private String version = "2.9";
64
65   private String webstartUrl = "www.jalview.org/services/launchApp";
66
67   private String application = "Jalview";
68
69   public static final String FILE_EXT = "json";
70
71   public static final String FILE_DESC = "JSON";
72
73   private String globalColorScheme;
74
75   private boolean showSeqFeatures;
76
77   private Hashtable<String, Sequence> seqMap;
78
79   private FeaturesDisplayedI displayedFeatures;
80
81   private FeatureRenderer fr;
82
83   private List<int[]> hiddenColumns;
84
85   private ColumnSelection columnSelection;
86
87   private List<String> hiddenSeqRefs;
88
89   private ArrayList<SequenceI> hiddenSequences;
90
91   public JSONFile()
92   {
93     super();
94   }
95
96   public JSONFile(FileParse source) throws IOException
97   {
98     super(source);
99   }
100
101   public JSONFile(String inFile, String type) throws IOException
102   {
103     super(inFile, type);
104   }
105
106   @Override
107   public void parse() throws IOException
108   {
109     parse(getReader());
110
111   }
112
113   @Override
114   public String print()
115   {
116     String jsonOutput = null;
117     try
118     {
119       AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
120       if (getViewport() != null)
121       {
122         globalColorScheme = ColourSchemeProperty
123                 .getColourName(getViewport()
124                 .getGlobalColourScheme());
125         setDisplayedFeatures(getViewport().getFeaturesDisplayed());
126         showSeqFeatures = getViewport().isShowSequenceFeatures();
127         fr = getViewport().getFeatureRenderer();
128       }
129
130       int count = 0;
131       for (SequenceI seq : seqs)
132       {
133         StringBuilder name = new StringBuilder();
134         name.append(seq.getName()).append("/").append(seq.getStart())
135                 .append("-").append(seq.getEnd());
136         SequencePojo jsonSeqPojo = new SequencePojo();
137         jsonSeqPojo.setId(String.valueOf(seq.hashCode()));
138         jsonSeqPojo.setOrder(++count);
139         jsonSeqPojo.setEnd(seq.getEnd());
140         jsonSeqPojo.setStart(seq.getStart());
141         jsonSeqPojo.setName(name.toString());
142         jsonSeqPojo.setSeq(seq.getSequenceAsString());
143         jsonAlignmentPojo.getSeqs().add(jsonSeqPojo);
144       }
145
146       jsonAlignmentPojo.setGlobalColorScheme(globalColorScheme);
147       jsonAlignmentPojo.getAppSettings().put("application", application);
148       jsonAlignmentPojo.getAppSettings().put("version", version);
149       jsonAlignmentPojo.getAppSettings().put("webStartUrl", webstartUrl);
150       jsonAlignmentPojo.getAppSettings().put("showSeqFeatures",
151               String.valueOf(showSeqFeatures));
152
153       String[] hiddenSections = getHiddenSections();
154       if (hiddenSections != null)
155       {
156         if (hiddenSections[0] != null
157                 && getViewport().getExportSettings()
158                         .isExportHiddenColumns())
159         {
160           jsonAlignmentPojo.getAppSettings().put("hiddenCols",
161                   String.valueOf(hiddenSections[0]));
162         }
163         if (hiddenSections[1] != null
164                 && getViewport().getExportSettings()
165                         .isExportHiddenSequences())
166         {
167           jsonAlignmentPojo.getAppSettings().put("hiddenSeqs",
168                   String.valueOf(hiddenSections[1]));
169         }
170       }
171
172       if (getViewport().getExportSettings().isExportAnnotations())
173       {
174         jsonAlignmentPojo
175                 .setAlignAnnotation(annotationToJsonPojo(annotations));
176       }
177
178       if (getViewport().getExportSettings().isExportFeatures())
179       {
180         jsonAlignmentPojo
181                 .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr));
182       }
183
184       if (getViewport().getExportSettings().isExportGroups()
185               && seqGroups != null
186               && seqGroups.size() > 0)
187       {
188         for (SequenceGroup seqGrp : seqGroups)
189         {
190           SequenceGrpPojo seqGrpPojo = new SequenceGrpPojo();
191           seqGrpPojo.setGroupName(seqGrp.getName());
192           seqGrpPojo.setColourScheme(ColourSchemeProperty
193                   .getColourName(seqGrp.cs));
194           seqGrpPojo.setColourText(seqGrp.getColourText());
195           seqGrpPojo.setDescription(seqGrp.getDescription());
196           seqGrpPojo.setDisplayBoxes(seqGrp.getDisplayBoxes());
197           seqGrpPojo.setDisplayText(seqGrp.getDisplayText());
198           seqGrpPojo.setEndRes(seqGrp.getEndRes());
199           seqGrpPojo.setStartRes(seqGrp.getStartRes());
200           seqGrpPojo.setShowNonconserved(seqGrp.getShowNonconserved());
201           for (SequenceI seq : seqGrp.getSequences())
202           {
203             seqGrpPojo.getSeqsHash().add(String.valueOf(seq.hashCode()));
204           }
205           jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo);
206         }
207       }
208       org.json.JSONObject generatedJSon = new org.json.JSONObject(
209               jsonAlignmentPojo);
210       jsonOutput = generatedJSon.toString();
211       return jsonOutput.replaceAll("xstart", "xStart").replaceAll("xend",
212               "xEnd");
213     } catch (Exception e)
214     {
215       e.printStackTrace();
216     }
217     return jsonOutput;
218   }
219
220   public String[] getHiddenSections()
221   {
222     String[] hiddenSections = new String[2];
223     if (getViewport() == null)
224     {
225       return null;
226     }
227
228     // hidden column business
229     if (getViewport().hasHiddenColumns())
230     {
231       List<int[]> hiddenCols = getViewport().getColumnSelection()
232               .getHiddenColumns();
233       StringBuilder hiddenColsBuilder = new StringBuilder();
234       for (int[] range : hiddenCols)
235       {
236         hiddenColsBuilder.append(";").append(range[0]).append("-")
237                 .append(range[1]);
238       }
239
240       hiddenColsBuilder.deleteCharAt(0);
241       hiddenSections[0] = hiddenColsBuilder.toString();
242     }
243
244     // hidden rows/seqs business
245     HiddenSequences hiddenSeqsObj = getViewport().getAlignment()
246             .getHiddenSequences();
247     if (hiddenSeqsObj == null || hiddenSeqsObj.hiddenSequences == null)
248     {
249       return hiddenSections;
250     }
251
252     SequenceI[] hiddenSeqs = hiddenSeqsObj.hiddenSequences;
253     StringBuilder hiddenSeqsBuilder = new StringBuilder();
254     for (SequenceI hiddenSeq : hiddenSeqs)
255     {
256       if (hiddenSeq != null)
257       {
258         hiddenSeqsBuilder.append(";").append(hiddenSeq.hashCode());
259       }
260     }
261     if (hiddenSeqsBuilder.length() > 0)
262     {
263       hiddenSeqsBuilder.deleteCharAt(0);
264     }
265     hiddenSections[1] = hiddenSeqsBuilder.toString();
266
267     return hiddenSections;
268   }
269
270   public static List<SequenceFeaturesPojo> sequenceFeatureToJsonPojo(
271           List<SequenceI> seqs, FeatureRenderer fr)
272   {
273     FeaturesDisplayedI displayedFeatures = (fr == null) ? null : fr
274             .getFeaturesDisplayed();
275     List<SequenceFeaturesPojo> sequenceFeaturesPojo = new ArrayList<SequenceFeaturesPojo>();
276     for (SequenceI seq : seqs)
277     {
278       SequenceI dataSetSequence = seq.getDatasetSequence();
279       SequenceFeature[] seqFeatures = (dataSetSequence == null) ? null
280               : seq.getDatasetSequence().getSequenceFeatures();
281
282       seqFeatures = (seqFeatures == null) ? seq.getSequenceFeatures()
283               : seqFeatures;
284       if (seqFeatures == null)
285       {
286         continue;
287       }
288
289       for (SequenceFeature sf : seqFeatures)
290       {
291         if (displayedFeatures != null
292                 && displayedFeatures.isVisible(sf.getType()))
293         {
294           SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo(
295                   String.valueOf(seq.hashCode()));
296           String featureColour = (fr == null) ? null : jalview.util.Format
297                   .getHexString(fr
298                   .findFeatureColour(Color.white, seq,
299                           seq.findIndex(sf.getBegin())));
300           jsonFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
301           jsonFeature.setXend(seq.findIndex(sf.getEnd()));
302           jsonFeature.setType(sf.getType());
303           jsonFeature.setDescription(sf.getDescription());
304           jsonFeature.setLinks(sf.links);
305           jsonFeature.setOtherDetails(sf.otherDetails);
306           jsonFeature.setScore(sf.getScore());
307           jsonFeature.setFillColor(featureColour);
308           jsonFeature.setFeatureGroup(sf.getFeatureGroup());
309           sequenceFeaturesPojo.add(jsonFeature);
310         }
311       }
312     }
313     return sequenceFeaturesPojo;
314   }
315
316   public static List<AlignmentAnnotationPojo> annotationToJsonPojo(
317           Vector<AlignmentAnnotation> annotations)
318   {
319     List<AlignmentAnnotationPojo> jsonAnnotations = new ArrayList<AlignmentAnnotationPojo>();
320     if (annotations == null)
321     {
322       return jsonAnnotations;
323     }
324     for (AlignmentAnnotation annot : annotations)
325     {
326       AlignmentAnnotationPojo alignAnnotPojo = new AlignmentAnnotationPojo();
327       alignAnnotPojo.setDescription(annot.description);
328       alignAnnotPojo.setLabel(annot.label);
329       for (Annotation annotation : annot.annotations)
330       {
331         AnnotationPojo annotationPojo = new AnnotationPojo();
332         if (annotation != null)
333         {
334           annotationPojo.setDescription(annotation.description);
335           annotationPojo.setValue(annotation.value);
336           annotationPojo
337                   .setSecondaryStructure(annotation.secondaryStructure);
338           annotationPojo.setDisplayCharacter(annotation.displayCharacter);
339           alignAnnotPojo.getAnnotations().add(annotationPojo);
340         }
341         else
342         {
343           alignAnnotPojo.getAnnotations().add(annotationPojo);
344         }
345       }
346       jsonAnnotations.add(alignAnnotPojo);
347     }
348     return jsonAnnotations;
349   }
350
351   @SuppressWarnings("unchecked")
352   public JSONFile parse(Reader jsonAlignmentString)
353   {
354     try
355     {
356       JSONParser jsonParser = new JSONParser();
357       JSONObject alignmentJsonObj = (JSONObject) jsonParser
358               .parse(jsonAlignmentString);
359       JSONArray seqJsonArray = (JSONArray) alignmentJsonObj.get("seqs");
360       JSONArray alAnnotJsonArray = (JSONArray) alignmentJsonObj
361               .get("alignAnnotation");
362       JSONArray jsonSeqArray = (JSONArray) alignmentJsonObj
363               .get("seqFeatures");
364       JSONArray seqGrpJsonArray = (JSONArray) alignmentJsonObj
365               .get("seqGroups");
366       JSONObject jvSettingsJsonObj = (JSONObject) alignmentJsonObj
367               .get("appSettings");
368
369       if (jvSettingsJsonObj != null)
370       {
371         String jsColourScheme = (String) jvSettingsJsonObj
372                 .get("globalColorScheme");
373         Boolean showFeatures = Boolean.valueOf(jvSettingsJsonObj.get(
374                 "showSeqFeatures").toString());
375         setColourScheme(getJalviewColorScheme(jsColourScheme));
376         setShowSeqFeatures(showFeatures);
377         parseHiddenSeqRefsAsList(jvSettingsJsonObj);
378         parseHiddenCols(jvSettingsJsonObj);
379       }
380
381       hiddenSequences = new ArrayList<SequenceI>();
382       seqMap = new Hashtable<String, Sequence>();
383       for (Iterator<JSONObject> sequenceIter = seqJsonArray.iterator(); sequenceIter
384               .hasNext();)
385       {
386         JSONObject sequence = sequenceIter.next();
387         String sequcenceString = sequence.get("seq").toString();
388         String sequenceName = sequence.get("name").toString();
389         String seqUniqueId = sequence.get("id").toString();
390         int start = Integer.valueOf(sequence.get("start").toString());
391         int end = Integer.valueOf(sequence.get("end").toString());
392         Sequence seq = new Sequence(sequenceName, sequcenceString, start,
393                 end);
394         if (hiddenSeqRefs != null && hiddenSeqRefs.contains(seqUniqueId))
395         {
396           hiddenSequences.add(seq);
397         }
398         seqs.add(seq);
399         seqMap.put(seqUniqueId, seq);
400       }
401       parseFeatures(jsonSeqArray);
402
403       for (Iterator<JSONObject> seqGrpIter = seqGrpJsonArray.iterator(); seqGrpIter
404               .hasNext();)
405       {
406         JSONObject seqGrpObj = seqGrpIter.next();
407         String grpName = seqGrpObj.get("groupName").toString();
408         String colourScheme = seqGrpObj.get("colourScheme").toString();
409         String description = (seqGrpObj.get("description") == null) ? null
410                 : seqGrpObj.get("description").toString();
411         boolean displayBoxes = Boolean.valueOf(seqGrpObj
412                 .get("displayBoxes").toString());
413         boolean displayText = Boolean.valueOf(seqGrpObj.get("displayText")
414                 .toString());
415         boolean colourText = Boolean.valueOf(seqGrpObj.get("colourText")
416                 .toString());
417         boolean showNonconserved = Boolean.valueOf(seqGrpObj.get(
418                 "showNonconserved").toString());
419         int startRes = Integer
420                 .valueOf(seqGrpObj.get("startRes").toString());
421         int endRes = Integer.valueOf(seqGrpObj.get("endRes").toString());
422         JSONArray seqsHashArray = (JSONArray) seqGrpObj.get("seqsHash");
423
424         ArrayList<SequenceI> grpSeqs = new ArrayList<SequenceI>();
425         if (seqsHashArray.size() > 0)
426         {
427           Iterator<String> seqHashIter = seqsHashArray.iterator();
428           while (seqHashIter.hasNext())
429           {
430             String seqHash = seqHashIter.next();
431             Sequence sequence = seqMap.get(seqHash);
432             if (sequence != null)
433             {
434               grpSeqs.add(sequence);
435             }
436           }
437         }
438         ColourSchemeI scheme = getJalviewColorScheme(colourScheme);
439         SequenceGroup seqGrp = new SequenceGroup(grpSeqs, grpName, scheme,
440                 displayBoxes, displayText, colourText, startRes, endRes);
441         seqGrp.setShowNonconserved(showNonconserved);
442         seqGrp.setDescription(description);
443         this.seqGroups.add(seqGrp);
444
445       }
446
447       for (Iterator<JSONObject> alAnnotIter = alAnnotJsonArray.iterator(); alAnnotIter
448               .hasNext();)
449       {
450         JSONObject alAnnot = alAnnotIter.next();
451         JSONArray annotJsonArray = (JSONArray) alAnnot.get("annotations");
452         Annotation[] annotations = new Annotation[annotJsonArray.size()];
453         int count = 0;
454         for (Iterator<JSONObject> annotIter = annotJsonArray.iterator(); annotIter
455                 .hasNext();)
456         {
457           JSONObject annot = annotIter.next();
458           if (annot == null)
459           {
460             annotations[count] = null;
461           }
462           else
463           {
464             float val = annot.get("value") == null ? null : Float
465                     .valueOf(annot.get("value").toString());
466             String desc = annot.get("description") == null ? null : annot
467                     .get("description").toString();
468
469             char ss = annot.get("secondaryStructure") == null ? ' '
470                     : annot.get("secondaryStructure").toString().charAt(0);
471             String displayChar = annot.get("displayCharacter").toString();
472
473             annotations[count] = new Annotation(displayChar, desc, ss, val);
474           }
475           ++count;
476         }
477
478         AlignmentAnnotation alignAnnot = new AlignmentAnnotation(alAnnot
479                 .get("label").toString(), alAnnot.get("description")
480                 .toString(), annotations);
481         this.annotations.add(alignAnnot);
482       }
483
484     } catch (Exception e)
485     {
486       e.printStackTrace();
487     }
488     return this;
489   }
490
491   public void parseHiddenSeqRefsAsList(JSONObject jvSettingsJson)
492   {
493     hiddenSeqRefs = new ArrayList<String>();
494     String hiddenSeqs = (String) jvSettingsJson.get("hiddenSeqs");
495     if(hiddenSeqs != null && !hiddenSeqs.isEmpty()){
496       String[] seqRefs = hiddenSeqs.split(";");
497       for(String seqRef : seqRefs){
498         hiddenSeqRefs.add(seqRef);
499       }
500     }
501   }
502
503   public void parseHiddenCols(JSONObject jvSettingsJson)
504   {
505     String hiddenCols = (String) jvSettingsJson.get("hiddenCols");
506     if(hiddenCols != null && !hiddenCols.isEmpty()){
507       columnSelection = new ColumnSelection();
508       String[] rangeStrings = hiddenCols.split(";");
509       for(String rangeString : rangeStrings){
510         String[] range = rangeString.split("-");
511         columnSelection.hideColumns(Integer.valueOf(range[0]),
512                 Integer.valueOf(range[1]));
513       }
514     }
515   }
516
517   @SuppressWarnings("unchecked")
518   private void parseFeatures(JSONArray jsonSeqFeatures)
519   {
520     if (jsonSeqFeatures != null)
521     {
522       for (Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures.iterator(); seqFeatureItr
523               .hasNext();)
524       {
525         JSONObject jsonFeature = seqFeatureItr.next();
526         Long begin = (Long) jsonFeature.get("xStart");
527         Long end = (Long) jsonFeature.get("xEnd");
528         String type = (String) jsonFeature.get("type");
529         String featureGrp = (String) jsonFeature.get("featureGroup");
530         String descripiton = (String) jsonFeature.get("description");
531         String seqRef = (String) jsonFeature.get("sequenceRef");
532         Float score = Float.valueOf(jsonFeature.get("score").toString());
533
534         Sequence seq = seqMap.get(seqRef);
535         SequenceFeature sequenceFeature = new SequenceFeature();
536         JSONArray linksJsonArray = (JSONArray) jsonFeature.get("links");
537         if (linksJsonArray != null && linksJsonArray.size() > 0)
538         {
539           Iterator<String> linkList = linksJsonArray.iterator();
540           while (linkList.hasNext())
541           {
542             String link = linkList.next();
543             sequenceFeature.addLink(link);
544           }
545         }
546         sequenceFeature.setFeatureGroup(featureGrp);
547         sequenceFeature.setScore(score);
548         sequenceFeature.setDescription(descripiton);
549         sequenceFeature.setType(type);
550         sequenceFeature.setBegin(seq.findPosition(begin.intValue()));
551         sequenceFeature.setEnd(seq.findPosition(end.intValue()) - 1);
552         seq.addSequenceFeature(sequenceFeature);
553       }
554     }
555   }
556
557   public static ColourSchemeI getJalviewColorScheme(
558           String bioJsColourSchemeName)
559   {
560     ColourSchemeI jalviewColor = null;
561     for (JalviewBioJsColorSchemeMapper cs : JalviewBioJsColorSchemeMapper
562             .values())
563     {
564       if (cs.getBioJsName().equalsIgnoreCase(bioJsColourSchemeName))
565       {
566         jalviewColor = cs.getJvColourScheme();
567         break;
568       }
569     }
570     return jalviewColor;
571   }
572
573   public String getGlobalColorScheme()
574   {
575     return globalColorScheme;
576   }
577
578   public void setGlobalColorScheme(String globalColorScheme)
579   {
580     this.globalColorScheme = globalColorScheme;
581   }
582
583   public ColourSchemeI getColourScheme()
584   {
585     return colourScheme;
586   }
587
588   public void setColourScheme(ColourSchemeI colourScheme)
589   {
590     this.colourScheme = colourScheme;
591   }
592
593   public FeaturesDisplayedI getDisplayedFeatures()
594   {
595     return displayedFeatures;
596   }
597
598   public void setDisplayedFeatures(FeaturesDisplayedI displayedFeatures)
599   {
600     this.displayedFeatures = displayedFeatures;
601   }
602
603
604   public static String getJSONData(AlignViewportI av)
605   {
606     JSONFile jsonFile = new JSONFile();
607     jsonFile.setViewport(av);
608     jsonFile.seqGroups = av.getAlignment().getGroups();
609     jsonFile.setDisplayedFeatures(av.getFeaturesDisplayed());
610
611     for (SequenceI seq : av.getAlignment().getSequences())
612     {
613       jsonFile.seqs.add(seq);
614     }
615   
616     // Add non auto calculated annotation to AlignFile
617     for (AlignmentAnnotation annot : av.getAlignment()
618             .getAlignmentAnnotation())
619     {
620       if (annot != null && !annot.autoCalculated)
621       {
622         if (annot.label.equals("PDB.CATempFactor"))
623         {
624           continue;
625         }
626         jsonFile.annotations.add(annot);
627       }
628     }
629     String jsonString = jsonFile.print();
630     return jsonString;
631   }
632
633   public boolean isShowSeqFeatures()
634   {
635     return showSeqFeatures;
636   }
637
638   public void setShowSeqFeatures(boolean showSeqFeatures)
639   {
640     this.showSeqFeatures = showSeqFeatures;
641   }
642
643   public Vector<AlignmentAnnotation> getAnnotations()
644   {
645     return annotations;
646   }
647
648   public List<int[]> getHiddenColumns()
649   {
650     return hiddenColumns;
651   }
652
653   public ColumnSelection getColumnSelection()
654   {
655     return columnSelection;
656   }
657
658   public void setColumnSelection(ColumnSelection columnSelection)
659   {
660     this.columnSelection = columnSelection;
661   }
662
663   public SequenceI[] getHiddenSequences()
664   {
665     if (hiddenSequences == null || hiddenSequences.isEmpty())
666     {
667       return new SequenceI[]
668       {};
669     }
670     synchronized (hiddenSequences)
671     {
672       return hiddenSequences.toArray(new SequenceI[hiddenSequences.size()]);
673     }
674   }
675
676   public void setHiddenSequences(ArrayList<SequenceI> hiddenSequences)
677   {
678     this.hiddenSequences = hiddenSequences;
679   }
680
681   public class JSONExportSettings
682   {
683     private boolean exportSequence;
684
685     private boolean exportSequenceFeatures;
686
687     private boolean exportAnnotations;
688
689     private boolean exportGroups;
690
691     private boolean exportJalviewSettings;
692
693     public boolean isExportSequence()
694     {
695       return exportSequence;
696     }
697
698     public void setExportSequence(boolean exportSequence)
699     {
700       this.exportSequence = exportSequence;
701     }
702
703     public boolean isExportSequenceFeatures()
704     {
705       return exportSequenceFeatures;
706     }
707
708     public void setExportSequenceFeatures(boolean exportSequenceFeatures)
709     {
710       this.exportSequenceFeatures = exportSequenceFeatures;
711     }
712
713     public boolean isExportAnnotations()
714     {
715       return exportAnnotations;
716     }
717
718     public void setExportAnnotations(boolean exportAnnotations)
719     {
720       this.exportAnnotations = exportAnnotations;
721     }
722
723     public boolean isExportGroups()
724     {
725       return exportGroups;
726     }
727
728     public void setExportGroups(boolean exportGroups)
729     {
730       this.exportGroups = exportGroups;
731     }
732
733     public boolean isExportJalviewSettings()
734     {
735       return exportJalviewSettings;
736     }
737
738     public void setExportJalviewSettings(boolean exportJalviewSettings)
739     {
740       this.exportJalviewSettings = exportJalviewSettings;
741     }
742   }
743 }