Project

General

Profile

« Previous | Next » 

Revision 49081

renaming of classes and packages

View differences:

modules/dnet-openaireplus-datasource-manager/trunk/src/main/java/eu/dnetlib/enabling/datasources/DatasourceManagerServiceImpl.java
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.rmi.BrowsableField;
27
import eu.dnetlib.enabling.datasources.rmi.BrowseTerm;
28
import eu.dnetlib.enabling.datasources.rmi.DatasourceConstants;
29
import eu.dnetlib.enabling.datasources.rmi.DatasourceDesc;
30
import eu.dnetlib.enabling.datasources.rmi.DatasourceManagerService;
31
import eu.dnetlib.enabling.datasources.rmi.DatasourceManagerServiceException;
32
import eu.dnetlib.enabling.datasources.rmi.IfaceDesc;
33
import eu.dnetlib.enabling.datasources.rmi.RepositoryMapEntry;
34
import eu.dnetlib.enabling.datasources.rmi.SearchInterfacesEntry;
35
import eu.dnetlib.enabling.datasources.rmi.SimpleDatasourceDesc;
36
import eu.dnetlib.enabling.tools.AbstractBaseService;
37

  
38
public class DatasourceManagerServiceImpl extends AbstractBaseService implements DatasourceManagerService {
39

  
40
	private DatasourceManagerClients datasourceManagerClients;
41

  
42
	private List<DbBrowsableField> browsableFields;
43

  
44
	private static final Log log = LogFactory.getLog(DatasourceManagerServiceImpl.class);
45

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

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

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

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

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

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

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

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

  
77
	@Override
78
	public List<DatasourceDesc> listAllDatasources() throws DatasourceManagerServiceException {
79
		return datasourceManagerClients.getDatasourcesByCondition(null);
80
	}
81

  
82
	@Override
83
	public List<DatasourceDesc> listDatasourcesUsingFilter(final String compliance,
84
			final String contentDescription,
85
			final String iisProcessingWorkflow,
86
			final String collectedFrom) throws DatasourceManagerServiceException {
87

  
88
		String cond = "";
89

  
90
		if ((compliance != null) && !compliance.isEmpty()) {
91
			if (!cond.isEmpty()) {
92
				cond += " and ";
93
			}
94
			cond += "ag.compatibilityclass=" + DatasourceFunctions.asSqlValue(compliance);
95
		}
96

  
97
		if ((contentDescription != null) && !contentDescription.isEmpty()) {
98
			if (!cond.isEmpty()) {
99
				cond += " and ";
100
			}
101
			cond += "ag.contentdescriptionclass=" + DatasourceFunctions.asSqlValue(contentDescription);
102
		}
103

  
104
		if ((iisProcessingWorkflow != null) && !iisProcessingWorkflow.isEmpty()) {
105
			if (!cond.isEmpty()) {
106
				cond += " and ";
107
			}
108
			cond += "ag.accessinfopackage LIKE '%###" + DatasourceParams.iis_processing_workflow + "###" + iisProcessingWorkflow + "###%'";
109
		}
110

  
111
		if ((collectedFrom != null) && !collectedFrom.isEmpty()) {
112
			if (!cond.isEmpty()) {
113
				cond += " and ";
114
			}
115
			cond += "ds.collectedfrom=" + DatasourceFunctions.asSqlValue(collectedFrom);
116
		}
117

  
118
		return datasourceManagerClients.getDatasourcesByCondition(cond);
119
	}
120

  
121
	@Override
122
	public boolean updateActivationStatus(final String dsId, final String ifaceId, final boolean active) throws DatasourceManagerServiceException {
123
		final Map<String, Object> params = Maps.newHashMap();
124

  
125
		params.put("active", DatasourceFunctions.asSqlValue(active));
126
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
127
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
128

  
129
		return datasourceManagerClients.updateSQL(dsId, "updateActivationStatus.sql.st", params, false, true);
130
	}
131

  
132
	@Override
133
	public boolean updateLevelOfCompliance(final String dsId, final String ifaceId, final String level) throws DatasourceManagerServiceException {
134
		final Map<String, Object> params = Maps.newHashMap();
135

  
136
		params.put("level", DatasourceFunctions.asSqlValue(level));
137
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
138
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
139

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

  
143
	@Override
144
	public boolean updateBaseUrl(final String dsId, final String ifaceId, final String baseUrl) throws DatasourceManagerServiceException {
145
		return updateAccessParam(dsId, ifaceId, DatasourceParams.baseUrl.toString(), baseUrl, true);
146
	}
147

  
148
	@Override
149
	public boolean updateContentDescription(final String dsId, final String ifaceId, final String desc) throws DatasourceManagerServiceException {
150
		final Map<String, Object> params = Maps.newHashMap();
151
		params.put("desc", DatasourceFunctions.asSqlValue(desc));
152
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
153
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
154

  
155
		return datasourceManagerClients.updateSQL(dsId, "updateContentDescription.sql.st", params, false, true);
156
	}
157

  
158
	@Override
159
	public boolean setIisProcessingWorkflow(final String dsId, final String ifaceId, final String wf) throws DatasourceManagerServiceException {
160
		return updateExtraField(dsId, ifaceId, DatasourceParams.iis_processing_workflow.toString(), wf, false);
161
	}
162

  
163
	@Override
164
	public boolean addInterface(final String dsId, final IfaceDesc iface) throws DatasourceManagerServiceException {
165
		final Map<String, Object> params = Maps.newHashMap();
166

  
167
		params.put("datasource", DatasourceFunctions.asSqlValue(dsId));
168
		params.put("id", DatasourceFunctions.asSqlValue(iface.getId()));
169
		params.put("typology", DatasourceFunctions.asSqlValue(iface.getTypology()));
170
		params.put("protocol", DatasourceFunctions.asSqlValue(iface.getAccessProtocol()));
171
		params.put("baseUrl", DatasourceFunctions.asSqlValue(iface.getBaseUrl()));
172
		params.put("description", DatasourceFunctions.asSqlValue(iface.getContentDescription()));
173
		params.put("compliance", DatasourceFunctions.asSqlValue(iface.getCompliance()));
174

  
175
		final Map<String, String> accessParams = new HashMap<String, String>();
176
		if (iface.getAccessParams() != null) {
177
			for (final Entry<String, String> e : iface.getAccessParams().entrySet()) {
178
				accessParams.put(DatasourceFunctions.asSqlValue(e.getKey()), DatasourceFunctions.asSqlValue(e.getValue()));
179
			}
180
		}
181
		params.put("accessParams", accessParams);
182

  
183
		final Map<String, String> extraFields = new HashMap<String, String>();
184
		if (iface.getExtraFields() != null) {
185
			for (final Entry<String, String> e : iface.getExtraFields().entrySet()) {
186
				extraFields.put(DatasourceFunctions.asSqlValue(e.getKey()), DatasourceFunctions.asSqlValue(e.getValue()));
187
			}
188
		}
189
		params.put("extraFields", extraFields);
190

  
191
		return datasourceManagerClients.updateSQL(dsId, "insertInterface.sql.st", params, false, true);
192
	}
193

  
194
	@Override
195
	public boolean deleteInterface(final String dsId, final String ifcId) throws DatasourceManagerServiceException {
196
		final Map<String, Object> params = Maps.newHashMap();
197

  
198
		params.put("datasource", DatasourceFunctions.asSqlValue(dsId));
199
		params.put("id", DatasourceFunctions.asSqlValue(ifcId));
200

  
201
		return datasourceManagerClients.updateSQL(dsId, "deleteInterface.sql.st", params, false, true);
202
	}
203

  
204
	@Override
205
	public boolean updateExtraField(final String dsId, final String ifaceId, final String field, final String value, final boolean preserveOriginal)
206
			throws DatasourceManagerServiceException {
207
		return updateApiCollectionsRow(dsId, ifaceId, field, value, preserveOriginal, false);
208
	}
209

  
210
	@Override
211
	public boolean updateAccessParam(final String dsId, final String ifaceId, final String field, final String value, final boolean preserveOriginal)
212
			throws DatasourceManagerServiceException {
213
		return updateApiCollectionsRow(dsId, ifaceId, field, value, preserveOriginal, true);
214
	}
215

  
216
	private boolean updateApiCollectionsRow(final String dsId,
217
			final String ifaceId,
218
			final String field,
219
			final String value,
220
			final boolean preserveOriginal,
221
			final boolean accessParam) throws DatasourceManagerServiceException {
222

  
223
		final String openaireDsId = datasourceManagerClients.findDatasourceId(dsId);
224

  
225
		final Map<String, Object> params = Maps.newHashMap();
226

  
227
		params.put("dsId", DatasourceFunctions.asSqlValue(openaireDsId));
228
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
229
		params.put("field", DatasourceFunctions.asSqlValue(field));
230
		params.put("accessParam", accessParam);
231

  
232
		if (value != null) {
233
			params.put("value", DatasourceFunctions.asSqlValue(value));
234
		}
235

  
236
		if (datasourceManagerClients.isDefinedParam(ifaceId, field)) {
237
			params.put("update", 1);
238
		}
239
		if (preserveOriginal) {
240
			params.put("preserveOriginal", 1);
241
		}
242

  
243
		return datasourceManagerClients.updateSQL(openaireDsId, "updateApiCollectionsRow.sql.st", params, false, true);
244
	}
245

  
246
	@Override
247
	public boolean deleteAccessParamOrExtraField(final String dsId, final String ifaceId, final String field) throws DatasourceManagerServiceException {
248
		final Map<String, Object> params = Maps.newHashMap();
249

  
250
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
251
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
252
		params.put("field", DatasourceFunctions.asSqlValue(field));
253

  
254
		return datasourceManagerClients.updateSQL(dsId, "deleteApiCollectionsRow.sql.st", params, false, true);
255
	}
256

  
257
	@Override
258
	public boolean updateSQL(final String dsId, final String sql, final boolean delete) throws DatasourceManagerServiceException {
259
		return datasourceManagerClients.updateSQL(dsId, sql, delete, true);
260
	}
261

  
262
	@Override
263
	public Date findNextScheduledExecution(final String dsId, final String ifaceId)
264
			throws DatasourceManagerServiceException {
265
		return datasourceManagerClients.findNextScheduledExecution(dsId, ifaceId);
266
	}
267

  
268
	@Override
269
	public boolean bulkUpdateApiExtraFields(final String repoId, final String ifaceId, final Map<String, String> fields)
270
			throws DatasourceManagerServiceException {
271
		return performUpdate(repoId, ifaceId, fields, false);
272
	}
273

  
274
	@Override
275
	public boolean bulkUpdateApiAccessParams(final String repoId, final String ifaceId, final Map<String, String> params)
276
			throws DatasourceManagerServiceException {
277
		return performUpdate(repoId, ifaceId, params, true);
278
	}
279

  
280
	private boolean performUpdate(final String repoId, final String ifaceId, final Map<String, String> params, final boolean accessParam)
281
			throws DatasourceManagerServiceException {
282
		final String dsId = datasourceManagerClients.findDatasourceId(repoId);
283

  
284
		if (!accessParam) {
285
			deleteOldExtraFields(dsId, ifaceId);
286
		}
287

  
288
		for (final Map.Entry<String, String> e : params.entrySet()) {
289
			performSingleUpdate(dsId, ifaceId, e.getKey(), e.getValue(), accessParam);
290
		}
291
		datasourceManagerClients.regenerateProfile(dsId);
292
		return true;
293
	}
294

  
295
	private boolean deleteOldExtraFields(final String dsId, final String ifaceId) throws DatasourceManagerServiceException {
296
		final Map<String, Object> params = Maps.newHashMap();
297

  
298
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
299
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
300

  
301
		return datasourceManagerClients.updateSQL(dsId, "deleteOldExtraFields.sql.st", params, false, false);
302
	}
303

  
304
	private boolean performSingleUpdate(final String dsId, final String ifaceId, final String field, final String value, final boolean accessParam)
305
			throws DatasourceManagerServiceException {
306
		final Map<String, Object> params = Maps.newHashMap();
307

  
308
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
309
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
310
		params.put("field", DatasourceFunctions.asSqlValue(field));
311
		params.put("accessParam", accessParam);
312

  
313
		if (value != null) {
314
			params.put("value", DatasourceFunctions.asSqlValue(value));
315
		}
316

  
317
		if (accessParam && datasourceManagerClients.isDefinedParam(ifaceId, field)) {
318
			params.put("update", 1);
319
			params.put("preserveOriginal", 1);
320
		}
321

  
322
		return datasourceManagerClients.updateSQL(dsId, "updateApiCollectionsRow.sql.st", params, false, false);
323
	}
324

  
325
	public DatasourceManagerClients getDatasourceManagerClients() {
326
		return datasourceManagerClients;
327
	}
328

  
329
	@Required
330
	public void setDatasourceManagerClients(final DatasourceManagerClients datasourceManagerClients) {
331
		this.datasourceManagerClients = datasourceManagerClients;
332
	}
333

  
334
	@Override
335
	public boolean overrideCompliance(final String repoId, final String ifaceId, final String compliance) throws DatasourceManagerServiceException {
336

  
337
		final String dsId = datasourceManagerClients.findDatasourceId(repoId);
338

  
339
		final Map<String, Object> params = Maps.newHashMap();
340
		params.put("dsId", DatasourceFunctions.asSqlValue(dsId));
341
		params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId));
342
		params.put("field", DatasourceFunctions.asSqlValue(DatasourceConstants.OVERRIDING_COMPLIANCE_FIELD));
343

  
344
		if (StringUtils.isEmpty(compliance)) {
345
			params.put("delete", true);
346
			log.debug("Removing compliance");
347
		} else {
348
			params.put("value", DatasourceFunctions.asSqlValue(compliance));
349
			if (datasourceManagerClients.isDefinedParam(ifaceId, DatasourceConstants.OVERRIDING_COMPLIANCE_FIELD)) {
350
				params.put("update", true);
351
				log.debug("Updating compliance: " + compliance);
352
			} else {
353
				params.put("insert", true);
354
				log.debug("Adding compliance: " + compliance);
355
			}
356
		}
357
		return datasourceManagerClients.updateSQL(dsId, "overrideCompliance.sql.st", params, false, true);
358
	}
