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