Merge branch 'spike/JAL-2040_JAL-2137_phyre2' into features/JAL-2040_JAL-2137_phyre2
[jalview.git] / src / jalview / io / AnnotationFile.java
index d8f9f15..eca27a7 100755 (executable)
@@ -34,10 +34,11 @@ import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemeProperty;
-import jalview.schemes.ResidueProperties;
 import jalview.schemes.UserColourScheme;
+import jalview.structure.StructureSelectionManager;
 
 import java.io.BufferedReader;
+import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -690,21 +691,41 @@ public class AnnotationFile
   public boolean readAnnotationFile(AlignmentI al, ColumnSelection colSel,
           String file, String protocol)
   {
+    baseUri = "";
     BufferedReader in = null;
     try
     {
       if (protocol.equals(AppletFormatAdapter.FILE))
       {
         in = new BufferedReader(new FileReader(file));
+        baseUri = new File(file).getParent();
+        if (baseUri == null)
+        {
+          baseUri = "";
+        }
+        else
+        {
+          baseUri += "/";
+        }
       }
       else if (protocol.equals(AppletFormatAdapter.URL))
       {
         URL url = new URL(file);
         in = new BufferedReader(new InputStreamReader(url.openStream()));
+        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("/")) + "/";
+        }
       }
       else if (protocol.equals(AppletFormatAdapter.PASTE))
       {
         in = new BufferedReader(new StringReader(file));
+        // TODO - support mimencoded PDBs for a paste.. ?
+        baseUri = "";
       }
       else if (protocol.equals(AppletFormatAdapter.CLASSLOADER))
       {
@@ -712,6 +733,8 @@ public class AnnotationFile
         if (is != null)
         {
           in = new BufferedReader(new java.io.InputStreamReader(is));
+          // TODO: this probably doesn't work for classloader - needs a test
+          baseUri = new File("/" + file).getParent() + "/";
         }
       }
       if (in != null)
@@ -737,6 +760,12 @@ public class AnnotationFile
 
   String lastread = "";
 
+  /**
+   * used for resolving absolute references to resources relative to
+   * annotationFile location
+   */
+  String baseUri = "";
+
   private static String GRAPHLINE = "GRAPHLINE", COMBINE = "COMBINE",
           STRUCTMODEL = "STRUCTMODEL";
 
@@ -1233,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)
       {
@@ -1275,7 +1306,11 @@ public class AnnotationFile
       }
       else
       {
-        // assume 1:1 - so synthesise sequences to use to construct mapping ?
+        // assume 1:1 - so synthesise sequences to use to construct mapping
+        StructureFile pdbf = StructureSelectionManager
+                .getStructureSelectionManager().setMapping(false,
+                        new SequenceI[] { refSeq2.getDatasetSequence() },
+                        null, modelPath, modelProt);
         refSeq2.getDatasetSequence().addPDBId(modelpe);
         if (templateSeq == null && tPw != null)
         {
@@ -1305,6 +1340,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, ",");
@@ -1763,9 +1808,9 @@ public class AnnotationFile
         else if (key.equalsIgnoreCase("consThreshold"))
         {
           sg.cs.setConservationInc(Integer.parseInt(value));
-          Conservation c = new Conservation("Group",
-                  ResidueProperties.propHash, 3, sg.getSequences(null),
-                  sg.getStartRes(), sg.getEndRes() + 1);
+          Conservation c = new Conservation("Group", 3,
+                  sg.getSequences(null), sg.getStartRes(),
+                  sg.getEndRes() + 1);
 
           c.calculate();
           c.verdict(false, 25); // TODO: refer to conservation percent threshold