package eu.dnetlib.dhp.bulktag.community; import java.io.Serializable; import java.util.*; import java.util.stream.Collectors; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import eu.dnetlib.dhp.bulktag.criteria.InterfaceAdapter; import eu.dnetlib.dhp.bulktag.criteria.Selection; /** Created by miriam on 02/08/2018. */ public class CommunityConfiguration implements Serializable { private Map communities; // map subject -> communityid private Map>> subjectMap = new HashMap<>(); // map datasourceid -> communityid private Map>> datasourceMap = new HashMap<>(); // map zenodocommunityid -> communityid private Map>> zenodocommunityMap = new HashMap<>(); // map communityid -> selectionconstraints private Map selectionConstraintsMap = new HashMap<>(); // map eosc datasource -> communityid private Map>> eoscDatasourceMap = new HashMap<>(); // map communityid -> remove constraints private Map removeConstraintsMap = new HashMap<>(); public Map>> getEoscDatasourceMap() { return eoscDatasourceMap; } public void setEoscDatasourceMap(Map>> eoscDatasourceMap) { this.eoscDatasourceMap = eoscDatasourceMap; } public Map>> getSubjectMap() { return subjectMap; } public void setSubjectMap(Map>> subjectMap) { this.subjectMap = subjectMap; } public Map>> getDatasourceMap() { return datasourceMap; } public void setDatasourceMap( Map>> datasourceMap) { this.datasourceMap = datasourceMap; } public Map>> getZenodocommunityMap() { return zenodocommunityMap; } public void setZenodocommunityMap( Map>> zenodocommunityMap) { this.zenodocommunityMap = zenodocommunityMap; } public Map getSelectionConstraintsMap() { return selectionConstraintsMap; } public void setSelectionConstraintsMap(Map selectionConstraintsMap) { this.selectionConstraintsMap = selectionConstraintsMap; } public Map getRemoveConstraintsMap() { return removeConstraintsMap; } public void setRemoveConstraintsMap(Map removeConstraintsMap) { this.removeConstraintsMap = removeConstraintsMap; } CommunityConfiguration(final Map communities) { this.communities = communities; init(); } void init() { if (subjectMap == null) { subjectMap = Maps.newHashMap(); } if (datasourceMap == null) { datasourceMap = Maps.newHashMap(); } if (zenodocommunityMap == null) { zenodocommunityMap = Maps.newHashMap(); } if (selectionConstraintsMap == null) { selectionConstraintsMap = Maps.newHashMap(); } if (removeConstraintsMap == null) { removeConstraintsMap = Maps.newHashMap(); } for (Community c : getCommunities().values()) { // get subjects final String id = c.getId(); for (String sbj : c.getSubjects()) { Pair p = new Pair<>(id, new SelectionConstraints()); add(sbj.toLowerCase().trim(), p, subjectMap); } // get datasources for (Provider d : c.getProviders()) { add(d.getOpenaireId(), new Pair<>(id, d.getSelectionConstraints()), datasourceMap); } // get zenodo communities for (ZenodoCommunity zc : c.getZenodoCommunities()) { add( zc.getZenodoCommunityId(), new Pair<>(id, zc.getSelCriteria()), zenodocommunityMap); } selectionConstraintsMap.put(id, c.getConstraints()); removeConstraintsMap.put(id, c.getRemoveConstraints()); } } private void add( String key, Pair value, Map>> map) { List> values = map.get(key); if (values == null) { values = new ArrayList<>(); map.put(key, values); } values.add(value); } public List> getCommunityForSubject(String sbj) { return subjectMap.get(sbj); } public List> getCommunityForDatasource(String dts) { return datasourceMap.get(dts); } public List getCommunityForDatasource( final String dts, final Map> param) { List> lp = datasourceMap.get(dts); if (lp == null) return Lists.newArrayList(); return lp .stream() .map( p -> { if (p.getSnd() == null) return p.getFst(); if (p.getSnd().verifyCriteria(param)) return p.getFst(); else return null; }) .filter(Objects::nonNull) .collect(Collectors.toList()); } public boolean isEoscDatasource(final String dts) { return eoscDatasourceMap.containsKey(dts); } public List> getCommunityForZenodoCommunity(String zc) { return zenodocommunityMap.get(zc); } public List getCommunityForSubjectValue(String value) { return getContextIds(subjectMap.get(value)); } public List getCommunityForDatasourceValue(String value) { return getContextIds(datasourceMap.get(value.toLowerCase())); } public List getCommunityForZenodoCommunityValue(String value) { return getContextIds(zenodocommunityMap.get(value.toLowerCase())); } private List getContextIds(List> list) { if (list != null) { return list.stream().map(Pair::getFst).collect(Collectors.toList()); } return Lists.newArrayList(); } public Map getCommunities() { return communities; } public void setCommunities(Map communities) { this.communities = communities; } public String toJson() { GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(Selection.class, new InterfaceAdapter()); Gson gson = builder.create(); return gson.toJson(this); } public int size() { return communities.keySet().size(); } public Community getCommunityById(String id) { return communities.get(id); } public List getCommunityList() { return Lists.newLinkedList(communities.values()); } }