Project

General

Profile

1
package eu.dnetlib.data.mdstore.plugins;
2

    
3
import java.net.URI;
4
import java.net.URISyntaxException;
5
import java.util.HashMap;
6
import java.util.List;
7
import java.util.Map;
8
import java.util.stream.Collectors;
9

    
10
import org.apache.commons.lang3.StringUtils;
11
import org.apache.commons.logging.Log;
12
import org.apache.commons.logging.LogFactory;
13
import org.springframework.beans.factory.annotation.Value;
14

    
15
import eu.dnetlib.data.mdstore.plugins.objects.MdRecord;
16
import eu.dnetlib.data.mdstore.plugins.objects.Project;
17

    
18
public class EnrichProjectsPlugin extends MdRecordPlugin {
19

    
20
	private static final Log log = LogFactory.getLog(EnrichProjectsPlugin.class);
21

    
22
	@Value("${plugin.enrich.projects.openaire.url}")
23
	private String baseUrl;
24

    
25
	private Map<String, Project> mapProjects = new HashMap<>();
26

    
27
	@Override
28
	protected void reconfigure() {
29
		log.info("Cleaning projects cache");
30
		mapProjects.clear();
31
	}
32

    
33
	@Override
34
	protected boolean updateRecord(final MdRecord record) {
35
		log.debug("Found " + record.getProjects().size() + " projects");
36

    
37
		if (record.getProjects().isEmpty()) { return false; }
38

    
39
		final List<Project> list = record.getProjects()
40
				.stream()
41
				.map(Project::getInfoId)
42
				.filter(StringUtils::isNotBlank)
43
				.map(Project::newInstance)
44
				.map(this::findEnrichedProject)
45
				.collect(Collectors.toList());
46

    
47
		log.debug("Processed " + list.size() + " projects");
48

    
49
		if (list.isEmpty()) { return false; }
50

    
51
		record.getProjects().clear();
52
		record.getProjects().addAll(list);
53

    
54
		return true;
55
	}
56

    
57
	private Project findEnrichedProject(final Project simpleProject) {
58
		final String s = simpleProject.getFunder() + "/" + simpleProject.getProgram() + "/" + simpleProject.getCode();
59
		if (!mapProjects.containsKey(s)) {
60
			final Project project = resolveProject(s);
61
			mapProjects.put(s, project != null ? project : simpleProject);
62
		}
63
		return mapProjects.get(s);
64
	}
65

    
66
	private Project resolveProject(final String s) {
67
		try {
68
			final String[] arr = s.split("/");
69
			final String url = String.format(baseUrl, arr[0], arr[1], arr[2]);
70
			return Project.newInstance(new URI(url));
71
		} catch (final URISyntaxException e) {
72
			log.error("Error resolving project: " + s, e);
73
			throw new RuntimeException("Error resolving project: " + s, e);
74
		}
75
	}
76

    
77
}
(5-5/8)