JAL-2316 First pass identifiers.org downloading working
authorkiramt <k.mourao@dundee.ac.uk>
Fri, 18 Nov 2016 07:16:48 +0000 (07:16 +0000)
committerkiramt <k.mourao@dundee.ac.uk>
Fri, 18 Nov 2016 07:16:48 +0000 (07:16 +0000)
src/jalview/urls/CustomUrlProvider.java
src/jalview/urls/IdentifiersUrlProvider.java
src/jalview/urls/UrlProvider.java
test/jalview/urls/IdentifiersUrlProviderTest.java

index 2d26883..d88c571 100644 (file)
 
 package jalview.urls;
 
-//import static jalview.util.UrlConstants.EMBLEBI_LABEL;
-//import static jalview.util.UrlConstants.EMBLEBI_STRING;
-//import static jalview.util.UrlConstants.SRS_LABEL;
-
-
 import static jalview.util.UrlConstants.DB_ACCESSION;
 import static jalview.util.UrlConstants.DELIM;
 import static jalview.util.UrlConstants.SEP;
index 4b88356..7819136 100644 (file)
 
 package jalview.urls;
 
-import java.util.Map;
+import static jalview.util.UrlConstants.DB_ACCESSION;
+import static jalview.util.UrlConstants.DELIM;
+import static jalview.util.UrlConstants.SEP;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Vector;
 
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+
 /**
  * 
  * Implements the UrlProviderI interface for a UrlProvider object which serves
@@ -35,48 +53,160 @@ import java.util.Vector;
 public class IdentifiersUrlProvider extends UrlProviderImpl
 {
 
+  // map of string ids to urls
+  private HashMap<String, HashMap<String, String>> urls;
+
+  // list of selected urls
+  private ArrayList<String> selectedUrls;
+
   public IdentifiersUrlProvider(String cachedUrlList, String idFileName)
   {
+    try
+    {
+      // File idFile = getIdentifiers();
+      urls = readIdentifiers(new FileReader(idFileName));
+      checkSelectionMatchesUrls(cachedUrlList);
+
+    } catch (IOException e)
+    {
+
+    }
+  }
+
+  private File getIdentifiers() throws IOException
+  {
+    String identifiersorgUrl = "http://identifiers.org/rest/collections/";
+    String outfile = "identifiers.json";
+    int BUFFER_SIZE = 4096;
+    
+    URL url = new URL(identifiersorgUrl);
+    InputStream is = new BufferedInputStream(url.openStream());
+    FileOutputStream os = new FileOutputStream(outfile);
+    byte[] buffer = new byte[BUFFER_SIZE];
+    int bytesRead = -1;
+    while ((bytesRead = is.read(buffer)) != -1)
+    {
+      os.write(buffer, 0, bytesRead);
+    }
+    os.close();
+    is.close();
+    
+    return new File(outfile);
+  }
 
+  private HashMap<String, HashMap<String, String>> readIdentifiers(
+          FileReader reader)
+  {
+    JSONParser parser = new JSONParser();
+    HashMap<String, HashMap<String, String>> idData = new HashMap<String, HashMap<String, String>>();
+
+    try
+    {
+      JSONArray jsonarray = (JSONArray) parser.parse(reader);
+
+      // loop over each entry in JSON array and build HashMap entry
+      for (int i = 0; i < jsonarray.size(); i++)
+      {
+        JSONObject item = (JSONObject) jsonarray.get(i);
+
+        HashMap<String, String> idEntry = new HashMap<String, String>();
+        idEntry.put("name", (String) item.get("name"));
+        idEntry.put("url", (String) item.get("url"));
+        idData.put((String) item.get("id"), idEntry);
+      }
+    } catch (FileNotFoundException e)
+    {
+      e.printStackTrace();
+    } catch (IOException e)
+    {
+      e.printStackTrace();
+    } catch (ParseException e)
+    {
+      e.printStackTrace();
+    }
+    return idData;
   }
 
-  public IdentifiersUrlProvider(Map<String, String> urlList,
-          String idFileName)
+  private void checkSelectionMatchesUrls(String cachedUrlList)
   {
+    selectedUrls = new ArrayList<String>();
+    String[] prevSelected = cachedUrlList.split("\\" + SEP);
+    for (String id : prevSelected)
+    {
+      if (urls.containsKey(id))
+      {
+        selectedUrls.add(id);
+      }
+    }
+
+    // reset defaultUrl in case it is no longer selected
+    setDefaultUrl(defaultUrl);
+  }
 
+  private void checkSelectionMatchesUrls(Vector<String> idList)
+  {
+    selectedUrls = new ArrayList<String>();
+    String[] prevSelected = new String[idList.size()];
+    idList.toArray(prevSelected);
+    for (String id : prevSelected)
+    {
+      if (urls.containsKey(id))
+      {
+        selectedUrls.add(id);
+      }
+    }
+
+    // reset defaultUrl in case it is no longer selected
+    setDefaultUrl(defaultUrl);
   }
 
   @Override
   public String getDefaultUrl()
   {
-    // TODO Auto-generated method stub
-    return null;
+    return defaultUrl;
   }
 
   @Override
   public boolean setDefaultUrl(String id)
   {
-    return false;
+    if (selectedUrls.contains(id))
+    {
+      defaultUrl = id;
+    }
+    else
+    {
+      defaultUrl = null;
+    }
+    return selectedUrls.contains(id);
   }
 
   @Override
   public String writeUrlsAsString()
   {
-    return "";
+    StringBuffer links = new StringBuffer();
+    for (String k : selectedUrls)
+    {
+      links.append(k);
+    }
+    return links.toString();
   }
 
   @Override
   public Vector<String> getLinksForDisplay()
   {
-    // TODO Auto-generated method stub
-    return null;
+    Vector<String> links = new Vector<String>();
+    for (String key : selectedUrls)
+    {
+      links.add(key + SEP + urls.get(key).get("url") + "/" + DELIM
+              + DB_ACCESSION + DELIM);
+    }
+    return links;
   }
 
   @Override
   public String getDefaultUrl(String seqid)
   {
-    // TODO Auto-generated method stub
-    return null;
+    return urls.get(defaultUrl).get("url") + "/" + seqid;
   }
 
   @Override
@@ -89,8 +219,8 @@ public class IdentifiersUrlProvider extends UrlProviderImpl
   @Override
   public void setUrlLinks(Vector<String> names, Vector<String> urls)
   {
-    // deliberately left empty
-    // TODO throw exception if called
+    // ignores urls, only uses names (as ids)
+    checkSelectionMatchesUrls(names);
   }
 
   @Override
index 4ae9d13..af618f0 100644 (file)
@@ -57,7 +57,7 @@ public class UrlProvider implements UrlProviderI
     UrlProviderI idProvider = new IdentifiersUrlProvider(cachedUrlList,
             ID_ORG_FILE);
     customProvider = new CustomUrlProvider(cachedUrlList);
-    providers.add(idProvider);
+    // providers.add(idProvider);
     providers.add(customProvider);
 
     // check that the defaultUrl still exists
@@ -80,7 +80,7 @@ public class UrlProvider implements UrlProviderI
     // create all the UrlProviders we need
     providers = new ArrayList<UrlProviderI>();
 
-    UrlProviderI idProvider = new IdentifiersUrlProvider(urlList,
+    UrlProviderI idProvider = new IdentifiersUrlProvider(null,
             ID_ORG_FILE);
     customProvider = new CustomUrlProvider(urlList);
     providers.add(idProvider);
index d8776f4..843e2d5 100644 (file)
@@ -25,10 +25,13 @@ import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertFalse;
 import static org.testng.AssertJUnit.assertTrue;
 
+import java.io.File;
+import java.io.FileWriter;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Vector;
 
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 public class IdentifiersUrlProviderTest
@@ -49,14 +52,27 @@ public class IdentifiersUrlProviderTest
     "MIR:00000011|http://identifiers.org/interpro/$DB_ACCESSION$",
     "MIR:00000372|http://identifiers.org/ena.embl/$DB_ACCESSION$"};
 
+  private static final String[] dlinks1 = {
+      "MIR:00000011|http://identifiers.org/interpro/$DB_ACCESSION$",
+      "MIR:00000372|http://identifiers.org/ena.embl/$DB_ACCESSION$" };
+
+  private static final String[] dlinks2 = {
+      "MIR:00000005|http://identifiers.org/uniprot/$DB_ACCESSION$",
+      "MIR:00000011|http://identifiers.org/interpro/$DB_ACCESSION$" };
+
   private static final String stringLinks = "MIR:00000005|http://identifiers.org/uniprot/$DB_ACCESSION$"
           + "MIR:00000011|http://identifiers.org/interpro/$DB_ACCESSION$"
           + "MIR:00000372|http://identifiers.org/ena.embl/$DB_ACCESSION$";
 
-
   private static final Vector<String> displayLinks = new Vector<String>(
         Arrays.asList(dlinks));
   
+  private static final Vector<String> displayLinks1 = new Vector<String>(
+          Arrays.asList(dlinks1));
+
+  private static final Vector<String> displayLinks2 = new Vector<String>(
+          Arrays.asList(dlinks2));
+
   private static final HashMap<String, String> urlMap = new HashMap<String, String>()
   {
     {
@@ -66,6 +82,31 @@ public class IdentifiersUrlProviderTest
     }
   };
 
+  private String testfile = "";
+
+
+  @BeforeClass(alwaysRun = true)
+  public void setup()
+  {
+    // setup test ids in a file
+    File outFile = null;
+    try
+    {
+      outFile = File.createTempFile("testidsfile", "txt");
+      outFile.deleteOnExit();
+
+      FileWriter fw = new FileWriter(outFile);
+      fw.write(testIdOrgFile);
+      fw.close();
+
+      testfile = outFile.getAbsolutePath();
+
+    } catch (Exception ex)
+    {
+      System.err.println(ex);
+    }
+  }
+
   /*
    * Test urls are set and returned correctly
    */
