X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fensembl%2FEnsemblFeatures.java;h=e28cc7f0b4a4fdf9828ad89eaca14c35ed9e2d19;hb=e1dbbc5edc07f65706eeb1dda9f4c9bcdee9d3a5;hp=a133381d51c7043ac54b5d8fd8b3a10031307851;hpb=cd268aa5e06c4327489110c59c987e3e071eb038;p=jalview.git diff --git a/src/jalview/ext/ensembl/EnsemblFeatures.java b/src/jalview/ext/ensembl/EnsemblFeatures.java index a133381..e28cc7f 100644 --- a/src/jalview/ext/ensembl/EnsemblFeatures.java +++ b/src/jalview/ext/ensembl/EnsemblFeatures.java @@ -26,6 +26,8 @@ import jalview.datamodel.Sequence; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.io.gff.SequenceOntologyI; +import jalview.util.JSONUtils; +import jalview.util.Platform; import java.io.BufferedReader; import java.io.IOException; @@ -34,10 +36,8 @@ import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Map; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; /** @@ -91,16 +91,14 @@ class EnsemblFeatures extends EnsemblRestClient public AlignmentI getSequenceRecords(String query) throws IOException { // TODO: use a vararg String... for getSequenceRecords instead? + List queries = new ArrayList<>(); queries.add(query); - BufferedReader fp = getSequenceReader(queries); - if (fp == null) - { - return null; - } - - SequenceI seq = parseFeaturesJson(fp); + SequenceI seq = parseFeaturesJson(queries); + if (seq == null) + return null; return new Alignment(new SequenceI[] { seq }); + } /** @@ -110,34 +108,33 @@ class EnsemblFeatures extends EnsemblRestClient * @param br * @return */ - private SequenceI parseFeaturesJson(BufferedReader br) + @SuppressWarnings("unchecked") + private SequenceI parseFeaturesJson(List queries) { SequenceI seq = new Sequence("Dummy", ""); - - JSONParser jp = new JSONParser(); try { - JSONArray responses = (JSONArray) jp.parse(br); - Iterator rvals = responses.iterator(); - while (rvals.hasNext()) + Iterator rvals = (Iterator) getJSON(null, queries, -1, MODE_ITERATOR, null); + if (rvals == null) { + return null; + } + while (rvals.hasNext()) + { try { - JSONObject obj = (JSONObject) rvals.next(); + Map obj = (Map) rvals.next(); String type = obj.get("feature_type").toString(); int start = Integer.parseInt(obj.get("start").toString()); int end = Integer.parseInt(obj.get("end").toString()); String source = obj.get("source").toString(); String strand = obj.get("strand").toString(); - Object value = obj.get("consequence_type"); - value = obj.get("alleles"); - JSONArray allelesArray = (JSONArray) value; - String alleles = allelesArray == null ? null - : allelesArray.toString(); // todo need as a List? - value = obj.get("clinical_significance"); - JSONArray clinSigArray = (JSONArray) value; - String clinSig = clinSigArray == null ? null - : clinSigArray.toString(); + Object phase = obj.get("phase"); + String alleles = JSONUtils + .arrayToStringList((List) obj.get("alleles")); + String clinSig = JSONUtils + .arrayToStringList( + (List) obj.get("clinical_significance")); /* * convert 'variation' to 'sequence_variant', and 'cds' to 'CDS' @@ -152,12 +149,16 @@ class EnsemblFeatures extends EnsemblRestClient { type = SequenceOntologyI.CDS; } - + String desc = getFirstNotNull(obj, "alleles", "external_name", JSON_ID); SequenceFeature sf = new SequenceFeature(type, desc, start, end, source); sf.setStrand("1".equals(strand) ? "+" : "-"); + if (phase != null) + { + sf.setPhase(phase.toString()); + } setFeatureAttribute(sf, obj, "id"); setFeatureAttribute(sf, obj, "Parent"); setFeatureAttribute(sf, obj, "consequence_type"); @@ -165,6 +166,7 @@ class EnsemblFeatures extends EnsemblRestClient sf.setValue("clinical_significance", clinSig); seq.addSequenceFeature(sf); + } catch (Throwable t) { // ignore - keep trying other features @@ -172,6 +174,7 @@ class EnsemblFeatures extends EnsemblRestClient } } catch (ParseException | IOException e) { + e.printStackTrace(); // ignore } @@ -179,29 +182,32 @@ class EnsemblFeatures extends EnsemblRestClient } /** - * Returns the first non-null attribute found (if any) as a string + * Returns the first non-null attribute found (if any) as a string, formatted + * suitably for display as feature description or tooltip. Answers null if + * none of the attribute keys is present. * * @param obj * @param keys * @return */ - protected String getFirstNotNull(JSONObject obj, String... keys) + @SuppressWarnings("unchecked") + protected String getFirstNotNull(Map obj, String... keys) { - String desc = null; - for (String key : keys) { Object val = obj.get(key); if (val != null) { - String s = val.toString(); + String s = val instanceof List + ? JSONUtils.arrayToStringList((List) val) + : val.toString(); if (!s.isEmpty()) { return s; } } } - return desc; + return null; } /** @@ -212,7 +218,7 @@ class EnsemblFeatures extends EnsemblRestClient * @param obj * @param key */ - protected void setFeatureAttribute(SequenceFeature sf, JSONObject obj, + protected void setFeatureAttribute(SequenceFeature sf, Map obj, String key) { Object object = obj.get(key);