JAL-1503 update version in GPL header
[jalview.git] / src / jalview / ws / dbsources / das / datamodel / DasSourceRegistry.java
index b17f7f2..04a1b60 100644 (file)
@@ -1,5 +1,20 @@
-/**
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
+ * Copyright (C) 2014 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.ws.dbsources.das.datamodel;
 
@@ -7,21 +22,15 @@ import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 import java.util.StringTokenizer;
-import java.util.Vector;
 
-import javax.swing.JOptionPane;
-
-import org.apache.http.auth.InvalidCredentialsException;
 import org.biodas.jdas.client.ConnectionPropertyProviderI;
 import org.biodas.jdas.client.SourcesClient;
+import org.biodas.jdas.client.threads.MultipleConnectionPropertyProviderI;
 import org.biodas.jdas.dassources.Capabilities;
 import org.biodas.jdas.schema.sources.CAPABILITY;
 import org.biodas.jdas.schema.sources.SOURCE;
@@ -35,7 +44,8 @@ import jalview.ws.dbsources.das.api.jalviewSourceI;
 /**
  *
  */
-public class DasSourceRegistry implements DasSourceRegistryI
+public class DasSourceRegistry implements DasSourceRegistryI,
+        MultipleConnectionPropertyProviderI
 {
   // private org.biodas.jdas.schema.sources.SOURCE[] dasSources = null;
   private List<jalviewSourceI> dasSources = null;
@@ -44,7 +54,7 @@ public class DasSourceRegistry implements DasSourceRegistryI
 
   private Hashtable<String, jalviewSourceI> localSources = null;
 
-  public static String DEFAULT_REGISTRY = "http://www.dasregistry.org/das1/sources/";
+  public static String DEFAULT_REGISTRY = "http://www.dasregistry.org/das/";
 
   /**
    * true if thread is running and we are talking to DAS registry service
@@ -67,6 +77,14 @@ public class DasSourceRegistry implements DasSourceRegistryI
               DEFAULT_REGISTRY);
       registry = DEFAULT_REGISTRY;
     }
+    if (registry.lastIndexOf("sources.xml") == registry.length() - 11)
+    {
+      // no trailing sources.xml document for registry in JDAS
+      jalview.bin.Cache.setProperty(
+              jalview.bin.Cache.DAS_REGISTRY_URL,
+              registry = registry.substring(0,
+                      registry.lastIndexOf("sources.xml")));
+    }
     return registry;
   }
 
@@ -80,7 +98,7 @@ public class DasSourceRegistry implements DasSourceRegistryI
   private List<jalviewSourceI> getDASSources()
   {
 
-    return getDASSources(getDasRegistryURL());
+    return getDASSources(getDasRegistryURL(), this);
   }
 
   /**
@@ -89,20 +107,42 @@ public class DasSourceRegistry implements DasSourceRegistryI
    * @param registryURL
    *          return sources from registryURL
    */
-  private static List<jalviewSourceI> getDASSources(String registryURL)
+  private static List<jalviewSourceI> getDASSources(String registryURL,
+          MultipleConnectionPropertyProviderI registry)
   {
     try
     {
       URL url = new URL(registryURL);
       org.biodas.jdas.client.SourcesClientInterface client = new SourcesClient();
 
-      SOURCES sources = client.fetchDataRegistry(registryURL, null, null, null, null, null, null);
+      SOURCES sources = client.fetchDataRegistry(registryURL, null, null,
+              null, null, null, null);
 
       List<SOURCE> dassources = sources.getSOURCE();
       ArrayList<jalviewSourceI> dsrc = new ArrayList<jalviewSourceI>();
+      HashMap<String, Integer> latests = new HashMap<String, Integer>();
+      Integer latest;
       for (SOURCE src : dassources)
       {
-        dsrc.add(new JalviewSource(src, false));
+        JalviewSource jsrc = new JalviewSource(src, registry, false);
+        latest = latests.get(jsrc.getSourceURL());
+        if (latest != null)
+        {
+          if (jsrc.isNewerThan(dsrc.get(latest.intValue())))
+          {
+            dsrc.set(latest.intValue(), jsrc);
+          }
+          else
+          {
+            System.out.println("Debug: Ignored older source "
+                    + jsrc.getTitle());
+          }
+        }
+        else
+        {
+          latests.put(jsrc.getSourceURL(), Integer.valueOf(dsrc.size()));
+          dsrc.add(jsrc);
+        }
       }
       return dsrc;
     } catch (Exception ex)
@@ -114,7 +154,6 @@ public class DasSourceRegistry implements DasSourceRegistryI
     }
   }
 
