1
|
package eu.dnetlib.enabling.datasources;
|
2
|
|
3
|
import java.io.IOException;
|
4
|
import java.sql.Array;
|
5
|
import java.sql.Date;
|
6
|
import java.sql.SQLException;
|
7
|
import java.sql.Timestamp;
|
8
|
import java.util.Arrays;
|
9
|
import java.util.HashMap;
|
10
|
import java.util.List;
|
11
|
import java.util.Map;
|
12
|
import java.util.Objects;
|
13
|
import java.util.stream.Collectors;
|
14
|
|
15
|
import org.apache.commons.lang3.BooleanUtils;
|
16
|
import org.apache.commons.lang3.StringUtils;
|
17
|
import org.apache.commons.logging.Log;
|
18
|
import org.apache.commons.logging.LogFactory;
|
19
|
import org.dom4j.Document;
|
20
|
import org.dom4j.DocumentException;
|
21
|
import org.dom4j.Element;
|
22
|
import org.dom4j.io.SAXReader;
|
23
|
import org.springframework.core.io.ClassPathResource;
|
24
|
import org.springframework.core.io.Resource;
|
25
|
|
26
|
import eu.dnetlib.enabling.datasources.common.Api;
|
27
|
import eu.dnetlib.enabling.datasources.common.ApiParam;
|
28
|
import eu.dnetlib.enabling.datasources.common.ApiParamImpl;
|
29
|
import eu.dnetlib.enabling.datasources.common.Datasource;
|
30
|
import eu.dnetlib.enabling.datasources.common.Identity;
|
31
|
import eu.dnetlib.enabling.datasources.common.Organization;
|
32
|
import eu.dnetlib.enabling.datasources.common.SearchApisEntry;
|
33
|
import eu.dnetlib.enabling.datasources.common.SimpleDatasource;
|
34
|
import eu.dnetlib.miscutils.datetime.DateUtils;
|
35
|
|
36
|
public class DatasourceFunctions {
|
37
|
|
38
|
private static final Log log = LogFactory.getLog(DatasourceFunctions.class);
|
39
|
|
40
|
private static final Resource baseDsProfile = new ClassPathResource("/eu/dnetlib/enabling/datasources/templates/datasource_base.xml");
|
41
|
|
42
|
public static SimpleDatasource mapToSimpleDs(final Map<String, Object> map) {
|
43
|
final SimpleDatasource ds = new SimpleDatasource();
|
44
|
ds.setId(castObject(map.get("id"), String.class));
|
45
|
ds.setName(castObject(map.get("name"), String.class));
|
46
|
ds.setOrigId(castObject(map.get("id"), String.class));
|
47
|
ds.setTypology(castObject(map.get("typology"), String.class));
|
48
|
ds.setValid(true);
|
49
|
try {
|
50
|
final Array arr = castObject(map.get("apis"), Array.class);
|
51
|
|
52
|
if (arr != null && ((Object[]) arr.getArray()).length > 0) {
|
53
|
ds.setApis(Arrays.stream((Object[]) arr.getArray())
|
54
|
.filter(Objects::nonNull)
|
55
|
.map(Object::toString)
|
56
|
.collect(Collectors.toSet()));
|
57
|
}
|
58
|
} catch (final SQLException e) {
|
59
|
log.error("Error parsing array (apis)", e);
|
60
|
throw new RuntimeException("Error parsing array (apis)", e);
|
61
|
}
|
62
|
|
63
|
return ds;
|
64
|
}
|
65
|
|
66
|
public static Datasource<Organization<?>, Identity> mapToDatasource(final Map<String, Object> map) {
|
67
|
final Datasource<Organization<?>, Identity> ds = new Datasource<>();
|
68
|
ds.setId(castObject(map.get("id"), String.class));
|
69
|
ds.setOfficialname(castObject(map.get("officialname"), String.class));
|
70
|
ds.setEnglishname(castObject(map.get("englishname"), String.class));
|
71
|
ds.setWebsiteurl(castObject(map.get("websiteurl"), String.class));
|
72
|
ds.setLogourl(castObject(map.get("logourl"), String.class));
|
73
|
ds.setContactemail(castObject(map.get("contactemail"), String.class));
|
74
|
ds.setLatitude(castObject(map.get("latitude"), Double.class));
|
75
|
ds.setLongitude(castObject(map.get("longitude"), Double.class));
|
76
|
ds.setTimezone(castObject(map.get("timezone"), String.class));
|
77
|
ds.setNamespaceprefix(castObject(map.get("namespaceprefix"), String.class));
|
78
|
ds.setLanguages(castObject(map.get("languages"), String.class));
|
79
|
ds.setOd_contenttypes(castObject(map.get("od_contenttypes"), String.class));
|
80
|
ds.setCollectedfrom(castObject(map.get("collectedfrom"), String.class));
|
81
|
ds.setDateofvalidation(castObject(map.get("dateofvalidation"), Date.class));
|
82
|
ds.setTypology(castObject(map.get("typology"), String.class));
|
83
|
ds.setProvenanceaction(castObject(map.get("provenanceaction"), String.class));
|
84
|
ds.setDateofcollection(castObject(map.get("dateofcollection"), Date.class));
|
85
|
ds.setPlatform(castObject(map.get("platform"), String.class));
|
86
|
ds.setActivationId(castObject(map.get("activationId"), String.class));
|
87
|
ds.setDescription(castObject(map.get("description"), String.class));
|
88
|
ds.setReleasestartdate(castObject(map.get("releasestartdate"), Date.class));
|
89
|
ds.setReleaseenddate(castObject(map.get("releaseenddate"), Date.class));
|
90
|
ds.setMissionstatementurl(castObject(map.get("missionstatementurl"), String.class));
|
91
|
ds.setDataprovider(castObject(map.get("dataprovider"), Boolean.class));
|
92
|
ds.setServiceprovider(castObject(map.get("serviceprovider"), Boolean.class));
|
93
|
ds.setDatabaseaccesstype(castObject(map.get("databaseaccesstype"), String.class));
|
94
|
ds.setDatauploadtype(castObject(map.get("datauploadtype"), String.class));
|
95
|
ds.setDatabaseaccessrestriction(castObject(map.get("databaseaccessrestriction"), String.class));
|
96
|
ds.setDatauploadrestriction(castObject(map.get("datauploadrestriction"), String.class));
|
97
|
ds.setVersioning(castObject(map.get("versioning"), Boolean.class));
|
98
|
ds.setCitationguidelineurl(castObject(map.get("citationguidelineurl"), String.class));
|
99
|
ds.setQualitymanagementkind(castObject(map.get("qualitymanagementkind"), String.class));
|
100
|
ds.setPidsystems(castObject(map.get("pidsystems"), String.class));
|
101
|
ds.setCertificates(castObject(map.get("certificates"), String.class));
|
102
|
ds.setAggregator(castObject(map.get("aggregator"), String.class));
|
103
|
ds.setIssn(castObject(map.get("issn"), String.class));
|
104
|
ds.setEissn(castObject(map.get("eissn"), String.class));
|
105
|
ds.setLissn(castObject(map.get("lissn"), String.class));
|
106
|
ds.setRegisteredby(castObject(map.get("registeredby"), String.class));
|
107
|
ds.setSubjects(castObject(map.get("subjects"), String.class));
|
108
|
ds.setManaged(castObject(map.get("managed"), Boolean.class));
|
109
|
return ds;
|
110
|
}
|
111
|
|
112
|
public static Identity mapToDsIdentity(final Map<String, Object> map) {
|
113
|
final Identity id = new Identity();
|
114
|
id.setPid(castObject(map.get("pid"), String.class));
|
115
|
id.setIssuertype(castObject(map.get("issuertype"), String.class));
|
116
|
return id;
|
117
|
}
|
118
|
|
119
|
public static Organization<Datasource<?, ?>> mapToDsOrganization(final Map<String, Object> map) {
|
120
|
final Organization<Datasource<?, ?>> org = new Organization<>();
|
121
|
org.setId(castObject(map.get("id"), String.class));
|
122
|
org.setLegalshortname(castObject(map.get("legalshortname"), String.class));
|
123
|
org.setLegalname(castObject(map.get("legalname"), String.class));
|
124
|
org.setWebsiteurl(castObject(map.get("websiteurl"), String.class));
|
125
|
org.setLogourl(castObject(map.get("logourl"), String.class));
|
126
|
org.setCountry(castObject(map.get("country"), String.class));
|
127
|
org.setCollectedfrom(castObject(map.get("collectedfrom"), String.class));
|
128
|
org.setDateofcollection(castObject(map.get("dateofcollection"), Date.class));
|
129
|
org.setProvenanceaction(castObject(map.get("provenanceaction"), String.class));
|
130
|
return org;
|
131
|
}
|
132
|
|
133
|
public static SearchApisEntry mapToSearchApisEntry(final Map<String, Object> map) {
|
134
|
final SearchApisEntry a = new SearchApisEntry();
|
135
|
a.setId(castObject(map.get("id"), String.class));
|
136
|
a.setCompliance(castObject(map.get("compliance"), String.class));
|
137
|
a.setActive(castObject(map.get("active"), Boolean.class));
|
138
|
a.setRepoId(castObject(map.get("dsId"), String.class));
|
139
|
a.setRepoName(castObject(map.get("name"), String.class));
|
140
|
a.setRepoCountry(castObject(map.get("country"), String.class));
|
141
|
a.setRepoPrefix(castObject(map.get("prefix"), String.class));
|
142
|
a.setAggrDate(castObject(map.get("aggrDate"), String.class));
|
143
|
a.setAggrTotal(castObject(map.get("aggrTotal"), Integer.class));
|
144
|
a.setProtocol(castObject(map.get("protocol"), String.class));
|
145
|
a.setAlternativeName(castObject(map.get("alternativeName"), String.class));
|
146
|
a.setRepoOrganization(castObject(map.get("organization"), String.class));
|
147
|
return a;
|
148
|
}
|
149
|
|
150
|
public static Api<ApiParam> mapToApi(final Map<String, Object> map) {
|
151
|
final Api<ApiParam> a = new Api<>();
|
152
|
a.setId(castObject(map.get("id"), String.class));
|
153
|
a.setProtocol(castObject(map.get("protocol"), String.class));
|
154
|
a.setDatasource(castObject(map.get("datasource"), String.class));
|
155
|
a.setContentdescription(castObject(map.get("contentdescription"), String.class));
|
156
|
a.setActive(castObject(map.get("active"), Boolean.class));
|
157
|
a.setRemovable(castObject(map.get("removable"), Boolean.class));
|
158
|
a.setTypology(castObject(map.get("typology"), String.class));
|
159
|
a.setCompatibility(castObject(map.get("compatibility"), String.class));
|
160
|
a.setCompatibilityOverrided(castObject(map.get("isCompatibilityOverrided"), Boolean.class));
|
161
|
a.setMetadataIdentifierPath(castObject(map.get("metadataIdentifierPath"), String.class));
|
162
|
a.setLastCollectionTotal(castObject(map.get("lastCollectionTotal"), Integer.class));
|
163
|
a.setLastCollectionDate(castObject(map.get("lastCollectionDate"), Timestamp.class));
|
164
|
a.setLastCollectionMdid(castObject(map.get("lastCollectionMdid"), String.class));
|
165
|
a.setLastAggregationTotal(castObject(map.get("lastAggregationTotal"), Integer.class));
|
166
|
a.setLastAggregationDate(castObject(map.get("lastAggregationDate"), Timestamp.class));
|
167
|
a.setLastAggregationMdid(castObject(map.get("lastAggregationMdid"), String.class));
|
168
|
a.setLastDownloadTotal(castObject(map.get("lastDownloadTotal"), Integer.class));
|
169
|
a.setLastDownloadDate(castObject(map.get("lastDownloadDate"), Timestamp.class));
|
170
|
a.setLastDownloadObjid(castObject(map.get("lastDownloadObjid"), String.class));
|
171
|
a.setLastValidationJob(castObject(map.get("lastValidationJob"), String.class));
|
172
|
a.setBaseurl(castObject(map.get("baseUrl"), String.class));
|
173
|
try {
|
174
|
final Array arr = castObject(map.get("params"), Array.class);
|
175
|
if (arr != null) {
|
176
|
a.setApiParams(Arrays.stream((Object[]) arr.getArray())
|
177
|
.filter(Objects::nonNull)
|
178
|
.map(Object::toString)
|
179
|
.map(s -> {
|
180
|
final ApiParam p = new ApiParamImpl();
|
181
|
p.setParam(StringUtils.substringBefore(s, "="));
|
182
|
p.setValue(StringUtils.substringAfter(s, "="));
|
183
|
return p;
|
184
|
})
|
185
|
.collect(Collectors.toSet()));
|
186
|
}
|
187
|
} catch (final SQLException e) {
|
188
|
log.error("Error parsing array params", e);
|
189
|
throw new RuntimeException("Error parsing array params", e);
|
190
|
}
|
191
|
|
192
|
return a;
|
193
|
}
|
194
|
|
195
|
public static String dsToProfile(final Datasource<Organization<?>, Identity> ds, final List<Api<ApiParam>> apis, final String profId)
|
196
|
throws DocumentException, IOException {
|
197
|
final Document doc = new SAXReader().read(baseDsProfile.getInputStream());
|
198
|
|
199
|
setValue(doc, "//DATASOURCE_TYPE", ds.getTypology());
|
200
|
setValue(doc, "//DATASOURCE_ORIGINAL_ID", ds.getId());
|
201
|
setValue(doc, "//TYPOLOGY", ds.getPlatform());
|
202
|
setValue(doc, "//OFFICIAL_NAME", ds.getOfficialname());
|
203
|
setValue(doc, "//ENGLISH_NAME", ds.getEnglishname());
|
204
|
setValue(doc, "//ICON_URI", ds.getLogourl());
|
205
|
setValue(doc, "//COUNTRY", ds.getOrganizations().stream().map(Organization::getCountry).findFirst().orElse(""));
|
206
|
setValue(doc, "//LONGITUDE", ds.getLongitude());
|
207
|
setValue(doc, "//LATITUDE", ds.getLatitude());
|
208
|
setValue(doc, "//TIMEZONE", ds.getTimezone());
|
209
|
setValue(doc, "//REPOSITORY_WEBPAGE", ds.getWebsiteurl());
|
210
|
setValue(doc, "//REPOSITORY_INSTITUTION", ds.getOrganizations().stream().map(Organization::getLegalname).findFirst().orElse(""));
|
211
|
setValue(doc, "//ADMIN_INFO", ds.getContactemail());
|
212
|
setValue(doc, "//REGISTERED_BY", ds.getRegisteredby());
|
213
|
setValue(doc, "//LAST_UPDATE/@value", DateUtils.now_ISO8601());
|
214
|
|
215
|
final Element ef = (Element) doc.selectSingleNode("//EXTRA_FIELDS");
|
216
|
addExtraField(ef, "OpenAireDataSourceId", ds.getId());
|
217
|
addExtraField(ef, "NamespacePrefix", ds.getNamespaceprefix());
|
218
|
addExtraField(ef, "VERIFIED", "NO");
|
219
|
addExtraField(ef, "aggregatorName", ds.getAggregator());
|
220
|
addExtraField(ef, "dateOfValidation", ds.getDateofvalidation());
|
221
|
addExtraField(ef, "dateOfCollection", ds.getDateofcollection());
|
222
|
addExtraField(ef, "mergeHomonyms", "NO");
|
223
|
addExtraField(ef, "ACTID", ds.getActivationId());
|
224
|
|
225
|
if (apis != null) {
|
226
|
final Element ifaces = (Element) doc.selectSingleNode("//INTERFACES");
|
227
|
apis.forEach(api -> addInterface(ifaces, api));
|
228
|
}
|
229
|
return doc.asXML();
|
230
|
}
|
231
|
|
232
|
private static void setValue(final Document doc, final String xpath, final Object value) {
|
233
|
if (value != null) {
|
234
|
doc.selectSingleNode(xpath).setText(value.toString());
|
235
|
}
|
236
|
}
|
237
|
|
238
|
private static void addInterface(final Element ifaces, final Api<?> api) {
|
239
|
|
240
|
final Element ifc = ifaces.addElement("INTERFACE");
|
241
|
ifc.addAttribute("id", api.getId());
|
242
|
ifc.addAttribute("label", String.format("%s (%s)",
|
243
|
StringUtils.defaultIfBlank(api.getTypology(), "-"),
|
244
|
StringUtils.defaultIfBlank(api.getCompatibility(), "-")));
|
245
|
ifc.addAttribute("typology", StringUtils.defaultIfBlank(api.getTypology(), ""));
|
246
|
ifc.addAttribute("active", "" + BooleanUtils.toBooleanDefaultIfNull(api.getActive(), false));
|
247
|
ifc.addAttribute("compliance", StringUtils.defaultIfBlank(api.getCompatibility(), ""));
|
248
|
ifc.addAttribute("contentDescription", StringUtils.defaultIfBlank(api.getContentdescription(), ""));
|
249
|
ifc.addAttribute("removable", "" + BooleanUtils.toBooleanDefaultIfNull(api.getRemovable(), false));
|
250
|
|
251
|
final Element ap = ifc.addElement("ACCESS_PROTOCOL");
|
252
|
api.getApiParams().forEach(p -> ap.addAttribute(p.getParam(), p.getValue()));
|
253
|
ap.setText(StringUtils.defaultIfBlank(api.getProtocol(), ""));
|
254
|
ifc.addElement("BASE_URL").setText(StringUtils.defaultIfBlank(api.getBaseurl(), ""));
|
255
|
|
256
|
if (api.isCompatibilityOverrided()) {
|
257
|
addInterfaceExtraField(ifc, "overriding_compliance", true);
|
258
|
}
|
259
|
|
260
|
addInterfaceExtraField(ifc, "metadata_identifier_path", api.getMetadataIdentifierPath());
|
261
|
addInterfaceExtraField(ifc, "last_collection_date", api.getLastCollectionDate());
|
262
|
addInterfaceExtraField(ifc, "last_collection_mdId", api.getLastCollectionMdid());
|
263
|
addInterfaceExtraField(ifc, "last_collection_total", api.getLastCollectionTotal());
|
264
|
addInterfaceExtraField(ifc, "last_aggregation_date", api.getLastAggregationDate());
|
265
|
addInterfaceExtraField(ifc, "last_aggregation_mdId", api.getLastAggregationMdid());
|
266
|
addInterfaceExtraField(ifc, "last_aggregation_total", api.getLastAggregationTotal());
|
267
|
addInterfaceExtraField(ifc, "last_download_date", api.getLastDownloadDate());
|
268
|
addInterfaceExtraField(ifc, "last_download_objId", api.getLastDownloadObjid());
|
269
|
addInterfaceExtraField(ifc, "last_download_total", api.getLastDownloadTotal());
|
270
|
addInterfaceExtraField(ifc, "last_validation_job", api.getLastValidationJob());
|
271
|
}
|
272
|
|
273
|
private static void addExtraField(final Element parent, final String field, final Object value) {
|
274
|
if (value != null && StringUtils.isNotBlank(value.toString())) {
|
275
|
final Element f = parent.addElement("FIELD");
|
276
|
f.addElement("key").setText(field);
|
277
|
f.addElement("value").setText(value.toString());
|
278
|
}
|
279
|
}
|
280
|
|
281
|
private static void addInterfaceExtraField(final Element parent, final String field, final Object value) {
|
282
|
if (value != null && StringUtils.isNotBlank(value.toString())) {
|
283
|
final Element f = parent.addElement("INTERFACE_EXTRA_FIELD");
|
284
|
f.addAttribute("name", field);
|
285
|
f.setText(value.toString());
|
286
|
}
|
287
|
}
|
288
|
|
289
|
public static Map<String, Object> dsToMap(final Datasource<Organization<?>, Identity> ds) {
|
290
|
final Map<String, Object> map = new HashMap<>();
|
291
|
|
292
|
map.put("id", ds.getId());
|
293
|
map.put("officialname", ds.getOfficialname());
|
294
|
map.put("englishname", ds.getEnglishname());
|
295
|
map.put("websiteurl", ds.getWebsiteurl());
|
296
|
map.put("logourl", ds.getLogourl());
|
297
|
map.put("contactemail", ds.getContactemail());
|
298
|
map.put("latitude", ds.getLatitude());
|
299
|
map.put("longitude", ds.getLongitude());
|
300
|
map.put("timezone", ds.getTimezone());
|
301
|
map.put("namespaceprefix", ds.getNamespaceprefix());
|
302
|
map.put("languages", ds.getLanguages());
|
303
|
map.put("od_contenttypes", ds.getOd_contenttypes());
|
304
|
map.put("collectedfrom", ds.getCollectedfrom());
|
305
|
map.put("dateofvalidation", ds.getDateofvalidation());
|
306
|
map.put("typology", ds.getTypology());
|
307
|
map.put("provenanceaction", ds.getProvenanceaction());
|
308
|
map.put("platform", ds.getPlatform());
|
309
|
map.put("activationid", ds.getActivationId());
|
310
|
map.put("description", ds.getDescription());
|
311
|
map.put("releasestartdate", ds.getReleasestartdate());
|
312
|
map.put("releaseenddate", ds.getReleaseenddate());
|
313
|
map.put("missionstatementurl", ds.getMissionstatementurl());
|
314
|
map.put("dataprovider", ds.getDataprovider());
|
315
|
map.put("serviceprovider", ds.getServiceprovider());
|
316
|
map.put("databaseaccesstype", ds.getDatabaseaccesstype());
|
317
|
map.put("datauploadtype", ds.getDatauploadtype());
|
318
|
map.put("databaseaccessrestriction", ds.getDatabaseaccessrestriction());
|
319
|
map.put("datauploadrestriction", ds.getDatauploadrestriction());
|
320
|
map.put("versioning", ds.getVersioning());
|
321
|
map.put("citationguidelineurl", ds.getCitationguidelineurl());
|
322
|
map.put("qualitymanagementkind", ds.getQualitymanagementkind());
|
323
|
map.put("pidsystems", ds.getPidsystems());
|
324
|
map.put("certificates", ds.getCertificates());
|
325
|
map.put("aggregator", ds.getAggregator());
|
326
|
map.put("issn", ds.getIssn());
|
327
|
map.put("eissn", ds.getEissn());
|
328
|
map.put("lissn", ds.getLissn());
|
329
|
map.put("registeredby", ds.getRegisteredby());
|
330
|
map.put("subjects", ds.getSubjects());
|
331
|
map.put("managed", ds.getManaged());
|
332
|
|
333
|
return map;
|
334
|
}
|
335
|
|
336
|
public static Map<String, Object> orgToMap(final String dsId, final Organization<?> org) {
|
337
|
final Map<String, Object> map = new HashMap<>();
|
338
|
map.put("dsId", dsId);
|
339
|
map.put("orgId", org.getId());
|
340
|
map.put("legalname", org.getLegalname());
|
341
|
map.put("legalshortname", org.getLegalshortname());
|
342
|
map.put("websiteurl", org.getWebsiteurl());
|
343
|
map.put("logourl", org.getLogourl());
|
344
|
map.put("country", org.getCountry());
|
345
|
map.put("collectedfrom", org.getCollectedfrom());
|
346
|
return map;
|
347
|
}
|
348
|
|
349
|
public static Map<String, Object> apiToMap(final Api<?> api) {
|
350
|
final Map<String, Object> map = new HashMap<>();
|
351
|
map.put("apiId", api.getId());
|
352
|
map.put("protocol", api.getProtocol());
|
353
|
map.put("baseUrl", api.getBaseurl());
|
354
|
map.put("dsId", api.getDatasource());
|
355
|
map.put("contentDescription", api.getContentdescription());
|
356
|
map.put("typology", api.getTypology());
|
357
|
map.put("compatibility", api.getCompatibility());
|
358
|
map.put("metadataIdentifierPath", api.getMetadataIdentifierPath());
|
359
|
map.put("removable", api.getRemovable());
|
360
|
// The other fields are not required in the INSERT operation
|
361
|
return map;
|
362
|
}
|
363
|
|
364
|
@SuppressWarnings("unchecked")
|
365
|
private static <T> T castObject(final Object o, final Class<T> clazz) {
|
366
|
if (o == null) { return null; }
|
367
|
if (clazz.isInstance(o)) { return (T) o; }
|
368
|
throw new IllegalArgumentException("Type not managed: " + clazz.getSimpleName());
|
369
|
}
|
370
|
|
371
|
}
|