View Javadoc

1   package uk.ac.ebi.intenz.tools.sib;
2   
3   import java.io.File;
4   import java.io.IOException;
5   import java.sql.Connection;
6   import java.sql.SQLException;
7   import java.text.SimpleDateFormat;
8   import java.util.ArrayList;
9   import java.util.Date;
10  import java.util.List;
11  
12  import org.apache.log4j.Logger;
13  
14  import uk.ac.ebi.biobabel.util.db.OracleDatabaseInstance;
15  import uk.ac.ebi.intenz.domain.constants.Status;
16  import uk.ac.ebi.intenz.domain.enzyme.EnzymeCommissionNumber;
17  import uk.ac.ebi.intenz.domain.enzyme.EnzymeEntry;
18  import uk.ac.ebi.intenz.domain.enzyme.EnzymeCommissionNumber.Type;
19  import uk.ac.ebi.intenz.domain.exceptions.DomainException;
20  import uk.ac.ebi.intenz.mapper.EnzymeEntryMapper;
21  import uk.ac.ebi.intenz.tools.sib.helper.SibEntryHelper;
22  import uk.ac.ebi.intenz.tools.sib.sptr_enzyme.EnzymeEntryImpl;
23  import uk.ac.ebi.intenz.tools.sib.writer.EnzymeFlatFileWriter;
24  import uk.ac.ebi.interfaces.sptr.SPTRException;
25  import uk.ac.ebi.xchars.SpecialCharacters;
26  import uk.ac.ebi.xchars.domain.EncodingType;
27  
28  /**
29   * This class provides methods for exporting enzyme data into the ENZYME flat file format.
30   *
31   * @author Michael Darsow
32   * @version $Revision: 1.2 $ $Date: 2008/01/28 11:43:22 $
33   */
34  public class EnzymeFlatFileWriterApp {
35  
36    private static final Logger LOGGER =
37  	  Logger.getLogger(EnzymeFlatFileWriterApp.class.getName());
38  
39  
40    private static float versionNumber = 1.0f;
41    private static String versionNumberString ="1";
42    /**
43     * Exports all IntEnz entries containing only data valid for the ENZYME database.
44     * <p/>
45     * The resulting file follows the same format as the <code><b>enzyme.dat</b></code> file format.
46     *
47     * @param args
48     * <ol>
49     * 	<li>EC number of a single entry.</li>
50     * </ol>
51     * If not passed, the whole database is dumped.
52     */
53    public static void main(String[] args) {
54  
55  	  assignDateAsVersion();
56  
57  	  List allEnzymes = null;
58  	  allEnzymes = getAllEnzymes(args);
59  	  if (allEnzymes == null) { // exit if an error occured while loading the data
60  		  System.exit(1);
61  	  }
62  
63  	  try {
64  		  LOGGER.info("Exporting '" + ApplicationResources.getInstance().getExportFlatFileName() + "...");
65  		  Long elapsedTimeForExporting = new Long(EnzymeFlatFileWriter.export(allEnzymes, "" + versionNumberString,
66  				  new File(ApplicationResources.getInstance().getExportFlatFileName())));
67  		  LOGGER.info("...export finished (" + (elapsedTimeForExporting.floatValue() / 1000) + " s)");
68  	  } catch (SPTRException e) {
69  		  LOGGER.error("SPTRException: ", e);
70  	  }
71    }
72  
73  
74  
75  
76     // --------------------------- PRIVATE METHODS ------------------------------------------------
77     /**
78      * Helper method used while not in production to assign a date to each flat-file
79      * currently produced on a nightly basis.<br/>
80      */
81     private static void assignDateAsVersion () {
82        try{
83          versionNumberString = new SimpleDateFormat("yyyyMMdd").format(new Date(System.currentTimeMillis())).toString();
84        }catch (NumberFormatException e){
85           LOGGER.error(e);
86           System.exit(1);
87        }
88     }
89  
90    /**
91     * Retrieves all ENZYME data and stores the individual entries in an
92     * {@link java.util.ArrayList}.
93     * @param args
94     * <ol>
95     * 	<li>EC number of a single entry.</li>
96     * </ol>
97     * If not passed, the whole database is dumped.
98     * @return an {@link java.util.ArrayList} of all entries containing only
99     * ENZYME data or <code>null</code> if an error occured.
100    */
101   private static List getAllEnzymes(String[] args) {
102     LOGGER.debug("Getting all enzymes.");
103     Connection con = null;
104     List allEnzymes = new ArrayList();
105     Long errorId = null;
106     String errorEc = null;
107     try {
108       String dbConfig = ApplicationResources.getInstance().getDbConfig();
109       con = OracleDatabaseInstance.getInstance(dbConfig).getConnection();
110       con.setAutoCommit(false);
111 
112       EnzymeEntryMapper enzymeEntryMapper = new EnzymeEntryMapper();
113       List sibEntries = null;
114        // exports all views excluding the NC-IUBMB view
115       if (args == null || args.length == 0){
116     	  sibEntries = enzymeEntryMapper.exportApprovedSibEntries(con);
117       } else {
118     	  sibEntries = new ArrayList();
119     	  EnzymeCommissionNumber ec = EnzymeCommissionNumber.valueOf(args[0]);
120           EnzymeEntry entry = enzymeEntryMapper.findByEc(
121     			  ec.getEc1(), ec.getEc2(), ec.getEc3(), ec.getEc4(),
122     			  ec.getType().equals(Type.PRELIMINARY)? Status.PRELIMINARY : Status.APPROVED,
123     			  con);
124     	  sibEntries.add(entry);
125       }
126       if (sibEntries != null) {
127         SpecialCharacters encoding = SpecialCharacters.getInstance(null);
128          // populating SPTR interfaces from domain EnzymeEntry
129          for (int iii = 0; iii < sibEntries.size(); iii++) {
130           EnzymeEntry enzymeEntry = (EnzymeEntry) sibEntries.get(iii);
131           errorId = enzymeEntry.getId();
132           errorEc = enzymeEntry.getEc().toString();
133           EnzymeEntryImpl sibEnzymeEntry = SibEntryHelper.getSibEnzymeEntry(enzymeEntry, encoding, EncodingType.SWISSPROT_CODE);
134           allEnzymes.add(sibEnzymeEntry);
135         }
136       } else {
137         LOGGER.fatal("No ENZYME data could be retreived from the database.");
138         return null;
139       }
140     } catch (IOException e) {
141       LOGGER.error("Unable to read database configuration: ", e);
142       return null;
143     } catch (DomainException e) {
144       LOGGER.error("Domain exception: ", e);
145       return null;
146     } catch (SPTRException e) {
147       LOGGER.error(errorEc + " [" + errorId + "] - SPTRException: ", e);
148       return null;
149     } catch (SQLException e) {
150       LOGGER.error(errorEc + " [" + errorId + "] - Error while loading ENZYME data from the database: ", e);
151       return null;
152     } catch (Exception e) {
153       LOGGER.error(errorEc + " [" + errorId + "]", e);
154       return null;
155     } finally {
156       try {
157         con.close();
158       } catch (SQLException e) {
159         LOGGER.error("Error while closing the database connection: ", e);
160       }
161     }
162 
163     return allEnzymes;
164   }
165 
166   /**
167    * Checks the arguments taken from the command line.
168    * <p/>
169    * For further info see {@link uk.ac.ebi.intenz.tools.sib.EnzymeFlatFileWriterApp#main(String[])}.
170    *
171    * @param args The arguments to be checked.
172    * @return <code>true</code> if the arguments are ok.
173    */
174   private static boolean argumentsOk(String[] args) {
175     if (args.length == 2) {
176       if (args[0].equals("version")) {
177         try {
178           Float argVersionNumber = new Float(args[1]);
179           versionNumber = argVersionNumber.floatValue();
180           LOGGER.info("Version number: "+versionNumber);
181         } catch (NumberFormatException e) {
182           System.err.println("The version number is not a valid floating-point number.");
183           return false;
184         }
185       }
186     } else {
187       System.err.println("Please provide a version number as shown below.");
188       return false;
189     }
190     return true;
191   }
192 
193   /**
194    * Prints usage information of this class to the console.
195    */
196   private static void printHelp() {
197     StringBuilder help = new StringBuilder();
198     help.append("Usage: java EnzymeFlatFileWriterApp version <version number>\n");
199     help.append("The <version number> must be a valid floating-point number and will be used in the version line of the flat file's header.\n");
200     help.append("Examples: java EnzymeFlatFileWriterApp version 33.0\n");
201     help.append("          java EnzymeFlatFileWriterApp version 33.12\n");
202     System.out.println(help.toString());
203   }
204 
205 
206 }