2020-05-27 11:34:13 +02:00
|
|
|
|
2021-01-25 15:43:04 +01:00
|
|
|
package eu.dnetlib.dhp.common.vocabulary;
|
2020-05-27 11:34:13 +02:00
|
|
|
|
2020-05-29 18:17:30 +02:00
|
|
|
import java.io.Serializable;
|
2020-05-27 11:34:13 +02:00
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.Map;
|
2020-06-09 17:20:40 +02:00
|
|
|
import java.util.Optional;
|
|
|
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
|
|
import com.google.common.collect.Maps;
|
|
|
|
|
|
|
|
import eu.dnetlib.dhp.schema.oaf.Qualifier;
|
2021-04-27 15:44:01 +02:00
|
|
|
import eu.dnetlib.dhp.schema.oaf.utils.OafMapperUtils;
|
2020-05-27 11:34:13 +02:00
|
|
|
|
2020-05-29 18:17:30 +02:00
|
|
|
public class Vocabulary implements Serializable {
|
2020-05-27 11:34:13 +02:00
|
|
|
|
|
|
|
private final String id;
|
|
|
|
private final String name;
|
|
|
|
|
2020-06-09 17:20:40 +02:00
|
|
|
/**
|
|
|
|
* Code to Term mappings for this Vocabulary.
|
|
|
|
*/
|
2020-05-27 11:34:13 +02:00
|
|
|
private final Map<String, VocabularyTerm> terms = new HashMap<>();
|
|
|
|
|
2020-06-09 17:20:40 +02:00
|
|
|
/**
|
|
|
|
* Synonym to Code mappings for this Vocabulary.
|
|
|
|
*/
|
|
|
|
private final Map<String, String> synonyms = Maps.newHashMap();
|
|
|
|
|
2020-05-27 11:34:13 +02:00
|
|
|
public Vocabulary(final String id, final String name) {
|
|
|
|
this.id = id;
|
|
|
|
this.name = name;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getId() {
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getName() {
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected Map<String, VocabularyTerm> getTerms() {
|
|
|
|
return terms;
|
|
|
|
}
|
|
|
|
|
|
|
|
public VocabularyTerm getTerm(final String id) {
|
2021-08-11 12:13:22 +02:00
|
|
|
return Optional.ofNullable(id).map(String::toLowerCase).map(terms::get).orElse(null);
|
2020-05-27 11:34:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
protected void addTerm(final String id, final String name) {
|
|
|
|
terms.put(id.toLowerCase(), new VocabularyTerm(id, name));
|
|
|
|
}
|
|
|
|
|
|
|
|
protected boolean termExists(final String id) {
|
|
|
|
return terms.containsKey(id.toLowerCase());
|
|
|
|
}
|
2020-06-09 17:20:40 +02:00
|
|
|
|
|
|
|
protected void addSynonym(final String syn, final String termCode) {
|
|
|
|
synonyms.put(syn, termCode.toLowerCase());
|
|
|
|
}
|
|
|
|
|
|
|
|
public VocabularyTerm getTermBySynonym(final String syn) {
|
2020-06-15 18:32:24 +02:00
|
|
|
return getTerm(synonyms.get(syn.toLowerCase()));
|
2020-06-09 17:20:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public Qualifier getTermAsQualifier(final String termId) {
|
|
|
|
if (StringUtils.isBlank(termId)) {
|
|
|
|
return OafMapperUtils.unknown(getId(), getName());
|
|
|
|
} else if (termExists(termId)) {
|
|
|
|
final VocabularyTerm t = getTerm(termId);
|
|
|
|
return OafMapperUtils.qualifier(t.getId(), t.getName(), getId(), getName());
|
|
|
|
} else {
|
|
|
|
return OafMapperUtils.qualifier(termId, termId, getId(), getName());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public Qualifier getSynonymAsQualifier(final String syn) {
|
|
|
|
return Optional
|
|
|
|
.ofNullable(getTermBySynonym(syn))
|
|
|
|
.map(term -> getTermAsQualifier(term.getId()))
|
|
|
|
.orElse(null);
|
|
|
|
}
|
|
|
|
|
2022-08-05 09:11:37 +02:00
|
|
|
public Qualifier lookup(String id) {
|
|
|
|
return Optional
|
2022-08-05 12:32:08 +02:00
|
|
|
.ofNullable(getSynonymAsQualifier(id))
|
|
|
|
.orElse(getTermAsQualifier(id));
|
2022-08-05 09:11:37 +02:00
|
|
|
}
|
|
|
|
|
2020-05-27 11:34:13 +02:00
|
|
|
}
|