359

  
360
	@Override
361
	public List<BrowsableField> listBrowsableFields() throws DatasourceManagerServiceException {
362
		return Lists.transform(getBrowsableFields(), new Function<DbBrowsableField, BrowsableField>() {
363

  
364
			@Override
365
			public BrowsableField apply(final DbBrowsableField f) {
366
				return new BrowsableField(f.getId(), f.getLabel());
367
			}
368
		});
369
	}
370

  
371
	@Override
372
	public List<BrowseTerm> browseField(final String f) throws DatasourceManagerServiceException {
373
		final List<BrowseTerm> list = Lists.newArrayList();
374

  
375
		try {
376
			final DbBrowsableField field = findBrowseField(f);
377
			if (field != null) {
378
				final SAXReader reader = new SAXReader();
379
				for (final String s : datasourceManagerClients.searchSQL(field.getSql())) {
380
					final Document doc = reader.read(new StringReader(s));
381
					final String id = doc.valueOf("/ROW/FIELD[@name='id']");
382
					final String name = doc.valueOf("/ROW/FIELD[@name='name']");
383
					final int value = NumberUtils.toInt(doc.valueOf("/ROW/FIELD[@name='count']"), 0);
384
					if (StringUtils.isNotEmpty(id)) {
385
						list.add(new BrowseTerm(id, name, value));
386
					}
387
				}
388
			}
389
		} catch (final Exception e) {
390
			log.error("Error browsing field " + f, e);
391
		}
392

  
393
		return list;
394
	}
