JAL-2137 resolve safely for URI and local paths
authorJim Procter <jprocter@issues.jalview.org>
Mon, 4 Jul 2016 11:53:05 +0000 (12:53 +0100)
committerJim Procter <jprocter@issues.jalview.org>
Mon, 4 Jul 2016 11:53:05 +0000 (12:53 +0100)
src/jalview/io/AnnotationFile.java

index 35651bb..c104fb2 100755 (executable)
@@ -712,7 +712,10 @@ public class AnnotationFile
       {
         URL url = new URL(file);
         in = new BufferedReader(new InputStreamReader(url.openStream()));
-        baseUri = url.toURI().getPath();
+        String bs = url.toExternalForm();
+        baseUri = bs.substring(0, bs.indexOf(url.getHost())
+                + url.getHost().length());
+        baseUri += url.toURI().getPath();
         if (baseUri.lastIndexOf("/") > -1)
         {
           baseUri = baseUri.substring(0, baseUri.lastIndexOf("/")) + "/";
@@ -1259,21 +1262,23 @@ public class AnnotationFile
   private boolean add_structmodel(AlignmentI al, SequenceI refSeq2, String tempId,
           String urlToModel, String urlToPairwise)
   {
-    String warningMessage=null;
+    String warningMessage = null, modelPath = null, modelProt = null, aliPath = null, aliProt = null;
     boolean added = false;
     try {
       // locate tempId. if it exists, will need to merge, otherwise:
       SequenceI templateSeq = al.findName(tempId);
       // 1. load urlToModel
-      // TODO: get base for current import operation and resolve against it
-      // transfer to local temp file ?
-      PDBEntry modelpe = new PDBEntry(tempId,null,Type.FILE,urlToModel);
-      PDBEntry templpe = new PDBEntry(tempId, null, Type.FILE, urlToModel);
+      modelPath = resolveAbsolute(urlToModel);
+      modelProt = AppletFormatAdapter.checkProtocol(modelPath);
+      // need to transfer to local temp file ?
+      PDBEntry modelpe = new PDBEntry(tempId, null, Type.FILE, modelPath);
+      PDBEntry templpe = new PDBEntry(tempId, null, Type.FILE, modelPath);
       refSeq2.addPDBId(modelpe);
-      
+      aliPath = resolveAbsolute(urlToPairwise);
+      aliProt = AppletFormatAdapter.checkProtocol(aliPath);
       // 2. load urlToPairwise
-      AlignmentI pwa = new AppletFormatAdapter().readFile(urlToPairwise,
-              AppletFormatAdapter.checkProtocol(urlToPairwise), "FASTA");
+      AlignmentI pwa = new AppletFormatAdapter().readFile(aliPath, aliProt,
+              "FASTA");
       SequenceI qPw = null, tPw = null;
       if (pwa != null)
       {
@@ -1331,6 +1336,16 @@ public class AnnotationFile
     }
   }
 
+  private String resolveAbsolute(String relURI)
+  {
+    if (relURI.indexOf(":/") > -1 || relURI.startsWith("/")
+            || "".equals(baseUri) || relURI.startsWith(baseUri))
+    {
+      return relURI;
+    }
+    return baseUri + relURI;
+  }
+
   private void parseHideCols(ColumnSelection colSel, String nextToken)
   {
     StringTokenizer inval = new StringTokenizer(nextToken, ",");