Project

General

Profile

1
package eu.dnetlib.enabling.datasources;
2

    
3
import java.io.StringReader;
4
import java.util.Collections;
5
import java.util.Date;
6
import java.util.HashMap;
7
import java.util.List;
8
import java.util.Map;
9
import java.util.Map.Entry;
10

    
11
import org.apache.commons.lang.StringEscapeUtils;
12
import org.apache.commons.lang.StringUtils;
13
import org.apache.commons.lang.math.NumberUtils;
14
import org.apache.commons.logging.Log;
15
import org.apache.commons.logging.LogFactory;
16
import org.dom4j.Document;
17
import org.dom4j.Node;
18
import org.dom4j.io.SAXReader;
19
import org.springframework.beans.factory.annotation.Required;
20

    
21
import com.google.common.base.Function;
22
import com.google.common.collect.Iterables;
23
import com.google.common.collect.Lists;
24
import com.google.common.collect.Maps;
25

    
26
import eu.dnetlib.enabling.datasources.common.BrowsableField;
27
import eu.dnetlib.enabling.datasources.common.BrowseTerm;
28
import eu.dnetlib.enabling.datasources.common.DatasourceConstants;
29
import eu.dnetlib.enabling.datasources.common.DatasourceDesc;
30
import eu.dnetlib.enabling.datasources.common.DatasourceManager;
31
import eu.dnetlib.enabling.datasources.common.DatasourceManagerServiceException;
32
import eu.dnetlib.enabling.datasources.common.IfaceDesc;
33
import eu.dnetlib.enabling.datasources.common.RepositoryMapEntry;
34
import eu.dnetlib.enabling.datasources.common.SearchInterfacesEntry;
35
import eu.dnetlib.enabling.datasources.common.SimpleDatasourceDesc;
36

    
37
public class LocalOpenaireDatasourceManager implements DatasourceManager {
38

    
39
	private DatasourceManagerClients datasourceManagerClients;
40

    
41
	private List<DbBrowsableField> browsableFields;
42

    
43
	private static final Log log = LogFactory.getLog(LocalOpenaireDatasourceManager.class);
44

    
45
	@Override
46
	public boolean addDatasource(final DatasourceDesc ds) throws DatasourceManagerServiceException {
47
		if (StringUtils.isBlank(ds.getAggregator())) {
48
			ds.setAggregator("OPENAIRE");
49
		}
50

    
51
		final Map<String, Object> params = DatasourceFunctions.asMapOfSqlValues(ds);
52

    
53
		if ((ds.getOrganization() != null) && !ds.getOrganization().trim().isEmpty()) {
54
			params.put("hasOrganization", 1);
55
		}
56
		return datasourceManagerClients.updateSQL(ds.getId(), "addDatasource.sql.st", params, false, true);
57
	}
58

    
59
	@Override
60
	public boolean deleteDatasource(final String dsId) throws DatasourceManagerServiceException {
61
		final Map<String, Object> params = Maps.newHashMap();
62

    
63
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
64

    
65
		return datasourceManagerClients.updateSQL(dsId, "deleteDatasource.sql.st", params, true, true);
66
	}
67

    
68
	@Override
69
	public DatasourceDesc getDatasource(final String dsId) throws DatasourceManagerServiceException {
70
		final List<DatasourceDesc> list = datasourceManagerClients.getDatasourcesByCondition("ds.id = " + DatasourceFunctions.asSqlValue(dsId));
71
		if (list.size() != 1) { throw new DatasourceManagerServiceException("Datasource not found, id=" + dsId); }
72

    
73
		return list.get(0);
74
	}
75

    
76
	@Override
77
	public boolean updateActivationStatus(final String dsId, final String ifaceId, final boolean active) throws DatasourceManagerServiceException {
78
		final Map<String, Object> params = Maps.newHashMap();
79

    
80
		params.put("active", DatasourceFunctions.asSqlValue(active));
81
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
82
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
83

    
84
		return datasourceManagerClients.updateSQL(dsId, "updateActivationStatus.sql.st", params, false, true);
85
	}
86

    
87
	@Override
88
	public boolean updateLevelOfCompliance(final String dsId, final String ifaceId, final String level) throws DatasourceManagerServiceException {
89
		final Map<String, Object> params = Maps.newHashMap();
90

    
91
		params.put("level", DatasourceFunctions.asSqlValue(level));
92
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
93
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
94

    
95
		return datasourceManagerClients.updateSQL(dsId, "updateLevelOfCompliance.sql.st", params, false, true);
96
	}
97

    
98
	@Override
99
	public boolean updateBaseUrl(final String dsId, final String ifaceId, final String baseUrl) throws DatasourceManagerServiceException {
100
		return updateAccessParam(dsId, ifaceId, DatasourceParams.baseUrl.toString(), baseUrl);
101
	}
102

    
103
	@Override
104
	public boolean updateContentDescription(final String dsId, final String ifaceId, final String desc) throws DatasourceManagerServiceException {
105
		final Map<String, Object> params = Maps.newHashMap();
106
		params.put("desc", DatasourceFunctions.asSqlValue(desc));
107
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
108
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
109

    
110
		return datasourceManagerClients.updateSQL(dsId, "updateContentDescription.sql.st", params, false, true);
111
	}
112

    
113
	@Override
114
	public boolean addInterface(final String dsId, final IfaceDesc iface) throws DatasourceManagerServiceException {
115
		final Map<String, Object> params = Maps.newHashMap();
116

    
117
		params.put("datasource", DatasourceFunctions.asSqlValue(dsId));
118
		params.put("id", DatasourceFunctions.asSqlValue(iface.getId()));
119
		params.put("typology", DatasourceFunctions.asSqlValue(iface.getTypology()));
120
		params.put("protocol", DatasourceFunctions.asSqlValue(iface.getAccessProtocol()));
121
		params.put("baseUrl", DatasourceFunctions.asSqlValue(iface.getBaseUrl()));
122
		params.put("description", DatasourceFunctions.asSqlValue(iface.getContentDescription()));
123
		params.put("compliance", DatasourceFunctions.asSqlValue(iface.getCompliance()));
124

    
125
		final Map<String, String> accessParams = new HashMap<String, String>();
126
		if (iface.getAccessParams() != null) {
127
			for (final Entry<String, String> e : iface.getAccessParams().entrySet()) {
128
				accessParams.put(DatasourceFunctions.asSqlValue(e.getKey()), DatasourceFunctions.asSqlValue(e.getValue()));
129
			}
130
		}
131
		params.put("accessParams", accessParams);
132

    
133
		final Map<String, String> extraFields = new HashMap<String, String>();
134
		if (iface.getExtraFields() != null) {
135
			for (final Entry<String, String> e : iface.getExtraFields().entrySet()) {
136
				extraFields.put(DatasourceFunctions.asSqlValue(e.getKey()), DatasourceFunctions.asSqlValue(e.getValue()));
137
			}
138
		}
139
		params.put("extraFields", extraFields);
140

    
141
		return datasourceManagerClients.updateSQL(dsId, "insertInterface.sql.st", params, false, true);
142
	}
143

    
144
	@Override
145
	public boolean deleteInterface(final String dsId, final String ifcId) throws DatasourceManagerServiceException {
146
		final Map<String, Object> params = Maps.newHashMap();
147

    
148
		params.put("datasource", DatasourceFunctions.asSqlValue(dsId));
149
		params.put("id", DatasourceFunctions.asSqlValue(ifcId));
150

    
151
		return datasourceManagerClients.updateSQL(dsId, "deleteInterface.sql.st", params, false, true);
152
	}
153

    
154
	@Override
155
	public boolean updateAccessParam(final String dsId, final String ifaceId, final String field, final String value) throws DatasourceManagerServiceException {
156

    
157
		final String openaireDsId = datasourceManagerClients.findDatasourceId(dsId);
158

    
159
		final Map<String, Object> params = Maps.newHashMap();
160

    
161
		params.put("dsId", DatasourceFunctions.asSqlValue(openaireDsId));
162
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
163
		params.put("field", DatasourceFunctions.asSqlValue(field));
164
		params.put("accessParam", true);
165

    
166
		if (value != null) {
167
			params.put("value", DatasourceFunctions.asSqlValue(value));
168
		}
169

    
170
		if (datasourceManagerClients.isDefinedParam(ifaceId, field)) {
171
			params.put("update", 1);
172
		}
173

    
174
		return datasourceManagerClients.updateSQL(openaireDsId, "updateApiCollectionsRow.sql.st", params, false, true);
175
	}
176

    
177
	@Override
178
	public boolean deleteAccessParam(final String dsId, final String ifaceId, final String field) throws DatasourceManagerServiceException {
179
		final Map<String, Object> params = Maps.newHashMap();
180

    
181
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
182
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
183
		params.put("field", DatasourceFunctions.asSqlValue(field));
184

    
185
		return datasourceManagerClients.updateSQL(dsId, "deleteApiCollectionsRow.sql.st", params, false, true);
186
	}
187

    
188
	@Override
189
	public boolean updateSQL(final String dsId, final String sql, final boolean delete) throws DatasourceManagerServiceException {
190
		return datasourceManagerClients.updateSQL(dsId, sql, delete, true);
191
	}
192

    
193
	@Override
194
	public Date findNextScheduledExecution(final String dsId, final String ifaceId)
195
			throws DatasourceManagerServiceException {
196
		return datasourceManagerClients.findNextScheduledExecution(dsId, ifaceId);
197
	}
198

    
199
	@Override
200
	public boolean bulkUpdateApiAccessParams(final String repoId, final String ifaceId, final Map<String, String> params)
201
			throws DatasourceManagerServiceException {
202
		return performUpdate(repoId, ifaceId, params, true);
203
	}
204

    
205
	private boolean performUpdate(final String repoId, final String ifaceId, final Map<String, String> params, final boolean accessParam)
206
			throws DatasourceManagerServiceException {
207
		final String dsId = datasourceManagerClients.findDatasourceId(repoId);
208

    
209
		if (!accessParam) {
210
			deleteOldExtraFields(dsId, ifaceId);
211
		}
212

    
213
		for (final Map.Entry<String, String> e : params.entrySet()) {
214
			performSingleUpdate(dsId, ifaceId, e.getKey(), e.getValue(), accessParam);
215
		}
216
		datasourceManagerClients.regenerateProfile(dsId);
217
		return true;
218
	}
219

    
220
	private boolean deleteOldExtraFields(final String dsId, final String ifaceId) throws DatasourceManagerServiceException {
221
		final Map<String, Object> params = Maps.newHashMap();
222

    
223
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
224
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
225

    
226
		return datasourceManagerClients.updateSQL(dsId, "deleteOldExtraFields.sql.st", params, false, false);
227
	}
228

    
229
	private boolean performSingleUpdate(final String dsId, final String ifaceId, final String field, final String value, final boolean accessParam)
230
			throws DatasourceManagerServiceException {
231
		final Map<String, Object> params = Maps.newHashMap();
232

    
233
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
234
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
235
		params.put("field", DatasourceFunctions.asSqlValue(field));
236
		params.put("accessParam", accessParam);
237

    
238
		if (value != null) {
239
			params.put("value", DatasourceFunctions.asSqlValue(value));
240
		}
241

    
242
		if (accessParam && datasourceManagerClients.isDefinedParam(ifaceId, field)) {
243
			params.put("update", 1);
244
			params.put("preserveOriginal", 1);
245
		}
246

    
247
		return datasourceManagerClients.updateSQL(dsId, "updateApiCollectionsRow.sql.st", params, false, false);
248
	}
249

    
250
	public DatasourceManagerClients getDatasourceManagerClients() {
251
		return datasourceManagerClients;
252
	}
253

    
254
	@Required
255
	public void setDatasourceManagerClients(final DatasourceManagerClients datasourceManagerClients) {
256
		this.datasourceManagerClients = datasourceManagerClients;
257
	}
258

    
259
	@Override
260
	public boolean overrideCompliance(final String repoId, final String ifaceId, final String compliance) throws DatasourceManagerServiceException {
261

    
262
		final String dsId = datasourceManagerClients.findDatasourceId(repoId);
263

    
264
		final Map<String, Object> params = Maps.newHashMap();
265
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
266
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
267
		params.put("field", DatasourceFunctions.asSqlValue(DatasourceConstants.OVERRIDING_COMPLIANCE_FIELD));
268

    
269
		if (StringUtils.isEmpty(compliance)) {
270
			params.put("delete", true);
271
			log.debug("Removing compliance");
272
		} else {
273
			params.put("value", DatasourceFunctions.asSqlValue(compliance));
274
			if (datasourceManagerClients.isDefinedParam(ifaceId, DatasourceConstants.OVERRIDING_COMPLIANCE_FIELD)) {
275
				params.put("update", true);
276
				log.debug("Updating compliance: " + compliance);
277
			} else {
278
				params.put("insert", true);
279
				log.debug("Adding compliance: " + compliance);
280
			}
281
		}
282
		return datasourceManagerClients.updateSQL(dsId, "overrideCompliance.sql.st", params, false, true);
283
	}
284

    
285
	@Override
286
	public List<BrowsableField> listBrowsableFields() throws DatasourceManagerServiceException {
287
		return Lists.transform(getBrowsableFields(), new Function<DbBrowsableField, BrowsableField>() {
288

    
289
			@Override
290
			public BrowsableField apply(final DbBrowsableField f) {
291
				return new BrowsableField(f.getId(), f.getLabel());
292
			}
293
		});
294
	}
295

    
296
	@Override
297
	public List<BrowseTerm> browseField(final String f) throws DatasourceManagerServiceException {
298
		final List<BrowseTerm> list = Lists.newArrayList();
299

    
300
		try {
301
			final DbBrowsableField field = findBrowseField(f);
302
			if (field != null) {
303
				final SAXReader reader = new SAXReader();
304
				for (final String s : datasourceManagerClients.searchSQL(field.getSql())) {
305
					final Document doc = reader.read(new StringReader(s));
306
					final String id = doc.valueOf("/ROW/FIELD[@name='id']");
307
					final String name = doc.valueOf("/ROW/FIELD[@name='name']");
308
					final int value = NumberUtils.toInt(doc.valueOf("/ROW/FIELD[@name='count']"), 0);
309
					if (StringUtils.isNotEmpty(id)) {
310
						list.add(new BrowseTerm(id, name, value));
311
					}
312
				}
313
			}
314
		} catch (final Exception e) {
315
			log.error("Error browsing field " + f, e);
316
		}
317

    
318
		return list;
319
	}
320

    
321
	@Override
322
	public List<SearchInterfacesEntry> searchInterface(final String field, final String value) throws DatasourceManagerServiceException {
323
		try {
324
			final Map<String, Object> params = Maps.newHashMap();
325
			params.put("value", value);
326

    
327
			if (!field.equalsIgnoreCase("__search__")) {
328
				params.put("field", field);
329
			}
330

    
331
			final DbBrowsableField f = findBrowseField(field);
332
			if ((f == null) || f.isText()) {
333
				params.put("delimeter", "'");
334
			}
335

    
336
			final SAXReader reader = new SAXReader();
337
			final Iterable<String> iter = datasourceManagerClients.searchSQL("searchRepoInterfaces.sql.st", params);
338
			return Lists.newArrayList(Iterables.transform(iter, new Function<String, SearchInterfacesEntry>() {
339

    
340
				@Override
341
				public SearchInterfacesEntry apply(final String s) {
342
					final SearchInterfacesEntry iface = new SearchInterfacesEntry();
343
					try {
344
						final Document doc = reader.read(new StringReader(s));
345
						final String country = doc.valueOf("/ROW/FIELD[@name='country']");
346

    
347
						iface.setRepoId(doc.valueOf("/ROW/FIELD[@name='repoid']"));
348
						iface.setRepoCountry(StringUtils.isEmpty(country) ? "-" : country.toUpperCase());
349
						iface.setRepoName(StringEscapeUtils.unescapeXml(doc.valueOf("/ROW/FIELD[@name='reponame']")));
350
						iface.setRepoPrefix(doc.valueOf("/ROW/FIELD[@name='repoprefix']"));
351

    
352
						iface.setId(doc.valueOf("/ROW/FIELD[@name='id']"));
353
						iface.setActive(Boolean.valueOf(doc.valueOf("/ROW/FIELD[@name='active']")));
354
						iface.setProtocol(doc.valueOf("/ROW/FIELD[@name='protocol']"));
355
						iface.setCompliance(doc.valueOf("/ROW/FIELD[@name='compliance']"));
356
						iface.setAggrDate(doc.valueOf("/ROW/FIELD[@name='aggrdate']"));
357
						iface.setAggrTotal(NumberUtils.toInt(doc.valueOf("/ROW/FIELD[@name='aggrtotal']"), 0));
358
					} catch (final Exception e) {
359
						log.error(e);
360
					}
361
					return iface;
362
				}
363
			}));
364
		} catch (final Exception e) {
365
			log.error("Error searching field " + field + " - value: " + value, e);
366
		}
367
		return Lists.newArrayList();
368
	}
369

    
370
	private DbBrowsableField findBrowseField(final String id) {
371
		for (final DbBrowsableField f : getBrowsableFields()) {
372
			if (f.getId().equals(id)) { return f; }
373
		}
374
		return null;
375
	}
376

    
377
	@Override
378
	public List<RepositoryMapEntry> getRepositoryMap() throws DatasourceManagerServiceException {
379
		final SAXReader reader = new SAXReader();
380

    
381
		try {
382
			final Iterable<String> iter = datasourceManagerClients.searchSQL("findReposMap.sql.st", null);
383
			return Lists.newArrayList(Iterables.transform(iter, s -> {
384
				final RepositoryMapEntry r = new RepositoryMapEntry();
385
				try {
386
					final Document doc = reader.read(new StringReader(s));
387
					r.setId(doc.valueOf("/ROW/FIELD[@name='id']"));
388
					r.setName(StringEscapeUtils.unescapeXml(doc.valueOf("/ROW/FIELD[@name='name']")));
389
					r.setLat(NumberUtils.toFloat(doc.valueOf("/ROW/FIELD[@name='lat']"), 0));
390
					r.setLng(NumberUtils.toFloat(doc.valueOf("/ROW/FIELD[@name='lng']"), 0));
391
				} catch (final Exception e) {
392
					log.error(e);
393
				}
394
				return r;
395
			}));
396
		} catch (final Exception e) {
397
			log.error("Error obtaing repo map entries", e);
398
		}
399
		return Lists.newArrayList();
400
	}
401

    
402
	@Override
403
	public List<SimpleDatasourceDesc> simpleListDatasourcesByType(final String type) throws DatasourceManagerServiceException {
404
		final Map<String, Object> params = Maps.newHashMap();
405
		params.put("type", type);
406
		final List<SimpleDatasourceDesc> list = Lists.newArrayList();
407
		try {
408
			final SAXReader reader = new SAXReader();
409
			for (final String s : datasourceManagerClients.searchSQL("simpleFindRepos.sql.st", params)) {
410
				final Document doc = reader.read(new StringReader(s));
411
				final SimpleDatasourceDesc r = new SimpleDatasourceDesc();
412
				r.setId(doc.valueOf("/ROW/FIELD[@name='id']"));
413
				r.setOrigId(doc.valueOf("/ROW/FIELD[@name='id']"));
414
				r.setName(StringEscapeUtils.unescapeXml(doc.valueOf("/ROW/FIELD[@name='name']")));
415
				for (final Object o : doc.selectNodes("/ROW/FIELD[@name='apis']/ITEM")) {
416
					r.getApis().add(((Node) o).getText());
417
				}
418
				r.setValid(true); // TODO
419
				r.setTypology(type);
420
				list.add(r);
421
			}
422
			Collections.sort(list);
423
		} catch (final Exception e) {
424
			log.error("Error listing repos", e);
425
		}
426
		return list;
427
	}
428

    
429
	public List<DbBrowsableField> getBrowsableFields() {
430
		return browsableFields;
431
	}
432

    
433
	@Required
434
	public void setBrowsableFields(final List<DbBrowsableField> browsableFields) {
435
		this.browsableFields = browsableFields;
436
	}
437
}
(5-5/5)