JAL-2920 wrap description in <html/> if it includes <br/>
[jalview.git] / src / jalview / ws / dbsources / Uniprot.java
index 11fff9d..167cd97 100644 (file)
@@ -42,6 +42,7 @@ import java.io.Reader;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Vector;
 
 import org.exolab.castor.mapping.Mapping;
@@ -302,29 +303,80 @@ public class Uniprot extends DbSourceProxyImpl
   protected static String getDescription(UniprotFeature uf)
   {
     String orig = uf.getOriginal();
-    String var = uf.getVariation();
+    List<String> variants = uf.getVariation();
     StringBuilder sb = new StringBuilder();
 
     /*
      * append variant in standard format if present
      * e.g. p.Arg59Lys
+     * multiple variants are split over lines using <br>
      */
-    if (orig != null && !orig.isEmpty() && var != null && !var.isEmpty())
+    boolean asHtml = false;
+    if (orig != null && !orig.isEmpty() && variants != null
+            && !variants.isEmpty())
     {
-      sb.append("p.");
-      String orig3 = ResidueProperties.aa2Triplet.get(orig);
-      sb.append(orig3 == null ? orig : StringUtils.toSentenceCase(orig3));
-      sb.append(Integer.toString(uf.getPosition()));
-      String var3 = ResidueProperties.aa2Triplet.get(var);
-      sb.append(var3 == null ? var : StringUtils.toSentenceCase(var3));
-      sb.append(" ");
-    }
+      int p = 0;
+      for (String var : variants)
+      {
+        // TODO proper HGVS nomenclature for delins structural variations
+        // http://varnomen.hgvs.org/recommendations/protein/variant/delins/
+        // for now we are pragmatic - any orig/variant sequence longer than
+        // three characters is shown with single-character notation rather than
+        // three-letter notation
+        sb.append("p.");
+        if (orig.length() < 4)
+        {
+          for (int c = 0, clen = orig.length(); c < clen; c++)
+          {
+            char origchar = orig.charAt(c);
+            String orig3 = ResidueProperties.aa2Triplet.get("" + origchar);
+            sb.append(orig3 == null ? origchar
+                    : StringUtils.toSentenceCase(orig3));
+          }
+        }
+        else
+        {
+          sb.append(orig);
+        }
+
+        sb.append(Integer.toString(uf.getPosition()));
 
+        if (var.length() < 4)
+        {
+          for (int c = 0, clen = var.length(); c < clen; c++)
+          {
+            char varchar = var.charAt(c);
+            String var3 = ResidueProperties.aa2Triplet.get("" + varchar);
+
+            sb.append(var3 != null ? StringUtils.toSentenceCase(var3)
+                    : "" + varchar);
+          }
+        }
+        else
+        {
+          sb.append(var);
+        }
+        if (++p != variants.size())
+        {
+          sb.append("<br/>&nbsp;&nbsp;");
+          asHtml = true;
+        }
+        else
+        {
+          sb.append(" ");
+        }
+      }
+    }
     String description = uf.getDescription();
     if (description != null)
     {
       sb.append(description);
     }
+    if (asHtml)
+    {
+      sb.insert(0, "<html>");
+      sb.append("</html>");
+    }
 
     return sb.toString();
   }