395

  
396
	@Override
397
	public List<SearchInterfacesEntry> searchInterface(final String field, final String value) throws DatasourceManagerServiceException {
398
		try {
399
			final Map<String, Object> params = Maps.newHashMap();
400
			params.put("value", value);
401

  
402
			if (!field.equalsIgnoreCase("__search__")) {
403
				params.put("field", field);
404
			}
405

  
406
			final DbBrowsableField f = findBrowseField(field);
407
			if ((f == null) || f.isText()) {
408
				params.put("delimeter", "'");
409
			}
410

  
411
			final SAXReader reader = new SAXReader();
412
			final Iterable<String> iter = datasourceManagerClients.searchSQL("searchRepoInterfaces.sql.st", params);
413
			return Lists.newArrayList(Iterables.transform(iter, new Function<String, SearchInterfacesEntry>() {
414

  
415
				@Override
416
				public SearchInterfacesEntry apply(final String s) {
417
					final SearchInterfacesEntry iface = new SearchInterfacesEntry();
418
					try {
419
						final Document doc = reader.read(new StringReader(s));
420
						final String country = doc.valueOf("/ROW/FIELD[@name='country']");
421

  
422
						iface.setRepoId(doc.valueOf("/ROW/FIELD[@name='repoid']"));
423
						iface.setRepoCountry(StringUtils.isEmpty(country) ? "-" : country.toUpperCase());
424
						iface.setRepoName(StringEscapeUtils.unescapeXml(doc.valueOf("/ROW/FIELD[@name='reponame']")));
425
						iface.setRepoPrefix(doc.valueOf("/ROW/FIELD[@name='repoprefix']"));
426

  
427
						iface.setId(doc.valueOf("/ROW/FIELD[@name='id']"));
428
						iface.setActive(Boolean.valueOf(doc.valueOf("/ROW/FIELD[@name='active']")));
429
						iface.setProtocol(doc.valueOf("/ROW/FIELD[@name='protocol']"));
430
						iface.setCompliance(doc.valueOf("/ROW/FIELD[@name='compliance']"));
431
						iface.setAggrDate(doc.valueOf("/ROW/FIELD[@name='aggrdate']"));
432
						iface.setAggrTotal(NumberUtils.toInt(doc.valueOf("/ROW/FIELD[@name='aggrtotal']"), 0));
433
					} catch (final Exception e) {
434
						log.error(e);
435
					}
436
					return iface;
437
				}
438
			}));
439
		} catch (final Exception e) {
440
			log.error("Error searching field " + field + " - value: " + value, e);
441
		}
442
		return Lists.newArrayList();
443
	}
