3 import jalview.api.FeaturesDisplayedI;
4 import jalview.datamodel.AlignmentAnnotation;
5 import jalview.datamodel.Annotation;
6 import jalview.datamodel.Sequence;
7 import jalview.datamodel.SequenceFeature;
8 import jalview.datamodel.SequenceGroup;
9 import jalview.datamodel.SequenceI;
10 import jalview.gui.AlignFrame;
11 import jalview.gui.Desktop;
12 import jalview.json.binding.v1.AlignmentAnnotationPojo;
13 import jalview.json.binding.v1.AlignmentPojo;
14 import jalview.json.binding.v1.AnnotationPojo;
15 import jalview.json.binding.v1.JalviewSettingsPojo;
16 import jalview.json.binding.v1.JalviewSettingsPojo.JalviewBioJsColorSchemeMapper;
17 import jalview.json.binding.v1.SequenceFeaturesPojo;
18 import jalview.json.binding.v1.SequenceGrpPojo;
19 import jalview.json.binding.v1.SequencePojo;
20 import jalview.schemes.ColourSchemeI;
21 import jalview.schemes.ColourSchemeProperty;
22 import jalview.viewmodel.AlignmentViewport;
24 import java.io.IOException;
25 import java.util.ArrayList;
26 import java.util.Hashtable;
27 import java.util.Iterator;
28 import java.util.List;
29 import java.util.Vector;
31 import org.json.simple.JSONArray;
32 import org.json.simple.JSONObject;
33 import org.json.simple.parser.JSONParser;
35 public class JSONFile extends AlignFile
37 private static ColourSchemeI colourScheme;
39 private static boolean seqFeaturesEnabled;
41 private String jalviewVersion;
43 private String webStartLaunchServletUrl = "http://www.jalview.org/services/launchApp";
45 public static final String FILE_EXT = "json";
47 public static final String FILE_DESC = "JSON";
49 private String globalColorScheme;
51 private boolean showSeqFeatures;
53 private Hashtable<String, Sequence> seqMap;
55 private FeaturesDisplayedI displayedFeatures;
57 private AlignmentViewport av;
59 private JSONExportSettings jsonExportSettings;
66 public JSONFile(FileParse source) throws IOException
71 public JSONFile(String inFile, String type) throws IOException
77 public void parse() throws IOException
79 StringBuilder jsonStringBuilder = new StringBuilder();
81 while ((currentLine = nextLine()) != null)
83 jsonStringBuilder.append(currentLine);
85 parse(jsonStringBuilder.toString());
94 if (getJsonExportSettings() == null)
96 jsonExportSettings = new JSONExportSettings();
97 jsonExportSettings.setExportAnnotations(true);
98 jsonExportSettings.setExportGroups(true);
99 jsonExportSettings.setExportJalviewSettings(true);
100 jsonExportSettings.setExportSequenceFeatures(true);
103 AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
104 if (Desktop.getCurrentAlignFrame() != null)
106 globalColorScheme = ColourSchemeProperty.getColourName(Desktop
107 .getCurrentAlignFrame().getViewport()
108 .getGlobalColourScheme());
109 this.av = Desktop.getCurrentAlignFrame().getCurrentView();
110 setDisplayedFeatures(av.getFeaturesDisplayed());
111 showSeqFeatures = Desktop.getCurrentAlignFrame().showSeqFeatures
116 for (SequenceI seq : seqs)
118 StringBuilder name = new StringBuilder();
119 name.append(seq.getName()).append("/").append(seq.getStart())
120 .append("-").append(seq.getEnd());
121 SequencePojo jsonSeqPojo = new SequencePojo();
122 jsonSeqPojo.setId(seq.getName() + "_" + seq.hashCode());
123 jsonSeqPojo.setOrder(++count);
124 jsonSeqPojo.setEnd(seq.getEnd());
125 jsonSeqPojo.setStart(seq.getStart());
126 jsonSeqPojo.setName(name.toString());
127 jsonSeqPojo.setSeq(seq.getSequenceAsString());
128 jsonAlignmentPojo.getSeqs().add(jsonSeqPojo);
131 if (jsonExportSettings.isExportJalviewSettings())
133 JalviewSettingsPojo jvSettings = new JalviewSettingsPojo();
134 jvSettings.setGlobalColorScheme(globalColorScheme);
135 jvSettings.setJalviewVersion(jalviewVersion);
136 jvSettings.setWebStartUrl(webStartLaunchServletUrl);
137 jvSettings.setShowSeqFeatures(showSeqFeatures);
138 jsonAlignmentPojo.setJalviewSettings(jvSettings);
141 if (jsonExportSettings.isExportAnnotations())
144 .setAlignAnnotation(annotationToJsonPojo(annotations));
147 if (jsonExportSettings.isExportSequenceFeatures())
149 jsonAlignmentPojo.setSeqFeatures(sequenceFeatureToJsonPojo(seqs,
150 getDisplayedFeatures()));
153 if (jsonExportSettings.isExportGroups() && seqGroups != null
154 && seqGroups.size() > 0)
156 for (SequenceGroup seqGrp : seqGroups)
158 SequenceGrpPojo seqGrpPojo = new SequenceGrpPojo();
159 seqGrpPojo.setGroupName(seqGrp.getName());
160 seqGrpPojo.setColourScheme(ColourSchemeProperty
161 .getColourName(seqGrp.cs));
162 seqGrpPojo.setColourText(seqGrp.getColourText());
163 seqGrpPojo.setDescription(seqGrp.getDescription());
164 seqGrpPojo.setDisplayBoxes(seqGrp.getDisplayBoxes());
165 seqGrpPojo.setDisplayText(seqGrp.getDisplayText());
166 seqGrpPojo.setEndRes(seqGrp.getEndRes());
167 seqGrpPojo.setStartRes(seqGrp.getStartRes());
168 seqGrpPojo.setShowNonconserved(seqGrp.getShowNonconserved());
169 for (SequenceI seq : seqGrp.getSequences())
171 seqGrpPojo.getSeqsHash().add(
172 seq.getName() + "_" + seq.hashCode());
174 jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo);
177 com.json.JSONObject generatedJSon = new com.json.JSONObject(
179 String jsonOutput = generatedJSon.toString();
180 return jsonOutput.replaceAll("xstart", "xStart").replaceAll("xend",
182 } catch (Exception e)
189 public static List<SequenceFeaturesPojo> sequenceFeatureToJsonPojo(
190 List<SequenceI> seqs, FeaturesDisplayedI displayedFeatures)
192 List<SequenceFeaturesPojo> sequenceFeaturesPojo = new ArrayList<SequenceFeaturesPojo>();
193 for (SequenceI seq : seqs)
195 SequenceI dataSetSequence = seq.getDatasetSequence();
196 SequenceFeature[] seqFeatures = (dataSetSequence == null) ? null
197 : seq.getDatasetSequence().getSequenceFeatures();
199 if (seqFeatures == null)
204 for (SequenceFeature sf : seqFeatures)
206 if (displayedFeatures != null
207 && displayedFeatures.isVisible(sf.getType()))
209 SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo(
210 seq.getName() + "_" + seq.hashCode());
211 jsonFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
212 jsonFeature.setXend(seq.findIndex(sf.getEnd()));
213 jsonFeature.setType(sf.getType());
214 jsonFeature.setDescription(sf.getDescription());
215 jsonFeature.setLinks(sf.links);
216 jsonFeature.setOtherDetails(sf.otherDetails);
217 jsonFeature.setScore(sf.getScore());
218 jsonFeature.setFeatureGroup(sf.getFeatureGroup());
219 sequenceFeaturesPojo.add(jsonFeature);
223 return sequenceFeaturesPojo;
226 public static List<AlignmentAnnotationPojo> annotationToJsonPojo(
227 Vector<AlignmentAnnotation> annotations)
229 List<AlignmentAnnotationPojo> jsonAnnotations = new ArrayList<AlignmentAnnotationPojo>();
230 if (annotations == null)
232 return jsonAnnotations;
234 for (AlignmentAnnotation annot : annotations)
236 AlignmentAnnotationPojo alignAnnotPojo = new AlignmentAnnotationPojo();
237 alignAnnotPojo.setDescription(annot.description);
238 alignAnnotPojo.setLabel(annot.label);
239 for (Annotation annotation : annot.annotations)
241 AnnotationPojo annotationPojo = new AnnotationPojo();
242 if (annotation != null)
244 annotationPojo.setDescription(annotation.description);
245 annotationPojo.setValue(annotation.value);
247 .setSecondaryStructure(annotation.secondaryStructure);
248 annotationPojo.setDisplayCharacter(annotation.displayCharacter);
249 alignAnnotPojo.getAnnotations().add(annotationPojo);
253 alignAnnotPojo.getAnnotations().add(annotationPojo);
256 jsonAnnotations.add(alignAnnotPojo);
258 return jsonAnnotations;
261 @SuppressWarnings("unchecked")
262 public JSONFile parse(String jsonAlignmentString)
266 JSONParser jsonParser = new JSONParser();
267 JSONObject alignmentJsonObj = (JSONObject) jsonParser
268 .parse(jsonAlignmentString);
269 JSONArray seqJsonArray = (JSONArray) alignmentJsonObj.get("seqs");
270 JSONArray alAnnotJsonArray = (JSONArray) alignmentJsonObj
271 .get("alignAnnotation");
272 JSONArray jsonSeqArray = (JSONArray) alignmentJsonObj
274 JSONArray seqGrpJsonArray = (JSONArray) alignmentJsonObj
276 JSONObject jvSettingsJsonObj = (JSONObject) alignmentJsonObj
277 .get("jalviewSettings");
279 if (jvSettingsJsonObj != null)
281 String jsColourScheme = (String) jvSettingsJsonObj
282 .get("globalColorScheme");
283 Boolean showFeatures = Boolean.valueOf(jvSettingsJsonObj.get(
284 "showSeqFeatures").toString());
285 setColourScheme(getJalviewColorScheme(jsColourScheme));
286 JSONFile.setSeqFeaturesEnabled(showFeatures);
289 seqMap = new Hashtable<String, Sequence>();
290 for (Iterator<JSONObject> sequenceIter = seqJsonArray.iterator(); sequenceIter
293 JSONObject sequence = sequenceIter.next();
294 String sequcenceString = sequence.get("seq").toString();
295 String sequenceName = sequence.get("name").toString();
296 String seqUniqueId = sequence.get("id").toString();
297 int start = Integer.valueOf(sequence.get("start").toString());
298 int end = Integer.valueOf(sequence.get("end").toString());
299 Sequence seq = new Sequence(sequenceName, sequcenceString, start,
302 seqMap.put(seqUniqueId, seq);
304 parseFeatures(jsonSeqArray);
306 for (Iterator<JSONObject> seqGrpIter = seqGrpJsonArray.iterator(); seqGrpIter
309 JSONObject seqGrpObj = seqGrpIter.next();
310 String grpName = seqGrpObj.get("groupName").toString();
311 String colourScheme = seqGrpObj.get("colourScheme").toString();
312 String description = (seqGrpObj.get("description") == null) ? null
313 : seqGrpObj.get("description").toString();
314 boolean displayBoxes = Boolean.valueOf(seqGrpObj
315 .get("displayBoxes").toString());
316 boolean displayText = Boolean.valueOf(seqGrpObj.get("displayText")
318 boolean colourText = Boolean.valueOf(seqGrpObj.get("colourText")
320 boolean showNonconserved = Boolean.valueOf(seqGrpObj.get(
321 "showNonconserved").toString());
322 int startRes = Integer
323 .valueOf(seqGrpObj.get("startRes").toString());
324 int endRes = Integer.valueOf(seqGrpObj.get("endRes").toString());
325 JSONArray seqsHashArray = (JSONArray) seqGrpObj.get("seqsHash");
327 ArrayList<SequenceI> grpSeqs = new ArrayList<SequenceI>();
328 if (seqsHashArray.size() > 0)
330 Iterator<String> seqHashIter = seqsHashArray.iterator();
331 while (seqHashIter.hasNext())
333 String seqHash = seqHashIter.next();
334 Sequence sequence = seqMap.get(seqHash);
335 if (sequence != null)
337 grpSeqs.add(sequence);
341 ColourSchemeI scheme = getJalviewColorScheme(colourScheme);
342 SequenceGroup seqGrp = new SequenceGroup(grpSeqs, grpName, scheme,
343 displayBoxes, displayText, colourText, startRes, endRes);
344 seqGrp.setShowNonconserved(showNonconserved);
345 seqGrp.setDescription(description);
346 this.seqGroups.add(seqGrp);
350 for (Iterator<JSONObject> alAnnotIter = alAnnotJsonArray.iterator(); alAnnotIter
353 JSONObject alAnnot = alAnnotIter.next();
354 JSONArray annotJsonArray = (JSONArray) alAnnot.get("annotations");
355 Annotation[] annotations = new Annotation[annotJsonArray.size()];
357 for (Iterator<JSONObject> annotIter = annotJsonArray.iterator(); annotIter
360 JSONObject annot = annotIter.next();
363 annotations[count] = null;
367 float val = annot.get("value") == null ? null : Float
368 .valueOf(annot.get("value").toString());
369 String desc = annot.get("description") == null ? null : annot
370 .get("description").toString();
372 char ss = annot.get("secondaryStructure") == null ? null
373 : annot.get("secondaryStructure").toString().charAt(0);
374 String displayChar = annot.get("displayCharacter").toString();
376 annotations[count] = new Annotation(displayChar, desc, ss, val);
381 AlignmentAnnotation alignAnnot = new AlignmentAnnotation(alAnnot
382 .get("label").toString(), alAnnot.get("description")
383 .toString(), annotations);
384 this.annotations.add(alignAnnot);
387 } catch (Exception e)
395 @SuppressWarnings("unchecked")
396 private void parseFeatures(JSONArray jsonSeqFeatures)
398 if (jsonSeqFeatures != null)
400 for (Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures.iterator(); seqFeatureItr
403 JSONObject jsonFeature = seqFeatureItr.next();
404 Long begin = (Long) jsonFeature.get("xStart");
405 Long end = (Long) jsonFeature.get("xEnd");
406 String type = (String) jsonFeature.get("type");
407 String featureGrp = (String) jsonFeature.get("featureGroup");
408 String descripiton = (String) jsonFeature.get("description");
409 String seqRef = (String) jsonFeature.get("sequenceRef");
410 Float score = Float.valueOf(jsonFeature.get("score").toString());
411 // Hashtable otherDetails = (Hashtable) jsonFeature
412 // .get("otherDetails");
413 // sequenceFeature.otherDetails = otherDetails;
415 Sequence seq = seqMap.get(seqRef);
416 SequenceFeature sequenceFeature = new SequenceFeature();
417 JSONArray linksJsonArray = (JSONArray) jsonFeature.get("links");
418 if (linksJsonArray != null && linksJsonArray.size() > 0)
420 Iterator<String> linkList = linksJsonArray.iterator();
421 while (linkList.hasNext())
423 String link = linkList.next();
424 sequenceFeature.addLink(link);
427 sequenceFeature.setFeatureGroup(featureGrp);
428 sequenceFeature.setScore(score);
429 sequenceFeature.setDescription(descripiton);
430 sequenceFeature.setType(type);
431 sequenceFeature.setBegin(seq.findPosition(begin.intValue()));
432 sequenceFeature.setEnd(seq.findPosition(end.intValue()) - 1);
433 seq.addSequenceFeature(sequenceFeature);
438 public ColourSchemeI getJalviewColorScheme(String bioJsColourSchemeName)
440 ColourSchemeI jalviewColor = null;
441 for (JalviewBioJsColorSchemeMapper cs : JalviewBioJsColorSchemeMapper
444 if (cs.getBioJsName().equalsIgnoreCase(bioJsColourSchemeName))
446 jalviewColor = cs.getJvColourScheme();
453 public void LoadAlignmentFeatures(AlignFrame af)
455 af.setShowSeqFeatures(JSONFile.isSeqFeaturesEnabled());
456 af.changeColour(getColourScheme());
457 af.setMenusForViewport();
460 public String getGlobalColorScheme()
462 return globalColorScheme;
465 public void setGlobalColorScheme(String globalColorScheme)
467 this.globalColorScheme = globalColorScheme;
470 public static ColourSchemeI getColourScheme()
475 public static void setColourScheme(ColourSchemeI colourScheme)
477 JSONFile.colourScheme = colourScheme;
480 public static boolean isSeqFeaturesEnabled()
482 return seqFeaturesEnabled;
485 public static void setSeqFeaturesEnabled(boolean seqFeaturesEnabled)
487 JSONFile.seqFeaturesEnabled = seqFeaturesEnabled;
490 public FeaturesDisplayedI getDisplayedFeatures()
492 return displayedFeatures;
495 public void setDisplayedFeatures(FeaturesDisplayedI displayedFeatures)
497 this.displayedFeatures = displayedFeatures;
500 public JSONExportSettings getJsonExportSettings()
502 return jsonExportSettings;
505 public void setJsonExportSettings(JSONExportSettings jsonExportSettings)
507 this.jsonExportSettings = jsonExportSettings;
510 public class JSONExportSettings
512 private boolean exportSequence;
514 private boolean exportSequenceFeatures;
516 private boolean exportAnnotations;
518 private boolean exportGroups;
520 private boolean exportJalviewSettings;
522 public boolean isExportSequence()
524 return exportSequence;
527 public void setExportSequence(boolean exportSequence)
529 this.exportSequence = exportSequence;
532 public boolean isExportSequenceFeatures()
534 return exportSequenceFeatures;
537 public void setExportSequenceFeatures(boolean exportSequenceFeatures)
539 this.exportSequenceFeatures = exportSequenceFeatures;
542 public boolean isExportAnnotations()
544 return exportAnnotations;
547 public void setExportAnnotations(boolean exportAnnotations)
549 this.exportAnnotations = exportAnnotations;
552 public boolean isExportGroups()
557 public void setExportGroups(boolean exportGroups)
559 this.exportGroups = exportGroups;
562 public boolean isExportJalviewSettings()
564 return exportJalviewSettings;
567 public void setExportJalviewSettings(boolean exportJalviewSettings)
569 this.exportJalviewSettings = exportJalviewSettings;