Project

General

Profile

1
package eu.dnetlib.dli.resolver;
2

    
3
import com.google.gson.JsonElement;
4
import com.google.gson.JsonObject;
5
import com.google.gson.JsonParser;
6
import com.mongodb.MongoClient;
7
import com.mongodb.client.FindIterable;
8
import com.mongodb.client.MongoCollection;
9
import com.mongodb.client.model.Filters;
10
import eu.dnetlib.dli.resolver.model.DLIObjectProvenance;
11
import eu.dnetlib.dli.resolver.model.DLIResolvedObject;
12
import eu.dnetlib.enabling.tools.DnetStreamSupport;
13
import eu.dnetlib.pid.resolver.AbstractPIDResolver;
14
import eu.dnetlib.pid.resolver.model.ObjectType;
15
import eu.dnetlib.pid.resolver.model.SubjectType;
16
import org.apache.commons.logging.Log;
17
import org.apache.commons.logging.LogFactory;
18
import org.bson.Document;
19
import org.springframework.beans.factory.annotation.Value;
20

    
21

    
22
import java.util.List;
23
import java.util.stream.Collectors;
24

    
25

    
26
public class DataciteOfflineResolver extends AbstractPIDResolver {
27

    
28
    /**
29
     * The Constant log.
30
     */
31
    private static final Log log = LogFactory.getLog(DataciteOfflineResolver.class);
32

    
33
    private MongoClient client;
34

    
35
    private MongoCollection<Document> dataciteCollection;
36

    
37
    @Value("${dli.dataciteOfflineResolver.databaseName}")
38
    private String databaseName;
39

    
40
    @Value("${dli.dataciteOfflineResolver.collectionName}")
41
    private String collectionName;
42

    
43

    
44
    @Override
45
    protected boolean canResolvePid(final String pidType) {
46
        return (pidType != null) && ("doi".equals(pidType.toLowerCase().trim()) || "handle".equals(pidType.toLowerCase().trim()));
47

    
48
    }
49

    
50
    @Override
51
    public DLIResolvedObject resolve(final String pid, final String pidType) {
52
        try {
53
            final Document result = retrieveItem(pid);
54
            if (result!= null) {
55
                return parseResponse(result);
56
            }
57
        } catch (Throwable e) {
58
            log.error("Error on getting item with Pid: " +  pid);
59
        }
60
        return null;
61
    }
62

    
63
    private DLIResolvedObject parseResponse(Document result) {
64
        final String json = result.toJson();
65
        final JsonParser p = new JsonParser();
66
        JsonObject root = p.parse(json).getAsJsonObject();
67
        final DLIResolvedObject dli = new DLIResolvedObject();
68

    
69
        final  String description = getStringValue(root, "description");
70
        dli.setDescription(description);
71
        dli.setPid(getStringValue(root, "pid"));
72
        dli.setPidType(getStringValue(root, "pidType"));
73
        dli.setType(ObjectType.dataset);
74
        dli.setDate(getStringValue(root, "date"));
75
        dli.setTitles(getStringValues(root, "titles"));
76
        dli.setAuthors(getStringValues(root, "authors"));
77
        if (root.has("subjects") && root.get("subjects").isJsonArray()) {
78
            dli.setSubjects(
79
                    DnetStreamSupport.generateStreamFromIterator(root.getAsJsonArray("subjects").iterator())
80
                    .map(JsonElement::getAsJsonObject)
81
                    .map(it -> new SubjectType(it.get("scheme").getAsString(), it.get("term").getAsString()))
82
                    .collect(Collectors.toList())
83
            );
84
        }
85
        dli.setDatasourceProvenance(
86
                DnetStreamSupport.generateStreamFromIterator(root.getAsJsonArray("datasourceProvenance").iterator())
87
                .map(JsonElement::getAsJsonObject)
88
                .map(it -> {
89
                    final DLIObjectProvenance provenance =new DLIObjectProvenance();
90
                    provenance.setDatasourceId(it.get("datasourceId").getAsString());
91
                    provenance.setCompletionStatus(it.get("completionStatus").getAsString());
92
                    provenance.setProvisionMode(it.get("provisionMode").getAsString());
93
                    provenance.setDatasource(it.get("datasource").getAsString());
94
                    provenance.setPublisher(getStringValue(it, "publisher"));
95
                    return provenance;
96
                })
97
                .collect(Collectors.toList())
98
        );
99
        return dli;
100
    }
101

    
102
    private List<String> getStringValues(final JsonObject root, final String key) {
103

    
104
        if (root.has(key) && root.get(key).isJsonArray()) {
105
            return DnetStreamSupport.generateStreamFromIterator(root.getAsJsonArray(key).iterator())
106
                    .map(JsonElement::getAsString)
107
                    .collect(Collectors.toList());
108
        }
109
        return null;
110
    }
111

    
112

    
113
    private String getStringValue(final JsonObject root, final String key) {
114
        if (root.has(key) && !root.get(key).isJsonNull()) {
115
            return root.get(key).getAsString();
116
        }
117
        return null;
118
    }
119

    
120

    
121
    private Document retrieveItem(final  String pid){
122
        FindIterable<Document> pids = getDataciteCollection().find(Filters.eq("pid", pid));
123
        if (pids!= null) {
124
            return pids.first();
125
        }
126
        return null;
127

    
128
    }
129

    
130

    
131
    public void setMongoClient(final MongoClient client) {
132
        this.client = client;
133
    }
134

    
135
    private MongoCollection<Document> getDataciteCollection() {
136

    
137
        if (dataciteCollection == null)
138
        {
139
            dataciteCollection = client.getDatabase(databaseName).getCollection(collectionName);
140
        }
141
        return dataciteCollection;
142
    }
143

    
144

    
145
    public String getDatabaseName() {
146
        return databaseName;
147
    }
148

    
149
    public void setDatabaseName(String databaseName) {
150
        this.databaseName = databaseName;
151
    }
152

    
153
    public String getCollectionName() {
154
        return collectionName;
155
    }
156

    
157
    public void setCollectionName(String collectionName) {
158
        this.collectionName = collectionName;
159
    }
160

    
161
    @Override
162
    public boolean isAvailableOffline() {
163
        return true;
164
    }
165
}
(7-7/17)