X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FJSONFile.java;h=022148a4e6fdc27bc93a8e18ce60231c1749101a;hb=a9f2db2f1688164dd54da7521509c135d7fdf042;hp=b778b83c04799a92b904e176bcb6f9616a992e92;hpb=cf4a342e06c80456393620b28820fa616fbc221c;p=jalview.git diff --git a/src/jalview/io/JSONFile.java b/src/jalview/io/JSONFile.java index b778b83..022148a 100644 --- a/src/jalview/io/JSONFile.java +++ b/src/jalview/io/JSONFile.java @@ -21,17 +21,19 @@ package jalview.io; -import jalview.api.AlignExportSettingI; +import jalview.api.AlignExportSettingsI; import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.api.ComplexAlignFile; import jalview.api.FeatureRenderer; +import jalview.api.FeatureSettingsModelI; import jalview.api.FeaturesDisplayedI; import jalview.bin.BuildDetails; +import jalview.datamodel.AlignExportSettingsAdapter; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.Annotation; -import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenColumns; import jalview.datamodel.HiddenSequences; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceFeature; @@ -45,8 +47,13 @@ import jalview.json.binding.biojson.v1.ColourSchemeMapper; import jalview.json.binding.biojson.v1.SequenceFeaturesPojo; import jalview.json.binding.biojson.v1.SequenceGrpPojo; import jalview.json.binding.biojson.v1.SequencePojo; +import jalview.renderer.seqfeatures.FeatureColourFinder; import jalview.schemes.ColourSchemeProperty; -import jalview.schemes.UserColourScheme; +import jalview.schemes.JalviewColourScheme; +import jalview.schemes.ResidueColourScheme; +import jalview.util.ColorUtils; +import jalview.util.Format; +import jalview.util.JSONUtils; import jalview.viewmodel.seqfeatures.FeaturesDisplayed; import java.awt.Color; @@ -56,24 +63,17 @@ import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Vector; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; - public class JSONFile extends AlignFile implements ComplexAlignFile { private static String version = new BuildDetails().getVersion(); - private String webstartUrl = "http://www.jalview.org/services/launchApp"; + private String webstartUrl = "https://www.jalview.org/services/launchApp"; private String application = "Jalview"; - public static final String FILE_EXT = "json"; - - public static final String FILE_DESC = "JSON"; - private String globalColourScheme; private boolean showSeqFeatures; @@ -84,9 +84,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile private FeatureRenderer fr; - private List hiddenColumns; - - private ColumnSelection columnSelection; + private HiddenColumns hiddenColumns; private List hiddenSeqRefs; @@ -104,9 +102,10 @@ public class JSONFile extends AlignFile implements ComplexAlignFile super(source); } - public JSONFile(String inFile, String type) throws IOException + public JSONFile(String inFile, DataSourceType sourceType) + throws IOException { - super(inFile, type); + super(inFile, sourceType); } @Override @@ -117,60 +116,24 @@ public class JSONFile extends AlignFile implements ComplexAlignFile } @Override - public String print() + public String print(SequenceI[] sqs, boolean jvsuffix) { String jsonOutput = null; try { AlignmentPojo jsonAlignmentPojo = new AlignmentPojo(); - AlignExportSettingI exportSettings = getExportSettings(); + AlignExportSettingsI exportSettings = getExportSettings(); - // if no export settings were supplied use the following with all values - // defaulting to true + /* + * if no export settings were supplied, provide an 'export all' setting + */ if (exportSettings == null) { - exportSettings = new AlignExportSettingI() - { - @Override - public boolean isExportHiddenSequences() - { - return true; - } - - @Override - public boolean isExportHiddenColumns() - { - return true; - } - - @Override - public boolean isExportGroups() - { - return true; - } - - @Override - public boolean isExportFeatures() - { - return true; - } - - @Override - public boolean isExportAnnotations() - { - return true; - } - - @Override - public boolean isCancelled() - { - return false; - } - }; + exportSettings = new AlignExportSettingsAdapter(true); } int count = 0; - for (SequenceI seq : seqs) + for (SequenceI seq : sqs) { StringBuilder name = new StringBuilder(); name.append(seq.getName()).append("/").append(seq.getStart()) @@ -217,17 +180,18 @@ public class JSONFile extends AlignFile implements ComplexAlignFile { // These color schemes require annotation, disable them if annotations // are not exported - if (globalColourScheme.equalsIgnoreCase("RNA Helices") - || globalColourScheme.equalsIgnoreCase("T-COFFEE SCORES")) + if (globalColourScheme + .equalsIgnoreCase(JalviewColourScheme.RNAHelices.toString()) + || globalColourScheme.equalsIgnoreCase( + JalviewColourScheme.TCoffee.toString())) { - jsonAlignmentPojo.setGlobalColorScheme("None"); + jsonAlignmentPojo.setGlobalColorScheme(ResidueColourScheme.NONE); } } if (exportSettings.isExportFeatures()) { - jsonAlignmentPojo - .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr)); + jsonAlignmentPojo.setSeqFeatures(sequenceFeatureToJsonPojo(sqs)); } if (exportSettings.isExportGroups() && seqGroups != null @@ -238,7 +202,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile SequenceGrpPojo seqGrpPojo = new SequenceGrpPojo(); seqGrpPojo.setGroupName(seqGrp.getName()); seqGrpPojo.setColourScheme(ColourSchemeProperty - .getColourName(seqGrp.cs)); + .getColourName(seqGrp.getColourScheme())); seqGrpPojo.setColourText(seqGrp.getColourText()); seqGrpPojo.setDescription(seqGrp.getDescription()); seqGrpPojo.setDisplayBoxes(seqGrp.getDisplayBoxes()); @@ -254,9 +218,8 @@ public class JSONFile extends AlignFile implements ComplexAlignFile jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo); } } - org.json.JSONObject generatedJSon = new org.json.JSONObject( - jsonAlignmentPojo); - jsonOutput = generatedJSon.toString(); + + jsonOutput = JSONUtils.stringify(jsonAlignmentPojo); return jsonOutput.replaceAll("xstart", "xStart").replaceAll("xend", "xEnd"); } catch (Exception e) @@ -277,17 +240,8 @@ public class JSONFile extends AlignFile implements ComplexAlignFile // hidden column business if (getViewport().hasHiddenColumns()) { - List hiddenCols = getViewport().getColumnSelection() - .getHiddenColumns(); - StringBuilder hiddenColsBuilder = new StringBuilder(); - for (int[] range : hiddenCols) - { - hiddenColsBuilder.append(";").append(range[0]).append("-") - .append(range[1]); - } - - hiddenColsBuilder.deleteCharAt(0); - hiddenSections[0] = hiddenColsBuilder.toString(); + hiddenSections[0] = getViewport().getAlignment().getHiddenColumns() + .regionsToString(";", "-"); } // hidden rows/seqs business @@ -316,46 +270,50 @@ public class JSONFile extends AlignFile implements ComplexAlignFile return hiddenSections; } - public List sequenceFeatureToJsonPojo( - List seqs, FeatureRenderer fr) + protected List sequenceFeatureToJsonPojo( + SequenceI[] sqs) { displayedFeatures = (fr == null) ? null : fr.getFeaturesDisplayed(); - List sequenceFeaturesPojo = new ArrayList(); - for (SequenceI seq : seqs) + List sequenceFeaturesPojo = new ArrayList<>(); + if (sqs == null) { - SequenceI dataSetSequence = seq.getDatasetSequence(); - SequenceFeature[] seqFeatures = (dataSetSequence == null) ? null - : seq.getDatasetSequence().getSequenceFeatures(); + return sequenceFeaturesPojo; + } - seqFeatures = (seqFeatures == null) ? seq.getSequenceFeatures() - : seqFeatures; - if (seqFeatures == null) - { - continue; - } + FeatureColourFinder finder = new FeatureColourFinder(fr); + String[] visibleFeatureTypes = displayedFeatures == null ? null + : displayedFeatures.getVisibleFeatures().toArray( + new String[displayedFeatures.getVisibleFeatureCount()]); + + for (SequenceI seq : sqs) + { + /* + * get all features currently visible (and any non-positional features) + */ + List seqFeatures = seq.getFeatures().getAllFeatures( + visibleFeatureTypes); for (SequenceFeature sf : seqFeatures) { - if (displayedFeatures != null - && displayedFeatures.isVisible(sf.getType())) - { - SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo( - String.valueOf(seq.hashCode())); - - String featureColour = (fr == null) ? null : jalview.util.Format - .getHexString(fr.findFeatureColour(Color.white, seq, - seq.findIndex(sf.getBegin()))); - jsonFeature.setXstart(seq.findIndex(sf.getBegin()) - 1); - jsonFeature.setXend(seq.findIndex(sf.getEnd())); - jsonFeature.setType(sf.getType()); - jsonFeature.setDescription(sf.getDescription()); - jsonFeature.setLinks(sf.links); - jsonFeature.setOtherDetails(sf.otherDetails); - jsonFeature.setScore(sf.getScore()); - jsonFeature.setFillColor(featureColour); - jsonFeature.setFeatureGroup(sf.getFeatureGroup()); - sequenceFeaturesPojo.add(jsonFeature); - } + SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo( + String.valueOf(seq.hashCode())); + + String featureColour = (fr == null) ? null : Format + .getHexString(finder.findFeatureColour(Color.white, seq, + seq.findIndex(sf.getBegin()))); + int xStart = sf.getBegin() == 0 ? 0 + : seq.findIndex(sf.getBegin()) - 1; + int xEnd = sf.getEnd() == 0 ? 0 : seq.findIndex(sf.getEnd()); + jsonFeature.setXstart(xStart); + jsonFeature.setXend(xEnd); + jsonFeature.setType(sf.getType()); + jsonFeature.setDescription(sf.getDescription()); + jsonFeature.setLinks(sf.links); + jsonFeature.setOtherDetails(sf.otherDetails); + jsonFeature.setScore(sf.getScore()); + jsonFeature.setFillColor(featureColour); + jsonFeature.setFeatureGroup(sf.getFeatureGroup()); + sequenceFeaturesPojo.add(jsonFeature); } } return sequenceFeaturesPojo; @@ -364,7 +322,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile public static List annotationToJsonPojo( Vector annotations) { - List jsonAnnotations = new ArrayList(); + List jsonAnnotations = new ArrayList<>(); if (annotations == null) { return jsonAnnotations; @@ -409,8 +367,8 @@ public class JSONFile extends AlignFile implements ComplexAlignFile annotationPojo.setDisplayCharacter(displayChar); if (annotation.colour != null) { - annotationPojo.setColour(jalview.util.Format - .getHexString(annotation.colour)); + annotationPojo.setColour( + jalview.util.Format.getHexString(annotation.colour)); } alignAnnotPojo.getAnnotations().add(annotationPojo); } @@ -437,36 +395,33 @@ public class JSONFile extends AlignFile implements ComplexAlignFile { try { - JSONParser jsonParser = new JSONParser(); - JSONObject alignmentJsonObj = (JSONObject) jsonParser - .parse(jsonAlignmentString); - JSONArray seqJsonArray = (JSONArray) alignmentJsonObj.get("seqs"); - JSONArray alAnnotJsonArray = (JSONArray) alignmentJsonObj + Map alignmentJsonObj = (Map) JSONUtils.parse(jsonAlignmentString); + List seqJsonArray = (List) alignmentJsonObj.get("seqs"); + List alAnnotJsonArray = (List) alignmentJsonObj .get("alignAnnotation"); - JSONArray jsonSeqArray = (JSONArray) alignmentJsonObj + List jsonSeqArray = (List) alignmentJsonObj .get("seqFeatures"); - JSONArray seqGrpJsonArray = (JSONArray) alignmentJsonObj + List seqGrpJsonArray = (List) alignmentJsonObj .get("seqGroups"); - JSONObject jvSettingsJsonObj = (JSONObject) alignmentJsonObj + Map jvSettingsJsonObj = (Map) alignmentJsonObj .get("appSettings"); if (jvSettingsJsonObj != null) { globalColourScheme = (String) jvSettingsJsonObj .get("globalColorScheme"); - Boolean showFeatures = Boolean.valueOf(jvSettingsJsonObj.get( - "showSeqFeatures").toString()); + Boolean showFeatures = Boolean.valueOf( + jvSettingsJsonObj.get("showSeqFeatures").toString()); setShowSeqFeatures(showFeatures); parseHiddenSeqRefsAsList(jvSettingsJsonObj); parseHiddenCols(jvSettingsJsonObj); } - hiddenSequences = new ArrayList(); - seqMap = new Hashtable(); - for (Iterator sequenceIter = seqJsonArray.iterator(); sequenceIter - .hasNext();) + hiddenSequences = new ArrayList<>(); + seqMap = new Hashtable<>(); + for (Iterator sequenceIter = seqJsonArray.iterator(); sequenceIter.hasNext();) { - JSONObject sequence = sequenceIter.next(); + Map sequence = (Map) sequenceIter.next(); String sequcenceString = sequence.get("seq").toString(); String sequenceName = sequence.get("name").toString(); String seqUniqueId = sequence.get("id").toString(); @@ -482,38 +437,35 @@ public class JSONFile extends AlignFile implements ComplexAlignFile seqMap.put(seqUniqueId, seq); } - parseFeatures(jsonSeqArray); - for (Iterator seqGrpIter = seqGrpJsonArray.iterator(); seqGrpIter - .hasNext();) + for (Iterator seqGrpIter = seqGrpJsonArray.iterator(); seqGrpIter.hasNext();) { - JSONObject seqGrpObj = seqGrpIter.next(); + Map seqGrpObj = (Map)seqGrpIter.next(); String grpName = seqGrpObj.get("groupName").toString(); String colourScheme = seqGrpObj.get("colourScheme").toString(); String description = (seqGrpObj.get("description") == null) ? null : seqGrpObj.get("description").toString(); - boolean displayBoxes = Boolean.valueOf(seqGrpObj - .get("displayBoxes").toString()); - boolean displayText = Boolean.valueOf(seqGrpObj.get("displayText") - .toString()); - boolean colourText = Boolean.valueOf(seqGrpObj.get("colourText") - .toString()); - boolean showNonconserved = Boolean.valueOf(seqGrpObj.get( - "showNonconserved").toString()); + boolean displayBoxes = Boolean + .valueOf(seqGrpObj.get("displayBoxes").toString()); + boolean displayText = Boolean + .valueOf(seqGrpObj.get("displayText").toString()); + boolean colourText = Boolean + .valueOf(seqGrpObj.get("colourText").toString()); + boolean showNonconserved = Boolean + .valueOf(seqGrpObj.get("showNonconserved").toString()); int startRes = Integer .valueOf(seqGrpObj.get("startRes").toString()); int endRes = Integer.valueOf(seqGrpObj.get("endRes").toString()); - JSONArray sequenceRefs = (JSONArray) seqGrpObj.get("sequenceRefs"); + List sequenceRefs = (List) seqGrpObj.get("sequenceRefs"); - ArrayList grpSeqs = new ArrayList(); + ArrayList grpSeqs = new ArrayList<>(); if (sequenceRefs.size() > 0) { - Iterator seqHashIter = sequenceRefs.iterator(); + Iterator seqHashIter = sequenceRefs.iterator(); while (seqHashIter.hasNext()) { - String seqHash = seqHashIter.next(); - Sequence sequence = seqMap.get(seqHash); + Sequence sequence = seqMap.get(seqHashIter.next()); if (sequence != null) { grpSeqs.add(sequence); @@ -521,84 +473,88 @@ public class JSONFile extends AlignFile implements ComplexAlignFile } } SequenceGroup seqGrp = new SequenceGroup(grpSeqs, grpName, null, - displayBoxes, displayText, colourText, - startRes, endRes); - seqGrp.cs = ColourSchemeMapper.getJalviewColourScheme(colourScheme, - seqGrp); + displayBoxes, displayText, colourText, startRes, endRes); + seqGrp.setColourScheme(ColourSchemeMapper + .getJalviewColourScheme(colourScheme, seqGrp)); seqGrp.setShowNonconserved(showNonconserved); seqGrp.setDescription(description); this.seqGroups.add(seqGrp); } - for (Iterator alAnnotIter = alAnnotJsonArray.iterator(); alAnnotIter - .hasNext();) + for (Iterator alAnnotIter = alAnnotJsonArray.iterator(); alAnnotIter.hasNext();) { - JSONObject alAnnot = alAnnotIter.next(); - JSONArray annotJsonArray = (JSONArray) alAnnot.get("annotations"); + Map alAnnot = (Map) alAnnotIter.next(); + List annotJsonArray = (List) alAnnot.get("annotations"); Annotation[] annotations = new Annotation[annotJsonArray.size()]; int count = 0; - for (Iterator annotIter = annotJsonArray.iterator(); annotIter - .hasNext();) + for (Iterator annotIter = annotJsonArray.iterator(); annotIter.hasNext();) { - JSONObject annot = annotIter.next(); + Map annot = (Map) annotIter.next(); if (annot == null) { annotations[count] = null; } else { - float val = annot.get("value") == null ? null : Float - .valueOf(annot.get("value").toString()); - String desc = annot.get("description") == null ? null : annot - .get("description").toString(); + float val = annot.get("value") == null ? null + : Float.valueOf(annot.get("value").toString()); + String desc = annot.get("description") == null ? null + : annot.get("description").toString(); char ss = annot.get("secondaryStructure") == null || annot.get("secondaryStructure").toString() - .equalsIgnoreCase("u0000") ? ' ' : annot - .get("secondaryStructure").toString().charAt(0); + .equalsIgnoreCase("u0000") ? ' ' + : annot.get("secondaryStructure") + .toString().charAt(0); String displayChar = annot.get("displayCharacter") == null ? "" : annot.get("displayCharacter").toString(); - Color color = annot.get("colour") == null ? Color.white - : UserColourScheme.getColourFromString(annot.get( - "colour").toString()); - annotations[count] = new Annotation(displayChar, desc, ss, val, - color); + + annotations[count] = new Annotation(displayChar, desc, ss, val); + if (annot.get("colour") != null) + { + Color color = ColorUtils + .parseColourString(annot.get("colour").toString()); + annotations[count].colour = color; + } } ++count; } - AlignmentAnnotation alignAnnot = new AlignmentAnnotation(alAnnot - .get("label").toString(), alAnnot.get("description") - .toString(), annotations); - alignAnnot.graph = (alAnnot.get("graphType") == null) ? 0 : Integer - .valueOf(alAnnot.get("graphType") - .toString()); + AlignmentAnnotation alignAnnot = new AlignmentAnnotation( + alAnnot.get("label").toString(), + alAnnot.get("description").toString(), annotations); + alignAnnot.graph = (alAnnot.get("graphType") == null) ? 0 + : Integer.valueOf(alAnnot.get("graphType").toString()); - JSONObject diplaySettings = (JSONObject) alAnnot + Map diplaySettings = (Map) alAnnot .get("annotationSettings"); if (diplaySettings != null) { - alignAnnot.scaleColLabel = (diplaySettings.get("scaleColLabel") == null) ? false - : Boolean.valueOf(diplaySettings.get("scaleColLabel") - .toString()); + alignAnnot.scaleColLabel = (diplaySettings + .get("scaleColLabel") == null) ? false + : Boolean.valueOf(diplaySettings + .get("scaleColLabel").toString()); alignAnnot.showAllColLabels = (diplaySettings - .get("showAllColLabels") == null) ? true : Boolean - .valueOf(diplaySettings.get("showAllColLabels") - .toString()); + .get("showAllColLabels") == null) ? true + : Boolean.valueOf(diplaySettings + .get("showAllColLabels").toString()); alignAnnot.centreColLabels = (diplaySettings .get("centreColLabels") == null) ? true - : Boolean.valueOf(diplaySettings.get("centreColLabels") - .toString()); - alignAnnot.belowAlignment = (diplaySettings.get("belowAlignment") == null) ? false - : Boolean.valueOf(diplaySettings.get("belowAlignment") - .toString()); - alignAnnot.visible = (diplaySettings.get("visible") == null) ? true - : Boolean.valueOf(diplaySettings.get("visible") - .toString()); - alignAnnot.hasIcons = (diplaySettings.get("hasIcon") == null) ? true - : Boolean.valueOf(diplaySettings.get("hasIcon") - .toString()); + : Boolean.valueOf(diplaySettings + .get("centreColLabels").toString()); + alignAnnot.belowAlignment = (diplaySettings + .get("belowAlignment") == null) ? false + : Boolean.valueOf(diplaySettings + .get("belowAlignment").toString()); + alignAnnot.visible = (diplaySettings.get("visible") == null) + ? true + : Boolean.valueOf( + diplaySettings.get("visible").toString()); + alignAnnot.hasIcons = (diplaySettings.get("hasIcon") == null) + ? true + : Boolean.valueOf( + diplaySettings.get("hasIcon").toString()); } if (alAnnot.get("score") != null) @@ -607,11 +563,12 @@ public class JSONFile extends AlignFile implements ComplexAlignFile .valueOf(alAnnot.get("score").toString()); } - String calcId = (alAnnot.get("calcId") == null) ? "" : alAnnot.get( - "calcId").toString(); + String calcId = (alAnnot.get("calcId") == null) ? "" + : alAnnot.get("calcId").toString(); alignAnnot.setCalcId(calcId); - String seqHash = (alAnnot.get("sequenceRef") != null) ? alAnnot - .get("sequenceRef").toString() : null; + String seqHash = (alAnnot.get("sequenceRef") != null) + ? alAnnot.get("sequenceRef").toString() + : null; Sequence sequence = (seqHash != null) ? seqMap.get(seqHash) : null; if (sequence != null) @@ -626,7 +583,7 @@ public class JSONFile extends AlignFile implements ComplexAlignFile alignAnnot.adjustForAlignment(); } } - // alignAnnot.validateRangeAndDisplay(); + alignAnnot.validateRangeAndDisplay(); this.annotations.add(alignAnnot); } @@ -637,78 +594,83 @@ public class JSONFile extends AlignFile implements ComplexAlignFile return this; } - public void parseHiddenSeqRefsAsList(JSONObject jvSettingsJson) + public void parseHiddenSeqRefsAsList(Map jvSettingsJson) { - hiddenSeqRefs = new ArrayList(); + hiddenSeqRefs = new ArrayList<>(); String hiddenSeqs = (String) jvSettingsJson.get("hiddenSeqs"); if (hiddenSeqs != null && !hiddenSeqs.isEmpty()) { String[] seqRefs = hiddenSeqs.split(";"); - for (String seqRef : seqRefs) + for (int i = 0, n = seqRefs.length; i < n; i++) { - hiddenSeqRefs.add(seqRef); + hiddenSeqRefs.add(seqRefs[i]); } } } - public void parseHiddenCols(JSONObject jvSettingsJson) + public void parseHiddenCols(Map jvSettingsJson) { String hiddenCols = (String) jvSettingsJson.get("hiddenCols"); if (hiddenCols != null && !hiddenCols.isEmpty()) { - columnSelection = new ColumnSelection(); + hiddenColumns = new HiddenColumns(); String[] rangeStrings = hiddenCols.split(";"); - for (String rangeString : rangeStrings) + for (int i = 0, n = rangeStrings.length; i < n; i++) { - String[] range = rangeString.split("-"); - columnSelection.hideColumns(Integer.valueOf(range[0]), + String[] range = rangeStrings[i].split("-"); + hiddenColumns.hideColumns(Integer.valueOf(range[0]), Integer.valueOf(range[1])); } } } @SuppressWarnings("unchecked") - private void parseFeatures(JSONArray jsonSeqFeatures) + private void parseFeatures(List jsonSeqFeatures) { if (jsonSeqFeatures != null) { displayedFeatures = new FeaturesDisplayed(); - for (Iterator seqFeatureItr = jsonSeqFeatures.iterator(); seqFeatureItr - .hasNext();) + for (Object o : jsonSeqFeatures) { - JSONObject jsonFeature = seqFeatureItr.next(); + Map jsonFeature = (Map) o; Long begin = (Long) jsonFeature.get("xStart"); Long end = (Long) jsonFeature.get("xEnd"); String type = (String) jsonFeature.get("type"); String featureGrp = (String) jsonFeature.get("featureGroup"); - String descripiton = (String) jsonFeature.get("description"); + String description = (String) jsonFeature.get("description"); String seqRef = (String) jsonFeature.get("sequenceRef"); Float score = Float.valueOf(jsonFeature.get("score").toString()); Sequence seq = seqMap.get(seqRef); - SequenceFeature sequenceFeature = new SequenceFeature(); - JSONArray linksJsonArray = (JSONArray) jsonFeature.get("links"); + + /* + * begin/end of 0 is for a non-positional feature + */ + int featureBegin = begin.intValue() == 0 ? 0 : seq + .findPosition(begin.intValue()); + int featureEnd = end.intValue() == 0 ? 0 : seq.findPosition(end + .intValue()) - 1; + + SequenceFeature sequenceFeature = new SequenceFeature(type, + description, featureBegin, featureEnd, score, featureGrp); + + List linksJsonArray = (List) jsonFeature.get("links"); if (linksJsonArray != null && linksJsonArray.size() > 0) { - Iterator linkList = linksJsonArray.iterator(); + Iterator linkList = linksJsonArray.iterator(); while (linkList.hasNext()) { - String link = linkList.next(); - sequenceFeature.addLink(link); + sequenceFeature.addLink((String) linkList.next()); } } - sequenceFeature.setFeatureGroup(featureGrp); - sequenceFeature.setScore(score); - sequenceFeature.setDescription(descripiton); - sequenceFeature.setType(type); - sequenceFeature.setBegin(seq.findPosition(begin.intValue())); - sequenceFeature.setEnd(seq.findPosition(end.intValue()) - 1); + seq.addSequenceFeature(sequenceFeature); displayedFeatures.setVisible(type); } } } + @Override public String getGlobalColourScheme() { return globalColourScheme; @@ -730,8 +692,13 @@ public class JSONFile extends AlignFile implements ComplexAlignFile this.displayedFeatures = displayedFeatures; } + @Override public void configureForView(AlignmentViewPanel avpanel) { + if (avpanel == null) + { + return; + } super.configureForView(avpanel); AlignViewportI viewport = avpanel.getAlignViewport(); AlignmentI alignment = viewport.getAlignment(); @@ -741,20 +708,24 @@ public class JSONFile extends AlignFile implements ComplexAlignFile fr = avpanel.cloneFeatureRenderer(); // Add non auto calculated annotation to AlignFile - for (AlignmentAnnotation annot : annots) + if (annots != null) { - if (annot != null && !annot.autoCalculated) + for (AlignmentAnnotation annot : annots) { - annotations.add(annot); + if (annot != null && !annot.autoCalculated) + { + annotations.add(annot); + } } } - globalColourScheme = ColourSchemeProperty.getColourName(viewport - .getGlobalColourScheme()); + globalColourScheme = ColourSchemeProperty + .getColourName(viewport.getGlobalColourScheme()); setDisplayedFeatures(viewport.getFeaturesDisplayed()); showSeqFeatures = viewport.isShowSequenceFeatures(); } + @Override public boolean isShowSeqFeatures() { return showSeqFeatures; @@ -770,21 +741,18 @@ public class JSONFile extends AlignFile implements ComplexAlignFile return annotations; } - public List getHiddenColumns() + @Override + public HiddenColumns getHiddenColumns() { return hiddenColumns; } - public ColumnSelection getColumnSelection() - { - return columnSelection; - } - - public void setColumnSelection(ColumnSelection columnSelection) + public void setHiddenColumns(HiddenColumns hidden) { - this.columnSelection = columnSelection; + this.hiddenColumns = hidden; } + @Override public SequenceI[] getHiddenSequences() { if (hiddenSequences == null || hiddenSequences.isEmpty()) @@ -864,4 +832,19 @@ public class JSONFile extends AlignFile implements ComplexAlignFile this.exportJalviewSettings = exportJalviewSettings; } } + + /** + * Returns a descriptor for suitable feature display settings with + *
    + *
  • ResNums or insertions features visible
  • + *
  • insertions features coloured red
  • + *
  • ResNum features coloured by label
  • + *
  • Insertions displayed above (on top of) ResNums
  • + *
+ */ + @Override + public FeatureSettingsModelI getFeatureColourScheme() + { + return new PDBFeatureSettings(); + } }