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.BrowsableField;
24
import eu.dnetlib.enabling.datasources.common.BrowseTerm;
25
import eu.dnetlib.enabling.datasources.common.BrowseTermImpl;
26
import eu.dnetlib.enabling.datasources.common.Datasource;
27
import eu.dnetlib.enabling.datasources.common.DatasourceManagerException;
28
import eu.dnetlib.enabling.datasources.common.LocalDatasourceManager;
29
import eu.dnetlib.enabling.datasources.common.SearchApisEntry;
30

    
31
public class LocalOpenaireDatasourceManager implements LocalDatasourceManager<Datasource<?, ?>, Api<?>> {
32

    
33
	private DatasourceManagerClients datasourceManagerClients;
34

    
35
	private List<DbBrowsableField> browsableFields;
36

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

    
53
	private static final Log log = LogFactory.getLog(LocalOpenaireDatasourceManager.class);
54

    
55
	@Override
56
	public List<? extends SearchApisEntry> searchApis(final String field, final Object value) throws DatasourceManagerException {
57
		try {
58
			final Map<String, Object> sqlParams = new HashMap<>();
59

    
60
			if (!field.equalsIgnoreCase("__search__")) {
61
				sqlParams.put("field", field);
62
				sqlParams.put("value", value);
63
			} else {
64
				sqlParams.put("value", "%" + value + "%");
65
			}
66

    
67
			return datasourceManagerClients.searchSQL(field.equalsIgnoreCase("__search__") ? searchApis : searchApisUsingField, sqlParams)
68
					.stream()
69
					.map(DatasourceFunctions::mapToSearchApisEntry)
70
					.collect(Collectors.toList());
71

    
72
		} catch (final Exception e) {
73
			log.error("Error searching field " + field + " - value: " + value, e);
74
		}
75
		return new ArrayList<>();
76
	}
77

    
78
	@Override
79
	public void saveDs(final Datasource<?, ?> ds) throws DatasourceManagerException {
80
		if (StringUtils.isBlank(ds.getAggregator())) {
81
			ds.setAggregator("OPENAIRE");
82
		}
83

    
84
		final Map<String, Object> params = DatasourceFunctions.dsToMap(ds);
85

    
86
		datasourceManagerClients.updateSQL(ds.getId(), addDs, AfterSqlUpdate.UPDATE_DS_PROFILE, params);
87

    
88
		if (ds.getOrganizations() != null && !ds.getOrganizations().isEmpty()) {
89
			// TODO
90
		}
91

    
92
	}
93

    
94
	@Override
95
	public void deleteDs(final String dsId) throws DatasourceManagerException {
96
		datasourceManagerClients.updateSQL(dsId, deleteDs, AfterSqlUpdate.DELETE_DS_PROFILE, ImmutableMap.of("dsId", dsId));
97
	}
98

    
99
	@Override
100
	public Datasource<?, ?> getDs(final String dsId) throws DatasourceManagerException {
101
		return datasourceManagerClients.getDatasourceById(dsId);
102
	}
103

    
104
	@Override
105
	public List<? extends Api<?>> getApis(final String dsId) throws DatasourceManagerException {
106

    
107
		return datasourceManagerClients.searchSQL(listApisByDsId, ImmutableMap.of("dsId", dsId))
108
				.stream()
109
				.map(DatasourceFunctions::mapToApi)
110
				.collect(Collectors.toList());
111
	}
112

    
113
	@Override
114
	public void setManaged(final String dsId, final boolean managed) throws DatasourceManagerException {
115
		final Map<String, Object> params = new HashMap<>();
116
		params.put("managed", managed);
117
		params.put("dsId", dsId);
118

    
119
		datasourceManagerClients.updateSQL(dsId, setManaged, AfterSqlUpdate.UPDATE_DS_PROFILE, params);
120

    
121
	}
122

    
123
	@Override
124
	public boolean isManaged(final String dsId) throws DatasourceManagerException {
125
		final String q = "SELECT * from dsm_datasources WHERE id = :dsId AND managed = true";
126
		return !datasourceManagerClients.searchSQL(q, ImmutableMap.of("dsId", dsId)).isEmpty();
127
	}
128

    
129
	@Override
130
	public void setActive(final String dsId, final String apiId, final boolean active) throws DatasourceManagerException {
131
		final Map<String, Object> params = new HashMap<>();
132
		params.put("active", active);
133
		params.put("apiId", apiId);
134
		params.put("dsId", dsId);
135

    
136
		datasourceManagerClients.updateSQL(dsId, setActive, AfterSqlUpdate.UPDATE_DS_PROFILE, params);
137
		if (!active) {
138
			setLastCollectionInfo(dsId, apiId, null, null, null);
139
			setLastAggregationInfo(dsId, apiId, null, null, null);
140
			setLastDownloadInfo(dsId, apiId, null, null, null);
141
		}
142
	}
143

    
144
	@Override
145
	public boolean isActive(final String dsId, final String apiId) throws DatasourceManagerException {
146
		final String q = "SELECT * from dsm_api WHERE id = :apiId AND datasource = :dsId AND active = true";
147
		return !datasourceManagerClients.searchSQL(q, ImmutableMap.of("dsId", dsId, "apiId", apiId)).isEmpty();
148
	}
149

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

    
156
	@Override
157
	public void updateCompliance(final String dsId, final String apiId, final String level, final boolean override) throws DatasourceManagerException {
158
		final Map<String, Object> params = ImmutableMap.of("level", level, "apiId", apiId, "dsId", dsId);
159
		datasourceManagerClients.updateSQL(dsId, override ? overrideCompliance : setCompliance, AfterSqlUpdate.UPDATE_DS_PROFILE, params);
160
	}
161

    
162
	@Override
163
	public void setLastCollectionInfo(final String dsId, final String apiId, final String mdId, final Integer size, final Date date)
164
			throws DatasourceManagerException {
165
		setLastOperationInfo(setLastCollectionInfo, dsId, apiId, mdId, size, date);
166
	}
167

    
168
	@Override
169
	public void setLastAggregationInfo(final String dsId, final String apiId, final String mdId, final Integer size, final Date date)
170
			throws DatasourceManagerException {
171
		setLastOperationInfo(setLastAggregationInfo, dsId, apiId, mdId, size, date);
172
	}
173

    
174
	@Override
175
	public void setLastDownloadInfo(final String dsId, final String apiId, final String objId, final Integer size, final Date date)
176
			throws DatasourceManagerException {
177
		setLastOperationInfo(setLastDownloadInfo, dsId, apiId, objId, size, date);
178
	}
179

    
180
	private void setLastOperationInfo(final Resource sqlResource, final String dsId, final String apiId, final String mdId, final Integer size, final Date date)
181
			throws DatasourceManagerException {
182
		final Map<String, Object> params = new HashMap<>();
183
		params.put("dsId", dsId);
184
		params.put("apiId", apiId);
185
		params.put("mdId", mdId);
186
		params.put("size", size);
187
		params.put("date", date);
188
		datasourceManagerClients.updateSQL(dsId, sqlResource, AfterSqlUpdate.UPDATE_DS_PROFILE, params);
189
	}
190

    
191
	@Override
192
	public void updateApiDetails(final String dsId, final String apiId, final String baseUrl, final Map<String, String> params)
193
			throws DatasourceManagerException {
194
		// Delete old params
195
		datasourceManagerClients.updateSQL(dsId, "DELETE FROM dsm_apiparams WHERE api = :api", AfterSqlUpdate.NONE, ImmutableMap.of("api", apiId));
196

    
197
		// Insert new params
198
		for (final Map.Entry<String, String> e : params.entrySet()) {
199
			final Map<String, Object> sqlParams = ImmutableMap.of("param", e.getKey(), "value", e.getValue(), "api", apiId);
200
			datasourceManagerClients.updateSQL(dsId, insertApiParam, AfterSqlUpdate.NONE, sqlParams);
201
		}
202

    
203
		// Update the BaseURL and the IS profile
204
		datasourceManagerClients.updateSQL(dsId, "UPDATE dsm_api SET baseurl = :baseurl WHERE id = :api", AfterSqlUpdate.UPDATE_DS_PROFILE,
205
				ImmutableMap.of("baseurl", baseUrl, "api", apiId));
206
	}
207

    
208
	@Override
209
	public List<? extends BrowsableField> listBrowsableFields() throws DatasourceManagerException {
210
		return getBrowsableFields();
211
	}
212

    
213
	@Override
214
	public List<BrowseTerm> browseField(final String field) throws DatasourceManagerException {
215
		return getBrowsableFields()
216
				.stream()
217
				.filter(f -> f.getId().equals(field))
218
				.map(f -> {
219
					try {
220
						return datasourceManagerClients.searchSQL(f.getSql(), new HashMap<>());
221
					} catch (final DatasourceManagerException e) {
222
						return null;
223
					}
224
				})
225
				.filter(Objects::nonNull)
226
				.flatMap(List::stream)
227
				.map(m -> new BrowseTermImpl(
228
						m.get("term").toString(),
229
						NumberUtils.toInt(m.get("count").toString())))
230
				.collect(Collectors.toList());
231
	}
232

    
233
	@Override
234
	public void addApi(final Api<?> api) throws DatasourceManagerException {
235

    
236
		// TODO: sql
237
		datasourceManagerClients.updateSQL(api.getDatasource(), insertApi, AfterSqlUpdate.NONE, DatasourceFunctions.apiToMap(api));
238

    
239
		api.getApiParams().forEach(p -> {
240
			final ImmutableMap<String, Object> sqlParams = ImmutableMap.of("param", p.getParam(), "value", p.getValue(), "api", api.getId());
241
			try {
242
				datasourceManagerClients.updateSQL(api.getDatasource(), insertApiParam, AfterSqlUpdate.NONE, sqlParams);
243
			} catch (final DatasourceManagerException e) {
244
				throw new RuntimeException(e);
245
			}
246
		});
247

    
248
		datasourceManagerClients.regenerateProfile(api.getDatasource());
249
	}
250

    
251
	@Override
252
	public void deleteApi(final String dsId, final String apiId) throws DatasourceManagerException {
253
		if (!isRemovable(dsId, apiId)) { throw new DatasourceManagerException("The api " + apiId + " can't be deleted"); }
254

    
255
		datasourceManagerClients.updateSQL(dsId, "DELETE FROM dsm_apiparams WHERE api = :api", AfterSqlUpdate.NONE, ImmutableMap.of("api", apiId));
256
		datasourceManagerClients.updateSQL(dsId, "DELETE FROM dsm_api WHERE id = :api", AfterSqlUpdate.UPDATE_DS_PROFILE, ImmutableMap.of("api", apiId));
257
	}
258

    
259
	public DatasourceManagerClients getDatasourceManagerClients() {
260
		return datasourceManagerClients;
261
	}
262

    
263
	@Required
264
	public void setDatasourceManagerClients(final DatasourceManagerClients datasourceManagerClients) {
265
		this.datasourceManagerClients = datasourceManagerClients;
266
	}
267

    
268
	public List<DbBrowsableField> getBrowsableFields() {
269
		return browsableFields;
270
	}
271

    
272
	@Required
273
	public void setBrowsableFields(final List<DbBrowsableField> browsableFields) {
274
		this.browsableFields = browsableFields;
275
	}
276

    
277
}
(4-4/4)