92 lines
2.6 KiB
Java
92 lines
2.6 KiB
Java
package eu.dnetlib.openaire.funders;
|
|
|
|
import java.io.StringReader;
|
|
import java.util.stream.Collectors;
|
|
|
|
import eu.dnetlib.openaire.exporter.model.funders.ExtendedFunderDetails;
|
|
import eu.dnetlib.openaire.exporter.model.funders.FunderDetails;
|
|
import eu.dnetlib.openaire.exporter.model.funders.FundingStream;
|
|
import eu.dnetlib.openaire.funders.domain.db.FunderDbEntry;
|
|
import eu.dnetlib.openaire.funders.domain.db.FundingPathDbEntry;
|
|
import org.dom4j.Document;
|
|
import org.dom4j.DocumentException;
|
|
import org.dom4j.io.SAXReader;
|
|
|
|
import static org.apache.commons.lang3.StringUtils.*;
|
|
|
|
public class ConversionUtils {
|
|
|
|
public static final String SEPARATOR = "::";
|
|
|
|
public static FunderDetails asFunderDetails(final FunderDbEntry fdb) {
|
|
final FunderDetails f = new FunderDetails();
|
|
|
|
f.setId(fdb.getId());
|
|
f.setName(fdb.getName());
|
|
f.setShortname(fdb.getShortname());
|
|
f.setJurisdiction(fdb.getJurisdiction());
|
|
f.setRegistrationDate(fdb.getRegistrationdate());
|
|
f.setLastUpdateDate(fdb.getLastupdatedate());
|
|
|
|
return f;
|
|
}
|
|
|
|
public static ExtendedFunderDetails asExtendedFunderDetails(final FunderDbEntry fdb) {
|
|
final ExtendedFunderDetails f = new ExtendedFunderDetails(asFunderDetails(fdb));
|
|
|
|
if (fdb.getFundingpaths() != null) {
|
|
f.setFundingStreams(
|
|
fdb.getFundingpaths().stream()
|
|
.map(ConversionUtils::asFundingStream)
|
|
.collect(Collectors.toList()));
|
|
}
|
|
|
|
return f;
|
|
}
|
|
|
|
private static FundingStream asFundingStream(final FundingPathDbEntry pathDbEntry) {
|
|
final FundingStream f = new FundingStream();
|
|
|
|
try {
|
|
final Document xml = new SAXReader().read(new StringReader(pathDbEntry.getPath()));
|
|
|
|
for(int i=2;i>=0;i--) {
|
|
if (hasFundingLevel(i, xml)) {
|
|
f.setId(getId(i, xml));
|
|
f.setName(getName(i, xml));
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (isBlank(f.getId()) && isNoneBlank(xml.valueOf("//funder/id/text()"))) {
|
|
f.setId(xml.valueOf("//funder/shortname/text()"));
|
|
f.setName(xml.valueOf("//funder/name/text()"));
|
|
}
|
|
|
|
if (isBlank(f.getId())) {
|
|
throw new IllegalStateException("invalid funding path:\n" + xml.asXML());
|
|
}
|
|
|
|
return f;
|
|
|
|
} catch (DocumentException e) {
|
|
throw new IllegalStateException("unable to parse funding path:\n" + pathDbEntry.getPath());
|
|
}
|
|
}
|
|
|
|
private static String getName(int level, final Document d) {
|
|
return d.valueOf(String.format("//funding_level_%s/description/text()", level));
|
|
}
|
|
|
|
private static String getId(int level, final Document d) {
|
|
return substringAfter(
|
|
d.valueOf(
|
|
String.format("//funding_level_%s/id/text()", level)
|
|
), SEPARATOR);
|
|
}
|
|
|
|
private static boolean hasFundingLevel(int level, Document d) {
|
|
return isNotBlank(getId(level, d));
|
|
}
|
|
}
|