package eu.dnetlib.iis.wf.affmatching.orgalternativenames; import static java.util.stream.Collectors.toList; import java.io.Serializable; import java.util.List; import java.util.Set; import com.google.common.collect.Lists; import eu.dnetlib.iis.wf.affmatching.model.AffMatchOrganization; /** * Filler of {@link AffMatchOrganization#getAlternativeNames()} list * based on a dictionary of alternative organization names. * * @author madryk */ public class AffMatchOrganizationAltNameFiller implements Serializable { private static final long serialVersionUID = 1L; private List<Set<String>> alternativeNamesDictionary = Lists.newArrayList(); //------------------------ LOGIC -------------------------- /** * Fills {@link AffMatchOrganization#getAlternativeNames()} list with * alternative names found in dictionary.<br/> * Method is looking for alternative names in dictionary * based on equality of {@link AffMatchOrganization#getName()} * or any of the {@link AffMatchOrganization#getAlternativeNames()} that * was already present in passed organization. * * Notice that method modifies {@link AffMatchOrganization#getAlternativeNames()} * of the passed organization.<br/> */ public AffMatchOrganization fillAlternativeNames(AffMatchOrganization organization) { List<String> alternativeNames = fetchAlternativeNames(organization.getNames()); alternativeNames.stream().forEach(altName -> organization.addAlternativeName(altName)); return organization; } //------------------------ PRIVATE -------------------------- private List<String> fetchAlternativeNames(List<String> originalNames) { for (Set<String> alternativeNames : alternativeNamesDictionary) { if (containsSameOrganizationName(originalNames, alternativeNames)) { return filterAlreadyPresentAlternativeNames(alternativeNames, originalNames); } } return Lists.newArrayList(); } private boolean containsSameOrganizationName(List<String> originalNames, Set<String> alternativeNames) { return originalNames.stream().anyMatch(orgName -> alternativeNames.contains(orgName)); } private List<String> filterAlreadyPresentAlternativeNames(Set<String> alternativeNames, List<String> originalNames) { return alternativeNames.stream().filter(altName -> !originalNames.contains(altName)).collect(toList()); } //------------------------ SETTERS -------------------------- /** * Dictionary of alternative organization names */ public void setAlternativeNamesDictionary(List<Set<String>> alternativeNamesDictionary) { this.alternativeNamesDictionary = alternativeNamesDictionary; } }