package net.sf.jabref.imports;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import net.sf.jabref.BibtexEntry;
import net.sf.jabref.Globals;
import net.sf.jabref.AuthorList;
import net.sf.jabref.BibtexFields;
/**
* Imports a Biblioscape Tag File. The format is described on
* http://www.biblioscape.com/manual_bsp/Biblioscape_Tag_File.htm Several
* Biblioscape field types are ignored. Others are only included in the BibTeX
* field "comment".
*/
public class ScifinderImporter extends ImportFormat {
/**
* Return the name of this import format.
*/
public String getFormatName() {
return "Scifinder";
}
/*
* (non-Javadoc)
* @see net.sf.jabref.imports.ImportFormat#getCLIId()
*/
public String getCLIId() {
return "scifinder";
}
/**
* Check whether the source is in the correct format for this importer.
*/
public boolean isRecognizedFormat(InputStream stream) throws IOException {
BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream));
String str;
int i=0;
while (((str = in.readLine()) != null) && (i < 50)) {
if (str.trim().equals("START_RECORD"))
return true;
i++;
}
return false;
}
/**
* Parse the entries in the source, and return a List of BibtexEntry
* objects.
*/
public List<BibtexEntry> importEntries(InputStream stream) throws IOException {
ArrayList<BibtexEntry> bibitems = new ArrayList<BibtexEntry>();
StringBuffer sb = new StringBuffer();
BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream));
String str;
String number = "";
String country = "";
String kindcode = "";
while ((str = in.readLine()) != null){
sb.append(str);
}
String[] entries = sb.toString().split("START_RECORD");
HashMap<String, String> hm = new HashMap<String, String>();
for (int i = 1; i < entries.length; i++){
String[] fields = entries[i].split("FIELD ");
String journal = null;
String Type = "";
hm.clear(); // reset
for (int j = 0; j < fields.length; j++)
if (fields[j].indexOf(":") >= 0){
String tmp[] = new String[2];
tmp[0] = fields[j].substring(0, fields[j].indexOf(":"));
tmp[1] = fields[j].substring(fields[j].indexOf(":") + 1).trim();
if (tmp.length > 1){//==2
if (tmp[0].equals("Author")) hm.put("author", AuthorList.fixAuthor_lastNameFirst(tmp[1].replaceAll(";", " and ")));
else if (tmp[0].equals("Title")) hm.put("title", tmp[1]);
else if (tmp[0].equals("Journal Title")) {
journal = tmp[1];
}
else if (tmp[0].equals("Volume")) hm.put("volume", tmp[1]);
else if (tmp[0].equals("Page")) hm.put("pages", tmp[1]);
else if (tmp[0].equals("Publication Year")) hm.put("year", tmp[1]);
else if (tmp[0].equals("Abstract")) hm.put("abstract", tmp[1]);
else if (tmp[0].equals("Supplementary Terms")) hm.put("keywords",
tmp[1]);
else if (tmp[0].equals("Inventor Name") && (tmp[1].trim().length() > 0)) hm.put("author", AuthorList.fixAuthor_lastNameFirst(tmp[1].replaceAll(";", " and ")));
else if (tmp[0].equals("Patent Assignee")) hm.put("institution", tmp[1]);
else if (tmp[0].equals("Patent Kind Code")) kindcode = " " + tmp[1];
else if (tmp[0].equals("Patent Country")) country = tmp[1] + " ";
else if (tmp[0].equals("Patent Number")) number = tmp[1];
else if (tmp[0].equals("Priority Application Date")) hm.put("number", country + number + kindcode);
else if (tmp[0].equals("Document Type")) {
if (tmp[1].startsWith("Journal") || tmp[1].startsWith("Review"))
Type = "article";
else if (tmp[1].equals("Dissertation"))
Type = "phdthesis";
else if (tmp[1].equals("Patent"))
Type = "patent";
else if (tmp[1].startsWith("Conference"))
Type = "conference";
else
Type = tmp[1];
}
}
}
BibtexEntry b = new BibtexEntry(BibtexFields.DEFAULT_BIBTEXENTRY_ID, Globals
.getEntryType(Type)); // id assumes an existing database so don't
// create one here
b.setField(hm);
if (journal != null) {
if (Type.equals("conference"))
b.setField("booktitle", journal);
else
b.setField("journal", journal);
}
bibitems.add(b);
}
return bibitems;
}
}