package uni.projecte.dataLayer.ThesaurusManager.xml;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import android.util.Log;
import uni.projecte.controler.ThesaurusControler;
public class PlainThesaurusReader {
/*
* Fields contained in the Thesaurus - Darwin Core 2 ->
* http://wiki.tdwg.org/twiki/bin/view/DarwinCore/DarwinCoreDraftStandard
*
*
* Genus | SpecificEpithet | | InfraspecificRank | InfraspecificEpithet | | primaryKey | foreignKey
* | authorSpecies | | authorSubspecies |
*
*/
public static String GENUS="Genus"; /* 0 */
public static String SPECIFIC_EPITHET="SpecificEpithet"; /* 1 */
public static String SPECIFIC_EPITHET_AUTHOR="SpecificEpithetAuthor"; /* 2 */
public static String INFRA_SPECIFIC_RANK="InfraspecificRank"; /* 3 */
public static String INFRA_SPECIFIC_EPITHET="InfraspecificEpithet"; /* 4 */
public static String INFRA_SPECIFIC_EPITHET_AUTHOR="InfraspecificEpithetAuthor"; /* 5 */
public static String PRIMARY_KEY="PrimaryKey"; /* 6 */
public static String SECONDARY_KEY="SecondaryKey"; /* 7 */
//private String taxonSeparator;
private String fieldSeparator="\t";
private ThesaurusControler thCont;
private String[] fields;
private int[] fieldsPosition;
private String fileName;
private boolean omitFirstLine;
private boolean scape;
/*
*
* InfraspecificRank: {"subsp.", "var.", "forma."}
*
* Taxon separator -> taxonSeparator: { ";" , "\n", .... }
* Field separator-> fieldSeparator: { ";" , " ", ......}
*
*/
public PlainThesaurusReader(String fileName,String fieldSeparator){
this.fieldSeparator=fieldSeparator;
this.fileName=fileName;
}
private int[] getFieldsCorrespondase(String[] fields) {
int n=fields.length;
int[] fieldsOrder=new int[n];
for(int i=0; i<n; i++){
if(fields[i].equals(GENUS)) fieldsOrder[i]=0;
else if(fields[i].equals(SPECIFIC_EPITHET)) fieldsOrder[i]=1;
else if(fields[i].equals(SPECIFIC_EPITHET_AUTHOR)) fieldsOrder[i]=2;
else if(fields[i].equals(INFRA_SPECIFIC_RANK)) fieldsOrder[i]=3;
else if(fields[i].equals(INFRA_SPECIFIC_EPITHET)) fieldsOrder[i]=4;
else if(fields[i].equals(INFRA_SPECIFIC_EPITHET_AUTHOR)) fieldsOrder[i]=5;
else if(fields[i].equals(PRIMARY_KEY)) fieldsOrder[i]=6;
else if(fields[i].equals(SECONDARY_KEY)) fieldsOrder[i]=7;
else fieldsOrder[i]=-1;
}
return fieldsOrder;
}
public String readFileFirstLine(){
String strLine="";
try{
FileInputStream fstream = new FileInputStream(fileName);
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
strLine = br.readLine();
in.close();
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
return "";
}
return strLine;
}
public boolean readFile(String[] fields, ThesaurusControler thCont){
this.fields=fields;
this.thCont=thCont;
this.fieldsPosition=getFieldsCorrespondase(fields);
boolean omitFirst=omitFirstLine;
try{
FileInputStream fstream = new FileInputStream(fileName);
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
thCont.startTransaction();
while ((strLine = br.readLine()) != null) {
if(omitFirst) omitFirst=false;
else readTaxon(strLine);
}
in.close();
}catch (Exception e){
return true;
}
return false;
}
/*
* Example:
*
* taxonSeparator="\n"
* fieldSeparator="\t"
*
* Tadorna"\t"tadorna\n
* Plectropterus\tgambensis\n
* Nettapus\tcoromandelianus\n
*
*
*/
public long readTaxon(String line){
String[] splittedItems=line.split(fieldSeparator);
if(splittedItems.length == fields.length){
insertIntoDataBase(splittedItems);
}
/* Wrong format */
else{
}
return -1;
}
private void insertIntoDataBase(String[] values){
ThesaurusItem thItem= new ThesaurusItem();
thItem.mapThItem(values,fieldsPosition,scape);
long thItemId=thCont.addThElement(thItem);
Log.i("ThReader","ThId: "+thItemId+" "+thItem.printElement());
}
public boolean isOmitFirstLine() {
return omitFirstLine;
}
public boolean isScape() {
return scape;
}
public void setOmitFirstLine(boolean omitFirstLine) {
this.omitFirstLine = omitFirstLine;
}
public void setScape(boolean scape) {
this.scape = scape;
}
public String getFieldSeparator() {
return fieldSeparator;
}
public void setFieldSeparator(String fieldSeparator) {
this.fieldSeparator = fieldSeparator;
}
}