444

  
445
	private DbBrowsableField findBrowseField(final String id) {
446
		for (final DbBrowsableField f : getBrowsableFields()) {
447
			if (f.getId().equals(id)) { return f; }
448
		}
449
		return null;
450
	}
451

  
452
	@Override
453
	public List<RepositoryMapEntry> getRepositoryMap() throws DatasourceManagerServiceException {
454
		final SAXReader reader = new SAXReader();
455

  
456
		try {
457
			final Iterable<String> iter = datasourceManagerClients.searchSQL("findReposMap.sql.st", null);
458
			return Lists.newArrayList(Iterables.transform(iter, s -> {
459
				final RepositoryMapEntry r = new RepositoryMapEntry();
460
				try {
461
					final Document doc = reader.read(new StringReader(s));
462
					r.setId(doc.valueOf("/ROW/FIELD[@name='id']"));
463
					r.setName(StringEscapeUtils.unescapeXml(doc.valueOf("/ROW/FIELD[@name='name']")));
464
					r.setLat(NumberUtils.toFloat(doc.valueOf("/ROW/FIELD[@name='lat']"), 0));
465
					r.setLng(NumberUtils.toFloat(doc.valueOf("/ROW/FIELD[@name='lng']"), 0));
466
				} catch (final Exception e) {
467
					log.error(e);
468
				}
469
				return r;
470
			}));
471
		} catch (final Exception e) {
472
			log.error("Error obtaing repo map entries", e);
473
		}
474
		return Lists.newArrayList();
475
	}
