JAL-2994 put ‘\’ first in character class clause of regex - otherwise doesn’t compile...
[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, DataSourceType 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", new String[]
107               { pdx.getMessage() });
108       throw new IOException(pdx);
109     } catch (ExceptionLoadingFailed lf)
110     {
111       errormessage = MessageManager.formatMessage(
112               "exception.ranml_couldnt_process_data", new String[]
113               { lf.getMessage() });
114       throw new IOException(lf);
115     } catch (ExceptionFileFormatOrSyntax iff)
116     {
117       errormessage = MessageManager
118               .formatMessage("exception.ranml_invalid_file", new String[]
119               { 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", new String[]
126               { x.getMessage() });
127       throw new IOException(errormessage, x);
128     }
129   }
130
131   @SuppressWarnings("unchecked")
132   public void _parse()
133           throws FileNotFoundException, ExceptionPermissionDenied,
134           ExceptionLoadingFailed, 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], "",
176                 Rna.getRNASecStrucState(annot[k]).charAt(0), 0f);
177       }
178
179       AlignmentAnnotation align = new AlignmentAnnotation(
180               "Secondary Structure",
181               current.getID().trim().length() > 0
182                       ? "Secondary Structure for " + current.getID()
183                       : "",
184               ann);
185
186       sqs[i].addAlignmentAnnotation(align);
187       sqs[i].setRNA(result.get(i));
188
189       // allarray.add(strucinarray);
190
191       annotations.addElement(align);
192       // BP.add(align.bps);
193
194     }
195
196     setSeqs(sqs);
197   }
198
199   @Override
200   public String print(SequenceI[] s, boolean jvSuffix)
201   {
202     return "not yet implemented";
203   }
204
205   public List<RNA> getRNA()
206   {
207     return result;
208   }
209
210   // public static void main(String[] args) {
211   // Pattern p= Pattern.compile("(.+)[.][^.]+");
212   // Matcher m = p.matcher("toto.xml.zip");
213   // System.out.println(m.matches());
214   // System.out.println(m.group(1));
215   // }
216   /**
217    * make a friendly ID string.
218    * 
219    * @param dataName
220    * @return truncated dataName to after last '/'
221    */
222   private String safeName(String dataName)
223   {
224     int b = 0;
225     if ((b = dataName.lastIndexOf(".")) > 0)
226     {
227       dataName = dataName.substring(0, b - 1);
228     }
229     b = 0;
230     Regex m = new Regex("[\\/]?([-A-Za-z0-9]+)\\.?");
231     String mm = dataName;
232     while (m.searchFrom(dataName, b))
233     {
234       mm = m.stringMatched();
235       b = m.matchedTo();
236     }
237     return mm;
238   }
239 }