JAL-1707 bug fix - also search using sequence name
[jalview.git] / src / jalview / gui / StructureChooser.java
index 5c86ce2..c913213 100644 (file)
@@ -232,38 +232,82 @@ public class StructureChooser extends GStructureChooser
 
   public static String buildQuery(SequenceI seq)
   {
-    String query = seq.getName();
-    StringBuilder queryBuilder = new StringBuilder();
-    int count = 0;
+    HashSet<String> seqRefs = new LinkedHashSet<String>();
+    String seqName = seq.getName();
+    String[] names = seqName.toLowerCase().split("\\|");
+    for (String name : names)
+    {
+      System.out.println("Found name : " + name);
+      name.trim();
+      if (isValidSeqName(name))
+      {
+        seqRefs.add(name);
+      }
+    }
 
     if (seq.getPDBId() != null)
     {
       for (PDBEntry entry : seq.getPDBId())
       {
-        queryBuilder.append("text:").append(entry.getId()).append(" OR ");
+        seqRefs.add(entry.getId());
       }
     }
 
     if (seq.getDBRef() != null && seq.getDBRef().length != 0)
     {
+      int count = 0;
       for (DBRefEntry dbRef : seq.getDBRef())
       {
-        queryBuilder.append("text:")
-                .append(dbRef.getAccessionId().replaceAll("GO:", ""))
-                .append(" OR ");
+        seqRefs.add(getDBRefId(dbRef));
         ++count;
         if (count > 10)
         {
           break;
         }
       }
-      int endIndex = queryBuilder.lastIndexOf(" OR ");
-      query = queryBuilder.toString().substring(5, endIndex);
     }
+
+    StringBuilder queryBuilder = new StringBuilder();
+    for (String seqRef : seqRefs)
+    {
+      queryBuilder.append("text:").append(seqRef).append(" OR ");
+    }
+    int endIndex = queryBuilder.lastIndexOf(" OR ");
+    String query = queryBuilder.toString().substring(5, endIndex);
     return query;
   }
 
   /**
+   * Ensures sequence ref names are not less than 3 characters and does not
+   * contain a database name
+   * 
+   * @param seqName
+   * @return
+   */
+  public static boolean isValidSeqName(String seqName)
+  {
+    String ignoreList = "pdb,uniprot";
+    if (seqName.length() < 3)
+    {
+      return false;
+    }
+    for (String ignoredEntry : ignoreList.split(","))
+    {
+      if (seqName.equalsIgnoreCase(ignoredEntry))
+      {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  public static String getDBRefId(DBRefEntry dbRef)
+  {
+    String ref = dbRef.getAccessionId().replaceAll("GO:", "");
+    return ref;
+  }
+
+  /**
    * Filters a given list of discovered structures based on supplied argument
    * 
    * @param fieldToFilterBy