476

  
477
	@Override
478
	public List<SimpleDatasourceDesc> simpleListDatasourcesByType(final String type) throws DatasourceManagerServiceException {
479
		final Map<String, Object> params = Maps.newHashMap();
480
		params.put("type", type);
481
		final List<SimpleDatasourceDesc> list = Lists.newArrayList();
482
		try {
483
			final SAXReader reader = new SAXReader();
484
			for (final String s : datasourceManagerClients.searchSQL("simpleFindRepos.sql.st", params)) {
485
				final Document doc = reader.read(new StringReader(s));
486
				final SimpleDatasourceDesc r = new SimpleDatasourceDesc();
487
				r.setId(doc.valueOf("/ROW/FIELD[@name='id']"));
488
				r.setOrigId(doc.valueOf("/ROW/FIELD[@name='id']"));
489
				r.setName(StringEscapeUtils.unescapeXml(doc.valueOf("/ROW/FIELD[@name='name']")));
490
				for (final Object o : doc.selectNodes("/ROW/FIELD[@name='apis']/ITEM")) {
491
					r.getApis().add(((Node) o).getText());
492
				}
493
				r.setValid(true); // TODO
494
				r.setTypology(type);
495
				list.add(r);
496
			}
497
			Collections.sort(list);
498
		} catch (final Exception e) {
499
			log.error("Error listing repos", e);
500
		}
501
		return list;
502
	}
