package edu.unc.ils.mrc.hive.converter.itis;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import edu.unc.ils.mrc.hive.converter.itis.model.Taxon;
import edu.unc.ils.mrc.hive.converter.itis.model.Taxonomy;
public class ITISConverter {
/**
* @param args
* @throws FileNotFoundException
*/
public static void main(String[] args) throws SQLException,
FileNotFoundException {
File out = new File("/tmp/itis.rdf");
PrintWriter pw = new PrintWriter(out);
Taxonomy taxonomy = new Taxonomy();
// Create a data source and set access data
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser("root");
//dataSource.setPassword("l3g10nar10");
dataSource.setDatabaseName("ITIS");
dataSource.setServerName("localhost");
// Getting the connection
Connection conexion = dataSource.getConnection();
Statement st = conexion.createStatement();
ResultSet rs = st.executeQuery("select * from longnames");
Map<String, String> tsnMap = new HashMap<String, String>();
while (rs.next()) // printing results
{
String tsn = rs.getString("tsn");
String name = rs.getString("completename");
tsnMap.put(tsn, name);
}
st.close();
rs.close();
Statement st2 = conexion.createStatement();
ResultSet rs2 = st2.executeQuery("select tsn,parent_tsn, name_usage from taxonomic_units");
Map<String, String> parentMap = new HashMap<String, String>();
Map<String, Boolean> acceptedMap = new HashMap<String, Boolean>();
HashMap<String, ArrayList<String>> childMap = new HashMap<String, ArrayList<String>>();
while (rs2.next()) {
String tsn = rs2.getString("tsn");
String parentTsn = rs2.getString("parent_tsn");
parentMap.put(tsn, parentTsn);
ArrayList<String> children = childMap.get(parentTsn);
if (children == null) {
children = new ArrayList<String>();
children.add(tsn);
childMap.put(parentTsn, children);
} else {
children.add(tsn);
childMap.put(parentTsn, children);
}
String nameUsage = rs2.getString("name_usage");
boolean accepted = false;
if (nameUsage.equals("accepted") || nameUsage.equals("valid"))
accepted = true;
acceptedMap.put(tsn, accepted);
}
st2.close();
rs2.close();
// getting parent URI
Statement st3 = conexion.createStatement();
ResultSet rs3 = st3.executeQuery("select tsn, vernacular_name from vernaculars");
Map<String, List<String>> commonNames = new HashMap<String, List<String>>();
while (rs3.next()) {
String tsn = rs3.getString("tsn");
String name = rs3.getString("vernacular_name");
List<String> names = commonNames.get(tsn);
if (names == null) {
names = new ArrayList<String>();
names.add(name);
commonNames.put(tsn, names);
} else {
names.add(name);
commonNames.put(tsn, names);
}
}
st3.close();
rs3.close();
Statement st4 = conexion.createStatement();
ResultSet rs4 = st4.executeQuery("select tsn, tsn_accepted from synonym_links");
Map<String, List<String>> synonyms = new HashMap<String, List<String>>();
while (rs4.next()) {
String tsnSynonym = rs4.getString("tsn");
String tsnAccepted = rs4.getString("tsn_accepted");
String name = tsnMap.get(tsnSynonym);
List<String> tsns = synonyms.get(tsnAccepted);
if (tsns == null) {
tsns = new ArrayList<String>();
tsns.add(name);
synonyms.put(tsnAccepted, tsns);
} else {
tsns.add(name);
synonyms.put(tsnAccepted, tsns);
}
}
st4.close();
rs4.close();
for (String tsn: tsnMap.keySet()) {
if (acceptedMap.get(tsn) == null || !acceptedMap.get(tsn))
continue;
String parentTsn = parentMap.get(tsn);
List<String> syns = new ArrayList<String>();
List<String> children = childMap.get(tsn);
List<String> vernaculars = commonNames.get(tsn);
List<String> s = synonyms.get(tsn);
String name = tsnMap.get(tsn);
if (s != null)
syns.addAll(s);
if (vernaculars != null)
syns.addAll(vernaculars);
Taxon taxon = new Taxon(tsn);
taxon.setLongName(name);
if (!parentTsn.equals("0"))
taxon.setParent(parentTsn);
taxon.setChilds(children);
taxon.setSynonyms(syns);
taxonomy.putTaxon(tsn, taxon);
System.out.println("TSN " + tsn + ", completename= " + name);
}
pw.println(taxonomy.getHeader());
for (Taxon t : taxonomy.getTaxons()) {
pw.println(t.toSKOS());
}
pw.println(taxonomy.getFooter());
// Closing database connections
conexion.close();
pw.close();
}
}