package org.jabref.model.entry.specialfields; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Optional; import org.jabref.model.entry.KeywordList; public enum SpecialField { PRINTED("printed", SpecialFieldValue.PRINTED ), PRIORITY("priority", SpecialFieldValue.CLEAR_PRIORITY, SpecialFieldValue.PRIORITY_HIGH, SpecialFieldValue.PRIORITY_MEDIUM, SpecialFieldValue.PRIORITY_LOW ), QUALITY("qualityassured", SpecialFieldValue.QUALITY_ASSURED ), RANKING("ranking", SpecialFieldValue.CLEAR_RANK, SpecialFieldValue.RANK_1, SpecialFieldValue.RANK_2, SpecialFieldValue.RANK_3, SpecialFieldValue.RANK_4, SpecialFieldValue.RANK_5 ), READ_STATUS("readstatus", SpecialFieldValue.CLEAR_READ_STATUS, SpecialFieldValue.READ, SpecialFieldValue.SKIMMED ), RELEVANCE("relevance", SpecialFieldValue.RELEVANT ); private List<SpecialFieldValue> values; private KeywordList keywords; private HashMap<String, SpecialFieldValue> map; private String fieldName; SpecialField(String fieldName, SpecialFieldValue... values) { this.fieldName = fieldName; this.values = new ArrayList<>(); this.keywords = new KeywordList(); this.map = new HashMap<>(); for (SpecialFieldValue value : values) { this.values.add(value); value.getKeyword().ifPresent(keywords::add); value.getFieldValue().ifPresent(fieldValue -> map.put(fieldValue, value)); } } public List<SpecialFieldValue> getValues() { return this.values; } public KeywordList getKeyWords() { return this.keywords; } public Optional<SpecialFieldValue> parse(String value) { return Optional.ofNullable(map.get(value)); } public String getFieldName() { return fieldName; } public boolean isSingleValueField() { return this.values.size() == 1; } public static Optional<SpecialField> getSpecialFieldInstanceFromFieldName(String fieldName) { switch (fieldName) { case "priority": return Optional.of(SpecialField.PRIORITY); case "qualityassured": return Optional.of(SpecialField.QUALITY); case "ranking": return Optional.of(SpecialField.RANKING); case "readstatus": return Optional.of(SpecialField.READ_STATUS); case "relevance": return Optional.of(SpecialField.RELEVANCE); case "printed": return Optional.of(SpecialField.PRINTED); default: return Optional.empty(); } } /** * @param fieldName the name of the field to check * @return true if given field is a special field, false otherwise */ public static boolean isSpecialField(String fieldName) { return SpecialField.getSpecialFieldInstanceFromFieldName(fieldName).isPresent(); } }