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(final Map<String, String> params) {
29
		log.info("Cleaning projects cache");
30
		mapProjects.clear();
31
	}
32

    
33
	@Override
34
	protected void resetConfiguration() {
35
		log.info("Cleaning projects cache");
36
		mapProjects.clear();
37
	}
38

    
39
	@Override
40
	protected boolean updateRecord(final String recordId, final MdRecord record) {
41
		log.debug("Found " + record.getProjects().size() + " projects");
42

    
43
		if (record.getProjects().isEmpty()) { return false; }
44

    
45
		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

    
53
		log.debug("Processed " + list.size() + " projects");
54

    
55
		if (list.isEmpty()) { return false; }
56

    
57
		record.getProjects().clear();
58
		record.getProjects().addAll(list);
59

    
60
		return true;
61
	}
62

    
63
	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
		}
69
		return mapProjects.get(s);
70
	}
71

    
72
	private Project resolveProject(final String s) {
73
		try {
74
			final String[] arr = s.split("/");
75
			final String url = String.format(baseUrl, arr[0], arr[1], arr[2]);
76
			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

    
83
}
(8-8/12)