1 /* GFFEntryInformation.java
2  *
3  * created: Thu Mar 30 2000
4  *
5  * This file is part of Artemis
6  *
7  * Copyright (C) 2000  Genome Research Limited
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program 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
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/GFFEntryInformation.java,v 1.6 2007-06-14 16:01:38 tjc Exp $
24  */
25 
26 package uk.ac.sanger.artemis.io;
27 
28 import java.io.InputStream;
29 import java.io.IOException;
30 import java.util.Enumeration;
31 import java.util.Properties;
32 
33 import uk.ac.sanger.artemis.util.StringVector;
34 import uk.ac.sanger.artemis.Options;
35 
36 /**
37  *  An EntryInformation object for GFFDocumentEntry objects.
38  *
39  *  @author Kim Rutherford <kmr@sanger.ac.uk>
40  *  @version $Id: GFFEntryInformation.java,v 1.6 2007-06-14 16:01:38 tjc Exp $
41  **/
42 
43 public class GFFEntryInformation extends SimpleEntryInformation
44 {
45 
GFFEntryInformation()46   public GFFEntryInformation()
47   {
48     super();
49 
50     try
51     {
52       makeEntryInformation();
53     }
54     catch(QualifierInfoException e)
55     {
56       System.err.println("could not initialise the embl package: " +
57                           e.getMessage());
58       System.exit(1);
59     }
60     catch(IOException e)
61     {
62       System.err.println("could not initialise the embl package: " +
63                           e.getMessage());
64       System.exit(1);
65     }
66   }
67 
68 
69   /**
70    *  Return an EntryInformation object that is suitable for EMBL and GENBANK
71    *  entries.
72    **/
makeEntryInformation()73   private void makeEntryInformation()
74       throws IOException, QualifierInfoException
75   {
76     final InputStream feature_keys_stream =
77       Options.class.getResourceAsStream("/etc/feature_keys_gff");
78 
79     final InputStream qualifier_types_stream =
80       Options.class.getResourceAsStream("/etc/qualifier_types_gff");
81 
82     QualifierInfoVector qualifier_info_vector =
83       readQualifierInfo(qualifier_types_stream, feature_keys_stream);
84 
85     for(int i = 0 ; i < qualifier_info_vector.size() ; ++i)
86     {
87       final QualifierInfo qualifier_info =
88         qualifier_info_vector.elementAt(i);
89 
90       addQualifierInfo(qualifier_info);
91     }
92 
93     //
94     // include extra keys and qualifiers
95     final QualifierInfoVector extra_qualifiers =
96       Options.getOptions().getExtraGffQualifiers();
97     final StringVector extra_keys =
98       Options.getOptions().getOptionValues("extra_keys_gff");
99 
100     for(int i = 0 ; i < extra_keys.size() ; ++i)
101     {
102       final Key new_key = new Key((String)extra_keys.elementAt(i));
103       //System.out.println(new_key.toString());
104       addKey(new_key);
105     }
106 
107     for(int i = 0 ; i < extra_qualifiers.size() ; ++i)
108     {
109       final QualifierInfo new_qualifier_info = extra_qualifiers.elementAt(i);
110       //System.out.println(new_qualifier_info.getName());
111       addQualifierInfo(new_qualifier_info);
112     }
113 
114 //  entry_information.setEMBLFormat(true);
115   }
116 
117   /**
118    *  Read the possible feature key and qualifier names and types from the two
119    *  given streams (see etc/feature_keys and etc/qualifier_types for details
120    *  on the formats).
121    **/
122   private static QualifierInfoVector
readQualifierInfo(final InputStream qualifier_types_stream, final InputStream feature_keys_stream)123     readQualifierInfo(final InputStream qualifier_types_stream,
124                       final InputStream feature_keys_stream)
125       throws IOException
126   {
127 
128     final QualifierInfoVector return_vector = new QualifierInfoVector();
129 
130     Properties feature_properties = new Properties();
131     final Properties qualifier_properties = new Properties();
132 
133     feature_properties.load(feature_keys_stream);
134     qualifier_properties.load(qualifier_types_stream);
135 
136     // parse the feature_properties
137 
138     {
139       final Properties new_feature_properties = new Properties();
140       final Enumeration feature_enum = feature_properties.propertyNames();
141 
142       while(feature_enum.hasMoreElements())
143       {
144         String current_feature_name = (String) feature_enum.nextElement();
145 
146         final StringVector property_values =
147           Options.getPropertyValues(feature_properties, current_feature_name);
148 
149         new_feature_properties.put(current_feature_name, property_values);
150       }
151 
152       feature_properties = new_feature_properties;
153     }
154 
155     final Enumeration qualifier_enum = qualifier_properties.propertyNames();
156 
157     while(qualifier_enum.hasMoreElements())
158     {
159       String current_qualifier_name = (String) qualifier_enum.nextElement();
160 
161       final StringVector current_qualifier_values =
162         Options.getPropertyValues(qualifier_properties,
163                                   current_qualifier_name);
164 
165       final boolean once_only =
166         current_qualifier_values.elementAt(0).equals("yes");
167 
168       final String type_string = (String)current_qualifier_values.elementAt(1);
169 
170       // find the keys for which this qualifier name is valid or required
171 
172       final KeyVector valid_keys = new KeyVector();
173       final KeyVector required_keys = new KeyVector();
174 
175       final Enumeration features_enum = feature_properties.propertyNames();
176 
177       while(features_enum.hasMoreElements())
178       {
179         final String current_key_string = (String)features_enum.nextElement();
180 
181         final Key current_key = new Key(current_key_string);
182 
183         final StringVector current_feature_qualifiers =
184           (StringVector) feature_properties.get(current_key_string);
185 
186         if(current_feature_qualifiers.contains(current_qualifier_name))
187           valid_keys.add(current_key);
188         else
189           if(current_feature_qualifiers.contains("@" +
190                                                    current_qualifier_name))
191           {
192             valid_keys.add(current_key);
193             required_keys.add(current_key);
194           }
195       }
196 
197       final int type = QualifierInfo.getQualifierTypeID(type_string);
198 
199       final QualifierInfo qualifier_info =
200         new QualifierInfo(current_qualifier_name, type, valid_keys,
201                            required_keys, once_only);
202 
203       return_vector.add(qualifier_info);
204     }
205 
206     return return_vector;
207   }
208 }
209