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 static boolean seqFeaturesEnabled;
42 private String jalviewVersion;
44 private String webStartLaunchServletUrl;
46 public static final String FILE_EXT = "json";
48 public static final String FILE_DESC = "JSON";
50 private String globalColorScheme;
52 private boolean showSeqFeatures;
54 private Hashtable<String, Sequence> seqMap;
56 private FeaturesDisplayedI displayedFeatures;
58 // private AlignViewportI viewport;
60 private FeatureRenderer fr;
62 private JSONExportSettings jsonExportSettings;
69 public JSONFile(FileParse source) throws IOException
74 public JSONFile(String inFile, String type) throws IOException
80 public void parse() throws IOException
82 StringBuilder jsonStringBuilder = new StringBuilder();
84 while ((currentLine = nextLine()) != null)
86 jsonStringBuilder.append(currentLine);
88 parse(jsonStringBuilder.toString());
97 if (getJsonExportSettings() == null)
99 jsonExportSettings = new JSONExportSettings();
100 jsonExportSettings.setExportAnnotations(true);
101 jsonExportSettings.setExportGroups(true);
102 jsonExportSettings.setExportJalviewSettings(true);
103 jsonExportSettings.setExportSequenceFeatures(true);
106 AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
107 if (getViewport() != null)
109 globalColorScheme = ColourSchemeProperty
110 .getColourName(getViewport()
111 .getGlobalColourScheme());
112 setDisplayedFeatures(getViewport().getFeaturesDisplayed());
113 showSeqFeatures = getViewport().isShowSequenceFeatures();
114 fr = getViewport().getFeatureRenderer();
115 // setSeqFeaturesEnabled(viewport.isShowSequenceFeatures());
119 for (SequenceI seq : seqs)
121 StringBuilder name = new StringBuilder();
122 name.append(seq.getName()).append("/").append(seq.getStart())
123 .append("-").append(seq.getEnd());
124 SequencePojo jsonSeqPojo = new SequencePojo();
125 jsonSeqPojo.setId(seq.getName() + "_" + seq.hashCode());
126 jsonSeqPojo.setOrder(++count);
127 jsonSeqPojo.setEnd(seq.getEnd());
128 jsonSeqPojo.setStart(seq.getStart());
129 jsonSeqPojo.setName(name.toString());
130 jsonSeqPojo.setSeq(seq.getSequenceAsString());
131 jsonAlignmentPojo.getSeqs().add(jsonSeqPojo);
134 if (jsonExportSettings.isExportJalviewSettings())
136 jalviewVersion = jalview.bin.Cache.getProperty("VERSION");
137 webStartLaunchServletUrl = jalview.bin.Cache.getDefault(
138 "www.jalview.org", "http://www.jalview.org")
139 + "/services/launchApp";
141 JalviewSettingsPojo jvSettings = new JalviewSettingsPojo();
142 jvSettings.setGlobalColorScheme(globalColorScheme);
143 jvSettings.setJalviewVersion(jalviewVersion);
144 jvSettings.setWebStartUrl(webStartLaunchServletUrl);
145 jvSettings.setShowSeqFeatures(showSeqFeatures);
146 jsonAlignmentPojo.setJalviewSettings(jvSettings);
149 if (jsonExportSettings.isExportAnnotations())
152 .setAlignAnnotation(annotationToJsonPojo(annotations));
155 if (jsonExportSettings.isExportSequenceFeatures())
158 .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr));
161 if (jsonExportSettings.isExportGroups() && seqGroups != null
162 && seqGroups.size() > 0)
164 for (SequenceGroup seqGrp : seqGroups)
166 SequenceGrpPojo seqGrpPojo = new SequenceGrpPojo();
167 seqGrpPojo.setGroupName(seqGrp.getName());
168 seqGrpPojo.setColourScheme(ColourSchemeProperty
169 .getColourName(seqGrp.cs));
170 seqGrpPojo.setColourText(seqGrp.getColourText());
171 seqGrpPojo.setDescription(seqGrp.getDescription());
172 seqGrpPojo.setDisplayBoxes(seqGrp.getDisplayBoxes());
173 seqGrpPojo.setDisplayText(seqGrp.getDisplayText());
174 seqGrpPojo.setEndRes(seqGrp.getEndRes());
175 seqGrpPojo.setStartRes(seqGrp.getStartRes());
176 seqGrpPojo.setShowNonconserved(seqGrp.getShowNonconserved());
177 for (SequenceI seq : seqGrp.getSequences())
179 seqGrpPojo.getSeqsHash().add(
180 seq.getName() + "_" + seq.hashCode());
182 jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo);
185 com.json.JSONObject generatedJSon = new com.json.JSONObject(
187 String jsonOutput = generatedJSon.toString();
188 return jsonOutput.replaceAll("xstart", "xStart").replaceAll("xend",
190 } catch (Exception e)
197 public static List<SequenceFeaturesPojo> sequenceFeatureToJsonPojo(
198 List<SequenceI> seqs, FeatureRenderer fr)
200 FeaturesDisplayedI displayedFeatures = (fr == null) ? null : fr
201 .getFeaturesDisplayed();
202 List<SequenceFeaturesPojo> sequenceFeaturesPojo = new ArrayList<SequenceFeaturesPojo>();
203 for (SequenceI seq : seqs)
205 SequenceI dataSetSequence = seq.getDatasetSequence();
206 SequenceFeature[] seqFeatures = (dataSetSequence == null) ? null
207 : seq.getDatasetSequence().getSequenceFeatures();
209 if (seqFeatures == null)
214 for (SequenceFeature sf : seqFeatures)
216 if (displayedFeatures != null
217 && displayedFeatures.isVisible(sf.getType()))
219 SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo(
220 seq.getName() + "_" + seq.hashCode());
221 String featureColour = (fr == null) ? null : jalview.util.Format
223 .findFeatureColour(Color.white, seq,
224 seq.findIndex(sf.getBegin())));
225 jsonFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
226 jsonFeature.setXend(seq.findIndex(sf.getEnd()));
227 jsonFeature.setType(sf.getType());
228 jsonFeature.setDescription(sf.getDescription());
229 jsonFeature.setLinks(sf.links);
230 jsonFeature.setOtherDetails(sf.otherDetails);
231 jsonFeature.setScore(sf.getScore());
232 jsonFeature.setFillColor(featureColour);
233 jsonFeature.setFeatureGroup(sf.getFeatureGroup());
234 sequenceFeaturesPojo.add(jsonFeature);
238 return sequenceFeaturesPojo;
241 public static List<AlignmentAnnotationPojo> annotationToJsonPojo(
242 Vector<AlignmentAnnotation> annotations)
244 List<AlignmentAnnotationPojo> jsonAnnotations = new ArrayList<AlignmentAnnotationPojo>();
245 if (annotations == null)
247 return jsonAnnotations;
249 for (AlignmentAnnotation annot : annotations)
251 AlignmentAnnotationPojo alignAnnotPojo = new AlignmentAnnotationPojo();
252 alignAnnotPojo.setDescription(annot.description);
253 alignAnnotPojo.setLabel(annot.label);
254 for (Annotation annotation : annot.annotations)
256 AnnotationPojo annotationPojo = new AnnotationPojo();
257 if (annotation != null)
259 annotationPojo.setDescription(annotation.description);
260 annotationPojo.setValue(annotation.value);
262 .setSecondaryStructure(annotation.secondaryStructure);
263 annotationPojo.setDisplayCharacter(annotation.displayCharacter);
264 alignAnnotPojo.getAnnotations().add(annotationPojo);
268 alignAnnotPojo.getAnnotations().add(annotationPojo);
271 jsonAnnotations.add(alignAnnotPojo);
273 return jsonAnnotations;
276 @SuppressWarnings("unchecked")
277 public JSONFile parse(String jsonAlignmentString)
281 JSONParser jsonParser = new JSONParser();
282 JSONObject alignmentJsonObj = (JSONObject) jsonParser
283 .parse(jsonAlignmentString);
284 JSONArray seqJsonArray = (JSONArray) alignmentJsonObj.get("seqs");
285 JSONArray alAnnotJsonArray = (JSONArray) alignmentJsonObj
286 .get("alignAnnotation");
287 JSONArray jsonSeqArray = (JSONArray) alignmentJsonObj
289 JSONArray seqGrpJsonArray = (JSONArray) alignmentJsonObj
291 JSONObject jvSettingsJsonObj = (JSONObject) alignmentJsonObj
292 .get("jalviewSettings");
294 if (jvSettingsJsonObj != null)
296 String jsColourScheme = (String) jvSettingsJsonObj
297 .get("globalColorScheme");
298 Boolean showFeatures = Boolean.valueOf(jvSettingsJsonObj.get(
299 "showSeqFeatures").toString());
300 setColourScheme(getJalviewColorScheme(jsColourScheme));
301 // JSONFile.setSeqFeaturesEnabled(showFeatures);
302 setShowSeqFeatures(showFeatures);
305 seqMap = new Hashtable<String, Sequence>();
306 for (Iterator<JSONObject> sequenceIter = seqJsonArray.iterator(); sequenceIter
309 JSONObject sequence = sequenceIter.next();
310 String sequcenceString = sequence.get("seq").toString();
311 String sequenceName = sequence.get("name").toString();
312 String seqUniqueId = sequence.get("id").toString();
313 int start = Integer.valueOf(sequence.get("start").toString());
314 int end = Integer.valueOf(sequence.get("end").toString());
315 Sequence seq = new Sequence(sequenceName, sequcenceString, start,
318 seqMap.put(seqUniqueId, seq);
320 parseFeatures(jsonSeqArray);
322 for (Iterator<JSONObject> seqGrpIter = seqGrpJsonArray.iterator(); seqGrpIter
325 JSONObject seqGrpObj = seqGrpIter.next();
326 String grpName = seqGrpObj.get("groupName").toString();
327 String colourScheme = seqGrpObj.get("colourScheme").toString();
328 String description = (seqGrpObj.get("description") == null) ? null
329 : seqGrpObj.get("description").toString();
330 boolean displayBoxes = Boolean.valueOf(seqGrpObj
331 .get("displayBoxes").toString());
332 boolean displayText = Boolean.valueOf(seqGrpObj.get("displayText")
334 boolean colourText = Boolean.valueOf(seqGrpObj.get("colourText")
336 boolean showNonconserved = Boolean.valueOf(seqGrpObj.get(
337 "showNonconserved").toString());
338 int startRes = Integer
339 .valueOf(seqGrpObj.get("startRes").toString());
340 int endRes = Integer.valueOf(seqGrpObj.get("endRes").toString());
341 JSONArray seqsHashArray = (JSONArray) seqGrpObj.get("seqsHash");
343 ArrayList<SequenceI> grpSeqs = new ArrayList<SequenceI>();
344 if (seqsHashArray.size() > 0)
346 Iterator<String> seqHashIter = seqsHashArray.iterator();
347 while (seqHashIter.hasNext())
349 String seqHash = seqHashIter.next();
350 Sequence sequence = seqMap.get(seqHash);
351 if (sequence != null)
353 grpSeqs.add(sequence);
357 ColourSchemeI scheme = getJalviewColorScheme(colourScheme);
358 SequenceGroup seqGrp = new SequenceGroup(grpSeqs, grpName, scheme,
359 displayBoxes, displayText, colourText, startRes, endRes);
360 seqGrp.setShowNonconserved(showNonconserved);
361 seqGrp.setDescription(description);
362 this.seqGroups.add(seqGrp);
366 for (Iterator<JSONObject> alAnnotIter = alAnnotJsonArray.iterator(); alAnnotIter
369 JSONObject alAnnot = alAnnotIter.next();
370 JSONArray annotJsonArray = (JSONArray) alAnnot.get("annotations");
371 Annotation[] annotations = new Annotation[annotJsonArray.size()];
373 for (Iterator<JSONObject> annotIter = annotJsonArray.iterator(); annotIter
376 JSONObject annot = annotIter.next();
379 annotations[count] = null;
383 float val = annot.get("value") == null ? null : Float
384 .valueOf(annot.get("value").toString());
385 String desc = annot.get("description") == null ? null : annot
386 .get("description").toString();
388 char ss = annot.get("secondaryStructure") == null ? null
389 : annot.get("secondaryStructure").toString().charAt(0);
390 String displayChar = annot.get("displayCharacter").toString();
392 annotations[count] = new Annotation(displayChar, desc, ss, val);
397 AlignmentAnnotation alignAnnot = new AlignmentAnnotation(alAnnot
398 .get("label").toString(), alAnnot.get("description")
399 .toString(), annotations);
400 this.annotations.add(alignAnnot);
403 } catch (Exception e)
411 @SuppressWarnings("unchecked")
412 private void parseFeatures(JSONArray jsonSeqFeatures)
414 if (jsonSeqFeatures != null)
416 for (Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures.iterator(); seqFeatureItr
419 JSONObject jsonFeature = seqFeatureItr.next();
420 Long begin = (Long) jsonFeature.get("xStart");
421 Long end = (Long) jsonFeature.get("xEnd");
422 String type = (String) jsonFeature.get("type");
423 String featureGrp = (String) jsonFeature.get("featureGroup");
424 String descripiton = (String) jsonFeature.get("description");
425 String seqRef = (String) jsonFeature.get("sequenceRef");
426 Float score = Float.valueOf(jsonFeature.get("score").toString());
427 // Hashtable otherDetails = (Hashtable) jsonFeature
428 // .get("otherDetails");
429 // sequenceFeature.otherDetails = otherDetails;
431 Sequence seq = seqMap.get(seqRef);
432 SequenceFeature sequenceFeature = new SequenceFeature();
433 JSONArray linksJsonArray = (JSONArray) jsonFeature.get("links");
434 if (linksJsonArray != null && linksJsonArray.size() > 0)
436 Iterator<String> linkList = linksJsonArray.iterator();
437 while (linkList.hasNext())
439 String link = linkList.next();
440 sequenceFeature.addLink(link);
443 sequenceFeature.setFeatureGroup(featureGrp);
444 sequenceFeature.setScore(score);
445 sequenceFeature.setDescription(descripiton);
446 sequenceFeature.setType(type);
447 sequenceFeature.setBegin(seq.findPosition(begin.intValue()));
448 sequenceFeature.setEnd(seq.findPosition(end.intValue()) - 1);
449 seq.addSequenceFeature(sequenceFeature);
454 public static ColourSchemeI getJalviewColorScheme(
455 String bioJsColourSchemeName)
457 ColourSchemeI jalviewColor = null;
458 for (JalviewBioJsColorSchemeMapper cs : JalviewBioJsColorSchemeMapper
461 if (cs.getBioJsName().equalsIgnoreCase(bioJsColourSchemeName))
463 jalviewColor = cs.getJvColourScheme();
470 public void LoadAlignmentFeatures(AlignFrame af)
472 af.setShowSeqFeatures(isShowSeqFeatures());
473 af.changeColour(getColourScheme());
474 af.setMenusForViewport();
477 public String getGlobalColorScheme()
479 return globalColorScheme;
482 public void setGlobalColorScheme(String globalColorScheme)
484 this.globalColorScheme = globalColorScheme;
487 public ColourSchemeI getColourScheme()
492 public void setColourScheme(ColourSchemeI colourScheme)
494 this.colourScheme = colourScheme;
497 public FeaturesDisplayedI getDisplayedFeatures()
499 return displayedFeatures;
502 public void setDisplayedFeatures(FeaturesDisplayedI displayedFeatures)
504 this.displayedFeatures = displayedFeatures;
507 public JSONExportSettings getJsonExportSettings()
509 return jsonExportSettings;
512 public void setJsonExportSettings(JSONExportSettings jsonExportSettings)
514 this.jsonExportSettings = jsonExportSettings;
517 public static String getJSONData(AlignViewportI av)
519 JSONFile jsonFile = new JSONFile();
520 jsonFile.setViewport(av);
521 jsonFile.seqGroups = av.getAlignment().getGroups();
522 jsonFile.setDisplayedFeatures(av.getFeaturesDisplayed());
524 for (SequenceI seq : av.getAlignment().getSequences())
526 jsonFile.seqs.add(seq);
529 // Add non auto calculated annotation to AlignFile
530 for (AlignmentAnnotation annot : av.getAlignment()
531 .getAlignmentAnnotation())
533 if (annot != null && !annot.autoCalculated)
535 if (annot.label.equals("PDB.CATempFactor"))
539 jsonFile.annotations.add(annot);
542 String jsonString = jsonFile.print();
546 public boolean isShowSeqFeatures()
548 return showSeqFeatures;
551 public void setShowSeqFeatures(boolean showSeqFeatures)
553 this.showSeqFeatures = showSeqFeatures;
556 public class JSONExportSettings
558 private boolean exportSequence;
560 private boolean exportSequenceFeatures;
562 private boolean exportAnnotations;
564 private boolean exportGroups;
566 private boolean exportJalviewSettings;
568 public boolean isExportSequence()
570 return exportSequence;
573 public void setExportSequence(boolean exportSequence)
575 this.exportSequence = exportSequence;
578 public boolean isExportSequenceFeatures()
580 return exportSequenceFeatures;
583 public void setExportSequenceFeatures(boolean exportSequenceFeatures)
585 this.exportSequenceFeatures = exportSequenceFeatures;
588 public boolean isExportAnnotations()
590 return exportAnnotations;
593 public void setExportAnnotations(boolean exportAnnotations)
595 this.exportAnnotations = exportAnnotations;
598 public boolean isExportGroups()
603 public void setExportGroups(boolean exportGroups)
605 this.exportGroups = exportGroups;
608 public boolean isExportJalviewSettings()
610 return exportJalviewSettings;
613 public void setExportJalviewSettings(boolean exportJalviewSettings)
615 this.exportJalviewSettings = exportJalviewSettings;