a2e97f64d0e9d6329ddd1da4fe3c828252ccad3a
[jalview.git] / src / jalview / ws / Jemboss.java
1 package jalview.ws;
2
3 /**
4  * <p>Title: JalviewX</p>
5  * <p>Description: Jalview Re-engineered</p>
6  * <p>Copyright: Copyright (c) 2004</p>
7  * <p>Company: Dundee University</p>
8  * @author not attributable
9  * @version 1.0
10  * Commenced 14th January 2005, Jim Procter
11  * Contains and depends on GPL-2 jemboss classes
12  * see http://www.rfcgr.mrc.ac.uk/Software/EMBOSS/Jemboss/index.html
13  */
14
15 /**
16  * Philosophy
17  * Jemboss webservices are implemented here as re-entrant synchronous SOAP
18  * exchanges. It is up to the user of the class whether these exchanges
19  * are executed in their own thread to effect background processing
20  * functionality.
21  *
22  * Things to do
23  * Standardise the exceptions (currently errors are output on stdout)
24  * Allow server configuration
25  * Throw away JembossParams and Jemboss dependence
26  * Generalise results to return collections of objects - alignments, trees, annotations, etc.
27  */
28
29 import java.net.*;
30 import java.security.*;
31 import java.util.*;
32
33 import ext.jemboss.*;
34 import ext.jemboss.soap.*;
35 import jalview.datamodel.*;
36 import jalview.io.*;
37
38
39 public class Jemboss
40 {
41   private static ext.jemboss.JembossParams vamsas_server;
42
43   public Jemboss()
44   {
45     // Set up default jalview-jemboss server properties
46     //
47     vamsas_server = new JembossParams();
48     vamsas_server.setCurrentMode("interactive");
49     System.out.println("Jemboss Server Init\n"
50                        + vamsas_server.serverDescription()
51                        + "\nUser Authorisation ? "
52                        + vamsas_server.getUseAuth()
53                        +"\n");
54   }
55
56   /* public void updateServer(JembossParams props)
57   {
58     vamsas_server.updateJembossPropStrings (
59       props.getEmbossEnvironmentArray());
60   }
61   */
62     public SequenceI[] clustalW(SequenceI[] sequences) {
63       // Does the same as below but keeps initial sequence order.
64       return (this.clustalW(sequences, true));
65     }
66   public SequenceI[] clustalW(SequenceI[] sequences, boolean PreserveOrder)
67   {
68
69     // Simplest client call - with gumph from jemboss.server.TestPrivateServer
70     if (vamsas_server.getPublicSoapURL().startsWith("https"))
71     {
72       //SSL settings
73       //    System.setProperty ("javax.net.debug", "all");
74       com.sun.net.ssl.internal.ssl.Provider p =
75           new com.sun.net.ssl.internal.ssl.Provider();
76       Security.addProvider(p);
77
78       //have to do it this way to work with JNLP
79       URL.setURLStreamHandlerFactory( new URLStreamHandlerFactory()
80       {
81         public URLStreamHandler createURLStreamHandler(final String protocol)
82         {
83           if(protocol != null && protocol.compareTo("https") == 0)
84           {
85             return new com.sun.net.ssl.internal.www.protocol.https.Handler();
86           }
87           return null;
88         }
89       });
90
91       //location of keystore
92       System.setProperty("javax.net.ssl.trustStore",
93                          "resources/client.keystore");
94
95       String jembossClientKeyStore = System.getProperty("user.home") +
96           "/.jembossClientKeystore";
97
98       try
99       {
100         new JembossJarUtil("resources/client.jar").writeByteFile(
101       "client.keystore",jembossClientKeyStore);
102         System.setProperty("javax.net.ssl.trustStore",
103                            jembossClientKeyStore);
104       }
105       catch(Exception exp){}
106
107     }
108
109     Hashtable filesToMove = new Hashtable();
110     String embossCommand = "emma -sequence jalseqs.fasta -auto";
111     // Duplicate
112     SequenceI[] myseq = new SequenceI[sequences.length];
113     for (int i=0; i<sequences.length; i++) {
114         myseq[i] = new Sequence(sequences[i]);
115     }
116     // Uniqueify, and
117     Hashtable namemap = jalview.analysis.SeqsetUtils.uniquify(myseq);
118     // Load sequence file into hash
119
120     filesToMove.put("jalseqs.fasta",
121                     jalview.io.FastaFile.print(myseq,124,false, false).getBytes());
122
123     if(vamsas_server.getUseAuth() == true)
124       if(vamsas_server.getServiceUserName() == null)
125         System.out.println("jalview.Jemboss: OOPS! Authentication required!");
126
127     // submit to private server
128     try
129     {
130       JembossRun thisrun = new JembossRun(embossCommand,"",
131                                           filesToMove,vamsas_server);
132       Hashtable h = thisrun.hash();
133       Enumeration enumerator = h.keys();
134       // Find the alignment generated and parse it
135       while (enumerator.hasMoreElements())
136       {
137         String thiskey = (String)enumerator.nextElement().toString();
138         if (thiskey.endsWith(".aln"))
139         {
140           // FormatAdapter, and IdentifyFile use a protocol string
141           // to work out what 'file' is - file/url/Alignmentasastring
142           String alfile = h.get(thiskey).toString();
143           String format = IdentifyFile.Identify(alfile, "Paste");
144           SequenceI[] alignment = null;
145
146           if (FormatAdapter.formats.contains(format))
147             alignment = FormatAdapter.readFile(alfile, "Paste", format);
148           else
149             System.out.println("jalview.Jemboss: Unknown format "+format+"\n");
150           if (alignment == null)
151             System.out.println("jalview.Jemboss: Couldn't read response:\n"
152                                + alfile + "\n---EOF\n");
153           else {
154             if (PreserveOrder) {
155               jalview.analysis.AlignmentSorter.recoverOrder(alignment);
156             }
157             if (!jalview.analysis.SeqsetUtils.deuniquify(namemap, alignment)) {
158                   System.out.println("jalview.Jemboss: Warning: Some of the "
159                                      +"original sequence names have not been recovered!\n");
160             }
161             return alignment;
162           }
163         }
164
165       }
166
167     }
168     catch (JembossSoapException eae)
169     {
170       System.out.println("jalview.Jemboss: SOAP ERROR :"+embossCommand
171                          + "\n" + eae);
172     }
173     catch (Exception e) {
174       System.out.println("jalview.Jemboss: Some other failure :\n"
175                          +e.getMessage()+"\n");
176     }
177
178     return null;
179   }
180 }
181