+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+
package jalview.io;
+import java.awt.Color;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+
+import jalview.api.AlignViewControllerGuiI;
+import jalview.api.AlignViewportI;
+import jalview.api.FeatureRenderer;
import jalview.api.FeaturesDisplayedI;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.Annotation;
+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.gui.Desktop;
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;
import jalview.schemes.ColourSchemeI;
import jalview.schemes.ColourSchemeProperty;
-import jalview.viewmodel.AlignmentViewport;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-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
{
- private static ColourSchemeI colourScheme;
+ private ColourSchemeI colourScheme;
- private static boolean seqFeaturesEnabled;
+ private String version = "2.9";
- private String jalviewVersion;
+ private String webstartUrl = "www.jalview.org/services/launchApp";
- private String webStartLaunchServletUrl = "http://www.jalview.org/services/launchApp";
+ private String application = "Jalview";
public static final String FILE_EXT = "json";
private FeaturesDisplayedI displayedFeatures;
- private AlignmentViewport av;
+ private FeatureRenderer fr;
private JSONExportSettings jsonExportSettings;
+ private List<int[]> hiddenColumns;
+
+ private List<String> hiddenSeqRefs;
+
public JSONFile()
{
super();
@Override
public String print()
{
+ String jsonOutput = null;
try
{
if (getJsonExportSettings() == null)
}
AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
- if (Desktop.getCurrentAlignFrame() != null)
+ if (getViewport() != null)
{
- globalColorScheme = ColourSchemeProperty.getColourName(Desktop
- .getCurrentAlignFrame().getViewport()
+ globalColorScheme = ColourSchemeProperty
+ .getColourName(getViewport()
.getGlobalColourScheme());
- this.av = Desktop.getCurrentAlignFrame().getCurrentView();
- setDisplayedFeatures(av.getFeaturesDisplayed());
- showSeqFeatures = Desktop.getCurrentAlignFrame().showSeqFeatures
- .isSelected();
+ setDisplayedFeatures(getViewport().getFeaturesDisplayed());
+ showSeqFeatures = getViewport().isShowSequenceFeatures();
+ fr = getViewport().getFeatureRenderer();
}
int count = 0;
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());
if (jsonExportSettings.isExportJalviewSettings())
{
- JalviewSettingsPojo jvSettings = new JalviewSettingsPojo();
- jvSettings.setGlobalColorScheme(globalColorScheme);
- jvSettings.setJalviewVersion(jalviewVersion);
- jvSettings.setWebStartUrl(webStartLaunchServletUrl);
- jvSettings.setShowSeqFeatures(showSeqFeatures);
- jsonAlignmentPojo.setJalviewSettings(jvSettings);
+ 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 = exportHiddenSections();
+ if (hiddenSections != null)
+ {
+ jsonAlignmentPojo.getAppSettings().put("hiddenCols",
+ String.valueOf(hiddenSections[0]));
+ jsonAlignmentPojo.getAppSettings().put("hiddenSeqs",
+ String.valueOf(hiddenSections[1]));
+ }
}
if (jsonExportSettings.isExportAnnotations())
if (jsonExportSettings.isExportSequenceFeatures())
{
- jsonAlignmentPojo.setSeqFeatures(sequenceFeatureToJsonPojo(seqs,
- getDisplayedFeatures()));
+ jsonAlignmentPojo
+ .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr));
}
if (jsonExportSettings.isExportGroups() && seqGroups != null
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[] exportHiddenSections()
+ {
+ String[] hiddenSections = new String[2];
+ if (getViewport() == null)
+ {
+ return null;
+ }
+
+ System.out.println("--- Hidden Sections ---");
+ // hidden column business
+ if (getViewport().hasHiddenColumns())
+ {
+ System.out.print("Hidden Cols : ");
+ List<int[]> 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();
+ System.out.println(hiddenSections[0]);
+ }
+
+ // hidden rows/seqs business
+ HiddenSequences hiddenSeqsObj = getViewport().getAlignment()
+ .getHiddenSequences();
+ if (hiddenSeqsObj == null)
+ {
+ return hiddenSections;
+ }
+
+ SequenceI[] hiddenSeqs = hiddenSeqsObj.hiddenSequences;
+ System.out.print("Hidden Seqs : ");
+ 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();
+ System.out.println(hiddenSections[1]);
+ return hiddenSections;
}
public static List<SequenceFeaturesPojo> sequenceFeatureToJsonPojo(
- List<SequenceI> seqs, FeaturesDisplayedI displayedFeatures)
+ List<SequenceI> seqs, FeatureRenderer fr)
{
+ FeaturesDisplayedI displayedFeatures = (fr == null) ? null : fr
+ .getFeaturesDisplayed();
List<SequenceFeaturesPojo> sequenceFeaturesPojo = new ArrayList<SequenceFeaturesPojo>();
for (SequenceI seq : seqs)
{
&& 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,
+ seq.findIndex(sf.getBegin())));
jsonFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
jsonFeature.setXend(seq.findIndex(sf.getEnd()));
jsonFeature.setType(sf.getType());
jsonFeature.setLinks(sf.links);
jsonFeature.setOtherDetails(sf.otherDetails);
jsonFeature.setScore(sf.getScore());
+ jsonFeature.setFillColor(featureColour);
jsonFeature.setFeatureGroup(sf.getFeatureGroup());
sequenceFeaturesPojo.add(jsonFeature);
}
JSONArray seqGrpJsonArray = (JSONArray) alignmentJsonObj
.get("seqGroups");
JSONObject jvSettingsJsonObj = (JSONObject) alignmentJsonObj
- .get("jalviewSettings");
+ .get("appSettings");
if (jvSettingsJsonObj != null)
{
Boolean showFeatures = Boolean.valueOf(jvSettingsJsonObj.get(
"showSeqFeatures").toString());
setColourScheme(getJalviewColorScheme(jsColourScheme));
- JSONFile.setSeqFeaturesEnabled(showFeatures);
+ setShowSeqFeatures(showFeatures);
+ parseHiddenSeqRefsAsList(jvSettingsJsonObj);
+ parseHiddenCols(jvSettingsJsonObj);
}
seqMap = new Hashtable<String, Sequence>();
int end = Integer.valueOf(sequence.get("end").toString());
Sequence seq = new Sequence(sequenceName, sequcenceString, start,
end);
+ if (hiddenSeqRefs.contains(seqUniqueId))
+ {
+ seq.setHidden(true);
+ }
seqs.add(seq);
seqMap.put(seqUniqueId, seq);
}
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();
return this;
}
+ public void parseHiddenSeqRefsAsList(JSONObject jvSettingsJson)
+ {
+ hiddenSeqRefs = new ArrayList<String>();
+ 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)
+ {
+ hiddenColumns = new ArrayList<int[]>();
+ String hiddenCols = (String) jvSettingsJson.get("hiddenCols");
+ if(hiddenCols != null && !hiddenCols.isEmpty()){
+ String[] rangeStrings = hiddenCols.split(";");
+ for(String rangeString : rangeStrings){
+ String[] range = rangeString.split("-");
+ hiddenColumns.add(new int[]
+ { Integer.valueOf(range[0]), Integer.valueOf(range[1]) });
+ }
+ }
+ }
@SuppressWarnings("unchecked")
private void parseFeatures(JSONArray jsonSeqFeatures)
}
}
- public ColourSchemeI getJalviewColorScheme(String bioJsColourSchemeName)
+ public static ColourSchemeI getJalviewColorScheme(
+ String bioJsColourSchemeName)
{
ColourSchemeI jalviewColor = null;
for (JalviewBioJsColorSchemeMapper cs : JalviewBioJsColorSchemeMapper
return jalviewColor;
}
- public void LoadAlignmentFeatures(AlignFrame af)
+ public void applySettingsToAlignmentView(AlignViewControllerGuiI avc)
{
- af.setShowSeqFeatures(JSONFile.isSeqFeaturesEnabled());
- af.changeColour(getColourScheme());
- af.setMenusForViewport();
+ avc.setShowSeqFeatures(isShowSeqFeatures());
+ avc.changeColour(getColourScheme());
+ avc.setMenusForViewport();
+ avc.hideColumns(hiddenColumns);
+ avc.syncHiddenSequences();
}
public String getGlobalColorScheme()
this.globalColorScheme = globalColorScheme;
}
- public static ColourSchemeI getColourScheme()
+ public ColourSchemeI getColourScheme()
{
return colourScheme;
}
- public static void setColourScheme(ColourSchemeI colourScheme)
- {
- JSONFile.colourScheme = colourScheme;
- }
-
- public static boolean isSeqFeaturesEnabled()
+ public void setColourScheme(ColourSchemeI colourScheme)
{
- return seqFeaturesEnabled;
- }
-
- public static void setSeqFeaturesEnabled(boolean seqFeaturesEnabled)
- {
- JSONFile.seqFeaturesEnabled = seqFeaturesEnabled;
+ this.colourScheme = colourScheme;
}
public FeaturesDisplayedI getDisplayedFeatures()
this.jsonExportSettings = jsonExportSettings;
}
+ public static String getJSONData(AlignViewportI av)
+ {
+ JSONFile jsonFile = new JSONFile();
+ jsonFile.setViewport(av);
+ jsonFile.seqGroups = av.getAlignment().getGroups();
+ jsonFile.setDisplayedFeatures(av.getFeaturesDisplayed());
+
+ for (SequenceI seq : av.getAlignment().getSequences())
+ {
+ jsonFile.seqs.add(seq);
+ }
+
+ // Add non auto calculated annotation to AlignFile
+ for (AlignmentAnnotation annot : av.getAlignment()
+ .getAlignmentAnnotation())
+ {
+ if (annot != null && !annot.autoCalculated)
+ {
+ if (annot.label.equals("PDB.CATempFactor"))
+ {
+ continue;
+ }
+ jsonFile.annotations.add(annot);
+ }
+ }
+ String jsonString = jsonFile.print();
+ return jsonString;
+ }
+
+ public boolean isShowSeqFeatures()
+ {
+ return showSeqFeatures;
+ }
+
+ public void setShowSeqFeatures(boolean showSeqFeatures)
+ {
+ this.showSeqFeatures = showSeqFeatures;
+ }
+
+ public Vector<AlignmentAnnotation> getAnnotations()
+ {
+ return annotations;
+ }
+
+ public List<int[]> getHiddenColumns()
+ {
+ return hiddenColumns;
+ }
+
public class JSONExportSettings
{
private boolean exportSequence;