503

  
504
	public List<DbBrowsableField> getBrowsableFields() {
505
		return browsableFields;
506
	}
507

  
508
	@Required
509
	public void setBrowsableFields(final List<DbBrowsableField> browsableFields) {
510
		this.browsableFields = browsableFields;
511
	}
512
}
modules/dnet-openaireplus-datasource-manager/trunk/src/main/java/eu/dnetlib/enabling/datasources/DatasourceFunctions.java
23 23
import com.google.common.collect.Lists;
24 24
import com.google.common.collect.Maps;
25 25

  
26
import eu.dnetlib.enabling.datasources.rmi.DatasourceConstants;
27
import eu.dnetlib.enabling.datasources.rmi.DatasourceDesc;
28
import eu.dnetlib.enabling.datasources.rmi.DatasourceManagerServiceException;
29
import eu.dnetlib.enabling.datasources.rmi.IfaceDesc;
26
import eu.dnetlib.enabling.datasources.common.DatasourceConstants;
27
import eu.dnetlib.enabling.datasources.common.DatasourceDesc;
28
import eu.dnetlib.enabling.datasources.common.DatasourceManagerServiceException;
29
import eu.dnetlib.enabling.datasources.common.IfaceDesc;
30 30

  
31 31
public class DatasourceFunctions {
32 32

  
modules/dnet-openaireplus-datasource-manager/trunk/src/main/java/eu/dnetlib/enabling/datasources/LocalOpenaireDatasourceManager.java
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
}
modules/dnet-openaireplus-datasource-manager/trunk/src/main/java/eu/dnetlib/enabling/datasources/DatasourceManagerClients.java
25 25

  
26 26
import eu.dnetlib.enabling.database.rmi.DatabaseException;
27 27
import eu.dnetlib.enabling.database.rmi.DatabaseService;
28
import eu.dnetlib.enabling.datasources.rmi.DatasourceDesc;
29
import eu.dnetlib.enabling.datasources.rmi.DatasourceManagerServiceException;
28
import eu.dnetlib.enabling.datasources.common.DatasourceDesc;
29
import eu.dnetlib.enabling.datasources.common.DatasourceManagerServiceException;
30 30
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException;
31 31
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
32 32
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
modules/dnet-openaireplus-datasource-manager/trunk/src/main/java/eu/dnetlib/enabling/datasources/DbBrowsableField.java
1 1
package eu.dnetlib.enabling.datasources;
2 2

  
3
import eu.dnetlib.enabling.datasources.rmi.BrowsableField;
3
import eu.dnetlib.enabling.datasources.common.BrowsableField;
4 4

  
5 5
public class DbBrowsableField extends BrowsableField {
6 6

  
modules/dnet-openaireplus-datasource-manager/trunk/pom.xml
21 21
		</dependency>
22 22
		<dependency>
23 23
			<groupId>eu.dnetlib</groupId>
24
			<artifactId>dnet-datasource-manager-rmi</artifactId>
24
			<artifactId>dnet-datasource-manager-common</artifactId>
25 25
			<version>[4.0.0,5.0.0)</version>
26 26
		</dependency>
27 27
		<dependency>

Also available in: Unified diff