-
   public void run()
   {
     getSources();
@@ -136,30 +175,60 @@ public class DasSourceRegistry implements DasSourceRegistryI
    */
   private void addLocalDasSources()
   {
-    String local = jalview.bin.Cache.getProperty("DAS_LOCAL_SOURCE");
-    if (local != null)
+    if (localSources == null)
     {
-      StringTokenizer st = new StringTokenizer(local, "\t");
-      while (st.hasMoreTokens())
+      // get local sources from properties and initialise the local source list
+      String local = jalview.bin.Cache.getProperty("DAS_LOCAL_SOURCE");
+
+      if (local != null)
       {
-        String token = st.nextToken();
-        int bar = token.indexOf("|");
-        String url = token.substring(bar + 1);
-        boolean features = true, sequence = false;
-        if (url.startsWith("sequence:"))
+        int n = 1;
+        StringTokenizer st = new StringTokenizer(local, "\t");
+        while (st.hasMoreTokens())
         {
-          url = url.substring(9);
-          // this source also serves sequences as well as features
-          sequence = true;
+          String token = st.nextToken();
+          int bar = token.indexOf("|");
+          if (bar == -1)
+          {
+            System.err
+                    .println("Warning: DAS user local source appears to have no nickname (expected a '|' followed by nickname)\nOffending definition: '"
+                            + token + "'");
+          }
+          String url = token.substring(bar + 1);
+          boolean features = true, sequence = false;
+          if (url.startsWith("sequence:"))
+          {
+            url = url.substring(9);
+            // this source also serves sequences as well as features
+            sequence = true;
+          }
+          try
+          {
+            if (bar > -1)
+            {
+              createLocalSource(url, token.substring(0, bar), sequence,
+                      features);
+            }
+            else
+            {
+              createLocalSource(url, "User Source" + n, sequence, features);
+            }
+          } catch (Exception q)
+          {
+            System.err
+                    .println("Unexpected exception when creating local source from '"
+                            + token + "'");
+            q.printStackTrace();
+          }
+          n++;
         }
-        createLocalSource(url, token.substring(0, bar), sequence, features);
       }
     }
   }
 
   private List<jalviewSourceI> appendLocalSources()
   {
-    List<jalviewSourceI> srclist=new ArrayList<jalviewSourceI>();
+    List<jalviewSourceI> srclist = new ArrayList<jalviewSourceI>();
     addLocalDasSources();
     sourceNames = new Hashtable<String, jalviewSourceI>();
     if (dasSources != null)
@@ -200,7 +269,7 @@ public class DasSourceRegistry implements DasSourceRegistryI
     {
       localSources = new Hashtable<String, jalviewSourceI>();
     }
-    jalviewSourceI src=new JalviewSource(local, true);
+    jalviewSourceI src = new JalviewSource(local, this, true);
     localSources.put(local.getTitle(), src);
     return src;
   }
@@ -225,14 +294,14 @@ public class DasSourceRegistry implements DasSourceRegistryI
        */
       CAPABILITY cap = new CAPABILITY();
       cap.setType("das1:" + Capabilities.SEQUENCE.getName());
-      cap.setQueryUri(url+"/sequence");
+      cap.setQueryUri(url + "/sequence");
       cp.add(cap);
     }
     if (features)
     {
       CAPABILITY cap = new CAPABILITY();
       cap.setType("das1:" + Capabilities.FEATURES.getName());
-      cap.setQueryUri(url+"/features");
+      cap.setQueryUri(url + "/features");
       cp.add(cap);
     }
 
@@ -256,6 +325,9 @@ public class DasSourceRegistry implements DasSourceRegistryI
       localSources.remove(source.getTitle());
       sourceNames.remove(source.getTitle());
       dasSources.remove(source);
+      jalview.bin.Cache.setProperty("DAS_LOCAL_SOURCE",
+              getLocalSourceString());
+
       return true;
     }
     return false;
@@ -326,8 +398,16 @@ public class DasSourceRegistry implements DasSourceRegistryI
   }
 
   @Override
-  public Map<String, ConnectionPropertyProviderI> getSessionHandler()
+  public MultipleConnectionPropertyProviderI getSessionHandler()
   {
+    return this;
+  }
+
+  @Override
+  public ConnectionPropertyProviderI getConnectionPropertyProviderFor(
+          String arg0)
+  {
+
     final ConnectionPropertyProviderI conprov = new ConnectionPropertyProviderI()
     {
       boolean authed = false;
@@ -380,8 +460,8 @@ public class DasSourceRegistry implements DasSourceRegistryI
           if (asuc != null && asuc.trim().length() > 0)
           {
             // authentication was successful
-            Cache.log.debug("Authenticated successfully as " + asuc
-                    + " with " + connection.getURL().toString());
+            Cache.log.debug("Authenticated successfully to "
+                    + connection.getURL().toString());
             return false;
           }
           // it wasn't - so we should tell the user it failed and ask if they
@@ -397,95 +477,7 @@ public class DasSourceRegistry implements DasSourceRegistryI
         }
       }
     };
-    return new Map<String, ConnectionPropertyProviderI>()
-    {
-
-      @Override
-      public void clear()
-      {
-        // TODO Auto-generated method stub
-
-      }
-
-      @Override
-      public boolean containsKey(Object key)
-      {
-        // TODO Auto-generated method stub
-        return false;
-      }
-
-      @Override
-      public boolean containsValue(Object value)
-      {
-        // TODO Auto-generated method stub
-        return false;
-      }
-
-      @Override
-      public Set<java.util.Map.Entry<String, ConnectionPropertyProviderI>> entrySet()
-      {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public ConnectionPropertyProviderI get(Object key)
-      {
-        return conprov;
-      }
-
-      @Override
-      public boolean isEmpty()
-      {
-        // TODO Auto-generated method stub
-        return false;
-      }
-
-      @Override
-      public Set<String> keySet()
-      {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public ConnectionPropertyProviderI put(String key,
-              ConnectionPropertyProviderI value)
-      {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public void putAll(
-              Map<? extends String, ? extends ConnectionPropertyProviderI> m)
-      {
-        // TODO Auto-generated method stub
-
-      }
-
-      @Override
-      public ConnectionPropertyProviderI remove(Object key)
-      {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public int size()
-      {
-        // TODO Auto-generated method stub
-        return 0;
-      }
-
-      @Override
-      public Collection<ConnectionPropertyProviderI> values()
-      {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-    };
+    return conprov;
   }
 
 }