2022-07-20 11:38:40 +02:00
|
|
|
|
|
|
|
package eu.dnetlib.dhp.oa.graph.dump;
|
|
|
|
|
2022-11-10 09:37:54 +01:00
|
|
|
import static eu.dnetlib.dhp.oa.graph.dump.Constants.*;
|
|
|
|
|
2022-07-20 11:38:40 +02:00
|
|
|
import java.io.Serializable;
|
|
|
|
import java.util.*;
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
2023-06-01 12:58:56 +02:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2022-08-04 14:23:19 +02:00
|
|
|
|
2022-08-03 11:42:56 +02:00
|
|
|
import eu.dnetlib.dhp.oa.graph.dump.exceptions.CardinalityTooHighException;
|
2022-07-20 11:38:40 +02:00
|
|
|
import eu.dnetlib.dhp.oa.graph.dump.exceptions.NoAvailableEntityTypeException;
|
2022-08-03 11:42:56 +02:00
|
|
|
import eu.dnetlib.dhp.oa.model.*;
|
|
|
|
import eu.dnetlib.dhp.oa.model.AccessRight;
|
|
|
|
import eu.dnetlib.dhp.oa.model.Author;
|
|
|
|
import eu.dnetlib.dhp.oa.model.GeoLocation;
|
2022-08-03 12:25:32 +02:00
|
|
|
import eu.dnetlib.dhp.oa.model.Indicator;
|
2022-08-03 11:42:56 +02:00
|
|
|
import eu.dnetlib.dhp.oa.model.Instance;
|
|
|
|
import eu.dnetlib.dhp.oa.model.OpenAccessRoute;
|
|
|
|
import eu.dnetlib.dhp.oa.model.Result;
|
2023-06-01 12:58:56 +02:00
|
|
|
import eu.dnetlib.dhp.oa.model.Subject;
|
2022-08-03 11:42:56 +02:00
|
|
|
import eu.dnetlib.dhp.oa.model.community.CfHbKeyValue;
|
|
|
|
import eu.dnetlib.dhp.oa.model.community.CommunityInstance;
|
|
|
|
import eu.dnetlib.dhp.oa.model.community.CommunityResult;
|
|
|
|
import eu.dnetlib.dhp.oa.model.community.Context;
|
|
|
|
import eu.dnetlib.dhp.oa.model.graph.GraphResult;
|
2022-07-20 11:38:40 +02:00
|
|
|
import eu.dnetlib.dhp.schema.common.ModelConstants;
|
|
|
|
import eu.dnetlib.dhp.schema.oaf.*;
|
|
|
|
|
|
|
|
public class ResultMapper implements Serializable {
|
|
|
|
|
|
|
|
public static <E extends eu.dnetlib.dhp.schema.oaf.OafEntity> Result map(
|
2022-08-03 11:42:56 +02:00
|
|
|
E in, Map<String, String> communityMap, String dumpType)
|
|
|
|
throws NoAvailableEntityTypeException, CardinalityTooHighException {
|
2022-07-20 11:38:40 +02:00
|
|
|
|
|
|
|
Result out;
|
|
|
|
if (Constants.DUMPTYPE.COMPLETE.getType().equals(dumpType)) {
|
|
|
|
out = new GraphResult();
|
|
|
|
} else {
|
|
|
|
out = new CommunityResult();
|
|
|
|
}
|
|
|
|
|
|
|
|
eu.dnetlib.dhp.schema.oaf.Result input = (eu.dnetlib.dhp.schema.oaf.Result) in;
|
|
|
|
Optional<eu.dnetlib.dhp.schema.oaf.Qualifier> ort = Optional.ofNullable(input.getResulttype());
|
|
|
|
if (ort.isPresent()) {
|
|
|
|
try {
|
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
addTypeSpecificInformation(out, input, ort.get());
|
|
|
|
mapAuthor(out, input);
|
|
|
|
mapAccessRight(out, input);
|
|
|
|
mapContributor(out, input);
|
|
|
|
mapCountry(out, input);
|
|
|
|
mapCoverage(out, input);
|
|
|
|
out.setDateofcollection(input.getDateofcollection());
|
|
|
|
mapDescription(out, input);
|
|
|
|
mapEmbargo(out, input);
|
|
|
|
mapFormat(out, input);
|
|
|
|
out.setId(input.getId().substring(3));
|
|
|
|
mapOriginalId(out, input);
|
|
|
|
mapInstance(dumpType, out, input);
|
|
|
|
mapLanguage(out, input);
|
|
|
|
mapLastUpdateTimestamp(out, input);
|
|
|
|
mapTitle(out, input);
|
|
|
|
mapPid(out, input);
|
|
|
|
mapDateOfAcceptance(out, input);
|
|
|
|
mapPublisher(out, input);
|
|
|
|
mapSource(out, input);
|
|
|
|
mapSubject(out, input);
|
|
|
|
out.setType(input.getResulttype().getClassid());
|
|
|
|
mapMeasure(out, input);
|
|
|
|
if (!Constants.DUMPTYPE.COMPLETE.getType().equals(dumpType)) {
|
|
|
|
mapCollectedfrom((CommunityResult) out, input);
|
|
|
|
mapContext(communityMap, (CommunityResult) out, input);
|
|
|
|
}
|
|
|
|
} catch (ClassCastException cce) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
return out;
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapContext(Map<String, String> communityMap, CommunityResult out,
|
|
|
|
eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Set<String> communities = communityMap.keySet();
|
|
|
|
List<Context> contextList = Optional
|
|
|
|
.ofNullable(
|
|
|
|
input
|
|
|
|
.getContext())
|
|
|
|
.map(
|
|
|
|
value -> value
|
|
|
|
.stream()
|
|
|
|
.map(c -> {
|
|
|
|
String communityId = c.getId();
|
|
|
|
if (communityId.contains("::")) {
|
|
|
|
communityId = communityId.substring(0, communityId.indexOf("::"));
|
|
|
|
}
|
|
|
|
if (communities.contains(communityId)) {
|
|
|
|
Context context = new Context();
|
|
|
|
context.setCode(communityId);
|
|
|
|
context.setLabel(communityMap.get(communityId));
|
|
|
|
Optional<List<DataInfo>> dataInfo = Optional.ofNullable(c.getDataInfo());
|
|
|
|
if (dataInfo.isPresent()) {
|
|
|
|
List<Provenance> provenance = new ArrayList<>();
|
|
|
|
provenance
|
|
|
|
.addAll(
|
|
|
|
dataInfo
|
|
|
|
.get()
|
|
|
|
.stream()
|
|
|
|
.map(
|
|
|
|
di -> Optional
|
|
|
|
.ofNullable(di.getProvenanceaction())
|
|
|
|
.map(
|
|
|
|
provenanceaction -> Provenance
|
|
|
|
.newInstance(
|
|
|
|
provenanceaction.getClassname(),
|
|
|
|
di.getTrust()))
|
|
|
|
.orElse(null))
|
|
|
|
.filter(Objects::nonNull)
|
|
|
|
.collect(Collectors.toSet()));
|
|
|
|
|
|
|
|
try {
|
|
|
|
context.setProvenance(getUniqueProvenance(provenance));
|
|
|
|
} catch (NoAvailableEntityTypeException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return context;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
})
|
|
|
|
.filter(Objects::nonNull)
|
|
|
|
.collect(Collectors.toList()))
|
|
|
|
.orElse(new ArrayList<>());
|
|
|
|
|
|
|
|
if (!contextList.isEmpty()) {
|
|
|
|
Set<Integer> hashValue = new HashSet<>();
|
|
|
|
List<Context> remainigContext = new ArrayList<>();
|
|
|
|
contextList.forEach(c -> {
|
|
|
|
if (!hashValue.contains(c.hashCode())) {
|
|
|
|
remainigContext.add(c);
|
|
|
|
hashValue.add(c.hashCode());
|
2022-07-20 11:38:40 +02:00
|
|
|
}
|
2023-06-01 12:58:56 +02:00
|
|
|
});
|
|
|
|
out.setContext(remainigContext);
|
|
|
|
}
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapCollectedfrom(CommunityResult out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
out
|
|
|
|
.setCollectedfrom(
|
|
|
|
input
|
|
|
|
.getCollectedfrom()
|
|
|
|
.stream()
|
2023-07-28 10:26:22 +02:00
|
|
|
.map(cf -> CfHbKeyValue.newInstance(cf.getKey().substring(3), cf.getValue()))
|
2023-06-01 12:58:56 +02:00
|
|
|
.collect(Collectors.toList()));
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapMeasure(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
if (Optional.ofNullable(input.getMeasures()).isPresent() && input.getMeasures().size() > 0) {
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
out.setIndicators(Utils.getIndicator(input.getMeasures()));
|
|
|
|
}
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapSubject(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
List<Subject> subjectList = new ArrayList<>();
|
|
|
|
Optional
|
|
|
|
.ofNullable(input.getSubject())
|
|
|
|
.ifPresent(
|
|
|
|
value -> value
|
|
|
|
.stream()
|
2023-07-11 12:40:21 +02:00
|
|
|
// .filter(
|
|
|
|
// s -> !((s.getQualifier().getClassid().equalsIgnoreCase("fos") &&
|
|
|
|
// Optional.ofNullable(s.getDataInfo()).isPresent()
|
|
|
|
// && Optional.ofNullable(s.getDataInfo().getProvenanceaction()).isPresent() &&
|
|
|
|
// s.getDataInfo().getProvenanceaction().getClassid().equalsIgnoreCase("subject:fos"))
|
|
|
|
// ||
|
|
|
|
// (s.getQualifier().getClassid().equalsIgnoreCase("sdg") &&
|
|
|
|
// Optional.ofNullable(s.getDataInfo()).isPresent()
|
|
|
|
// && Optional.ofNullable(s.getDataInfo().getProvenanceaction()).isPresent() &&
|
|
|
|
// s
|
|
|
|
// .getDataInfo()
|
|
|
|
// .getProvenanceaction()
|
|
|
|
// .getClassid()
|
|
|
|
// .equalsIgnoreCase("subject:sdg"))))
|
2023-06-01 12:58:56 +02:00
|
|
|
.forEach(s -> subjectList.add(getSubject(s))));
|
|
|
|
|
|
|
|
out.setSubjects(subjectList);
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapSource(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Optional
|
|
|
|
.ofNullable(input.getSource())
|
|
|
|
.ifPresent(
|
|
|
|
value -> out.setSource(value.stream().map(Field::getValue).collect(Collectors.toList())));
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapPublisher(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Optional<Field<String>> oStr;
|
|
|
|
oStr = Optional.ofNullable(input.getPublisher());
|
|
|
|
if (oStr.isPresent()) {
|
|
|
|
out.setPublisher(oStr.get().getValue());
|
|
|
|
}
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapDateOfAcceptance(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Optional<Field<String>> oStr;
|
|
|
|
oStr = Optional.ofNullable(input.getDateofacceptance());
|
|
|
|
if (oStr.isPresent()) {
|
|
|
|
out.setPublicationdate(oStr.get().getValue());
|
|
|
|
}
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapPid(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Optional
|
|
|
|
.ofNullable(input.getPid())
|
|
|
|
.ifPresent(
|
|
|
|
value -> out
|
|
|
|
.setPid(
|
|
|
|
value
|
|
|
|
.stream()
|
|
|
|
.map(
|
|
|
|
p -> ResultPid
|
|
|
|
.newInstance(p.getQualifier().getClassid(), p.getValue()))
|
|
|
|
.collect(Collectors.toList())));
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapTitle(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Optional<List<StructuredProperty>> otitle = Optional.ofNullable(input.getTitle());
|
|
|
|
if (otitle.isPresent()) {
|
|
|
|
List<StructuredProperty> iTitle = otitle
|
|
|
|
.get()
|
|
|
|
.stream()
|
|
|
|
.filter(t -> t.getQualifier().getClassid().equalsIgnoreCase("main title"))
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
if (!iTitle.isEmpty()) {
|
|
|
|
out.setMaintitle(iTitle.get(0).getValue());
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
iTitle = otitle
|
|
|
|
.get()
|
|
|
|
.stream()
|
|
|
|
.filter(t -> t.getQualifier().getClassid().equalsIgnoreCase("subtitle"))
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
if (!iTitle.isEmpty()) {
|
|
|
|
out.setSubtitle(iTitle.get(0).getValue());
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
}
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapLastUpdateTimestamp(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Optional<Long> oLong = Optional.ofNullable(input.getLastupdatetimestamp());
|
|
|
|
if (oLong.isPresent()) {
|
|
|
|
out.setLastupdatetimestamp(oLong.get());
|
|
|
|
}
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapLanguage(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Optional<Qualifier> oL = Optional.ofNullable(input.getLanguage());
|
|
|
|
if (oL.isPresent()) {
|
|
|
|
Qualifier language = oL.get();
|
|
|
|
out.setLanguage(Language.newInstance(language.getClassid(), language.getClassname()));
|
|
|
|
}
|
|
|
|
}
|
2022-11-10 09:37:54 +01:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapInstance(String dumpType, Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Optional<List<eu.dnetlib.dhp.schema.oaf.Instance>> oInst = Optional
|
|
|
|
.ofNullable(input.getInstance());
|
2022-09-22 15:50:39 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
if (oInst.isPresent()) {
|
|
|
|
if (DUMPTYPE.COMPLETE.getType().equals(dumpType)) {
|
|
|
|
((GraphResult) out)
|
|
|
|
.setInstance(
|
|
|
|
oInst.get().stream().map(ResultMapper::getGraphInstance).collect(Collectors.toList()));
|
|
|
|
} else {
|
|
|
|
((CommunityResult) out)
|
|
|
|
.setInstance(
|
|
|
|
oInst
|
|
|
|
.get()
|
|
|
|
.stream()
|
|
|
|
.map(ResultMapper::getCommunityInstance)
|
|
|
|
.collect(Collectors.toList()));
|
2022-07-20 11:38:40 +02:00
|
|
|
}
|
|
|
|
}
|
2023-06-01 12:58:56 +02:00
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapOriginalId(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
out.setOriginalId(new ArrayList<>());
|
|
|
|
Optional
|
|
|
|
.ofNullable(input.getOriginalId())
|
|
|
|
.ifPresent(
|
|
|
|
v -> out
|
|
|
|
.setOriginalId(
|
|
|
|
input
|
|
|
|
.getOriginalId()
|
|
|
|
.stream()
|
|
|
|
.filter(s -> !s.startsWith("50|"))
|
|
|
|
.collect(Collectors.toList())));
|
|
|
|
}
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapFormat(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
final List<String> formatList = new ArrayList<>();
|
|
|
|
Optional
|
|
|
|
.ofNullable(input.getFormat())
|
|
|
|
.ifPresent(value -> value.stream().forEach(f -> formatList.add(f.getValue())));
|
|
|
|
out.setFormat(formatList);
|
2022-07-20 11:38:40 +02:00
|
|
|
}
|
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapEmbargo(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Optional<Field<String>> oStr = Optional.ofNullable(input.getEmbargoenddate());
|
|
|
|
if (oStr.isPresent()) {
|
|
|
|
out.setEmbargoenddate(oStr.get().getValue());
|
2022-11-10 09:37:54 +01:00
|
|
|
}
|
2023-06-01 12:58:56 +02:00
|
|
|
}
|
2022-11-10 09:37:54 +01:00
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapDescription(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
final List<String> descriptionList = new ArrayList<>();
|
|
|
|
Optional
|
|
|
|
.ofNullable(input.getDescription())
|
|
|
|
.ifPresent(value -> value.forEach(d -> descriptionList.add(d.getValue())));
|
|
|
|
out.setDescription(descriptionList);
|
2022-11-10 09:37:54 +01:00
|
|
|
}
|
|
|
|
|
2023-06-01 12:58:56 +02:00
|
|
|
private static void mapCoverage(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
final List<String> coverageList = new ArrayList<>();
|
|
|
|
Optional
|
|
|
|
.ofNullable(input.getCoverage())
|
|
|
|
.ifPresent(value -> value.stream().forEach(c -> coverageList.add(c.getValue())));
|
|
|
|
out.setCoverage(coverageList);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void mapCountry(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Optional
|
|
|
|
.ofNullable(input.getCountry())
|
|
|
|
.ifPresent(
|
|
|
|
value -> out
|
|
|
|
.setCountry(
|
|
|
|
value
|
|
|
|
.stream()
|
|
|
|
.map(
|
|
|
|
c -> {
|
|
|
|
if (c.getClassid().equals((ModelConstants.UNKNOWN))) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
ResultCountry country = new ResultCountry();
|
|
|
|
country.setCode(c.getClassid());
|
|
|
|
country.setLabel(c.getClassname());
|
|
|
|
Optional
|
|
|
|
.ofNullable(c.getDataInfo())
|
|
|
|
.ifPresent(
|
|
|
|
provenance -> country
|
|
|
|
.setProvenance(
|
|
|
|
Provenance
|
|
|
|
.newInstance(
|
|
|
|
provenance
|
|
|
|
.getProvenanceaction()
|
|
|
|
.getClassname(),
|
|
|
|
c.getDataInfo().getTrust())));
|
|
|
|
return country;
|
|
|
|
})
|
|
|
|
.filter(Objects::nonNull)
|
|
|
|
.collect(Collectors.toList())));
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void mapContributor(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
final List<String> contributorList = new ArrayList<>();
|
|
|
|
Optional
|
|
|
|
.ofNullable(input.getContributor())
|
|
|
|
.ifPresent(value -> value.stream().forEach(c -> contributorList.add(c.getValue())));
|
|
|
|
out.setContributor(contributorList);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void mapAccessRight(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
// I do not map Access Right UNKNOWN or OTHER
|
|
|
|
|
|
|
|
Optional<Qualifier> oar = Optional.ofNullable(input.getBestaccessright());
|
|
|
|
if (oar.isPresent() && Constants.ACCESS_RIGHTS_COAR_MAP.containsKey(oar.get().getClassid())) {
|
|
|
|
String code = Constants.ACCESS_RIGHTS_COAR_MAP.get(oar.get().getClassid());
|
|
|
|
out
|
|
|
|
.setBestaccessright(
|
|
|
|
|
|
|
|
BestAccessRight
|
|
|
|
.newInstance(
|
|
|
|
code,
|
|
|
|
Constants.COAR_CODE_LABEL_MAP.get(code),
|
|
|
|
Constants.COAR_ACCESS_RIGHT_SCHEMA));
|
2022-11-10 09:37:54 +01:00
|
|
|
}
|
2023-06-01 12:58:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private static void mapAuthor(Result out, eu.dnetlib.dhp.schema.oaf.Result input) {
|
|
|
|
Optional
|
|
|
|
.ofNullable(input.getAuthor())
|
|
|
|
.ifPresent(
|
|
|
|
ats -> out.setAuthor(ats.stream().map(ResultMapper::getAuthor).collect(Collectors.toList())));
|
2022-11-10 09:37:54 +01:00
|
|
|
}
|
|
|
|
|
2022-07-20 11:38:40 +02:00
|
|
|
private static void addTypeSpecificInformation(Result out, eu.dnetlib.dhp.schema.oaf.Result input,
|
2023-06-01 12:58:56 +02:00
|
|
|
eu.dnetlib.dhp.schema.oaf.Qualifier ort) throws NoAvailableEntityTypeException {
|
|
|
|
switch (ort.getClassid()) {
|
2022-07-20 11:38:40 +02:00
|
|
|
case "publication":
|
|
|
|
Optional<Journal> journal = Optional
|
|
|
|
.ofNullable(((Publication) input).getJournal());
|
|
|
|
if (journal.isPresent()) {
|
|
|
|
Journal j = journal.get();
|
|
|
|
Container c = new Container();
|
|
|
|
c.setConferencedate(j.getConferencedate());
|
|
|
|
c.setConferenceplace(j.getConferenceplace());
|
|
|
|
c.setEdition(j.getEdition());
|
|
|
|
c.setEp(j.getEp());
|
|
|
|
c.setIss(j.getIss());
|
|
|
|
c.setIssnLinking(j.getIssnLinking());
|
|
|
|
c.setIssnOnline(j.getIssnOnline());
|
|
|
|
c.setIssnPrinted(j.getIssnPrinted());
|
|
|
|
c.setName(j.getName());
|
|
|
|
c.setSp(j.getSp());
|
|
|
|
c.setVol(j.getVol());
|
|
|
|
out.setContainer(c);
|
|
|
|
out.setType(ModelConstants.PUBLICATION_DEFAULT_RESULTTYPE.getClassname());
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "dataset":
|
|
|
|
Dataset id = (Dataset) input;
|
|
|
|
Optional.ofNullable(id.getSize()).ifPresent(v -> out.setSize(v.getValue()));
|
|
|
|
Optional.ofNullable(id.getVersion()).ifPresent(v -> out.setVersion(v.getValue()));
|
|
|
|
|
|
|
|
out
|
|
|
|
.setGeolocation(
|
|
|
|
Optional
|
|
|
|
.ofNullable(id.getGeolocation())
|
|
|
|
.map(
|
|
|
|
igl -> igl
|
|
|
|
.stream()
|
|
|
|
.filter(Objects::nonNull)
|
|
|
|
.map(gli -> {
|
|
|
|
GeoLocation gl = new GeoLocation();
|
|
|
|
gl.setBox(gli.getBox());
|
|
|
|
gl.setPlace(gli.getPlace());
|
|
|
|
gl.setPoint(gli.getPoint());
|
|
|
|
return gl;
|
|
|
|
})
|
|
|
|
.collect(Collectors.toList()))
|
|
|
|
.orElse(null));
|
|
|
|
|
|
|
|
out.setType(ModelConstants.DATASET_DEFAULT_RESULTTYPE.getClassname());
|
|
|
|
break;
|
|
|
|
case "software":
|
|
|
|
|
|
|
|
Software is = (Software) input;
|
|
|
|
Optional
|
|
|
|
.ofNullable(is.getCodeRepositoryUrl())
|
|
|
|
.ifPresent(value -> out.setCodeRepositoryUrl(value.getValue()));
|
|
|
|
Optional
|
|
|
|
.ofNullable(is.getDocumentationUrl())
|
|
|
|
.ifPresent(
|
|
|
|
value -> out
|
|
|
|
.setDocumentationUrl(
|
|
|
|
value
|
|
|
|
.stream()
|
|
|
|
.map(Field::getValue)
|
|
|
|
.collect(Collectors.toList())));
|
|
|
|
|
|
|
|
Optional
|
|
|
|
.ofNullable(is.getProgrammingLanguage())
|
|
|
|
.ifPresent(value -> out.setProgrammingLanguage(value.getClassid()));
|
|
|
|
|
|
|
|
out.setType(ModelConstants.SOFTWARE_DEFAULT_RESULTTYPE.getClassname());
|
|
|
|
break;
|
|
|
|
case "other":
|
|
|
|
|
|
|
|
OtherResearchProduct ir = (OtherResearchProduct) input;
|
|
|
|
out
|
|
|
|
.setContactgroup(
|
|
|
|
Optional
|
|
|
|
.ofNullable(ir.getContactgroup())
|
|
|
|
.map(value -> value.stream().map(Field::getValue).collect(Collectors.toList()))
|
|
|
|
.orElse(null));
|
|
|
|
|
|
|
|
out
|
|
|
|
.setContactperson(
|
|
|
|
Optional
|
|
|
|
.ofNullable(ir.getContactperson())
|
|
|
|
.map(value -> value.stream().map(Field::getValue).collect(Collectors.toList()))
|
|
|
|
.orElse(null));
|
|
|
|
out
|
|
|
|
.setTool(
|
|
|
|
Optional
|
|
|
|
.ofNullable(ir.getTool())
|
|
|
|
.map(value -> value.stream().map(Field::getValue).collect(Collectors.toList()))
|
|
|
|
.orElse(null));
|
|
|
|
|
|
|
|
out.setType(ModelConstants.ORP_DEFAULT_RESULTTYPE.getClassname());
|
|
|
|
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
throw new NoAvailableEntityTypeException();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static Instance getGraphInstance(eu.dnetlib.dhp.schema.oaf.Instance i) {
|
|
|
|
Instance instance = new Instance();
|
|
|
|
|
|
|
|
setCommonValue(i, instance);
|
|
|
|
|
|
|
|
return instance;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private static CommunityInstance getCommunityInstance(eu.dnetlib.dhp.schema.oaf.Instance i) {
|
|
|
|
CommunityInstance instance = new CommunityInstance();
|
|
|
|
|
|
|
|
setCommonValue(i, instance);
|
|
|
|
|
2023-08-07 13:56:58 +02:00
|
|
|
if (Optional.ofNullable(i.getCollectedfrom()).isPresent() &&
|
|
|
|
Optional.ofNullable(i.getCollectedfrom().getKey()).isPresent() &&
|
|
|
|
StringUtils.isNotBlank(i.getCollectedfrom().getKey()))
|
|
|
|
instance
|
|
|
|
.setCollectedfrom(
|
|
|
|
CfHbKeyValue
|
|
|
|
.newInstance(i.getCollectedfrom().getKey().substring(3), i.getCollectedfrom().getValue()));
|
2022-07-20 11:38:40 +02:00
|
|
|
|
2023-08-07 13:56:58 +02:00
|
|
|
if (Optional.ofNullable(i.getHostedby()).isPresent() &&
|
|
|
|
Optional.ofNullable(i.getHostedby().getKey()).isPresent() &&
|
|
|
|
StringUtils.isNotBlank(i.getHostedby().getKey()))
|
|
|
|
instance
|
|
|
|
.setHostedby(
|
|
|
|
CfHbKeyValue.newInstance(i.getHostedby().getKey().substring(3), i.getHostedby().getValue()));
|
2022-07-20 11:38:40 +02:00
|
|
|
|
|
|
|
return instance;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private static <I extends Instance> void setCommonValue(eu.dnetlib.dhp.schema.oaf.Instance i, I instance) {
|
|
|
|
Optional<eu.dnetlib.dhp.schema.oaf.AccessRight> opAr = Optional.ofNullable(i.getAccessright());
|
|
|
|
|
2022-10-11 10:57:50 +02:00
|
|
|
if (opAr.isPresent() && Constants.ACCESS_RIGHTS_COAR_MAP.containsKey(opAr.get().getClassid())) {
|
|
|
|
String code = Constants.ACCESS_RIGHTS_COAR_MAP.get(opAr.get().getClassid());
|
2022-07-20 11:38:40 +02:00
|
|
|
|
|
|
|
instance
|
|
|
|
.setAccessright(
|
|
|
|
AccessRight
|
|
|
|
.newInstance(
|
|
|
|
code,
|
2022-10-11 10:57:50 +02:00
|
|
|
Constants.COAR_CODE_LABEL_MAP.get(code),
|
2022-07-20 11:38:40 +02:00
|
|
|
Constants.COAR_ACCESS_RIGHT_SCHEMA));
|
|
|
|
|
|
|
|
if (opAr.get().getOpenAccessRoute() != null) {
|
|
|
|
switch (opAr.get().getOpenAccessRoute()) {
|
|
|
|
case hybrid:
|
|
|
|
instance.getAccessright().setOpenAccessRoute(OpenAccessRoute.hybrid);
|
|
|
|
break;
|
|
|
|
case gold:
|
|
|
|
instance.getAccessright().setOpenAccessRoute(OpenAccessRoute.gold);
|
|
|
|
break;
|
|
|
|
case green:
|
|
|
|
instance.getAccessright().setOpenAccessRoute(OpenAccessRoute.green);
|
|
|
|
break;
|
|
|
|
case bronze:
|
|
|
|
instance.getAccessright().setOpenAccessRoute(OpenAccessRoute.bronze);
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Optional
|
|
|
|
.ofNullable(i.getPid())
|
|
|
|
.ifPresent(
|
|
|
|
pid -> instance
|
|
|
|
.setPid(
|
|
|
|
pid
|
|
|
|
.stream()
|
|
|
|
.map(p -> ResultPid.newInstance(p.getQualifier().getClassid(), p.getValue()))
|
|
|
|
.collect(Collectors.toList())));
|
|
|
|
|
|
|
|
Optional
|
|
|
|
.ofNullable(i.getAlternateIdentifier())
|
|
|
|
.ifPresent(
|
|
|
|
ai -> instance
|
|
|
|
.setAlternateIdentifier(
|
|
|
|
ai
|
|
|
|
.stream()
|
|
|
|
.map(p -> AlternateIdentifier.newInstance(p.getQualifier().getClassid(), p.getValue()))
|
|
|
|
.collect(Collectors.toList())));
|
|
|
|
|
|
|
|
Optional
|
|
|
|
.ofNullable(i.getLicense())
|
|
|
|
.ifPresent(value -> instance.setLicense(value.getValue()));
|
|
|
|
Optional
|
|
|
|
.ofNullable(i.getDateofacceptance())
|
|
|
|
.ifPresent(value -> instance.setPublicationdate(value.getValue()));
|
|
|
|
Optional
|
|
|
|
.ofNullable(i.getRefereed())
|
|
|
|
.ifPresent(value -> instance.setRefereed(value.getClassname()));
|
|
|
|
Optional
|
|
|
|
.ofNullable(i.getInstancetype())
|
|
|
|
.ifPresent(value -> instance.setType(value.getClassname()));
|
|
|
|
Optional.ofNullable(i.getUrl()).ifPresent(value -> instance.setUrl(value));
|
|
|
|
Optional<Field<String>> oPca = Optional.ofNullable(i.getProcessingchargeamount());
|
|
|
|
Optional<Field<String>> oPcc = Optional.ofNullable(i.getProcessingchargecurrency());
|
|
|
|
if (oPca.isPresent() && oPcc.isPresent()) {
|
|
|
|
Field<String> pca = oPca.get();
|
|
|
|
Field<String> pcc = oPcc.get();
|
|
|
|
if (!pca.getValue().trim().equals("") && !pcc.getValue().trim().equals("")) {
|
|
|
|
APC apc = new APC();
|
|
|
|
apc.setCurrency(oPcc.get().getValue());
|
|
|
|
apc.setAmount(oPca.get().getValue());
|
|
|
|
instance.setArticleprocessingcharge(apc);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
Optional.ofNullable(i.getUrl()).ifPresent(instance::setUrl);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private static List<Provenance> getUniqueProvenance(List<Provenance> provenance)
|
|
|
|
throws NoAvailableEntityTypeException {
|
|
|
|
Provenance iProv = new Provenance();
|
|
|
|
|
|
|
|
Provenance hProv = new Provenance();
|
|
|
|
Provenance lProv = new Provenance();
|
|
|
|
|
|
|
|
for (Provenance p : provenance) {
|
|
|
|
switch (p.getProvenance()) {
|
|
|
|
case Constants.HARVESTED:
|
|
|
|
hProv = getHighestTrust(hProv, p);
|
|
|
|
break;
|
|
|
|
case Constants.INFERRED:
|
|
|
|
iProv = getHighestTrust(iProv, p);
|
|
|
|
// To be removed as soon as the new beta run has been done
|
|
|
|
// this fixex issue of not set trust during bulktagging
|
|
|
|
if (StringUtils.isEmpty(iProv.getTrust())) {
|
|
|
|
iProv.setTrust(Constants.DEFAULT_TRUST);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case Constants.USER_CLAIM:
|
|
|
|
lProv = getHighestTrust(lProv, p);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
throw new NoAvailableEntityTypeException();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return Arrays
|
|
|
|
.asList(iProv, hProv, lProv)
|
|
|
|
.stream()
|
|
|
|
.filter(p -> !StringUtils.isEmpty(p.getProvenance()))
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private static Provenance getHighestTrust(Provenance hProv, Provenance p) {
|
|
|
|
if (StringUtils.isNoneEmpty(hProv.getTrust(), p.getTrust()))
|
|
|
|
return hProv.getTrust().compareTo(p.getTrust()) > 0 ? hProv : p;
|
|
|
|
|
|
|
|
return (StringUtils.isEmpty(p.getTrust()) && !StringUtils.isEmpty(hProv.getTrust())) ? hProv : p;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private static Subject getSubject(StructuredProperty s) {
|
|
|
|
Subject subject = new Subject();
|
|
|
|
subject.setSubject(SubjectSchemeValue.newInstance(s.getQualifier().getClassid(), s.getValue()));
|
|
|
|
Optional<DataInfo> di = Optional.ofNullable(s.getDataInfo());
|
|
|
|
if (di.isPresent()) {
|
|
|
|
Provenance p = new Provenance();
|
|
|
|
p.setProvenance(di.get().getProvenanceaction().getClassname());
|
|
|
|
p.setTrust(di.get().getTrust());
|
|
|
|
subject.setProvenance(p);
|
|
|
|
}
|
|
|
|
|
|
|
|
return subject;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static Author getAuthor(eu.dnetlib.dhp.schema.oaf.Author oa) {
|
|
|
|
Author a = new Author();
|
|
|
|
a.setFullname(oa.getFullname());
|
|
|
|
a.setName(oa.getName());
|
|
|
|
a.setSurname(oa.getSurname());
|
|
|
|
a.setRank(oa.getRank());
|
|
|
|
|
|
|
|
Optional<List<StructuredProperty>> oPids = Optional
|
|
|
|
.ofNullable(oa.getPid());
|
|
|
|
if (oPids.isPresent()) {
|
|
|
|
AuthorPid pid = getOrcid(oPids.get());
|
|
|
|
if (pid != null) {
|
|
|
|
a.setPid(pid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return a;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static AuthorPid getAuthorPid(StructuredProperty pid) {
|
|
|
|
Optional<DataInfo> di = Optional.ofNullable(pid.getDataInfo());
|
|
|
|
if (di.isPresent()) {
|
|
|
|
return AuthorPid
|
|
|
|
.newInstance(
|
|
|
|
AuthorPidSchemeValue
|
|
|
|
.newInstance(
|
|
|
|
pid.getQualifier().getClassid(),
|
|
|
|
pid.getValue()),
|
|
|
|
Provenance
|
|
|
|
.newInstance(
|
|
|
|
di.get().getProvenanceaction().getClassname(),
|
|
|
|
di.get().getTrust()));
|
|
|
|
} else {
|
|
|
|
return AuthorPid
|
|
|
|
.newInstance(
|
|
|
|
AuthorPidSchemeValue
|
|
|
|
.newInstance(
|
|
|
|
pid.getQualifier().getClassid(),
|
|
|
|
pid.getValue())
|
|
|
|
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static AuthorPid getOrcid(List<StructuredProperty> p) {
|
|
|
|
List<StructuredProperty> pidList = p.stream().map(pid -> {
|
|
|
|
if (pid.getQualifier().getClassid().equals(ModelConstants.ORCID) ||
|
|
|
|
(pid.getQualifier().getClassid().equals(ModelConstants.ORCID_PENDING))) {
|
|
|
|
return pid;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}).filter(Objects::nonNull).collect(Collectors.toList());
|
|
|
|
|
|
|
|
if (pidList.size() == 1) {
|
|
|
|
return getAuthorPid(pidList.get(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
List<StructuredProperty> orcid = pidList
|
|
|
|
.stream()
|
|
|
|
.filter(
|
|
|
|
ap -> ap
|
|
|
|
.getQualifier()
|
|
|
|
.getClassid()
|
|
|
|
.equals(ModelConstants.ORCID))
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
if (orcid.size() == 1) {
|
|
|
|
return getAuthorPid(orcid.get(0));
|
|
|
|
}
|
|
|
|
orcid = pidList
|
|
|
|
.stream()
|
|
|
|
.filter(
|
|
|
|
ap -> ap
|
|
|
|
.getQualifier()
|
|
|
|
.getClassid()
|
|
|
|
.equals(ModelConstants.ORCID_PENDING))
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
if (orcid.size() == 1) {
|
|
|
|
return getAuthorPid(orcid.get(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|