@@ -74,14 +115,14 @@ public class IdentifiersUrlProviderTest
   {
     // creation from cached id list
     String idList = "MIR:00000005|MIR:00000011|MIR:00000372";
-    UrlProviderI idProv = new IdentifiersUrlProvider(idList, testIdOrgFile);
+    UrlProviderI idProv = new IdentifiersUrlProvider(idList, testfile);
     
     assertTrue(displayLinks.containsAll(idProv.getLinksForDisplay()));
 
     // because UrlProvider does not guarantee order of links, we can't just
     // compare the output of writeUrlsAsString to a string, hence the hoops here
     String result = idProv.writeUrlsAsString();
-    UrlProviderI up = new IdentifiersUrlProvider(result, testIdOrgFile);
+    UrlProviderI up = new IdentifiersUrlProvider(result, testfile);
     assertTrue(displayLinks.containsAll(up.getLinksForDisplay()));
 
   }
@@ -94,7 +135,7 @@ public class IdentifiersUrlProviderTest
   {
     // creation from cached id list
     String idList = "MIR:00000005|MIR:00000011|MIR:00000372";
-    UrlProviderI idProv = new IdentifiersUrlProvider(idList, testIdOrgFile);
+    UrlProviderI idProv = new IdentifiersUrlProvider(idList, testfile);
     
     // initially no default
     assertEquals(null, idProv.getDefaultUrl());
@@ -122,21 +163,25 @@ public class IdentifiersUrlProviderTest
   {
     // creation from cached id list
     String idList = "MIR:00000005|MIR:00000011|MIR:00000372";
-    UrlProviderI idProv = new IdentifiersUrlProvider(idList, testIdOrgFile);
+    UrlProviderI idProv = new IdentifiersUrlProvider(idList, testfile);
 
     // set url links
     String[] ids = { "MIR:00000372", "MIR:00000011" };
     Vector<String> names = new Vector<String>(Arrays.asList(ids));
     Vector<String> urls = null;
     idProv.setUrlLinks(names, urls);
-    assertEquals(names, idProv.getLinksForDisplay());
+    Vector<String> result = idProv.getLinksForDisplay();
+    assertEquals(displayLinks1.size(), result.size());
+    assertTrue(displayLinks1.containsAll(result));
     
     //set default url then reset url links, default should be unset if not present
     String[] moreids = { "MIR:00000005", "MIR:00000011" };
     names = new Vector<String>(Arrays.asList(moreids));
     idProv.setDefaultUrl("MIR:00000372");
     idProv.setUrlLinks(names, urls);
-    assertEquals(names, idProv.getLinksForDisplay());
+    result = idProv.getLinksForDisplay();
+    assertEquals(displayLinks2.size(), result.size());
+    assertTrue(displayLinks2.containsAll(result));
     assertEquals(null, idProv.getDefaultUrl());
 
   }