JAL-2316 Refactoring of functionality to provide urls to gui
[jalview.git] / src / jalview / util / CustomUrlProvider.java
index f679e36..e6f19fb 100644 (file)
 package jalview.util;
 
 import static jalview.util.UrlConstants.DB_ACCESSION;
-import static jalview.util.UrlConstants.EMBLEBI_STRING;
+import static jalview.util.UrlConstants.DELIM;
+//import static jalview.util.UrlConstants.EMBLEBI_LABEL;
+//import static jalview.util.UrlConstants.EMBLEBI_STRING;
+import static jalview.util.UrlConstants.SEP;
 import static jalview.util.UrlConstants.SEQUENCE_ID;
-import static jalview.util.UrlConstants.SRS_STRING;
+//import static jalview.util.UrlConstants.SRS_LABEL;
 
 import java.util.HashMap;
 import java.util.Iterator;
@@ -40,81 +43,118 @@ import java.util.Vector;
  * @author $author$
  * @version $Revision$
  */
-public class CustomUrlProvider implements UrlProviderI
+public class CustomUrlProvider extends UrlProviderImpl
 {
 
+  // minimum length of substitution in url link string
+  private static final int MIN_SUBST_LENGTH = 4;
+
+  // Default sequence URL link label for SRS
+  private static final String SRS_LABEL = "SRS";
+
+  // map of string ids to urlLinks
   private HashMap<String, UrlLink> urls;
 
+  /**
+   * Construct UrlProvider for custom (user-entered) URLs
+   * 
+   * @param cachedUrlList
+   *          list of URLs in form stored in Cache. i.e. SEP delimited string
+   */
   public CustomUrlProvider(String cachedUrlList)
   {
     try
     {
-      StringTokenizer st = new StringTokenizer(cachedUrlList, "|");
+      urls = new HashMap<String, UrlLink>();
+
+      // cachedUrlList is in form <label>|<url>|<label>|<url>...
+      // parse cachedUrlList into labels (used as id) and url links
+      StringTokenizer st = new StringTokenizer(cachedUrlList, SEP);
       while (st.hasMoreElements())
       {
         String name = st.nextToken();
         String url = st.nextToken();
         // check for '|' within a regex
-        int rxstart = url.indexOf("$" + DB_ACCESSION + "$");
+        int rxstart = url.indexOf(DELIM + DB_ACCESSION + DELIM);
         if (rxstart == -1)
         {
-          rxstart = url.indexOf("$" + SEQUENCE_ID + "$");
+          rxstart = url.indexOf(DELIM + SEQUENCE_ID + DELIM);
         }
-        while (rxstart == -1 && url.indexOf("/=$") == -1)
+        while (rxstart == -1 && url.indexOf("/=" + DELIM) == -1)
         {
-          url = url + "|" + st.nextToken();
+          url = url + SEP + st.nextToken();
         }
-        urls.put(name, new UrlLink(url));
-        // sequenceURLLinks.addElement(name + "|" + url);
+        urls.put(name, new UrlLink(name + SEP + url));
       }
     } catch (Exception ex)
     {
       System.out.println(ex + "\nError parsing sequence links");
     }
+    upgradeOldLinks();
 
-    // upgrade old SRS link
-    String srs_key = SRS_STRING.split("\\|")[0];
-    if (urls.containsKey(srs_key))
+  }
+
+  /**
+   * Construct UrlProvider for custom (user-entered) URLs
+   * 
+   * @param urlList
+   *          list of URLs as (label,url) pairs
+   */
+  public CustomUrlProvider(Map<String, String> urlList)
+  {
+    try
     {
-      urls.remove(srs_key);
-      urls.put(EMBLEBI_STRING.split("//|")[0],
-              new UrlLink(EMBLEBI_STRING.split("//|")[1]));
+      urls = new HashMap<String, UrlLink>();
+      Iterator<Map.Entry<String, String>> it = urlList.entrySet()
+              .iterator();
+      while (it.hasNext())
+      {
+        Map.Entry<String, String> pair = it.next();
+        urls.put(pair.getKey(),
+                new UrlLink(pair.getKey() + SEP + pair.getValue()));
+      }
+    } catch (Exception ex)
+    {
+      System.out.println(ex + "\nError parsing sequence links");
     }
+    upgradeOldLinks();
   }
 
-  @Override
-  public HashMap<String, UrlLink> getUrlLinks()
+  private void upgradeOldLinks()
   {
-    // TODO Auto-generated method stub
-    return null;
+    // upgrade old SRS link
+    if (urls.containsKey(SRS_LABEL))
+    {
+      urls.remove(SRS_LABEL);
+      urls.put(DEFAULT_LABEL, new UrlLink(DEFAULT_STRING));
+    }
   }
 
   @Override
-  public void getLinksForDisplay(Vector<String> nameLinks,
-          Vector<String> urlLinks)
+  public Vector<String> getLinksForDisplay()
   {
+    Vector<String> links = new Vector<String>();
     Iterator<Map.Entry<String, UrlLink>> it = urls.entrySet().iterator();
     while (it.hasNext())
     {
       Map.Entry<String, UrlLink> pair = it.next();
-      nameLinks.addElement(pair.getKey());
-      urlLinks.addElement(pair.getValue().toString()); // TODO check this is
-                                                       // right
+      links.add(pair.getValue().toString());
     }
+    return links;
   }
 
   @Override
-  public String getDefaultUrl()
-  {
-    // TODO Auto-generated method stub
-    return null;
-  }
-
-  @Override
-  public void setDefaultUrl(String id)
+  public boolean setDefaultUrl(String id)
   {
-    // TODO Auto-generated method stub
-
+    if (urls.containsKey(id))
+    {
+      defaultUrl = id;
+    }
+    else
+    {
+      defaultUrl = null;
+    }
+    return urls.containsKey(id);
   }
 
   @Override
@@ -126,10 +166,10 @@ public class CustomUrlProvider implements UrlProviderI
       for (UrlLink link : urls.values())
       {
         links.append(link.toString());
-        links.append("|");
+        links.append(SEP);
       }
 
-      // remove last "|"
+      // remove last SEP
       links.setLength(links.length() - 1);
     }
     else
