X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FSequenceFeature.java;h=035291832c22ed56e7a65a398f6cc405d36ad47f;hp=ba7412c7f132045e9c01c20687d37e58d69c45be;hb=f4766a7bbcfae845fc95923b01fa14ff83d589ff;hpb=163ed5b997bbda48e4cdd950e87a8fe01baae7fb diff --git a/src/jalview/datamodel/SequenceFeature.java b/src/jalview/datamodel/SequenceFeature.java index ba7412c..0352918 100755 --- a/src/jalview/datamodel/SequenceFeature.java +++ b/src/jalview/datamodel/SequenceFeature.java @@ -25,6 +25,7 @@ import jalview.datamodel.features.FeatureLocationI; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import java.util.TreeMap; import java.util.Vector; /** @@ -52,6 +53,16 @@ public class SequenceFeature implements FeatureLocationI private static final String LOCATION = "!Location"; /* + * map of otherDetails special keys, and their value fields' delimiter + */ + private static final Map INFO_KEYS = new HashMap<>(); + + static + { + INFO_KEYS.put("CSQ", ","); + } + + /* * ATTRIBUTES is reserved for the GFF 'column 9' data, formatted as * name1=value1;name2=value2,value3;...etc */ @@ -233,8 +244,8 @@ public class SequenceFeature implements FeatureLocationI return false; } - if (!(type + description + featureGroup + getPhase()).equals(sf.type - + sf.description + sf.featureGroup + sf.getPhase())) + if (!(type + description + featureGroup + getPhase()).equals( + sf.type + sf.description + sf.featureGroup + sf.getPhase())) { return false; } @@ -535,4 +546,59 @@ public class SequenceFeature implements FeatureLocationI { return begin == 0 && end == 0; } + + /** + * Answers a formatted text report of feature details + * + * @return + */ + public String getDetailsReport() + { + StringBuilder sb = new StringBuilder(128); + if (begin == end) + { + sb.append(String.format("%s %d %s", type, begin, description)); + } + else + { + sb.append(String.format("%s %d-%d %s", type, begin, end, description)); + } + if (featureGroup != null) + { + sb.append(" (").append(featureGroup).append(")"); + } + sb.append("\n\n"); + + if (otherDetails != null) + { + TreeMap ordered = new TreeMap<>( + String.CASE_INSENSITIVE_ORDER); + ordered.putAll(otherDetails); + + for (Entry entry : ordered.entrySet()) + { + String key = entry.getKey(); + if (ATTRIBUTES.equals(key)) + { + continue; // to avoid double reporting + } + if (INFO_KEYS.containsKey(key)) + { + /* + * split selected INFO data by delimiter over multiple lines + */ + sb.append(key).append("=\n "); + String delimiter = INFO_KEYS.get(key); + String value = entry.getValue().toString(); + sb.append(value.replace(delimiter, "\n ")); + } + else + { + sb.append(key + "=" + entry.getValue().toString() + "\n"); + } + } + } + String text = sb.toString(); + return text; + } }