JAL-1620 version bump and release notes
[jalview.git] / src / jalview / io / RnamlFile.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1)
3  * Copyright (C) 2014 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.SecStrConsensus.SimpleBP;
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
36 import com.stevesoft.pat.Regex;
37
38 import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax;
39 import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed;
40 import fr.orsay.lri.varna.exceptions.ExceptionPermissionDenied;
41 import fr.orsay.lri.varna.factories.RNAFactory;
42 import fr.orsay.lri.varna.models.rna.RNA;
43
44 public class RnamlFile extends AlignFile
45 {
46   public String id;
47
48   protected ArrayList<RNA> result;
49
50   public RnamlFile()
51   {
52     super();
53
54   }
55
56   public RnamlFile(String inFile, String type) throws IOException
57   {
58     super(inFile, type);
59
60   }
61
62   public RnamlFile(FileParse source) throws IOException
63   {
64     super(source);
65
66   }
67
68   public BufferedReader CreateReader() throws FileNotFoundException
69   {
70     FileReader fr = null;
71     fr = new FileReader(inFile);
72
73     BufferedReader r = new BufferedReader(fr);
74     return r;
75   }
76
77   /*
78    * (non-Javadoc)
79    * 
80    * @see jalview.io.AlignFile#parse()
81    */
82   public void parse() throws IOException
83   {
84     if (System.getProperty("java.version").indexOf("1.6") > -1
85             || System.getProperty("java.version").indexOf("1.5") > -1)
86     {
87       // patch for 'This parser does not support specification "null" version
88       // "null"' error
89       // this hack ensures we get a properly updated SAXParserFactory on older
90       // JVMs
91       // thanks to Stefan Birkner over at https://coderwall.com/p/kqsrrw
92       System.setProperty("javax.xml.parsers.SAXParserFactory",
93               "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
94     }
95     // rather than lose exception semantics whilst parsing RNAML with VARNA we
96     // wrap the routine and catch all exceptions before passing them up the
97     // chain as an IOException
98     try
99     {
100       _parse();
101     } catch (ExceptionPermissionDenied pdx)
102     {
103       errormessage = MessageManager.formatMessage("exception.rnaml_couldnt_access_datasource", new String[]{pdx.getMessage()});
104       throw new IOException(pdx);
105     } catch (ExceptionLoadingFailed lf)
106     {
107       errormessage = MessageManager.formatMessage("exception.ranml_couldnt_process_data", new String[]{lf.getMessage()});
108       throw new IOException(lf);
109     } catch (ExceptionFileFormatOrSyntax iff)
110     {
111         errormessage = MessageManager.formatMessage("exception.ranml_invalid_file", new String[]{iff.getMessage()});
112       throw new IOException(iff);
113     } catch (Exception x)
114     {
115       error = true;
116       errormessage = MessageManager.formatMessage("exception.ranml_problem_parsing_data", new String[]{x.getMessage()});
117       throw new IOException(errormessage , x);
118     }
119   }
120
121   @SuppressWarnings("unchecked")
122   public void _parse() throws FileNotFoundException,
123           ExceptionPermissionDenied, ExceptionLoadingFailed,
124           ExceptionFileFormatOrSyntax
125   {
126
127     result = RNAFactory.loadSecStrRNAML(getReader());
128
129     ArrayList<ArrayList> allarray = new ArrayList();
130     ArrayList<ArrayList<SimpleBP>> BP = new ArrayList();
131     ArrayList strucinarray = new ArrayList();
132     SequenceI[] seqs = new SequenceI[result.size()];
133
134     for (int i = 0; i < result.size(); i++)
135     {
136
137       RNA current = result.get(i);
138       String rna = current.getStructDBN(true);
139       String seq = current.getSeq();
140       int begin = 1;
141       int end = seq.length();
142
143       id = current.getName();
144       if (id == null || id.trim().length() == 0)
145       {
146         id = safeName(getDataName());
147         if (result.size() > 1)
148         {
149           id += "." + i;
150         }
151       }
152       seqs[i] = new Sequence(id, seq, begin, end);
153
154       seqs[i].setEnd(seqs[i].findPosition(seqs[i].getLength()));
155       String[] annot = new String[rna.length()];
156       Annotation[] ann = new Annotation[rna.length()];
157
158       for (int j = 0; j < rna.length(); j++)
159       {
160         annot[j] = "" + rna.charAt(j);
161
162       }
163       for (int k = 0; k < rna.length(); k++)
164       {
165         ann[k] = new Annotation(annot[k], "",
166                 jalview.schemes.ResidueProperties.getRNASecStrucState(
167                         annot[k]).charAt(0), 0f);
168       }
169
170       AlignmentAnnotation align = new AlignmentAnnotation(
171               "Secondary Structure",
172               current.getID().trim().length() > 0 ? "Secondary Structure for "
173                       + current.getID()
174                       : "", ann);
175
176       seqs[i].addAlignmentAnnotation(align);
177       seqs[i].setRNA(result.get(i));
178
179       allarray.add(strucinarray);
180
181       annotations.addElement(align);
182       BP.add(align.bps);
183
184     }
185
186     setSeqs(seqs);
187   }
188
189   public static String print(SequenceI[] s)
190   {
191     return "not yet implemented";
192   }
193
194   public String print()
195   {
196     System.out.print("print :");
197     return print(getSeqsAsArray());
198   }
199
200   public ArrayList getRNA()
201   {
202     return result;
203   }
204
205   // public static void main(String[] args) {
206   // Pattern p= Pattern.compile("(.+)[.][^.]+");
207   // Matcher m = p.matcher("toto.xml.zip");
208   // System.out.println(m.matches());
209   // System.out.println(m.group(1));
210   // }
211   /**
212    * make a friendly ID string.
213    * 
214    * @param dataName
215    * @return truncated dataName to after last '/'
216    */
217   private String safeName(String dataName)
218   {
219     int b = 0;
220     if ((b = dataName.lastIndexOf(".")) > 0)
221     {
222       dataName = dataName.substring(0, b - 1);
223     }
224     b = 0;
225     Regex m = new Regex("[\\/]?([-A-Za-z0-9]+)\\.?");
226     String mm = dataName;
227     while (m.searchFrom(dataName, b))
228     {
229       mm = m.stringMatched();
230       b = m.matchedTo();
231     }
232     return mm;
233   }
234 }