3 import jalview.api.AlignViewportI;
4 import jalview.api.FeatureRenderer;
5 import jalview.api.FeaturesDisplayedI;
6 import jalview.datamodel.AlignmentAnnotation;
7 import jalview.datamodel.Annotation;
8 import jalview.datamodel.Sequence;
9 import jalview.datamodel.SequenceFeature;
10 import jalview.datamodel.SequenceGroup;
11 import jalview.datamodel.SequenceI;
12 import jalview.gui.AlignFrame;
13 import jalview.json.binding.v1.AlignmentAnnotationPojo;
14 import jalview.json.binding.v1.AlignmentPojo;
15 import jalview.json.binding.v1.AnnotationPojo;
16 import jalview.json.binding.v1.JalviewSettingsPojo;
17 import jalview.json.binding.v1.JalviewSettingsPojo.JalviewBioJsColorSchemeMapper;
18 import jalview.json.binding.v1.SequenceFeaturesPojo;
19 import jalview.json.binding.v1.SequenceGrpPojo;
20 import jalview.json.binding.v1.SequencePojo;
21 import jalview.schemes.ColourSchemeI;
22 import jalview.schemes.ColourSchemeProperty;
24 import java.awt.Color;
25 import java.io.IOException;
26 import java.util.ArrayList;
27 import java.util.Hashtable;
28 import java.util.Iterator;
29 import java.util.List;
30 import java.util.Vector;
32 import org.json.simple.JSONArray;
33 import org.json.simple.JSONObject;
34 import org.json.simple.parser.JSONParser;
36 public class JSONFile extends AlignFile
38 private ColourSchemeI colourScheme;
40 private String jalviewVersion;
42 private String webStartLaunchServletUrl;
44 public static final String FILE_EXT = "json";
46 public static final String FILE_DESC = "JSON";
48 private String globalColorScheme;
50 private boolean showSeqFeatures;
52 private Hashtable<String, Sequence> seqMap;
54 private FeaturesDisplayedI displayedFeatures;
56 private FeatureRenderer fr;
58 private JSONExportSettings jsonExportSettings;
65 public JSONFile(FileParse source) throws IOException
70 public JSONFile(String inFile, String type) throws IOException
76 public void parse() throws IOException
78 StringBuilder jsonStringBuilder = new StringBuilder();
80 while ((currentLine = nextLine()) != null)
82 jsonStringBuilder.append(currentLine);
84 parse(jsonStringBuilder.toString());
93 if (getJsonExportSettings() == null)
95 jsonExportSettings = new JSONExportSettings();
96 jsonExportSettings.setExportAnnotations(true);
97 jsonExportSettings.setExportGroups(true);
98 jsonExportSettings.setExportJalviewSettings(true);
99 jsonExportSettings.setExportSequenceFeatures(true);
102 AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
103 if (getViewport() != null)
105 globalColorScheme = ColourSchemeProperty
106 .getColourName(getViewport()
107 .getGlobalColourScheme());
108 setDisplayedFeatures(getViewport().getFeaturesDisplayed());
109 showSeqFeatures = getViewport().isShowSequenceFeatures();
110 fr = getViewport().getFeatureRenderer();
114 for (SequenceI seq : seqs)
116 StringBuilder name = new StringBuilder();
117 name.append(seq.getName()).append("/").append(seq.getStart())
118 .append("-").append(seq.getEnd());
119 SequencePojo jsonSeqPojo = new SequencePojo();
120 jsonSeqPojo.setId(seq.getName() + "_" + seq.hashCode());
121 jsonSeqPojo.setOrder(++count);
122 jsonSeqPojo.setEnd(seq.getEnd());
123 jsonSeqPojo.setStart(seq.getStart());
124 jsonSeqPojo.setName(name.toString());
125 jsonSeqPojo.setSeq(seq.getSequenceAsString());
126 jsonAlignmentPojo.getSeqs().add(jsonSeqPojo);
129 if (jsonExportSettings.isExportJalviewSettings())
131 jalviewVersion = jalview.bin.Cache.getProperty("VERSION");
132 webStartLaunchServletUrl = jalview.bin.Cache.getDefault(
133 "www.jalview.org", "http://www.jalview.org")
134 + "/services/launchApp";
136 JalviewSettingsPojo jvSettings = new JalviewSettingsPojo();
137 jvSettings.setGlobalColorScheme(globalColorScheme);
138 jvSettings.setJalviewVersion(jalviewVersion);
139 jvSettings.setWebStartUrl(webStartLaunchServletUrl);
140 jvSettings.setShowSeqFeatures(showSeqFeatures);
141 jsonAlignmentPojo.setJalviewSettings(jvSettings);
144 if (jsonExportSettings.isExportAnnotations())
147 .setAlignAnnotation(annotationToJsonPojo(annotations));
150 if (jsonExportSettings.isExportSequenceFeatures())
153 .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr));
156 if (jsonExportSettings.isExportGroups() && seqGroups != null
157 && seqGroups.size() > 0)
159 for (SequenceGroup seqGrp : seqGroups)
161 SequenceGrpPojo seqGrpPojo = new SequenceGrpPojo();
162 seqGrpPojo.setGroupName(seqGrp.getName());
163 seqGrpPojo.setColourScheme(ColourSchemeProperty
164 .getColourName(seqGrp.cs));
165 seqGrpPojo.setColourText(seqGrp.getColourText());
166 seqGrpPojo.setDescription(seqGrp.getDescription());
167 seqGrpPojo.setDisplayBoxes(seqGrp.getDisplayBoxes());
168 seqGrpPojo.setDisplayText(seqGrp.getDisplayText());
169 seqGrpPojo.setEndRes(seqGrp.getEndRes());
170 seqGrpPojo.setStartRes(seqGrp.getStartRes());
171 seqGrpPojo.setShowNonconserved(seqGrp.getShowNonconserved());
172 for (SequenceI seq : seqGrp.getSequences())
174 seqGrpPojo.getSeqsHash().add(
175 seq.getName() + "_" + seq.hashCode());
177 jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo);
180 com.json.JSONObject generatedJSon = new com.json.JSONObject(
182 String jsonOutput = generatedJSon.toString();
183 return jsonOutput.replaceAll("xstart", "xStart").replaceAll("xend",
185 } catch (Exception e)
192 public static List<SequenceFeaturesPojo> sequenceFeatureToJsonPojo(
193 List<SequenceI> seqs, FeatureRenderer fr)
195 FeaturesDisplayedI displayedFeatures = (fr == null) ? null : fr
196 .getFeaturesDisplayed();
197 List<SequenceFeaturesPojo> sequenceFeaturesPojo = new ArrayList<SequenceFeaturesPojo>();
198 for (SequenceI seq : seqs)
200 SequenceI dataSetSequence = seq.getDatasetSequence();
201 SequenceFeature[] seqFeatures = (dataSetSequence == null) ? null
202 : seq.getDatasetSequence().getSequenceFeatures();
204 if (seqFeatures == null)
209 for (SequenceFeature sf : seqFeatures)
211 if (displayedFeatures != null
212 && displayedFeatures.isVisible(sf.getType()))
214 SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo(
215 seq.getName() + "_" + seq.hashCode());
216 String featureColour = (fr == null) ? null : jalview.util.Format
218 .findFeatureColour(Color.white, seq,
219 seq.findIndex(sf.getBegin())));
220 jsonFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
221 jsonFeature.setXend(seq.findIndex(sf.getEnd()));
222 jsonFeature.setType(sf.getType());
223 jsonFeature.setDescription(sf.getDescription());
224 jsonFeature.setLinks(sf.links);
225 jsonFeature.setOtherDetails(sf.otherDetails);
226 jsonFeature.setScore(sf.getScore());
227 jsonFeature.setFillColor(featureColour);
228 jsonFeature.setFeatureGroup(sf.getFeatureGroup());
229 sequenceFeaturesPojo.add(jsonFeature);
233 return sequenceFeaturesPojo;
236 public static List<AlignmentAnnotationPojo> annotationToJsonPojo(
237 Vector<AlignmentAnnotation> annotations)
239 List<AlignmentAnnotationPojo> jsonAnnotations = new ArrayList<AlignmentAnnotationPojo>();
240 if (annotations == null)
242 return jsonAnnotations;
244 for (AlignmentAnnotation annot : annotations)
246 AlignmentAnnotationPojo alignAnnotPojo = new AlignmentAnnotationPojo();
247 alignAnnotPojo.setDescription(annot.description);
248 alignAnnotPojo.setLabel(annot.label);
249 for (Annotation annotation : annot.annotations)
251 AnnotationPojo annotationPojo = new AnnotationPojo();
252 if (annotation != null)
254 annotationPojo.setDescription(annotation.description);
255 annotationPojo.setValue(annotation.value);
257 .setSecondaryStructure(annotation.secondaryStructure);
258 annotationPojo.setDisplayCharacter(annotation.displayCharacter);
259 alignAnnotPojo.getAnnotations().add(annotationPojo);
263 alignAnnotPojo.getAnnotations().add(annotationPojo);
266 jsonAnnotations.add(alignAnnotPojo);
268 return jsonAnnotations;
271 @SuppressWarnings("unchecked")
272 public JSONFile parse(String jsonAlignmentString)
276 JSONParser jsonParser = new JSONParser();
277 JSONObject alignmentJsonObj = (JSONObject) jsonParser
278 .parse(jsonAlignmentString);
279 JSONArray seqJsonArray = (JSONArray) alignmentJsonObj.get("seqs");
280 JSONArray alAnnotJsonArray = (JSONArray) alignmentJsonObj
281 .get("alignAnnotation");
282 JSONArray jsonSeqArray = (JSONArray) alignmentJsonObj
284 JSONArray seqGrpJsonArray = (JSONArray) alignmentJsonObj
286 JSONObject jvSettingsJsonObj = (JSONObject) alignmentJsonObj
287 .get("jalviewSettings");
289 if (jvSettingsJsonObj != null)
291 String jsColourScheme = (String) jvSettingsJsonObj
292 .get("globalColorScheme");
293 Boolean showFeatures = Boolean.valueOf(jvSettingsJsonObj.get(
294 "showSeqFeatures").toString());
295 setColourScheme(getJalviewColorScheme(jsColourScheme));
296 setShowSeqFeatures(showFeatures);
299 seqMap = new Hashtable<String, Sequence>();
300 for (Iterator<JSONObject> sequenceIter = seqJsonArray.iterator(); sequenceIter
303 JSONObject sequence = sequenceIter.next();
304 String sequcenceString = sequence.get("seq").toString();
305 String sequenceName = sequence.get("name").toString();
306 String seqUniqueId = sequence.get("id").toString();
307 int start = Integer.valueOf(sequence.get("start").toString());
308 int end = Integer.valueOf(sequence.get("end").toString());
309 Sequence seq = new Sequence(sequenceName, sequcenceString, start,
312 seqMap.put(seqUniqueId, seq);
314 parseFeatures(jsonSeqArray);
316 for (Iterator<JSONObject> seqGrpIter = seqGrpJsonArray.iterator(); seqGrpIter
319 JSONObject seqGrpObj = seqGrpIter.next();
320 String grpName = seqGrpObj.get("groupName").toString();
321 String colourScheme = seqGrpObj.get("colourScheme").toString();
322 String description = (seqGrpObj.get("description") == null) ? null
323 : seqGrpObj.get("description").toString();
324 boolean displayBoxes = Boolean.valueOf(seqGrpObj
325 .get("displayBoxes").toString());
326 boolean displayText = Boolean.valueOf(seqGrpObj.get("displayText")
328 boolean colourText = Boolean.valueOf(seqGrpObj.get("colourText")
330 boolean showNonconserved = Boolean.valueOf(seqGrpObj.get(
331 "showNonconserved").toString());
332 int startRes = Integer
333 .valueOf(seqGrpObj.get("startRes").toString());
334 int endRes = Integer.valueOf(seqGrpObj.get("endRes").toString());
335 JSONArray seqsHashArray = (JSONArray) seqGrpObj.get("seqsHash");
337 ArrayList<SequenceI> grpSeqs = new ArrayList<SequenceI>();
338 if (seqsHashArray.size() > 0)
340 Iterator<String> seqHashIter = seqsHashArray.iterator();
341 while (seqHashIter.hasNext())
343 String seqHash = seqHashIter.next();
344 Sequence sequence = seqMap.get(seqHash);
345 if (sequence != null)
347 grpSeqs.add(sequence);
351 ColourSchemeI scheme = getJalviewColorScheme(colourScheme);
352 SequenceGroup seqGrp = new SequenceGroup(grpSeqs, grpName, scheme,
353 displayBoxes, displayText, colourText, startRes, endRes);
354 seqGrp.setShowNonconserved(showNonconserved);
355 seqGrp.setDescription(description);
356 this.seqGroups.add(seqGrp);
360 for (Iterator<JSONObject> alAnnotIter = alAnnotJsonArray.iterator(); alAnnotIter
363 JSONObject alAnnot = alAnnotIter.next();
364 JSONArray annotJsonArray = (JSONArray) alAnnot.get("annotations");
365 Annotation[] annotations = new Annotation[annotJsonArray.size()];
367 for (Iterator<JSONObject> annotIter = annotJsonArray.iterator(); annotIter
370 JSONObject annot = annotIter.next();
373 annotations[count] = null;
377 float val = annot.get("value") == null ? null : Float
378 .valueOf(annot.get("value").toString());
379 String desc = annot.get("description") == null ? null : annot
380 .get("description").toString();
382 char ss = annot.get("secondaryStructure") == null ? null
383 : annot.get("secondaryStructure").toString().charAt(0);
384 String displayChar = annot.get("displayCharacter").toString();
386 annotations[count] = new Annotation(displayChar, desc, ss, val);
391 AlignmentAnnotation alignAnnot = new AlignmentAnnotation(alAnnot
392 .get("label").toString(), alAnnot.get("description")
393 .toString(), annotations);
394 this.annotations.add(alignAnnot);
397 } catch (Exception e)
405 @SuppressWarnings("unchecked")
406 private void parseFeatures(JSONArray jsonSeqFeatures)
408 if (jsonSeqFeatures != null)
410 for (Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures.iterator(); seqFeatureItr
413 JSONObject jsonFeature = seqFeatureItr.next();
414 Long begin = (Long) jsonFeature.get("xStart");
415 Long end = (Long) jsonFeature.get("xEnd");
416 String type = (String) jsonFeature.get("type");
417 String featureGrp = (String) jsonFeature.get("featureGroup");
418 String descripiton = (String) jsonFeature.get("description");
419 String seqRef = (String) jsonFeature.get("sequenceRef");
420 Float score = Float.valueOf(jsonFeature.get("score").toString());
421 // Hashtable otherDetails = (Hashtable) jsonFeature
422 // .get("otherDetails");
423 // sequenceFeature.otherDetails = otherDetails;
425 Sequence seq = seqMap.get(seqRef);
426 SequenceFeature sequenceFeature = new SequenceFeature();
427 JSONArray linksJsonArray = (JSONArray) jsonFeature.get("links");
428 if (linksJsonArray != null && linksJsonArray.size() > 0)
430 Iterator<String> linkList = linksJsonArray.iterator();
431 while (linkList.hasNext())
433 String link = linkList.next();
434 sequenceFeature.addLink(link);
437 sequenceFeature.setFeatureGroup(featureGrp);
438 sequenceFeature.setScore(score);
439 sequenceFeature.setDescription(descripiton);
440 sequenceFeature.setType(type);
441 sequenceFeature.setBegin(seq.findPosition(begin.intValue()));
442 sequenceFeature.setEnd(seq.findPosition(end.intValue()) - 1);
443 seq.addSequenceFeature(sequenceFeature);
448 public static ColourSchemeI getJalviewColorScheme(
449 String bioJsColourSchemeName)
451 ColourSchemeI jalviewColor = null;
452 for (JalviewBioJsColorSchemeMapper cs : JalviewBioJsColorSchemeMapper
455 if (cs.getBioJsName().equalsIgnoreCase(bioJsColourSchemeName))
457 jalviewColor = cs.getJvColourScheme();
464 public void applySettingsToAlignFrame(AlignFrame af)
466 af.setShowSeqFeatures(isShowSeqFeatures());
467 af.changeColour(getColourScheme());
468 af.setMenusForViewport();
471 public String getGlobalColorScheme()
473 return globalColorScheme;
476 public void setGlobalColorScheme(String globalColorScheme)
478 this.globalColorScheme = globalColorScheme;
481 public ColourSchemeI getColourScheme()
486 public void setColourScheme(ColourSchemeI colourScheme)
488 this.colourScheme = colourScheme;
491 public FeaturesDisplayedI getDisplayedFeatures()
493 return displayedFeatures;
496 public void setDisplayedFeatures(FeaturesDisplayedI displayedFeatures)
498 this.displayedFeatures = displayedFeatures;
501 public JSONExportSettings getJsonExportSettings()
503 return jsonExportSettings;
506 public void setJsonExportSettings(JSONExportSettings jsonExportSettings)
508 this.jsonExportSettings = jsonExportSettings;
511 public static String getJSONData(AlignViewportI av)
513 JSONFile jsonFile = new JSONFile();
514 jsonFile.setViewport(av);
515 jsonFile.seqGroups = av.getAlignment().getGroups();
516 jsonFile.setDisplayedFeatures(av.getFeaturesDisplayed());
518 for (SequenceI seq : av.getAlignment().getSequences())
520 jsonFile.seqs.add(seq);
523 // Add non auto calculated annotation to AlignFile
524 for (AlignmentAnnotation annot : av.getAlignment()
525 .getAlignmentAnnotation())
527 if (annot != null && !annot.autoCalculated)
529 if (annot.label.equals("PDB.CATempFactor"))
533 jsonFile.annotations.add(annot);
536 String jsonString = jsonFile.print();
540 public boolean isShowSeqFeatures()
542 return showSeqFeatures;
545 public void setShowSeqFeatures(boolean showSeqFeatures)
547 this.showSeqFeatures = showSeqFeatures;
550 public class JSONExportSettings
552 private boolean exportSequence;
554 private boolean exportSequenceFeatures;
556 private boolean exportAnnotations;
558 private boolean exportGroups;
560 private boolean exportJalviewSettings;
562 public boolean isExportSequence()
564 return exportSequence;
567 public void setExportSequence(boolean exportSequence)
569 this.exportSequence = exportSequence;
572 public boolean isExportSequenceFeatures()
574 return exportSequenceFeatures;
577 public void setExportSequenceFeatures(boolean exportSequenceFeatures)
579 this.exportSequenceFeatures = exportSequenceFeatures;
582 public boolean isExportAnnotations()
584 return exportAnnotations;
587 public void setExportAnnotations(boolean exportAnnotations)
589 this.exportAnnotations = exportAnnotations;
592 public boolean isExportGroups()
597 public void setExportGroups(boolean exportGroups)
599 this.exportGroups = exportGroups;
602 public boolean isExportJalviewSettings()
604 return exportJalviewSettings;
607 public void setExportJalviewSettings(boolean exportJalviewSettings)
609 this.exportJalviewSettings = exportJalviewSettings;