Project

General

Profile

1 44133 michele.ar
package eu.dnetlib.data.mdstore.plugins;
2
3 48734 michele.ar
import java.net.URI;
4
import java.net.URISyntaxException;
5 44523 michele.ar
import java.util.HashMap;
6
import java.util.List;
7 44133 michele.ar
import java.util.Map;
8 51020 michele.ar
import java.util.stream.Collectors;
9 44133 michele.ar
10 44523 michele.ar
import org.apache.commons.lang3.StringUtils;
11 44133 michele.ar
import org.apache.commons.logging.Log;
12
import org.apache.commons.logging.LogFactory;
13 49368 michele.ar
import org.springframework.beans.factory.annotation.Value;
14 44133 michele.ar
15 51020 michele.ar
import eu.dnetlib.data.mdstore.plugins.objects.MdRecord;
16 48734 michele.ar
import eu.dnetlib.data.mdstore.plugins.objects.Project;
17 44133 michele.ar
18 51020 michele.ar
public class EnrichProjectsPlugin extends MdRecordPlugin {
19 44133 michele.ar
20
	private static final Log log = LogFactory.getLog(EnrichProjectsPlugin.class);
21
22 49368 michele.ar
	@Value("${plugin.enrich.projects.openaire.url}")
23
	private String baseUrl;
24
25 51020 michele.ar
	private Map<String, Project> mapProjects = new HashMap<>();
26
27 44133 michele.ar
	@Override
28 51852 michele.ar
	protected void reconfigure(final Map<String, String> params) {
29 51020 michele.ar
		log.info("Cleaning projects cache");
30
		mapProjects.clear();
31
	}
32 44133 michele.ar
33 51020 michele.ar
	@Override
34 54968 michele.ar
	protected void resetConfiguration() {
35
		log.info("Cleaning projects cache");
36
		mapProjects.clear();
37
	}
38
39
	@Override
40 60388 michele.ar
	protected boolean updateRecord(final String recordId, final MdRecord record) {
41 51020 michele.ar
		log.debug("Found " + record.getProjects().size() + " projects");
42 44523 michele.ar
43 51020 michele.ar
		if (record.getProjects().isEmpty()) { return false; }
44 49250 michele.ar
45 51020 michele.ar
		final List<Project> list = record.getProjects()
46
				.stream()
47
				.map(Project::getInfoId)
48
				.filter(StringUtils::isNotBlank)
49
				.map(Project::newInstance)
50
				.map(this::findEnrichedProject)
51
				.collect(Collectors.toList());
52 49250 michele.ar
53 51020 michele.ar
		log.debug("Processed " + list.size() + " projects");
54 49250 michele.ar
55 51020 michele.ar
		if (list.isEmpty()) { return false; }
56 44133 michele.ar
57 51020 michele.ar
		record.getProjects().clear();
58
		record.getProjects().addAll(list);
59 44559 michele.ar
60 51020 michele.ar
		return true;
61 44523 michele.ar
	}
62
63 51020 michele.ar
	private Project findEnrichedProject(final Project simpleProject) {
64
		final String s = simpleProject.getFunder() + "/" + simpleProject.getProgram() + "/" + simpleProject.getCode();
65
		if (!mapProjects.containsKey(s)) {
66
			final Project project = resolveProject(s);
67
			mapProjects.put(s, project != null ? project : simpleProject);
68 44523 michele.ar
		}
69 51020 michele.ar
		return mapProjects.get(s);
70 44523 michele.ar
	}
71
72 48734 michele.ar
	private Project resolveProject(final String s) {
73
		try {
74
			final String[] arr = s.split("/");
75 49368 michele.ar
			final String url = String.format(baseUrl, arr[0], arr[1], arr[2]);
76 48734 michele.ar
			return Project.newInstance(new URI(url));
77
		} catch (final URISyntaxException e) {
78
			log.error("Error resolving project: " + s, e);
79
			throw new RuntimeException("Error resolving project: " + s, e);
80
		}
81
	}
82 51020 michele.ar
83 44133 michele.ar
}