package net.sf.jabref.imports;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import net.sf.jabref.BibtexEntry;
/**
* Role of an importer for JabRef.
*
* <p>Importers are sorted according to following criteria
* <ol><li>
* custom importers come first, then importers shipped with JabRef
* </li><li>
* then importers are sorted by name.
* </li></ol>
* </p>
*/
public abstract class ImportFormat implements Comparable<ImportFormat> {
private boolean isCustomImporter;
/**
* Constructor for custom importers.
*/
public ImportFormat() {
this.isCustomImporter = false;
}
/**
* Check whether the source is in the correct format for this importer.
*/
public abstract boolean isRecognizedFormat(InputStream in) throws IOException;
/**
* Parse the entries in the source, and return a List of BibtexEntry
* objects.
*/
public abstract List<BibtexEntry> importEntries(InputStream in) throws IOException;
/**
* Name of this import format.
*
* <p>The name must be unique.</p>
*
* @return format name, must be unique and not <code>null</code>
*/
public abstract String getFormatName();
/**
* Extensions that this importer can read.
*
* @return comma separated list of extensions or <code>null</code> for the default
*/
public String getExtensions() {
return null;
}
/**
* Short, one token ID to identify the format from the command line.
*
* @return command line ID
*/
public String getCLIId() {
String id = getFormatName();
StringBuffer result = new StringBuffer(id.length());
for (int i = 0; i < id.length(); i++) {
char c = id.charAt(i);
if (Character.isLetterOrDigit(c)) {
result.append(Character.toLowerCase(c));
}
}
return result.toString();
}
/**
* Description of the ImportFormat.
*
* <p>Implementors of ImportFormats should override this. Ideally, it should specify
* <ul><li>
* what kind of entries from what sources and based on what specification it is able to import
* </li><li>
* by what criteria it {@link #isRecognizedFormat(InputStream) recognizes} an import format
* </li></ul>
*
* @return description of the import format
*/
public String getDescription() {
return "No description available for " + getFormatName() + ".";
}
/**
* Sets if this is a custom importer.
*
* <p>For custom importers added dynamically to JabRef, this will be
* set automatically by JabRef.</p>
*
* @param isCustomImporter if this is a custom importer
*/
public final void setIsCustomImporter(boolean isCustomImporter) {
this.isCustomImporter = isCustomImporter;
}
/**
* Wether this importer is a custom importer.
*
* <p>Custom importers will have precedence over built-in importers.</p>
*
* @return wether this is a custom importer
*/
public final boolean getIsCustomImporter() {
return this.isCustomImporter;
}
/*
* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return getFormatName().hashCode();
}
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object o) {
return o != null
&& o instanceof ImportFormat
&& ((ImportFormat)o).getIsCustomImporter() == getIsCustomImporter()
&& ((ImportFormat)o).getFormatName().equals(getFormatName());
}
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return getFormatName();
}
/*
* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
public int compareTo(ImportFormat importer) {
int result = 0;
if (getIsCustomImporter() == importer.getIsCustomImporter()) {
result = getFormatName().compareTo(importer.getFormatName());
} else {
result = getIsCustomImporter() ? 1 : -1;
}
return result;
}
}