JAL-2316 Moved url providers into own package
[jalview.git] / src / jalview / urls / UrlProvider.java
diff --git a/src/jalview/urls/UrlProvider.java b/src/jalview/urls/UrlProvider.java
new file mode 100644 (file)
index 0000000..17b179b
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.urls;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+/**
+ * 
+ * Implements the UrlProviderI interface for a composite UrlProvider object
+ * 
+ * @author $author$
+ * @version $Revision$
+ */
+public class UrlProvider implements UrlProviderI
+{
+  // List of actual URL link providers
+  private List<UrlProviderI> providers;
+
+  // Specific reference to custom URL link provider
+  private UrlProviderI customProvider;
+
+  /**
+   * Construct URL provider from string of cached URLs, and set default URL
+   * 
+   * @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 defaultUrlString, String cachedUrlList)
+  {
+    // create all the UrlProviders we need
+    providers = new ArrayList<UrlProviderI>();
+    
+    UrlProviderI idProvider = new IdentifiersUrlProvider(cachedUrlList);
+    customProvider = new CustomUrlProvider(cachedUrlList);
+    providers.add(idProvider);
+    providers.add(customProvider);
+
+    // check that the defaultUrl still exists
+    if (!setDefaultUrl(defaultUrlString))
+    {
+      chooseDefaultUrl();
+    }
+  }
+  
+  /**
+   * 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
+   */
+  public UrlProvider(String defaultUrlString, Map<String, String> urlList)
+  {
+    // 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))
+    {
+      chooseDefaultUrl();
+    }
+  }
+
+  @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;
+  }
+  
+  @Override
+  public boolean setDefaultUrl(String id)
+  {
+    for (UrlProviderI p : providers)
+    {
+      if (p.setDefaultUrl(id))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+  
+  @Override
+  public String writeUrlsAsString()
+  {
+    String result = "";
+    for (UrlProviderI p : providers)
+    {
+      result += p.writeUrlsAsString();
+    }
+    return result;
+  }
+
+  @Override
+  public Vector<String> getLinksForDisplay()
+  {
+    Vector<String> fullLinks = new Vector<String>();
+    for (UrlProviderI p : providers)
+    {
+      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;
+  }
+
+  @Override
+  public String getDefaultUrl(String seqid)
+  {
+    String link = null;
+    for (UrlProviderI p : providers)
+    {
+      if (p.getDefaultUrl(seqid) == null)
+      {
+        continue;
+      }
+      else
+      {
+        link = p.getDefaultUrl(seqid);
+        break;
+      }
+    }
+    return link;
+  }
+
+  @Override
+  public String getDefaultTarget(String seqid)
+  {
+    String target = null;
+    for (UrlProviderI p : providers)
+    {
+      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();
+  }
+
+}