initial commit
[jalview.git] / forester / java / src / org / forester / archaeopteryx / UrlTreeReader.java
1 // $Id:
2 // FORESTER -- software libraries and applications
3 // for evolutionary biology research and applications.
4 //
5 // Copyright (C) 2008-2009 Christian M. Zmasek
6 // Copyright (C) 2008-2009 Burnham Institute for Medical Research
7 // All rights reserved
8 // 
9 // This library is free software; you can redistribute it and/or
10 // modify it under the terms of the GNU Lesser General Public
11 // License as published by the Free Software Foundation; either
12 // version 2.1 of the License, or (at your option) any later version.
13 //
14 // This library is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 // Lesser General Public License for more details.
18 // 
19 // You should have received a copy of the GNU Lesser General Public
20 // License along with this library; if not, write to the Free Software
21 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 //
23 // Contact: phylosoft @ gmail . com
24 // WWW: www.phylosoft.org/forester
25
26 package org.forester.archaeopteryx;
27
28 import java.io.File;
29 import java.io.IOException;
30 import java.net.MalformedURLException;
31 import java.net.URL;
32 import java.util.Date;
33
34 import javax.swing.JOptionPane;
35
36 import org.forester.archaeopteryx.webservices.PhylogeniesWebserviceClient;
37 import org.forester.archaeopteryx.webservices.WebserviceUtil;
38 import org.forester.archaeopteryx.webservices.WebservicesManager;
39 import org.forester.io.parsers.PhylogenyParser;
40 import org.forester.io.parsers.nexus.NexusPhylogeniesParser;
41 import org.forester.io.parsers.nhx.NHXParser;
42 import org.forester.io.parsers.phyloxml.PhyloXmlParser;
43 import org.forester.io.parsers.tol.TolParser;
44 import org.forester.phylogeny.Phylogeny;
45 import org.forester.phylogeny.data.Identifier;
46 import org.forester.phylogeny.factories.ParserBasedPhylogenyFactory;
47 import org.forester.phylogeny.factories.PhylogenyFactory;
48 import org.forester.util.ForesterUtil;
49
50 public class UrlTreeReader implements Runnable {
51
52     private final MainFrame _main_frame;
53     private final int       _webservice_client_index;
54
55     UrlTreeReader( final MainFrame mf, final int webservice_client_index ) {
56         _main_frame = mf;
57         _webservice_client_index = webservice_client_index;
58     }
59
60     synchronized void readPhylogeniesFromWebservice() {
61         final long start_time = new Date().getTime();
62         URL url = null;
63         Phylogeny[] trees = null;
64         final WebservicesManager webservices_manager = WebservicesManager.getInstance();
65         final PhylogeniesWebserviceClient client = webservices_manager
66                 .getAvailablePhylogeniesWebserviceClient( _webservice_client_index );
67         String identifier = JOptionPane.showInputDialog( _main_frame, client.getInstructions() + "\n(Reference: "
68                 + client.getReference() + ")", client.getDescription(), JOptionPane.QUESTION_MESSAGE );
69         if ( ( identifier != null ) && ( identifier.trim().length() > 0 ) ) {
70             identifier = identifier.trim();
71             if ( client.isQueryInteger() ) {
72                 identifier = identifier.replaceAll( "^\\D+", "" );
73                 int id = -1;
74                 try {
75                     id = Integer.parseInt( identifier );
76                 }
77                 catch ( final NumberFormatException e ) {
78                     id = -1;
79                 }
80                 if ( id < 1 ) {
81                     JOptionPane.showMessageDialog( _main_frame,
82                                                    "Identifier is expected to be a number",
83                                                    "Can not open URL",
84                                                    JOptionPane.ERROR_MESSAGE );
85                     return;
86                 }
87                 identifier = id + "";
88             }
89             try {
90                 String url_str = client.getUrl();
91                 url_str = url_str.replaceFirst( PhylogeniesWebserviceClient.QUERY_PLACEHOLDER, identifier );
92                 url = new URL( url_str );
93                 PhylogenyParser parser = null;
94                 switch ( client.getReturnFormat() ) {
95                     case TOL_XML_RESPONSE:
96                         parser = new TolParser();
97                         break;
98                     case NEXUS:
99                         parser = new NexusPhylogeniesParser();
100                         ( ( NexusPhylogeniesParser ) parser ).setReplaceUnderscores( true );
101                         break;
102                     case NH:
103                         parser = new NHXParser();
104                         ( ( NHXParser ) parser ).setTaxonomyExtraction( ForesterUtil.TAXONOMY_EXTRACTION.NO );
105                         ( ( NHXParser ) parser ).setReplaceUnderscores( true );
106                         ( ( NHXParser ) parser ).setGuessRootedness( true );
107                         break;
108                     case NH_EXTRACT_TAXONOMY:
109                         parser = new NHXParser();
110                         ( ( NHXParser ) parser )
111                                 .setTaxonomyExtraction( ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
112                         ( ( NHXParser ) parser ).setReplaceUnderscores( false );
113                         ( ( NHXParser ) parser ).setGuessRootedness( true );
114                         break;
115                     case PFAM:
116                         parser = new NHXParser();
117                         ( ( NHXParser ) parser )
118                                 .setTaxonomyExtraction( ForesterUtil.TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY );
119                         ( ( NHXParser ) parser ).setReplaceUnderscores( false );
120                         ( ( NHXParser ) parser ).setGuessRootedness( true );
121                         break;
122                     case NHX:
123                         parser = new NHXParser();
124                         ( ( NHXParser ) parser ).setTaxonomyExtraction( ForesterUtil.TAXONOMY_EXTRACTION.NO );
125                         ( ( NHXParser ) parser ).setReplaceUnderscores( false );
126                         ( ( NHXParser ) parser ).setGuessRootedness( true );
127                         break;
128                     case PHYLOXML:
129                         parser = new PhyloXmlParser();
130                         break;
131                     default:
132                         throw new IllegalArgumentException( "unknown format: " + client.getReturnFormat() );
133                 }
134                 if ( _main_frame.getMainPanel().getCurrentTreePanel() != null ) {
135                     _main_frame.getMainPanel().getCurrentTreePanel().setWaitCursor();
136                 }
137                 else {
138                     _main_frame.getMainPanel().setWaitCursor();
139                 }
140                 final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
141                 trees = factory.create( url.openStream(), parser );
142             }
143             catch ( final MalformedURLException e ) {
144                 JOptionPane.showMessageDialog( _main_frame,
145                                                "Malformed URL: " + url + "\n" + e.getLocalizedMessage(),
146                                                "Malformed URL",
147                                                JOptionPane.ERROR_MESSAGE );
148             }
149             catch ( final IOException e ) {
150                 JOptionPane.showMessageDialog( _main_frame, "Could not read from " + url + "\n"
151                         + e.getLocalizedMessage(), "Failed to read tree from " + client.getName() + " for "
152                         + identifier, JOptionPane.ERROR_MESSAGE );
153             }
154             catch ( final NumberFormatException e ) {
155                 JOptionPane.showMessageDialog( _main_frame, "Could not read from " + url + "\n"
156                         + e.getLocalizedMessage(), "Failed to read tree from " + client.getName() + " for "
157                         + identifier, JOptionPane.ERROR_MESSAGE );
158             }
159             catch ( final Exception e ) {
160                 e.printStackTrace();
161                 JOptionPane.showMessageDialog( _main_frame,
162                                                e.getLocalizedMessage(),
163                                                "Unexpected Exception",
164                                                JOptionPane.ERROR_MESSAGE );
165             }
166             finally {
167                 if ( _main_frame.getCurrentTreePanel() != null ) {
168                     _main_frame.getCurrentTreePanel().setArrowCursor();
169                 }
170                 else {
171                     _main_frame.getMainPanel().setArrowCursor();
172                 }
173             }
174             if ( ( trees != null ) && ( trees.length > 0 ) ) {
175                 for( final Phylogeny phylogeny : trees ) {
176                     if ( !phylogeny.isEmpty() ) {
177                         if ( client.getName().equals( WebserviceUtil.TREE_FAM_NAME ) ) {
178                             phylogeny.setRerootable( false );
179                             phylogeny.setRooted( true );
180                         }
181                         if ( client.getName().equals( WebserviceUtil.PFAM_NAME ) ) {
182                             phylogeny.setRerootable( false );
183                             phylogeny.setRooted( true );
184                             ForesterUtil.transferInternalNodeNamesToConfidence( phylogeny );
185                         }
186                         if ( client.getProcessingInstructions() != null ) {
187                             WebserviceUtil.processInstructions( client, phylogeny );
188                         }
189                         if ( client.getNodeField() != null ) {
190                             ForesterUtil.transferNodeNameToField( phylogeny, client.getNodeField() );
191                         }
192                         phylogeny.setIdentifier( new Identifier( identifier, client.getName() ) );
193                         _main_frame.getJMenuBar().remove( _main_frame.getHelpMenu() );
194                         _main_frame.getMenuBarOfMainFrame().add( _main_frame.getHelpMenu() );
195                         _main_frame.getMainPanel().addPhylogenyInNewTab( phylogeny,
196                                                                          _main_frame.getConfiguration(),
197                                                                          new File( url.getFile() ).getName(),
198                                                                          url.toString() );
199                         String my_name_for_file = "";
200                         if ( !ForesterUtil.isEmpty( phylogeny.getName() ) ) {
201                             my_name_for_file = new String( phylogeny.getName() ).replaceAll( " ", "_" );
202                         }
203                         else if ( phylogeny.getIdentifier() != null ) {
204                             final StringBuffer sb = new StringBuffer();
205                             if ( !ForesterUtil.isEmpty( phylogeny.getIdentifier().getProvider() ) ) {
206                                 sb.append( phylogeny.getIdentifier().getProvider() );
207                                 sb.append( "_" );
208                             }
209                             sb.append( phylogeny.getIdentifier().getValue() );
210                             my_name_for_file = new String( sb.toString().replaceAll( " ", "_" ) );
211                         }
212                         _main_frame.getMainPanel().getCurrentTreePanel().setTreeFile( new File( my_name_for_file ) );
213                         Util.lookAtSomeTreePropertiesForAptxControlSettings( phylogeny, _main_frame.getMainPanel()
214                                 .getControlPanel(), _main_frame.getConfiguration() );
215                         _main_frame.getMainPanel().getControlPanel().showWhole();
216                     }
217                 }
218             }
219             _main_frame.getContentPane().repaint();
220             if ( ( ( trees != null ) && ( trees.length > 0 ) ) && ( ( new Date().getTime() - start_time ) > 20000 ) ) {
221                 try {
222                     JOptionPane.showMessageDialog( null,
223                                                    ForesterUtil.wordWrap( "Successfully read in " + trees.length
224                                                            + " evolutionry tree(s) from [" + url + "]", 80 ),
225                                                    "Success",
226                                                    JOptionPane.INFORMATION_MESSAGE );
227                 }
228                 catch ( final Exception e ) {
229                     // Not important if this fails, do nothing.
230                 }
231                 _main_frame.getContentPane().repaint();
232             }
233         }
234         _main_frame.activateSaveAllIfNeeded();
235         System.gc();
236     }
237
238     @Override
239     public void run() {
240         readPhylogeniesFromWebservice();
241     }
242 }