JAL-2316 Refactoring of functionality to provide urls to gui
[jalview.git] / src / jalview / util / UrlProvider.java
index 3cd033b..f66e3fd 100644 (file)
@@ -21,8 +21,8 @@
 package jalview.util;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Vector;
 
 /**
@@ -37,70 +37,94 @@ public class UrlProvider implements UrlProviderI
   // List of actual URL link providers
   private List<UrlProviderI> providers;
 
-  // Record of default URL
-  private String defaultUrl;
-  
+  // Specific reference to custom URL link provider
+  private UrlProviderI customProvider;
+
   /**
    * Construct URL provider from string of cached URLs, and set default URL
    * 
-   * @param defaultUrl
+   * @param defaultUrlString
    *          id of the current default URL
    * @param cachedUrlList
    *          string listing current active URLs, expected to be custom URLs
    *          separated by |, or ids of URLs
    */
-  public UrlProvider(String defaultUrl, String cachedUrlList)
+  public UrlProvider(String defaultUrlString, String cachedUrlList)
   {
     // create all the UrlProviders we need
     providers = new ArrayList<UrlProviderI>();
     
     UrlProviderI idProvider = new IdentifiersUrlProvider(cachedUrlList);
-    UrlProviderI customProvider = new CustomUrlProvider(cachedUrlList);
+    customProvider = new CustomUrlProvider(cachedUrlList);
     providers.add(idProvider);
     providers.add(customProvider);
 
     // check that the defaultUrl still exists
+    if (!setDefaultUrl(defaultUrlString))
+    {
+      chooseDefaultUrl();
+    }
   }
   
   /**
-   * Get all the URL links
-   * @return all URL links
+   * Construct URL provider from a map of (label,url) pairs, and set default URL
+   * 
+   * @param defaultUrlString
+   *          id of the current default URL
+   * @param urlList
+   *          vector of (label, url) pairs
    */
-  @Override
-  public HashMap<String, UrlLink> getUrlLinks()
+  public UrlProvider(String defaultUrlString, Map<String, String> urlList)
   {
-    HashMap<String, UrlLink> urls = new HashMap<String, UrlLink>();
-    for (UrlProviderI p : providers)
+    // create all the UrlProviders we need
+    providers = new ArrayList<UrlProviderI>();
+
+    UrlProviderI idProvider = new IdentifiersUrlProvider(urlList);
+    customProvider = new CustomUrlProvider(urlList);
+    providers.add(idProvider);
+    providers.add(customProvider);
+
+    // check that the defaultUrl still exists
+    if (!setDefaultUrl(defaultUrlString))
     {
-      urls.putAll(p.getUrlLinks());
+      chooseDefaultUrl();
     }
-    return urls;
   }
-  
-  /**
-   * Get the default URL
-   * @return id of the default URL
-   */
+
   @Override
   public String getDefaultUrl()
   {
+    String defaultUrl = null;
+    for (UrlProviderI p : providers)
+    {
+      defaultUrl = p.getDefaultUrl();
+      if (defaultUrl != null)
+      {
+        return defaultUrl;
+      }
+    }
+
+    // no provider has a default set, just choose one
+    if (defaultUrl == null)
+    {
+      defaultUrl = chooseDefaultUrl();
+    }
     return defaultUrl;
   }
   
-  /**
-   * Set the default URL
-   * @param id the id of the URL to set as default
-   */
   @Override
-  public void setDefaultUrl(String id)
+  public boolean setDefaultUrl(String id)
   {
-    defaultUrl = id;
+    for (UrlProviderI p : providers)
+    {
+      if (p.setDefaultUrl(id))
+      {
+        return true;
+      }
+    }
+    return false;
   }
   
-  /**
-   * Write out all URLs as a string suitable for serialising
-   * @return string representation of available URLs
-   */
   @Override
   public String writeUrlsAsString()
   {
@@ -111,49 +135,74 @@ public class UrlProvider implements UrlProviderI
     }
     return result;
   }
-  
-  /**
-   * Set URL links from string
-   * 
-   * @param cachedUrl
-   *          string representation of URL links, i.e. | separated
-   */
+
   @Override
-  public void setUrlLinks(String cachedUrl)
+  public Vector<String> getLinksForDisplay()
   {
+    Vector<String> fullLinks = new Vector<String>();
     for (UrlProviderI p : providers)
     {
-      p.setUrlLinks(cachedUrl);
+      List<String> links = p.getLinksForDisplay();
+      if (links != null)
+      {
+        // will obliterate links with same keys from different providers
+        // must have checks in place to prevent user from duplicating ids
+        fullLinks.addAll(links);
+      }
     }
+    return fullLinks;
   }
-  
-  /**
-   * Set URL links from collection
-   * 
-   * @param links
-   *          hashmap containing string indexed UrlLinks
-   */
+
   @Override
-  public void setUrlLinks(HashMap<String, UrlLink> links)
+  public String getDefaultUrl(String seqid)
   {
+    String link = null;
     for (UrlProviderI p : providers)
     {
-      p.setUrlLinks(links);
+      if (p.getDefaultUrl(seqid) == null)
+      {
+        continue;
+      }
+      else
+      {
+        link = p.getDefaultUrl(seqid);
+        break;
+      }
     }
+    return link;
   }
 
   @Override
-  public void getLinksForDisplay(Vector<String> nameLinks,
-          Vector<String> urlLinks)
+  public String getDefaultTarget(String seqid)
   {
-    Vector<String> names = new Vector<String>();
-    Vector<String> links = new Vector<String>();
+    String target = null;
     for (UrlProviderI p : providers)
     {
-      p.getLinksForDisplay(names, links);
-      nameLinks.addAll(names);
-      urlLinks.addAll(links);
+      if (p.getDefaultTarget(seqid) == null)
+      {
+        continue;
+      }
+      else
+      {
+        target = p.getDefaultTarget(seqid);
+        break;
+      }
     }
+    return target;
+  }
+
+  @Override
+  public void setUrlLinks(Vector<String> names, Vector<String> urls)
+  {
+    // only allow custom urls to be updated by user
+    customProvider.setUrlLinks(names, urls);
   }
   
+  @Override
+  public String chooseDefaultUrl()
+  {
+    // choose a custom url default
+    return customProvider.chooseDefaultUrl();
+  }
+
 }