JAL-2089 patch broken merge to master for Release 2.10.0b1
[jalview.git] / src / jalview / io / RnamlFile.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.io;
22
23 import jalview.analysis.Rna;
24 import jalview.datamodel.AlignmentAnnotation;
25 import jalview.datamodel.Annotation;
26 import jalview.datamodel.Sequence;
27 import jalview.datamodel.SequenceI;
28 import jalview.util.MessageManager;
29
30 import java.io.BufferedReader;
31 import java.io.FileNotFoundException;
32 import java.io.FileReader;
33 import java.io.IOException;
34 import java.util.ArrayList;
35 import java.util.List;
36
37 import com.stevesoft.pat.Regex;
38
39 import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax;
40 import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed;
41 import fr.orsay.lri.varna.exceptions.ExceptionPermissionDenied;
42 import fr.orsay.lri.varna.factories.RNAFactory;
43 import fr.orsay.lri.varna.models.rna.RNA;
44
45 public class RnamlFile extends AlignFile
46 {
47   public String id;
48
49   protected ArrayList<RNA> result;
50
51   public RnamlFile()
52   {
53     super();
54
55   }
56
57   public RnamlFile(String inFile, String type) throws IOException
58   {
59     super(inFile, type);
60
61   }
62
63   public RnamlFile(FileParse source) throws IOException
64   {
65     super(source);
66
67   }
68
69   public BufferedReader CreateReader() throws FileNotFoundException
70   {
71     FileReader fr = null;
72     fr = new FileReader(inFile);
73
74     BufferedReader r = new BufferedReader(fr);
75     return r;
76   }
77
78   /*
79    * (non-Javadoc)
80    * 
81    * @see jalview.io.AlignFile#parse()
82    */
83   @Override
84   public void parse() throws IOException
85   {
86     if (System.getProperty("java.version").indexOf("1.6") > -1
87             || System.getProperty("java.version").indexOf("1.5") > -1)
88     {
89       // patch for 'This parser does not support specification "null" version
90       // "null"' error
91       // this hack ensures we get a properly updated SAXParserFactory on older
92       // JVMs
93       // thanks to Stefan Birkner over at https://coderwall.com/p/kqsrrw
94       System.setProperty("javax.xml.parsers.SAXParserFactory",
95               "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
96     }
97     // rather than lose exception semantics whilst parsing RNAML with VARNA we
98     // wrap the routine and catch all exceptions before passing them up the
99     // chain as an IOException
100     try
101     {
102       _parse();
103     } catch (ExceptionPermissionDenied pdx)
104     {
105       errormessage = MessageManager.formatMessage(
106               "exception.rnaml_couldnt_access_datasource",
107               new String[] { pdx.getMessage() });
108       throw new IOException(pdx);
109     } catch (ExceptionLoadingFailed lf)
110     {
111       errormessage = MessageManager.formatMessage(
112               "exception.ranml_couldnt_process_data",
113               new String[] { lf.getMessage() });
114       throw new IOException(lf);
115     } catch (ExceptionFileFormatOrSyntax iff)
116     {
117       errormessage = MessageManager.formatMessage(
118               "exception.ranml_invalid_file",
119               new String[] { iff.getMessage() });
120       throw new IOException(iff);
121     } catch (Exception x)
122     {
123       error = true;
124       errormessage = MessageManager.formatMessage(
125               "exception.ranml_problem_parsing_data",
126               new String[] { x.getMessage() });
127       throw new IOException(errormessage, x);
128     }
129   }
130
131   @SuppressWarnings("unchecked")
132   public void _parse() throws FileNotFoundException,
133           ExceptionPermissionDenied, ExceptionLoadingFailed,
134           ExceptionFileFormatOrSyntax
135   {
136
137     result = RNAFactory.loadSecStrRNAML(getReader());
138
139     // ArrayList<ArrayList> allarray = new ArrayList();
140     // ArrayList<ArrayList<SimpleBP>> BP = new ArrayList();
141     // ArrayList strucinarray = new ArrayList();
142     SequenceI[] sqs = new SequenceI[result.size()];
143
144     for (int i = 0; i < result.size(); i++)
145     {
146
147       RNA current = result.get(i);
148       String rna = current.getStructDBN(true);
149       String seq = current.getSeq();
150       int begin = 1;
151       int end = seq.length();
152
153       id = current.getName();
154       if (id == null || id.trim().length() == 0)
155       {
156         id = safeName(getDataName());
157         if (result.size() > 1)
158         {
159           id += "." + i;
160         }
161       }
162       sqs[i] = new Sequence(id, seq, begin, end);
163
164       sqs[i].setEnd(sqs[i].findPosition(sqs[i].getLength()));
165       String[] annot = new String[rna.length()];
166       Annotation[] ann = new Annotation[rna.length()];
167
168       for (int j = 0; j < rna.length(); j++)
169       {
170         annot[j] = "" + rna.charAt(j);
171
172       }
173       for (int k = 0; k < rna.length(); k++)
174       {
175         ann[k] = new Annotation(annot[k], "", Rna.getRNASecStrucState(
176                 annot[k]).charAt(0), 0f);
177       }
178
179       AlignmentAnnotation align = new AlignmentAnnotation(
180               "Secondary Structure",
181               current.getID().trim().length() > 0 ? "Secondary Structure for "
182                       + current.getID()
183                       : "", ann);
184
185       sqs[i].addAlignmentAnnotation(align);
186       sqs[i].setRNA(result.get(i));
187
188       // allarray.add(strucinarray);
189
190       annotations.addElement(align);
191       // BP.add(align.bps);
192
193     }
194
195     setSeqs(sqs);
196   }
197
198   public static String print(SequenceI[] s)
199   {
200     return "not yet implemented";
201   }
202
203   @Override
204   public String print()
205   {
206     System.out.print("print :");
207     return print(getSeqsAsArray());
208   }
209
210   public List<RNA> getRNA()
211   {
212     return result;
213   }
214
215   // public static void main(String[] args) {
216   // Pattern p= Pattern.compile("(.+)[.][^.]+");
217   // Matcher m = p.matcher("toto.xml.zip");
218   // System.out.println(m.matches());
219   // System.out.println(m.group(1));
220   // }
221   /**
222    * make a friendly ID string.
223    * 
224    * @param dataName
225    * @return truncated dataName to after last '/'
226    */
227   private String safeName(String dataName)
228   {
229     int b = 0;
230     if ((b = dataName.lastIndexOf(".")) > 0)
231     {
232       dataName = dataName.substring(0, b - 1);
233     }
234     b = 0;
235     Regex m = new Regex("[\\/]?([-A-Za-z0-9]+)\\.?");
236     String mm = dataName;
237     while (m.searchFrom(dataName, b))
238     {
239       mm = m.stringMatched();
240       b = m.matchedTo();
241     }
242     return mm;
243   }
244 }