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.ArrayList;
6
import java.util.List;
7
import java.util.Map;
8

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

    
15
import com.google.gson.Gson;
16
import com.google.gson.reflect.TypeToken;
17
import com.mongodb.MongoClient;
18
import com.mongodb.client.MongoCollection;
19

    
20
import eu.dnetlib.data.mdstore.plugins.objects.Dataset;
21
import eu.dnetlib.data.mdstore.plugins.objects.MdRecord;
22
import eu.dnetlib.data.mdstore.plugins.objects.dli.DliEntity;
23
import eu.dnetlib.data.mdstore.plugins.objects.dli.DliIdentifier;
24
import eu.dnetlib.data.mdstore.plugins.objects.dli.DliRelation;
25

    
26
public class EnrichDatasetsPlugin extends GenericDoiMdstorePlugin {
27

    
28
	private static final Log log = LogFactory.getLog(EnrichDatasetsPlugin.class);
29

    
30
	private static final Gson gson = new Gson();
31

    
32
	@Value("${plugin.enrich.dataset.dli.url}")
33
	private String baseUrl;
34

    
35
	@Autowired
36
	private MongoClient mongoClient;
37

    
38
	private Counter enrichDatasetsCounter = new Counter();
39

    
40
	@Override
41
	protected URI prepareURI(final String doi) throws URISyntaxException {
42
		return new URI(String.format(baseUrl, doi));
43
	}
44

    
45
	@Override
46
	protected void reconfigure(final Map<String, String> params) {
47
		enrichDatasetsCounter.reset();
48
	}
49

    
50
	@Override
51
	protected void resetConfiguration() {
52
		log.info("***** Openaire Enrichment - datasets  : " + enrichDatasetsCounter);
53
		enrichDatasetsCounter.reset();
54
	}
55

    
56
	@Override
57
	protected MongoCollection<org.bson.Document> getCacheCollection() {
58
		return mongoClient.getDatabase("API_CACHES").getCollection("DATASETS_API_CACHE");
59
	}
60

    
61
	@Override
62
	protected boolean updateDocument(final MdRecord doc, final String response) {
63

    
64
		doc.getDatasets().clear();
65

    
66
		final List<Dataset> datasets = new ArrayList<>();
67

    
68
		final List<DliRelation> rels = gson.fromJson(response, new TypeToken<List<DliRelation>>() {}.getType());
69

    
70
		for (final DliRelation rel : rels) {
71
			datasets.addAll(findRelatedDatasets(rel.getSource()));
72
			datasets.addAll(findRelatedDatasets(rel.getTarget()));
73
		}
74

    
75
		if (datasets.isEmpty()) {
76
			return false;
77
		} else {
78
			doc.getDatasets().addAll(datasets);
79
			enrichDatasetsCounter.incrementAfter(doc.getDatasets().size());
80
			return true;
81
		}
82
	}
83

    
84
	private List<Dataset> findRelatedDatasets(final DliEntity entity) {
85
		final List<Dataset> res = new ArrayList<>();
86
		if (entity.getObjectType().equalsIgnoreCase("dataset")) {
87
			final String title = entity.getTitle();
88
			for (final DliIdentifier id : entity.getIdentifiers()) {
89
				if (id.getSchema().equalsIgnoreCase("doi") && StringUtils.isNoneBlank(id.getIdentifier()) && StringUtils.isNotBlank(title)) {
90
					res.add(new Dataset(id.getIdentifier(), title));
91
				}
92
			}
93
		}
94
		return res;
95
	}
96

    
97
}
(4-4/12)