package org.jabref.logic.importer;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import org.jabref.model.database.BibDatabase;
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.database.BibDatabases;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.EntryType;
import org.jabref.model.metadata.MetaData;
public class ParserResult {
private final Map<String, EntryType> entryTypes;
private final List<String> warnings = new ArrayList<>();
private final List<String> duplicateKeys = new ArrayList<>();
private BibDatabase database;
private MetaData metaData = new MetaData();
private File file;
private boolean invalid;
private boolean toOpenTab;
public ParserResult() {
this(Collections.emptyList());
}
public ParserResult(Collection<BibEntry> entries) {
this(BibDatabases.createDatabase(BibDatabases.purgeEmptyEntries(entries)));
}
public ParserResult(BibDatabase database) {
this(database, new MetaData(), new HashMap<>());
}
public ParserResult(BibDatabase database, MetaData metaData, Map<String, EntryType> entryTypes) {
this.database = Objects.requireNonNull(database);
this.metaData = Objects.requireNonNull(metaData);
this.entryTypes = Objects.requireNonNull(entryTypes);
}
public static ParserResult fromErrorMessage(String message) {
ParserResult parserResult = new ParserResult();
parserResult.addWarning(message);
parserResult.setInvalid(true);
return parserResult;
}
private static String getErrorMessage(Exception exception) {
String errorMessage = exception.getLocalizedMessage();
if (exception.getCause() != null) {
errorMessage += " Caused by: " + exception.getCause().getLocalizedMessage();
}
return errorMessage;
}
public static ParserResult fromError(Exception exception) {
return fromErrorMessage(getErrorMessage(exception));
}
/**
* Check if this database is marked to be added to the currently open tab. Default is false.
*/
public boolean toOpenTab() {
return toOpenTab;
}
public void setToOpenTab() {
this.toOpenTab = true;
}
public BibDatabase getDatabase() {
return database;
}
public MetaData getMetaData() {
return metaData;
}
public void setMetaData(MetaData md) {
this.metaData = md;
}
public Map<String, EntryType> getEntryTypes() {
return entryTypes;
}
public Optional<File> getFile() {
return Optional.ofNullable(file);
}
public void setFile(File f) {
file = f;
}
/**
* Add a parser warning.
*
* @param s String Warning text. Must be pretranslated. Only added if there isn't already a dupe.
*/
public void addWarning(String s) {
if (!warnings.contains(s)) {
warnings.add(s);
}
}
public void addException(Exception exception) {
String errorMessage = getErrorMessage(exception);
addWarning(errorMessage);
}
public boolean hasWarnings() {
return !warnings.isEmpty();
}
public List<String> warnings() {
return new ArrayList<>(warnings);
}
/**
* Add a key to the list of duplicated BibTeX keys found in the database.
*
* @param key The duplicated key
*/
public void addDuplicateKey(String key) {
if (!duplicateKeys.contains(key)) {
duplicateKeys.add(key);
}
}
/**
* Query whether any duplicated BibTeX keys have been found in the database.
*
* @return true if there is at least one duplicate key.
*/
public boolean hasDuplicateKeys() {
return !duplicateKeys.isEmpty();
}
/**
* Get all duplicated keys found in the database.
*
* @return A list containing the duplicated keys.
*/
public List<String> getDuplicateKeys() {
return duplicateKeys;
}
public boolean isInvalid() {
return invalid;
}
public void setInvalid(boolean invalid) {
this.invalid = invalid;
}
public String getErrorMessage() {
return warnings().stream().collect(Collectors.joining(" "));
}
public BibDatabaseContext getDatabaseContext() {
return new BibDatabaseContext(database, metaData, file);
}
public void setDatabaseContext(BibDatabaseContext bibDatabaseContext) {
Objects.requireNonNull(bibDatabaseContext);
database = bibDatabaseContext.getDatabase();
metaData = bibDatabaseContext.getMetaData();
file = bibDatabaseContext.getDatabaseFile().orElse(null);
}
public boolean isEmpty() {
return this == new ParserResult();
}
}