package org.jabref.logic.importer.fileformat;
import java.io.BufferedReader;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.jabref.logic.importer.Importer;
import org.jabref.logic.importer.ParserResult;
import org.jabref.logic.util.FileExtensions;
/**
* Object with data for a custom importer.
*
* <p>Is also responsible for instantiating the class loader.</p>
*/
public class CustomImporter extends Importer {
private final String className;
private final Path basePath;
private Importer importer;
public CustomImporter(String basePath, String className) throws ClassNotFoundException {
this.basePath = Paths.get(basePath);
this.className = className;
try {
importer = load(this.basePath.toUri().toURL(), this.className);
} catch (IOException | InstantiationException | IllegalAccessException exception) {
throw new ClassNotFoundException("", exception);
}
}
private static Importer load(URL basePathURL, String className)
throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
try (URLClassLoader cl = new URLClassLoader(new URL[] {basePathURL})) {
Class<?> clazz = Class.forName(className, true, cl);
return (Importer) clazz.newInstance();
}
}
public List<String> getAsStringList() {
return Arrays.asList(basePath.toString().replace('\\', '/'), className);
}
public String getClassName() {
return className;
}
public Path getBasePath() {
return basePath;
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof CustomImporter)) {
return false;
}
CustomImporter otherImporter = (CustomImporter) other;
return Objects.equals(className, otherImporter.className) && Objects.equals(basePath, otherImporter.basePath);
}
@Override
public boolean isRecognizedFormat(BufferedReader input) throws IOException {
return importer.isRecognizedFormat(input);
}
@Override
public ParserResult importDatabase(BufferedReader input) throws IOException {
return importer.importDatabase(input);
}
@Override
public String getName() {
return importer.getName();
}
@Override
public FileExtensions getExtensions() {
return importer.getExtensions();
}
@Override
public String getId() {
return importer.getId();
}
@Override
public String getDescription() {
return importer.getDescription();
}
@Override
public int hashCode() {
return Objects.hash(className, basePath);
}
@Override
public String toString() {
return this.getName();
}
}