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(ds.getId(), org);
95
				datasourceManagerClients.updateSQL(ds.getId(), addOrg, AfterSqlUpdate.NONE, orgParams);
96
			}
97
		}
98

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

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

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

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

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

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

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

    
129
	}
130

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
284
}
(4-4/4)