package org.jabref.logic.protectedterms;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.jabref.logic.l10n.Localization;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Reads abbreviation files (property files using NAME = ABBREVIATION as a format) into a list of Abbreviations.
*/
public class ProtectedTermsParser {
private static final Log LOGGER = LogFactory.getLog(ProtectedTermsParser.class);
private final List<String> terms = new ArrayList<>();
private String description = Localization.lang("The text after the last line starting with # will be used");
private String location;
public void readTermsFromResource(String resourceFileName, String descriptionString) {
URL url = Objects
.requireNonNull(ProtectedTermsLoader.class.getResource(Objects.requireNonNull(resourceFileName)));
description = descriptionString;
location = resourceFileName;
try {
readTermsList(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));
} catch (IOException e) {
LOGGER.info("Could not read protected terms from resource " + resourceFileName, e);
}
}
public void readTermsFromFile(File file) throws FileNotFoundException {
location = file.getAbsolutePath();
try (FileReader reader = new FileReader(Objects.requireNonNull(file))) {
readTermsList(reader);
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
LOGGER.warn("Could not read terms from file " + file.getAbsolutePath(), e);
}
}
public void readTermsFromFile(File file, Charset encoding) throws FileNotFoundException {
location = file.getAbsolutePath();
try (FileInputStream stream = new FileInputStream(Objects.requireNonNull(file));
InputStreamReader reader = new InputStreamReader(stream, Objects.requireNonNull(encoding))) {
readTermsList(reader);
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
LOGGER.warn("Could not read terms from file " + file.getAbsolutePath(), e);
}
}
/**
* Read the given file, which should contain a list of journal names and their
* abbreviations. Each line should be formatted as: "Full Journal Name=Abbr. Journal Name"
*
* @param in
*/
private void readTermsList(Reader in) {
try (BufferedReader reader = new BufferedReader(in)) {
String line;
while ((line = reader.readLine()) != null) {
addLine(line);
}
} catch (IOException ex) {
LOGGER.info("Could not read journal list from file ", ex);
}
}
private void addLine(String line) {
if (line.startsWith("#")) {
description = line.substring(1).trim();
return;
}
this.terms.add(line);
}
public ProtectedTermsList getProtectTermsList(boolean enabled, boolean internal) {
ProtectedTermsList termList = new ProtectedTermsList(description, terms, location, internal);
termList.setEnabled(enabled);
return termList;
}
}