Project

General

Profile

1
package eu.dnetlib.enabling.datasources;
2

    
3
import java.util.ArrayList;
4
import java.util.Date;
5
import java.util.HashMap;
6
import java.util.List;
7
import java.util.Map;
8
import java.util.Objects;
9
import java.util.stream.Collectors;
10

    
11
import org.apache.commons.lang.StringUtils;
12
import org.apache.commons.lang.math.NumberUtils;
13
import org.apache.commons.logging.Log;
14
import org.apache.commons.logging.LogFactory;
15
import org.springframework.beans.factory.annotation.Required;
16
import org.springframework.core.io.ClassPathResource;
17
import org.springframework.core.io.Resource;
18

    
19
import com.google.common.collect.ImmutableMap;
20

    
21
import eu.dnetlib.enabling.datasources.DatasourceManagerClients.AfterSqlUpdate;
22
import eu.dnetlib.enabling.datasources.common.Api;
23
import eu.dnetlib.enabling.datasources.common.ApiParam;
24
import eu.dnetlib.enabling.datasources.common.BrowsableField;
25
import eu.dnetlib.enabling.datasources.common.BrowseTerm;
26
import eu.dnetlib.enabling.datasources.common.BrowseTermImpl;
27
import eu.dnetlib.enabling.datasources.common.Datasource;
28
import eu.dnetlib.enabling.datasources.common.DatasourceManagerException;
29
import eu.dnetlib.enabling.datasources.common.Identity;
30
import eu.dnetlib.enabling.datasources.common.LocalDatasourceManager;
31
import eu.dnetlib.enabling.datasources.common.Organization;
32
import eu.dnetlib.enabling.datasources.common.SearchApisEntry;
33

    
34
public class LocalOpenaireDatasourceManager implements LocalDatasourceManager<Datasource<Organization<?>, Identity>, Api<ApiParam>> {
35

    
36
	private DatasourceManagerClients datasourceManagerClients;
37

    
38
	private List<DbBrowsableField> browsableFields;
39

    
40
	private static final String QUERY_BASEDIR = "/eu/dnetlib/enabling/datasources/queries/";
41
	private static final Resource searchApis = new ClassPathResource(QUERY_BASEDIR + "searchApisNormal.sql");
42
	private static final Resource searchApisUsingField = new ClassPathResource(QUERY_BASEDIR + "searchApisUsingField.sql");
43
	private static final Resource addDs = new ClassPathResource(QUERY_BASEDIR + "addDatasource.sql");
44
	private static final Resource addOrg = new ClassPathResource(QUERY_BASEDIR + "addOrganization.sql");
45
	private static final Resource deleteDs = new ClassPathResource(QUERY_BASEDIR + "deleteDatasource.sql");
46
	private static final Resource setActive = new ClassPathResource(QUERY_BASEDIR + "setActive.sql");
47
	private static final Resource setManaged = new ClassPathResource(QUERY_BASEDIR + "setManaged.sql");
48
	private static final Resource setCompliance = new ClassPathResource(QUERY_BASEDIR + "setCompliance.sql");
49
	private static final Resource overrideCompliance = new ClassPathResource(QUERY_BASEDIR + "overrideCompliance.sql");
50
	private static final Resource setLastCollectionInfo = new ClassPathResource(QUERY_BASEDIR + "setLastCollectionInfo.sql");
51
	private static final Resource setLastAggregationInfo = new ClassPathResource(QUERY_BASEDIR + "setLastAggregationInfo.sql");
52
	private static final Resource setLastDownloadInfo = new ClassPathResource(QUERY_BASEDIR + "setLastDownloadInfo.sql");
53
	private static final Resource listApisByDsId = new ClassPathResource(QUERY_BASEDIR + "listApisByDsId.sql");
54
	private static final Resource insertApiParam = new ClassPathResource(QUERY_BASEDIR + "insertApiParam.sql");
55
	private static final Resource insertApi = new ClassPathResource(QUERY_BASEDIR + "insertApi.sql");
56

    
57
	private static final Log log = LogFactory.getLog(LocalOpenaireDatasourceManager.class);
58

    
59
	@Override
60
	public List<? extends SearchApisEntry> searchApis(final String field, final Object value) throws DatasourceManagerException {
61
		try {
62
			final Map<String, Object> sqlParams = new HashMap<>();
63

    
64
			if (!field.equalsIgnoreCase("__search__")) {
65
				sqlParams.put("field", field);
66
				sqlParams.put("value", value);
67
			} else {
68
				sqlParams.put("value", "%" + value + "%");
69
			}
70

    
71
			return datasourceManagerClients.searchSQL(field.equalsIgnoreCase("__search__") ? searchApis : searchApisUsingField, sqlParams)
72
					.stream()
73
					.map(DatasourceFunctions::mapToSearchApisEntry)
74
					.collect(Collectors.toList());
75

    
76
		} catch (final Exception e) {
77
			log.error("Error searching field " + field + " - value: " + value, e);
78
		}
79
		return new ArrayList<>();
80
	}
81

    
82
	@Override
83
	public void saveDs(final Datasource<Organization<?>, Identity> ds) throws DatasourceManagerException {
84
		if (StringUtils.isBlank(ds.getAggregator())) {
85
			ds.setAggregator("OPENAIRE");
86
		}
87

    
88
		final Map<String, Object> dsParams = DatasourceFunctions.dsToMap(ds);
89

    
90
		datasourceManagerClients.updateSQL(ds.getId(), addDs, AfterSqlUpdate.NONE, dsParams);
91

    
92
		if (ds.getOrganizations() != null) {
93
			for (final Organization<?> org : ds.getOrganizations()) {
94
				final Map<String, Object> orgParams = DatasourceFunctions.orgToMap(org);
95
				datasourceManagerClients.updateSQL(ds.getId(), addOrg, AfterSqlUpdate.NONE, orgParams);
96

    
97
			}
98
		}
99

    
100
		datasourceManagerClients.regenerateProfile(ds.getId());
101
	}
102

    
103
	@Override
104
	public void deleteDs(final String dsId) throws DatasourceManagerException {
105
		datasourceManagerClients.updateSQL(dsId, deleteDs, AfterSqlUpdate.DELETE_DS_PROFILE, ImmutableMap.of("dsId", dsId));
106
	}
107

    
108
	@Override
109
	public Datasource<Organization<?>, Identity> getDs(final String dsId) throws DatasourceManagerException {
110
		return datasourceManagerClients.getDatasourceById(dsId);
111
	}
112

    
113
	@Override
114
	public List<Api<ApiParam>> getApis(final String dsId) throws DatasourceManagerException {
115

    
116
		return datasourceManagerClients.searchSQL(listApisByDsId, ImmutableMap.of("dsId", dsId))
117
				.stream()
118
				.map(DatasourceFunctions::mapToApi)
119
				.collect(Collectors.toList());
120
	}
121

    
122
	@Override
123
	public void setManaged(final String dsId, final boolean managed) throws DatasourceManagerException {
124
		final Map<String, Object> params = new HashMap<>();
125
		params.put("managed", managed);
126
		params.put("dsId", dsId);
127

    
128
		datasourceManagerClients.updateSQL(dsId, setManaged, AfterSqlUpdate.UPDATE_DS_PROFILE, params);
129

    
130
	}
131

    
132
	@Override
133
	public boolean isManaged(final String dsId) throws DatasourceManagerException {
134
		final String q = "SELECT * from dsm_datasources WHERE id = :dsId AND managed = true";
135
		return !datasourceManagerClients.searchSQL(q, ImmutableMap.of("dsId", dsId)).isEmpty();
136
	}
137

    
138
	@Override
139
	public void setActive(final String dsId, final String apiId, final boolean active) throws DatasourceManagerException {
140
		final Map<String, Object> params = new HashMap<>();
141
		params.put("active", active);
142
		params.put("apiId", apiId);
143
		params.put("dsId", dsId);
144

    
145
		datasourceManagerClients.updateSQL(dsId, setActive, AfterSqlUpdate.UPDATE_DS_PROFILE, params);
146
		if (!active) {
147
			setLastCollectionInfo(dsId, apiId, null, null, null);
148
			setLastAggregationInfo(dsId, apiId, null, null, null);
149
			setLastDownloadInfo(dsId, apiId, null, null, null);
150
		}
151
	}
152

    
153
	@Override
154
	public boolean isActive(final String dsId, final String apiId) throws DatasourceManagerException {
155
		final String q = "SELECT * from dsm_api WHERE id = :apiId AND datasource = :dsId AND active = true";
156
		return !datasourceManagerClients.searchSQL(q, ImmutableMap.of("dsId", dsId, "apiId", apiId)).isEmpty();
157
	}
158

    
159
	@Override
160
	public boolean isRemovable(final String dsId, final String apiId) throws DatasourceManagerException {
161
		final String q = "SELECT * from dsm_api WHERE id = :apiId AND datasource = :dsId AND active != true AND removable = true";
162
		return !datasourceManagerClients.searchSQL(q, ImmutableMap.of("dsId", dsId, "apiId", apiId)).isEmpty();
163
	}
164

    
165
	@Override
166
	public void updateCompliance(final String dsId, final String apiId, final String level, final boolean override) throws DatasourceManagerException {
167
		final Map<String, Object> params = ImmutableMap.of("level", level, "apiId", apiId, "dsId", dsId);
168
		datasourceManagerClients.updateSQL(dsId, override ? overrideCompliance : setCompliance, AfterSqlUpdate.UPDATE_DS_PROFILE, params);
169
	}
170

    
171
	@Override
172
	public void setLastCollectionInfo(final String dsId, final String apiId, final String mdId, final Integer size, final Date date)
173
			throws DatasourceManagerException {
174
		setLastOperationInfo(setLastCollectionInfo, dsId, apiId, mdId, size, date);
175
	}
176

    
177
	@Override
178
	public void setLastAggregationInfo(final String dsId, final String apiId, final String mdId, final Integer size, final Date date)
179
			throws DatasourceManagerException {
180
		setLastOperationInfo(setLastAggregationInfo, dsId, apiId, mdId, size, date);
181
	}
182

    
183
	@Override
184
	public void setLastDownloadInfo(final String dsId, final String apiId, final String objId, final Integer size, final Date date)
185
			throws DatasourceManagerException {
186
		setLastOperationInfo(setLastDownloadInfo, dsId, apiId, objId, size, date);
187
	}
188

    
189
	private void setLastOperationInfo(final Resource sqlResource, final String dsId, final String apiId, final String mdId, final Integer size, final Date date)
190
			throws DatasourceManagerException {
191
		final Map<String, Object> params = new HashMap<>();
192
		params.put("dsId", dsId);
193
		params.put("apiId", apiId);
194
		params.put("mdId", mdId);
195
		params.put("size", size);
196
		params.put("date", date);
197
		datasourceManagerClients.updateSQL(dsId, sqlResource, AfterSqlUpdate.UPDATE_DS_PROFILE, params);
198
	}
199

    
200
	@Override
201
	public void updateApiDetails(final String dsId, final String apiId, final String baseUrl, final Map<String, String> params)
202
			throws DatasourceManagerException {
203
		// Delete old params
204
		datasourceManagerClients.updateSQL(dsId, "DELETE FROM dsm_apiparams WHERE api = :api", AfterSqlUpdate.NONE, ImmutableMap.of("api", apiId));
205

    
206
		// Insert new params
207
		for (final Map.Entry<String, String> e : params.entrySet()) {
208
			final Map<String, Object> sqlParams = ImmutableMap.of("param", e.getKey(), "value", e.getValue(), "api", apiId);
209
			datasourceManagerClients.updateSQL(dsId, insertApiParam, AfterSqlUpdate.NONE, sqlParams);
210
		}
211

    
212
		// Update the BaseURL and the IS profile
213
		datasourceManagerClients.updateSQL(dsId, "UPDATE dsm_api SET baseurl = :baseurl WHERE id = :api", AfterSqlUpdate.UPDATE_DS_PROFILE,
214
				ImmutableMap.of("baseurl", baseUrl, "api", apiId));
215
	}
216

    
217
	@Override
218
	public List<? extends BrowsableField> listBrowsableFields() throws DatasourceManagerException {
219
		return getBrowsableFields();
220
	}
221

    
222
	@Override
223
	public List<BrowseTerm> browseField(final String field) throws DatasourceManagerException {
224
		return getBrowsableFields()
225
				.stream()
226
				.filter(f -> f.getId().equals(field))
227
				.map(f -> {
228
					try {
229
						return datasourceManagerClients.searchSQL(f.getSql(), new HashMap<>());
230
					} catch (final DatasourceManagerException e) {
231
						return null;
232
					}
233
				})
234
				.filter(Objects::nonNull)
235
				.flatMap(List::stream)
236
				.map(m -> new BrowseTermImpl(
237
						m.get("term").toString(),
238
						NumberUtils.toInt(m.get("count").toString())))
239
				.collect(Collectors.toList());
240
	}
241

    
242
	@Override
243
	public void addApi(final Api<ApiParam> api) throws DatasourceManagerException {
244

    
245
		datasourceManagerClients.updateSQL(api.getDatasource(), insertApi, AfterSqlUpdate.NONE, DatasourceFunctions.apiToMap(api));
246

    
247
		api.getApiParams().forEach(p -> {
248
			final ImmutableMap<String, Object> sqlParams = ImmutableMap.of("param", p.getParam(), "value", p.getValue(), "api", api.getId());
249
			try {
250
				datasourceManagerClients.updateSQL(api.getDatasource(), insertApiParam, AfterSqlUpdate.NONE, sqlParams);
251
			} catch (final DatasourceManagerException e) {
252
				throw new RuntimeException(e);
253
			}
254
		});
255

    
256
		datasourceManagerClients.regenerateProfile(api.getDatasource());
257
	}
258

    
259
	@Override
260
	public void deleteApi(final String dsId, final String apiId) throws DatasourceManagerException {
261
		if (!isRemovable(dsId, apiId)) { throw new DatasourceManagerException("The api " + apiId + " can't be deleted"); }
262

    
263
		datasourceManagerClients.updateSQL(dsId, "DELETE FROM dsm_apiparams WHERE api = :api", AfterSqlUpdate.NONE, ImmutableMap.of("api", apiId));
264
		datasourceManagerClients.updateSQL(dsId, "DELETE FROM dsm_api WHERE id = :api", AfterSqlUpdate.UPDATE_DS_PROFILE, ImmutableMap.of("api", apiId));
265
	}
266

    
267
	public DatasourceManagerClients getDatasourceManagerClients() {
268
		return datasourceManagerClients;
269
	}
270

    
271
	@Required
272
	public void setDatasourceManagerClients(final DatasourceManagerClients datasourceManagerClients) {
273
		this.datasourceManagerClients = datasourceManagerClients;
274
	}
275

    
276
	public List<DbBrowsableField> getBrowsableFields() {
277
		return browsableFields;
278
	}
279

    
280
	@Required
281
	public void setBrowsableFields(final List<DbBrowsableField> browsableFields) {
282
		this.browsableFields = browsableFields;
283
	}
284

    
285
}
(4-4/4)