X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FJSONFile.java;h=bbbc122e2b8666d97819ba8f998785e2a8c7955a;hb=93d63f3c608771bb48b5ac18f761194a1ea28554;hp=28b8ed22f1b877de07fededa54487a21e0b022f2;hpb=7ce1382b998c007a78c9b33a3dc331e966eebc4b;p=jalview.git diff --git a/src/jalview/io/JSONFile.java b/src/jalview/io/JSONFile.java index 28b8ed2..bbbc122 100644 --- a/src/jalview/io/JSONFile.java +++ b/src/jalview/io/JSONFile.java @@ -1,20 +1,42 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ + package jalview.io; import jalview.api.AlignViewportI; +import jalview.api.ComplexAlignFile; import jalview.api.FeatureRenderer; import jalview.api.FeaturesDisplayedI; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; +import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenSequences; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; -import jalview.gui.AlignFrame; import jalview.json.binding.v1.AlignmentAnnotationPojo; import jalview.json.binding.v1.AlignmentPojo; +import jalview.json.binding.v1.AlignmentPojo.JalviewBioJsColorSchemeMapper; import jalview.json.binding.v1.AnnotationPojo; -import jalview.json.binding.v1.JalviewSettingsPojo; -import jalview.json.binding.v1.JalviewSettingsPojo.JalviewBioJsColorSchemeMapper; import jalview.json.binding.v1.SequenceFeaturesPojo; import jalview.json.binding.v1.SequenceGrpPojo; import jalview.json.binding.v1.SequencePojo; @@ -23,6 +45,7 @@ import jalview.schemes.ColourSchemeProperty; import java.awt.Color; import java.io.IOException; +import java.io.Reader; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; @@ -33,13 +56,15 @@ import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; -public class JSONFile extends AlignFile +public class JSONFile extends AlignFile implements ComplexAlignFile { private ColourSchemeI colourScheme; - private String jalviewVersion; + private String version = "2.9"; + + private String webstartUrl = "www.jalview.org/services/launchApp"; - private String webStartLaunchServletUrl; + private String application = "Jalview"; public static final String FILE_EXT = "json"; @@ -55,7 +80,13 @@ public class JSONFile extends AlignFile private FeatureRenderer fr; - private JSONExportSettings jsonExportSettings; + private List hiddenColumns; + + private ColumnSelection columnSelection; + + private List hiddenSeqRefs; + + private ArrayList hiddenSequences; public JSONFile() { @@ -75,30 +106,16 @@ public class JSONFile extends AlignFile @Override public void parse() throws IOException { - StringBuilder jsonStringBuilder = new StringBuilder(); - String currentLine; - while ((currentLine = nextLine()) != null) - { - jsonStringBuilder.append(currentLine); - } - parse(jsonStringBuilder.toString()); + parse(getReader()); } @Override public String print() { + String jsonOutput = null; try { - if (getJsonExportSettings() == null) - { - jsonExportSettings = new JSONExportSettings(); - jsonExportSettings.setExportAnnotations(true); - jsonExportSettings.setExportGroups(true); - jsonExportSettings.setExportJalviewSettings(true); - jsonExportSettings.setExportSequenceFeatures(true); - } - AlignmentPojo jsonAlignmentPojo = new AlignmentPojo(); if (getViewport() != null) { @@ -117,7 +134,7 @@ public class JSONFile extends AlignFile name.append(seq.getName()).append("/").append(seq.getStart()) .append("-").append(seq.getEnd()); SequencePojo jsonSeqPojo = new SequencePojo(); - jsonSeqPojo.setId(seq.getName() + "_" + seq.hashCode()); + jsonSeqPojo.setId(String.valueOf(seq.hashCode())); jsonSeqPojo.setOrder(++count); jsonSeqPojo.setEnd(seq.getEnd()); jsonSeqPojo.setStart(seq.getStart()); @@ -126,34 +143,46 @@ public class JSONFile extends AlignFile jsonAlignmentPojo.getSeqs().add(jsonSeqPojo); } - if (jsonExportSettings.isExportJalviewSettings()) + jsonAlignmentPojo.setGlobalColorScheme(globalColorScheme); + jsonAlignmentPojo.getAppSettings().put("application", application); + jsonAlignmentPojo.getAppSettings().put("version", version); + jsonAlignmentPojo.getAppSettings().put("webStartUrl", webstartUrl); + jsonAlignmentPojo.getAppSettings().put("showSeqFeatures", + String.valueOf(showSeqFeatures)); + + String[] hiddenSections = getHiddenSections(); + if (hiddenSections != null) { - jalviewVersion = jalview.bin.Cache.getProperty("VERSION"); - webStartLaunchServletUrl = jalview.bin.Cache.getDefault( - "www.jalview.org", "http://www.jalview.org") - + "/services/launchApp"; - - JalviewSettingsPojo jvSettings = new JalviewSettingsPojo(); - jvSettings.setGlobalColorScheme(globalColorScheme); - jvSettings.setJalviewVersion(jalviewVersion); - jvSettings.setWebStartUrl(webStartLaunchServletUrl); - jvSettings.setShowSeqFeatures(showSeqFeatures); - jsonAlignmentPojo.setJalviewSettings(jvSettings); + if (hiddenSections[0] != null + && getViewport().getExportSettings() + .isExportHiddenColumns()) + { + jsonAlignmentPojo.getAppSettings().put("hiddenCols", + String.valueOf(hiddenSections[0])); + } + if (hiddenSections[1] != null + && getViewport().getExportSettings() + .isExportHiddenSequences()) + { + jsonAlignmentPojo.getAppSettings().put("hiddenSeqs", + String.valueOf(hiddenSections[1])); + } } - if (jsonExportSettings.isExportAnnotations()) + if (getViewport().getExportSettings().isExportAnnotations()) { jsonAlignmentPojo .setAlignAnnotation(annotationToJsonPojo(annotations)); } - if (jsonExportSettings.isExportSequenceFeatures()) + if (getViewport().getExportSettings().isExportFeatures()) { jsonAlignmentPojo .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr)); } - if (jsonExportSettings.isExportGroups() && seqGroups != null + if (getViewport().getExportSettings().isExportGroups() + && seqGroups != null && seqGroups.size() > 0) { for (SequenceGroup seqGrp : seqGroups) @@ -171,22 +200,71 @@ public class JSONFile extends AlignFile seqGrpPojo.setShowNonconserved(seqGrp.getShowNonconserved()); for (SequenceI seq : seqGrp.getSequences()) { - seqGrpPojo.getSeqsHash().add( - seq.getName() + "_" + seq.hashCode()); + seqGrpPojo.getSeqsHash().add(String.valueOf(seq.hashCode())); } jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo); } } - com.json.JSONObject generatedJSon = new com.json.JSONObject( + org.json.JSONObject generatedJSon = new org.json.JSONObject( jsonAlignmentPojo); - String jsonOutput = generatedJSon.toString(); + jsonOutput = generatedJSon.toString(); return jsonOutput.replaceAll("xstart", "xStart").replaceAll("xend", "xEnd"); } catch (Exception e) { e.printStackTrace(); - throw e; } + return jsonOutput; + } + + public String[] getHiddenSections() + { + String[] hiddenSections = new String[2]; + if (getViewport() == null) + { + return null; + } + + // 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(); + } + + // hidden rows/seqs business + HiddenSequences hiddenSeqsObj = getViewport().getAlignment() + .getHiddenSequences(); + if (hiddenSeqsObj == null || hiddenSeqsObj.hiddenSequences == null) + { + return hiddenSections; + } + + SequenceI[] hiddenSeqs = hiddenSeqsObj.hiddenSequences; + StringBuilder hiddenSeqsBuilder = new StringBuilder(); + for (SequenceI hiddenSeq : hiddenSeqs) + { + if (hiddenSeq != null) + { + hiddenSeqsBuilder.append(";").append(hiddenSeq.hashCode()); + } + } + if (hiddenSeqsBuilder.length() > 0) + { + hiddenSeqsBuilder.deleteCharAt(0); + } + hiddenSections[1] = hiddenSeqsBuilder.toString(); + + return hiddenSections; } public static List sequenceFeatureToJsonPojo( @@ -201,6 +279,8 @@ public class JSONFile extends AlignFile SequenceFeature[] seqFeatures = (dataSetSequence == null) ? null : seq.getDatasetSequence().getSequenceFeatures(); + seqFeatures = (seqFeatures == null) ? seq.getSequenceFeatures() + : seqFeatures; if (seqFeatures == null) { continue; @@ -212,7 +292,7 @@ public class JSONFile extends AlignFile && displayedFeatures.isVisible(sf.getType())) { SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo( - seq.getName() + "_" + seq.hashCode()); + String.valueOf(seq.hashCode())); String featureColour = (fr == null) ? null : jalview.util.Format .getHexString(fr .findFeatureColour(Color.white, seq, @@ -269,7 +349,7 @@ public class JSONFile extends AlignFile } @SuppressWarnings("unchecked") - public JSONFile parse(String jsonAlignmentString) + public JSONFile parse(Reader jsonAlignmentString) { try { @@ -284,7 +364,7 @@ public class JSONFile extends AlignFile JSONArray seqGrpJsonArray = (JSONArray) alignmentJsonObj .get("seqGroups"); JSONObject jvSettingsJsonObj = (JSONObject) alignmentJsonObj - .get("jalviewSettings"); + .get("appSettings"); if (jvSettingsJsonObj != null) { @@ -294,8 +374,11 @@ public class JSONFile extends AlignFile "showSeqFeatures").toString()); setColourScheme(getJalviewColorScheme(jsColourScheme)); setShowSeqFeatures(showFeatures); + parseHiddenSeqRefsAsList(jvSettingsJsonObj); + parseHiddenCols(jvSettingsJsonObj); } + hiddenSequences = new ArrayList(); seqMap = new Hashtable(); for (Iterator sequenceIter = seqJsonArray.iterator(); sequenceIter .hasNext();) @@ -308,6 +391,10 @@ public class JSONFile extends AlignFile int end = Integer.valueOf(sequence.get("end").toString()); Sequence seq = new Sequence(sequenceName, sequcenceString, start, end); + if (hiddenSeqRefs != null && hiddenSeqRefs.contains(seqUniqueId)) + { + hiddenSequences.add(seq); + } seqs.add(seq); seqMap.put(seqUniqueId, seq); } @@ -379,7 +466,7 @@ public class JSONFile extends AlignFile String desc = annot.get("description") == null ? null : annot .get("description").toString(); - char ss = annot.get("secondaryStructure") == null ? null + char ss = annot.get("secondaryStructure") == null ? ' ' : annot.get("secondaryStructure").toString().charAt(0); String displayChar = annot.get("displayCharacter").toString(); @@ -401,6 +488,31 @@ public class JSONFile extends AlignFile return this; } + public void parseHiddenSeqRefsAsList(JSONObject jvSettingsJson) + { + hiddenSeqRefs = new ArrayList(); + String hiddenSeqs = (String) jvSettingsJson.get("hiddenSeqs"); + if(hiddenSeqs != null && !hiddenSeqs.isEmpty()){ + String[] seqRefs = hiddenSeqs.split(";"); + for(String seqRef : seqRefs){ + hiddenSeqRefs.add(seqRef); + } + } + } + + public void parseHiddenCols(JSONObject jvSettingsJson) + { + String hiddenCols = (String) jvSettingsJson.get("hiddenCols"); + if(hiddenCols != null && !hiddenCols.isEmpty()){ + columnSelection = new ColumnSelection(); + String[] rangeStrings = hiddenCols.split(";"); + for(String rangeString : rangeStrings){ + String[] range = rangeString.split("-"); + columnSelection.hideColumns(Integer.valueOf(range[0]), + Integer.valueOf(range[1])); + } + } + } @SuppressWarnings("unchecked") private void parseFeatures(JSONArray jsonSeqFeatures) @@ -418,9 +530,6 @@ public class JSONFile extends AlignFile String descripiton = (String) jsonFeature.get("description"); String seqRef = (String) jsonFeature.get("sequenceRef"); Float score = Float.valueOf(jsonFeature.get("score").toString()); - // Hashtable otherDetails = (Hashtable) jsonFeature - // .get("otherDetails"); - // sequenceFeature.otherDetails = otherDetails; Sequence seq = seqMap.get(seqRef); SequenceFeature sequenceFeature = new SequenceFeature(); @@ -461,13 +570,6 @@ public class JSONFile extends AlignFile return jalviewColor; } - public void applySettingsToAlignFrame(AlignFrame af) - { - af.setShowSeqFeatures(isShowSeqFeatures()); - af.changeColour(getColourScheme()); - af.setMenusForViewport(); - } - public String getGlobalColorScheme() { return globalColorScheme; @@ -498,15 +600,6 @@ public class JSONFile extends AlignFile this.displayedFeatures = displayedFeatures; } - public JSONExportSettings getJsonExportSettings() - { - return jsonExportSettings; - } - - public void setJsonExportSettings(JSONExportSettings jsonExportSettings) - { - this.jsonExportSettings = jsonExportSettings; - } public static String getJSONData(AlignViewportI av) { @@ -547,6 +640,44 @@ public class JSONFile extends AlignFile this.showSeqFeatures = showSeqFeatures; } + public Vector getAnnotations() + { + return annotations; + } + + public List getHiddenColumns() + { + return hiddenColumns; + } + + public ColumnSelection getColumnSelection() + { + return columnSelection; + } + + public void setColumnSelection(ColumnSelection columnSelection) + { + this.columnSelection = columnSelection; + } + + public SequenceI[] getHiddenSequences() + { + if (hiddenSequences == null || hiddenSequences.isEmpty()) + { + return new SequenceI[] + {}; + } + synchronized (hiddenSequences) + { + return hiddenSequences.toArray(new SequenceI[hiddenSequences.size()]); + } + } + + public void setHiddenSequences(ArrayList hiddenSequences) + { + this.hiddenSequences = hiddenSequences; + } + public class JSONExportSettings { private boolean exportSequence;