Project

General

Profile

1
package eu.dnetlib.enabling.datasources;
2

    
3
import java.sql.Array;
4
import java.sql.Date;
5
import java.sql.SQLException;
6
import java.sql.Timestamp;
7
import java.util.Arrays;
8
import java.util.HashMap;
9
import java.util.Map;
10
import java.util.Objects;
11
import java.util.stream.Collectors;
12

    
13
import org.apache.commons.lang3.StringUtils;
14
import org.apache.commons.logging.Log;
15
import org.apache.commons.logging.LogFactory;
16

    
17
import eu.dnetlib.enabling.datasources.common.Api;
18
import eu.dnetlib.enabling.datasources.common.ApiParam;
19
import eu.dnetlib.enabling.datasources.common.ApiParamImpl;
20
import eu.dnetlib.enabling.datasources.common.Datasource;
21
import eu.dnetlib.enabling.datasources.common.Identity;
22
import eu.dnetlib.enabling.datasources.common.Organization;
23
import eu.dnetlib.enabling.datasources.common.PidSystem;
24
import eu.dnetlib.enabling.datasources.common.SearchApisEntry;
25
import eu.dnetlib.enabling.datasources.common.SimpleDatasource;
26

    
27
public class DatasourceFunctions {
28

    
29
	private static final String EOSC_DATA_SOURCE = "Data Source";
30

    
31
	private static final Log log = LogFactory.getLog(DatasourceFunctions.class);
32

    
33
	public static SimpleDatasource mapToSimpleDs(final Map<String, Object> map) {
34
		final SimpleDatasource ds = new SimpleDatasource();
35
		ds.setId(castObject(map.get("id"), String.class));
36
		ds.setName(castObject(map.get("name"), String.class));
37
		ds.setOrigId(castObject(map.get("id"), String.class));
38
		ds.setEoscDatasourceType(castObject(map.get("eosc_datasource_type"), String.class));
39
		ds.setValid(true);
40
		try {
41
			final Array arr = castObject(map.get("apis"), Array.class);
42

    
43
			if (arr != null && ((Object[]) arr.getArray()).length > 0) {
44
				ds.setApis(Arrays.stream((Object[]) arr.getArray())
45
					.filter(Objects::nonNull)
46
					.map(Object::toString)
47
					.collect(Collectors.toSet()));
48
			}
49
		} catch (final SQLException e) {
50
			log.error("Error parsing array (apis)", e);
51
			throw new RuntimeException("Error parsing array (apis)", e);
52
		}
53

    
54
		return ds;
55
	}
56

    
57
	public static Datasource<Organization<?>, Identity, PidSystem> mapToDatasource(final Map<String, Object> map) {
58
		final Datasource<Organization<?>, Identity, PidSystem> ds = new Datasource<>();
59
		ds.setId(castObject(map.get("id"), String.class));
60
		ds.setOfficialname(castObject(map.get("officialname"), String.class));
61
		ds.setEnglishname(castObject(map.get("englishname"), String.class));
62
		ds.setWebsiteurl(castObject(map.get("websiteurl"), String.class));
63
		ds.setLogourl(castObject(map.get("logourl"), String.class));
64
		ds.setContactemail(castObject(map.get("contactemail"), String.class));
65
		ds.setLatitude(castObject(map.get("latitude"), Double.class));
66
		ds.setLongitude(castObject(map.get("longitude"), Double.class));
67
		ds.setTimezone(castObject(map.get("timezone"), String.class));
68
		ds.setNamespaceprefix(castObject(map.get("namespaceprefix"), String.class));
69
		ds.setLanguages(castObject(map.get("languages"), String.class));
70
		ds.setCollectedfrom(castObject(map.get("collectedfrom"), String.class));
71
		ds.setDateofvalidation(castObject(map.get("dateofvalidation"), Date.class));
72
		ds.setEoscDatasourceType(castObject(map.get("eosc_datasource_type"), String.class));
73
		ds.setProvenanceaction(castObject(map.get("provenanceaction"), String.class));
74
		ds.setDateofcollection(castObject(map.get("dateofcollection"), Date.class));
75
		ds.setPlatform(castObject(map.get("platform"), String.class));
76
		ds.setActivationId(castObject(map.get("activationId"), String.class));
77
		ds.setDescription(castObject(map.get("description"), String.class));
78
		ds.setReleasestartdate(castObject(map.get("releasestartdate"), Date.class));
79
		ds.setReleaseenddate(castObject(map.get("releaseenddate"), Date.class));
80
		ds.setMissionstatementurl(castObject(map.get("missionstatementurl"), String.class));
81
		ds.setDatabaseaccesstype(castObject(map.get("databaseaccesstype"), String.class));
82
		ds.setDatauploadtype(castObject(map.get("datauploadtype"), String.class));
83
		ds.setDatabaseaccessrestriction(castObject(map.get("databaseaccessrestriction"), String.class));
84
		ds.setDatauploadrestriction(castObject(map.get("datauploadrestriction"), String.class));
85
		ds.setCitationguidelineurl(castObject(map.get("citationguidelineurl"), String.class));
86
		ds.setCertificates(castObject(map.get("certificates"), String.class));
87
		ds.setAggregator(castObject(map.get("aggregator"), String.class));
88
		ds.setIssn(castObject(map.get("issn"), String.class));
89
		ds.setEissn(castObject(map.get("eissn"), String.class));
90
		ds.setLissn(castObject(map.get("lissn"), String.class));
91
		ds.setRegisteredby(castObject(map.get("registeredby"), String.class));
92
		ds.setSubjects(castObject(map.get("subjects"), String.class));
93
		ds.setManaged(castObject(map.get("managed"), Boolean.class));
94
		ds.setConsentTermsOfUse(castObject(map.get("consenttermsofuse"), Boolean.class));
95
		ds.setConsentTermsOfUseDate(castObject(map.get("consenttermsofusedate"), Date.class));
96
		ds.setFullTextDownload(castObject(map.get("fulltextdownload"), Boolean.class));
97
		ds.setStatus(castObject(map.get("status"), String.class));
98

    
99
		return ds;
100
	}
101

    
102
	public static Identity mapToDsIdentity(final Map<String, Object> map) {
103
		final Identity id = new Identity();
104
		id.setPid(castObject(map.get("pid"), String.class));
105
		id.setIssuertype(castObject(map.get("issuertype"), String.class));
106
		return id;
107
	}
108

    
109
	public static Organization<Datasource<?, ?, ?>> mapToDsOrganization(final Map<String, Object> map) {
110
		final Organization<Datasource<?, ?, ?>> org = new Organization<>();
111
		org.setId(castObject(map.get("id"), String.class));
112
		org.setLegalshortname(castObject(map.get("legalshortname"), String.class));
113
		org.setLegalname(castObject(map.get("legalname"), String.class));
114
		org.setWebsiteurl(castObject(map.get("websiteurl"), String.class));
115
		org.setLogourl(castObject(map.get("logourl"), String.class));
116
		org.setCountry(castObject(map.get("country"), String.class));
117
		org.setCollectedfrom(castObject(map.get("collectedfrom"), String.class));
118
		org.setDateofcollection(castObject(map.get("dateofcollection"), Date.class));
119
		org.setProvenanceaction(castObject(map.get("provenanceaction"), String.class));
120
		return org;
121
	}
122

    
123
	public static SearchApisEntry mapToSearchApisEntry(final Map<String, Object> map) {
124
		final SearchApisEntry a = new SearchApisEntry();
125
		a.setId(castObject(map.get("id"), String.class));
126
		a.setCompliance(castObject(map.get("compliance"), String.class));
127
		a.setActive(castObject(map.get("active"), Boolean.class));
128
		a.setRepoId(castObject(map.get("dsId"), String.class));
129
		a.setRepoName(castObject(map.get("name"), String.class));
130
		a.setRepoCountry(castObject(map.get("country"), String.class));
131
		a.setRepoPrefix(castObject(map.get("prefix"), String.class));
132
		a.setAggrDate(castObject(map.get("aggrDate"), String.class));
133
		a.setAggrTotal(castObject(map.get("aggrTotal"), Integer.class));
134
		a.setAggrBackend(calculateMdstoreBackendById(castObject(map.get("aggrMdId"), String.class)));
135
		a.setCollDate(castObject(map.get("collDate"), String.class));
136
		a.setCollTotal(castObject(map.get("collTotal"), Integer.class));
137
		a.setCollBackend(calculateMdstoreBackendById(castObject(map.get("collMdId"), String.class)));
138
		a.setProtocol(castObject(map.get("protocol"), String.class));
139
		a.setAlternativeName(castObject(map.get("alternativeName"), String.class));
140
		a.setRepoOrganization(castObject(map.get("organization"), String.class));
141
		return a;
142
	}
143

    
144
	private static String calculateMdstoreBackendById(final String mdId) {
145
		if (StringUtils.isBlank(mdId)) {
146
			return "";
147
		} else if (StringUtils.trim(mdId).startsWith("md-")) {
148
			return "HDFS";
149
		} else {
150
			return "MONGO";
151
		}
152
	}
153

    
154
	public static Api<ApiParam> mapToApi(final Map<String, Object> map) {
155
		final Api<ApiParam> a = new Api<>();
156
		a.setId(castObject(map.get("id"), String.class));
157
		a.setProtocol(castObject(map.get("protocol"), String.class));
158
		a.setDatasource(castObject(map.get("datasource"), String.class));
159
		a.setContentdescription(castObject(map.get("contentdescription"), String.class));
160
		a.setActive(castObject(map.get("active"), Boolean.class));
161
		a.setRemovable(castObject(map.get("removable"), Boolean.class));
162
		a.setCompatibility(castObject(map.get("compatibility"), String.class));
163
		a.setCompatibilityOverrided(castObject(map.get("isCompatibilityOverrided"), Boolean.class));
164
		a.setMetadataIdentifierPath(castObject(map.get("metadataIdentifierPath"), String.class));
165
		a.setLastCollectionTotal(castObject(map.get("lastCollectionTotal"), Integer.class));
166
		a.setLastCollectionDate(castObject(map.get("lastCollectionDate"), Timestamp.class));
167
		a.setLastCollectionMdid(castObject(map.get("lastCollectionMdid"), String.class));
168
		a.setLastAggregationTotal(castObject(map.get("lastAggregationTotal"), Integer.class));
169
		a.setLastAggregationDate(castObject(map.get("lastAggregationDate"), Timestamp.class));
170
		a.setLastAggregationMdid(castObject(map.get("lastAggregationMdid"), String.class));
171
		a.setLastDownloadTotal(castObject(map.get("lastDownloadTotal"), Integer.class));
172
		a.setLastDownloadDate(castObject(map.get("lastDownloadDate"), Timestamp.class));
173
		a.setLastDownloadObjid(castObject(map.get("lastDownloadObjid"), String.class));
174
		a.setLastValidationJob(castObject(map.get("lastValidationJob"), String.class));
175
		a.setBaseurl(castObject(map.get("baseUrl"), String.class));
176
		try {
177
			final Array arr = castObject(map.get("params"), Array.class);
178
			if (arr != null) {
179
				a.setApiParams(Arrays.stream((Object[]) arr.getArray())
180
					.filter(Objects::nonNull)
181
					.map(Object::toString)
182
					.map(s -> {
183
						final ApiParam p = new ApiParamImpl();
184
						p.setParam(StringUtils.substringBefore(s, "="));
185
						p.setValue(StringUtils.substringAfter(s, "="));
186
						return p;
187
					})
188
					.collect(Collectors.toSet()));
189
			}
190
		} catch (final SQLException e) {
191
			log.error("Error parsing array params", e);
192
			throw new RuntimeException("Error parsing array params", e);
193
		}
194

    
195
		return a;
196
	}
197

    
198
	public static Map<String, Object> dsToMap(final Datasource<Organization<?>, Identity, PidSystem> ds) {
199
		final Map<String, Object> map = new HashMap<>();
200

    
201
		map.put("id", ds.getId());
202
		map.put("officialname", ds.getOfficialname());
203
		map.put("englishname", ds.getEnglishname());
204
		map.put("websiteurl", ds.getWebsiteurl());
205
		map.put("logourl", ds.getLogourl());
206
		map.put("contactemail", ds.getContactemail());
207
		map.put("latitude", ds.getLatitude());
208
		map.put("longitude", ds.getLongitude());
209
		map.put("timezone", ds.getTimezone());
210
		map.put("namespaceprefix", ds.getNamespaceprefix());
211
		map.put("languages", ds.getLanguages());
212
		map.put("collectedfrom", ds.getCollectedfrom());
213
		map.put("dateofvalidation", ds.getDateofvalidation());
214
		map.put("eosctype", EOSC_DATA_SOURCE);
215
		map.put("eoscdatasourcetype", ds.getEoscDatasourceType());
216
		map.put("provenanceaction", ds.getProvenanceaction());
217
		map.put("platform", ds.getPlatform());
218
		map.put("activationid", ds.getActivationId());
219
		map.put("description", ds.getDescription());
220
		map.put("releasestartdate", ds.getReleasestartdate());
221
		map.put("releaseenddate", ds.getReleaseenddate());
222
		map.put("missionstatementurl", ds.getMissionstatementurl());
223
		map.put("databaseaccesstype", ds.getDatabaseaccesstype());
224
		map.put("datauploadtype", ds.getDatauploadtype());
225
		map.put("databaseaccessrestriction", ds.getDatabaseaccessrestriction());
226
		map.put("datauploadrestriction", ds.getDatauploadrestriction());
227
		map.put("citationguidelineurl", ds.getCitationguidelineurl());
228
		map.put("pidsystems", ds.getPidsystems());
229
		map.put("certificates", ds.getCertificates());
230
		map.put("aggregator", ds.getAggregator());
231
		map.put("issn", ds.getIssn());
232
		map.put("eissn", ds.getEissn());
233
		map.put("lissn", ds.getLissn());
234
		map.put("registeredby", ds.getRegisteredby());
235
		map.put("subjects", ds.getSubjects());
236
		map.put("managed", ds.getManaged());
237
		map.put("status", ds.getStatus());
238

    
239
		return map;
240
	}
241

    
242
	public static Map<String, Object> orgToMap(final String dsId, final Organization<?> org) {
243
		final Map<String, Object> map = new HashMap<>();
244
		map.put("dsId", dsId);
245
		map.put("orgId", org.getId());
246
		map.put("legalname", org.getLegalname());
247
		map.put("legalshortname", org.getLegalshortname());
248
		map.put("websiteurl", org.getWebsiteurl());
249
		map.put("logourl", org.getLogourl());
250
		map.put("country", org.getCountry());
251
		map.put("collectedfrom", org.getCollectedfrom());
252
		return map;
253
	}
254

    
255
	public static Map<String, Object> apiToMap(final Api<?> api) {
256
		final Map<String, Object> map = new HashMap<>();
257
		map.put("apiId", api.getId());
258
		map.put("protocol", api.getProtocol());
259
		map.put("baseUrl", api.getBaseurl());
260
		map.put("dsId", api.getDatasource());
261
		map.put("contentDescription", api.getContentdescription());
262
		map.put("compatibility", api.getCompatibility());
263
		map.put("metadataIdentifierPath", api.getMetadataIdentifierPath());
264
		map.put("removable", api.getRemovable());
265
		// The other fields are not required in the INSERT operation
266
		return map;
267
	}
268

    
269
	@SuppressWarnings("unchecked")
270
	private static <T> T castObject(final Object o, final Class<T> clazz) {
271
		if (o == null) { return null; }
272
		if (clazz.isInstance(o)) { return (T) o; }
273
		throw new IllegalArgumentException("Type not managed: " + clazz.getSimpleName());
274
	}
275

    
276
}
(1-1/5)