@@ -140,18 +180,79 @@ public class CustomUrlProvider implements UrlProviderI
   }
 
   @Override
-  public void setUrlLinks(String cachedUrl)
+  public String getDefaultUrl(String seqid)
   {
-    // TODO Auto-generated method stub, maybe don't need this? watch out for
-    // superclass interactions
+    if (defaultUrl == null)
+    {
+      return null;
+    }
 
+    String url = null;
+    UrlLink urlLink = urls.get(defaultUrl);
+    String[] defaultUrls = urlLink.makeUrls(seqid, true);
+    if (defaultUrls == null || defaultUrls[0] == null
+            || defaultUrls[0].length() < MIN_SUBST_LENGTH)
+    {
+      url = null;
+    }
+    else
+    {
+      // just take first URL made from regex
+      url = defaultUrls[1];
+    }
+    return url;
   }
 
   @Override
-  public void setUrlLinks(HashMap<String, UrlLink> links)
+  public String getDefaultTarget(String seqid)
   {
-    // TODO Auto-generated method stub
+    return urls.get(defaultUrl).getTarget();
+  }
+
+  @Override
+  public void setUrlLinks(Vector<String> names, Vector<String> urlstrings)
+  {
+    HashMap<String, UrlLink> newurls = new HashMap<String, UrlLink>();
+
+    // should check that lists are same length but this function is likely
+    // to change once the Preferences dialog is rebuilt
+
+    for (int i = 0; i < names.size(); ++i)
+    {
+      // don't allow MIRIAM ids as custom url names (as the links will overwrite
+      // each other)
+      // unlikely user would try to do this, but...
+      if (isMiriamId(names.elementAt(i)))
+      {
+        throw new IllegalArgumentException(MessageManager.formatMessage(
+                "exception.url_cannot_have_miriam_id", names.elementAt(i)));
+      }
+      // don't allow duplicate key names as entries will be overwritten
+      if (newurls.containsKey(names.elementAt(i)))
+      {
+        throw new IllegalArgumentException(MessageManager.formatMessage(
+                "exception.url_cannot_have_duplicate_id",
+                names.elementAt(i)));
+      }
+      newurls.put(names.elementAt(i), new UrlLink(names.elementAt(i) + SEP
+              + urlstrings.elementAt(i)));
+    }
+
+    // don't update until we're sure this set is ok
+    urls = newurls;
 
   }
 
+  @Override
+  public String chooseDefaultUrl()
+  {
+    // unilaterally set the default id to the EMBL_EBI link
+    
+    if (!urls.containsKey(DEFAULT_LABEL))
+    {
+      urls.put(DEFAULT_LABEL, new UrlLink(DEFAULT_STRING));
+    }
+    return DEFAULT_LABEL;
+  }
+
 }