Project

General

Profile

1
package eu.dnetlib.enabling.datasources;
2

    
3
import java.io.IOException;
4
import java.text.ParseException;
5
import java.text.SimpleDateFormat;
6
import java.util.ArrayList;
7
import java.util.Date;
8
import java.util.List;
9
import java.util.Map;
10

    
11
import com.google.common.base.Splitter;
12
import com.google.common.collect.Lists;
13
import com.google.common.collect.Maps;
14
import eu.dnetlib.rmi.datasource.DatasourceConstants;
15
import eu.dnetlib.rmi.datasource.DatasourceDesc;
16
import eu.dnetlib.rmi.datasource.DatasourceManagerServiceException;
17
import eu.dnetlib.rmi.datasource.IfaceDesc;
18
import org.antlr.stringtemplate.StringTemplate;
19
import org.apache.commons.io.IOUtils;
20
import org.apache.commons.lang3.StringEscapeUtils;
21
import org.apache.commons.lang3.StringUtils;
22
import org.apache.commons.logging.Log;
23
import org.apache.commons.logging.LogFactory;
24
import org.dom4j.Document;
25
import org.dom4j.Node;
26
import org.springframework.core.io.ClassPathResource;
27
import org.springframework.core.io.Resource;
28

    
29
public class DatasourceFunctions {
30

    
31
	private static final Log log = LogFactory.getLog(DatasourceFunctions.class); // NOPMD by marko on 11/24/08 5:02 PM
32

    
33
	private static Resource ifaceTemplate = new ClassPathResource("/eu/dnetlib/enabling/datasources/repo_interface.st");
34

    
35
	public static String buildInterface(final String infopackage) {
36
		final IfaceDesc iface = generateIfaceDesc(infopackage);
37

    
38
		if (iface != null) {
39
			final StringTemplate i = getTemplate(ifaceTemplate);
40
			i.setAttribute("ifc", iface);
41

    
42
			return i.toString();
43
		} else {
44
			return "";
45
		}
46
	}
47

    
48
	public static IfaceDesc generateIfaceDesc(final String infopackage) {
49
		if (infopackage == null || infopackage.trim().isEmpty()) { return null; }
50

    
51
		final IfaceDesc iface = new IfaceDesc();
52
		iface.setId(getValueBetween(infopackage, null, "<==1==>"));
53
		iface.setTypology(getValueBetween(infopackage, "<==1==>", "<==2==>"));
54
		iface.setCompliance(getValueBetween(infopackage, "<==2==>", "<==3==>"));
55
		iface.setContentDescription(getValueBetween(infopackage, "<==3==>", "<==4==>"));
56
		iface.setAccessProtocol(getValueBetween(infopackage, "<==4==>", "<==5==>"));
57
		iface.setActive(Boolean.parseBoolean(getValueBetween(infopackage, "<==5==>", "<==6==>")));
58
		iface.setRemovable(Boolean.parseBoolean(getValueBetween(infopackage, "<==6==>", "<==7==>")));
59

    
60
		final Map<String, String> accessParams = Maps.newHashMap();
61
		final Map<String, String> extraParams = Maps.newHashMap();
62

    
63
		for (String param : parseParams(getValueBetween(infopackage, "<==7==>", null))) {
64

    
65
			final String[] arr = param.split("###");
66

    
67
			if (arr.length == 3) {
68
				final boolean accessParam = Boolean.parseBoolean(arr[0].trim());
69
				final String paramName = arr[1].trim();
70
				final String paramValue = arr.length > 2 ? arr[2].trim() : "";
71

    
72
				if (accessParam) {
73
					if (paramName.equals(DatasourceParams.baseUrl.toString())) {
74
						iface.setBaseUrl(paramValue);
75
					} else {
76
						accessParams.put(paramName, paramValue);
77
					}
78
				} else {
79
					extraParams.put(paramName, paramValue);
80
				}
81
			} else {
82
				log.debug("Invalid Datasource Parameter");
83
			}
84
		}
85

    
86
		iface.setAccessParams(accessParams);
87
		iface.setExtraFields(extraParams);
88

    
89
		return iface;
90
	}
91

    
92
	private static String getValueBetween(final String s, final String pre, final String post) {
93
		if (pre == null && post == null) {
94
			return StringEscapeUtils.escapeXml(s);
95
		} else if (pre == null) {
96
			return StringEscapeUtils.escapeXml(StringUtils.substringBefore(s, post));
97
		} else if (post == null) {
98
			return StringEscapeUtils.escapeXml(StringUtils.substringAfter(s, pre));
99
		} else {
100
			return StringEscapeUtils.escapeXml(StringUtils.substringBetween(s, pre, post));
101
		}
102
	}
103

    
104
	private static Iterable<String> parseParams(final String s) {
105
		return Splitter.on("@@@").omitEmptyStrings().trimResults().split(s);
106
	}
107

    
108
	private static StringTemplate getTemplate(final Resource res) {
109
		try {
110
			return new StringTemplate(IOUtils.toString(res.getInputStream()));
111
		} catch (IOException e) {
112
			log.error("unable to get template", e);
113
			throw new RuntimeException(e);
114
		}
115
	}
116

    
117
	public static String asSqlValue(final String s) {
118
		return s == null ? "NULL" : "'" + StringUtils.replace(s, "'", "''") + "'";
119
	}
120

    
121
	public static String asSqlValue(final Boolean b) {
122
		return b == null ? "NULL" : b.toString();
123
	}
124

    
125
	private static String asSqlValue(final Double d) {
126
		return d == null ? "NULL" : d.toString();
127
	}
128

    
129
	private static Object asSqlValue(final Date date) {
130
		if (date == null) { return "NULL"; }
131
		final long millis = date.getTime();
132
		final java.sql.Date sqlDate = new java.sql.Date(millis);
133
		return "'" + sqlDate.toString() + "'";
134
	}
135

    
136
	public static boolean verifyCompliance(final Document doc) {
137

    
138
		for (Object o : doc.selectNodes("//INTERFACE")) {
139
			final String compliance = ((Node) o).valueOf("./INTERFACE_EXTRA_FIELD[@name='" + DatasourceConstants.OVERRIDING_COMPLIANCE_FIELD + "']");
140
			if (!StringUtils.isEmpty(compliance)) {
141
				if (!"unknown".equalsIgnoreCase(compliance) && !"notCompatible".equalsIgnoreCase(compliance)) { return true; }
142
			} else {
143
				final String compliance2 = ((Node) o).valueOf("@compliance");
144
				if (!"unknown".equalsIgnoreCase(compliance2) && !"notCompatible".equalsIgnoreCase(compliance2)) { return true; }
145
			}
146
		}
147

    
148
		return false;
149
	}
150

    
151
	@SuppressWarnings("unchecked")
152
	public static DatasourceDesc xmlToDatasourceDesc(final Document doc) throws DatasourceManagerServiceException {
153

    
154
		final DatasourceDesc ds = new DatasourceDesc();
155

    
156
		ds.setId(findValue(doc, "id", String.class));
157
		ds.setOfficialName(findValue(doc, "officialname", String.class));
158
		ds.setEnglishName(findValue(doc, "englishname", String.class));
159
		ds.setWebsiteUrl(findValue(doc, "websiteurl", String.class));
160
		ds.setLogoUrl(findValue(doc, "logourl", String.class));
161
		ds.setCountryCode(findValue(doc, "countrycode", String.class));
162
		ds.setCountryName(findValue(doc, "countryname", String.class));
163
		ds.setOrganization(findValue(doc, "organization", String.class));
164
		ds.setContactEmail(findValue(doc, "contactemail", String.class));
165
		ds.setLatitude(findValue(doc, "latitude", Double.class));
166
		ds.setLongitude(findValue(doc, "longitude", Double.class));
167
		ds.setTimezone(findValue(doc, "timezone", Double.class));
168
		ds.setNamespacePrefix(findValue(doc, "namespaceprefix", String.class));
169
		ds.setOdNumberOfItems(findValue(doc, "od_numberofitems", String.class));
170
		ds.setOdNumberOfItemsDate(findValue(doc, "od_numberofitemsdate", String.class));
171
		ds.setOdPolicies(findValue(doc, "od_policies", String.class));
172
		ds.setOdLanguages(findValue(doc, "od_languages", String.class));
173
		ds.setOdContentTypes(findValue(doc, "od_contenttypes", String.class));
174
		ds.setCollectedFrom(findValue(doc, "collectedfrom", String.class));
175
		ds.setInferred(findValue(doc, "inferred", Boolean.class));
176
		ds.setDeletedByInference(findValue(doc, "deletedbyinference", Boolean.class));
177
		ds.setTrust(findValue(doc, "trust", Double.class));
178
		ds.setInferenceProvenance(findValue(doc, "inferenceprovenance", String.class));
179
		ds.setDateOfValidation(findValue(doc, "dateofvalidation", Date.class));
180
		ds.setRegisteredBy(findValue(doc, "registeredby", String.class));
181
		ds.setDatasourceClass(findValue(doc, "datasourceclass", String.class));
182
		ds.setProvenanceActionClass(findValue(doc, "provenanceactionclass", String.class));
183
		ds.setDateOfCollection(findValue(doc, "dateofcollection", Date.class));
184
		ds.setTypology(findValue(doc, "typology", String.class));
185
		ds.setActivationId(findValue(doc, "activationid", String.class));
186
		ds.setMergehomonyms(findValue(doc, "mergehomonyms", Boolean.class));
187
		ds.setDescription(findValue(doc, "description", String.class));
188
		ds.setReleaseStartDate(findValue(doc, "releasestartdate", Date.class));
189
		ds.setReleaseEndDate(findValue(doc, "releaseenddate", Date.class));
190
		ds.setMissionStatementUrl(findValue(doc, "missionstatementurl", String.class));
191
		ds.setDataProvider(findValue(doc, "dataprovider", Boolean.class));
192
		ds.setServiceProvider(findValue(doc, "serviceprovider", Boolean.class));
193
		ds.setDatabaseAccessType(findValue(doc, "databaseaccesstype", String.class));
194
		ds.setDataUploadType(findValue(doc, "datauploadtype", String.class));
195
		ds.setDatabaseAccessRestriction(findValue(doc, "databaseaccessrestriction", String.class));
196
		ds.setDataUploadRestriction(findValue(doc, "datauploadrestriction", String.class));
197
		ds.setVersioning(findValue(doc, "versioning", Boolean.class));
198
		ds.setCitationGuidelineUrl(findValue(doc, "citationguidelineurl", String.class));
199
		ds.setQualityManagementKind(findValue(doc, "qualitymanagementkind", String.class));
200
		ds.setPidSystems(findValue(doc, "pidsystems", String.class));
201
		ds.setCertificates(findValue(doc, "certificates", String.class));
202
		ds.setAggregator(findValue(doc, "aggregator", String.class));
203
		ds.setIssn(findValue(doc, "issn", String.class));
204
		ds.setEissn(findValue(doc, "eissn", String.class));
205
		ds.setLissn(findValue(doc, "lissn", String.class));
206
		ds.setInterfaces(findValue(doc, "accessinfopackage", List.class));
207

    
208
		return ds;
209
	}
210

    
211
	@SuppressWarnings("unchecked")
212
	private static <T> T findValue(final Document doc, final String elem, final Class<T> clazz) throws DatasourceManagerServiceException {
213

    
214
		if (clazz == List.class) {
215
			if (elem.equalsIgnoreCase("accessinfopackage")) {
216
				final List<IfaceDesc> ifaces = Lists.newArrayList();
217
				for (Object o : doc.selectNodes("//FIELD[@name='accessinfopackage']/ITEM")) {
218
					final IfaceDesc ifaceDesc = generateIfaceDesc(((Node) o).getText());
219
					if (ifaceDesc != null) {
220
						ifaces.add(ifaceDesc);
221
					}
222
				}
223
				return (T) ifaces;
224
			} else {
225
				throw new DatasourceManagerServiceException("Invalid List element " + elem);
226
			}
227
		} else {
228
			final String val = doc.valueOf("//FIELD[@name='" + elem + "' and not(@isNull='true')]");
229

    
230
			if (clazz == String.class) {
231
				return (T) val;
232
			} else if (val == null || val.isEmpty()) {
233
				return null;
234
			} else if (clazz == Boolean.class) {
235
				return (T) new Boolean(val);
236
			} else if (clazz == Double.class) {
237
				return (T) new Double(val);
238
			} else if (clazz == Date.class) {
239
				try {
240
					return (T) new SimpleDateFormat("yyyy-MM-dd").parse(val);
241
				} catch (ParseException e) {
242
					throw new DatasourceManagerServiceException("Invalid date: " + val);
243
				}
244
			} else {
245
				throw new DatasourceManagerServiceException("Invalid type " + clazz + " for element " + elem);
246
			}
247
		}
248

    
249
	}
250

    
251
	public static Map<String, Object> asMapOfSqlValues(final DatasourceDesc ds) {
252
		final Map<String, Object> map = Maps.newHashMap();
253
		map.put("id", asSqlValue(ds.getId()));
254
		map.put("officialName", asSqlValue(ds.getOfficialName()));
255
		map.put("englishName", asSqlValue(ds.getEnglishName()));
256
		map.put("websiteUrl", asSqlValue(ds.getWebsiteUrl()));
257
		map.put("logoUrl", asSqlValue(ds.getLogoUrl()));
258
		map.put("countryCode", asSqlValue(ds.getCountryCode()));
259
		map.put("countryName", asSqlValue(ds.getCountryName()));
260
		map.put("organization", asSqlValue(ds.getOrganization()));
261
		map.put("contactEmail", asSqlValue(ds.getContactEmail()));
262
		map.put("latitude", asSqlValue(ds.getLatitude()));
263
		map.put("longitude", asSqlValue(ds.getLongitude()));
264
		map.put("timezone", asSqlValue(ds.getTimezone()));
265
		map.put("namespacePrefix", asSqlValue(ds.getNamespacePrefix()));
266
		map.put("odNumberOfItems", asSqlValue(ds.getOdNumberOfItems()));
267
		map.put("odNumberOfItemsDate", asSqlValue(ds.getOdNumberOfItemsDate()));
268
		map.put("odPolicies", asSqlValue(ds.getOdPolicies()));
269
		map.put("odLanguages", asSqlValue(ds.getOdLanguages()));
270
		map.put("odContentTypes", asSqlValue(ds.getOdContentTypes()));
271
		map.put("collectedFrom", asSqlValue(ds.getCollectedFrom()));
272
		map.put("inferred", asSqlValue(ds.isInferred()));
273
		map.put("deletedByInference", asSqlValue(ds.isDeletedByInference()));
274
		map.put("trust", asSqlValue(ds.getTrust()));
275
		map.put("inferenceProvenance", asSqlValue(ds.getInferenceProvenance()));
276
		map.put("dateOfValidation", asSqlValue(ds.getDateOfValidation()));
277
		map.put("registeredBy", asSqlValue(ds.getRegisteredBy()));
278
		map.put("datasourceClass", asSqlValue(ds.getDatasourceClass()));
279
		map.put("provenanceActionClass", asSqlValue(ds.getProvenanceActionClass()));
280
		map.put("dateOfCollection", asSqlValue(ds.getDateOfCollection()));
281
		map.put("typology", asSqlValue(ds.getTypology()));
282
		map.put("activationId", asSqlValue(ds.getActivationId()));
283
		map.put("mergehomonyms", asSqlValue(ds.isMergehomonyms()));
284
		map.put("description", asSqlValue(ds.getDescription()));
285
		map.put("releaseStartDate", asSqlValue(ds.getReleaseStartDate()));
286
		map.put("releaseEndDate", asSqlValue(ds.getReleaseEndDate()));
287
		map.put("missionStatementUrl", asSqlValue(ds.getMissionStatementUrl()));
288
		map.put("dataProvider", asSqlValue(ds.isDataProvider()));
289
		map.put("serviceProvider", asSqlValue(ds.isServiceProvider()));
290
		map.put("databaseAccessType", asSqlValue(ds.getDatabaseAccessType()));
291
		map.put("dataUploadType", asSqlValue(ds.getDataUploadType()));
292
		map.put("databaseAccessRestriction", asSqlValue(ds.getDatabaseAccessRestriction()));
293
		map.put("dataUploadRestriction", asSqlValue(ds.getDataUploadRestriction()));
294
		map.put("versioning", asSqlValue(ds.isVersioning()));
295
		map.put("citationGuidelineUrl", asSqlValue(ds.getCitationGuidelineUrl()));
296
		map.put("qualityManagementKind", asSqlValue(ds.getQualityManagementKind()));
297
		map.put("pidSystems", asSqlValue(ds.getPidSystems()));
298
		map.put("certificates", asSqlValue(ds.getCertificates()));
299
		map.put("aggregator", asSqlValue(ds.getAggregator()));
300
		map.put("issn", asSqlValue(ds.getIssn()));
301
		map.put("eissn", asSqlValue(ds.getEissn()));
302
		map.put("lissn", asSqlValue(ds.getLissn()));
303

    
304
		final ArrayList<Map<String, Object>> ifaces = new ArrayList<Map<String, Object>>();
305

    
306
		if (ds.getInterfaces() != null) {
307

    
308
			for (IfaceDesc iface : ds.getInterfaces()) {
309
				if (iface.getId() != null && !iface.getId().trim().isEmpty()) {
310
					final Map<String, Object> mapIface = Maps.newHashMap();
311

    
312
					mapIface.put("id", asSqlValue(iface.getId()));
313
					mapIface.put("typology", asSqlValue(iface.getTypology()));
314
					mapIface.put("compliance", asSqlValue(iface.getCompliance()));
315
					mapIface.put("contentDescription", asSqlValue(iface.getContentDescription()));
316
					mapIface.put("accessProtocol", asSqlValue(iface.getAccessProtocol()));
317
					mapIface.put("baseUrl", asSqlValue(iface.getBaseUrl()));
318

    
319
					final Map<String, String> extraFields = Maps.newHashMap();
320
					if (iface.getExtraFields() != null) {
321
						for (String k : iface.getExtraFields().keySet()) {
322
							if (k != null && !k.trim().isEmpty()) {
323
								extraFields.put(asSqlValue(k), asSqlValue(iface.getExtraFields().get(k)));
324
							}
325
						}
326
					}
327
					mapIface.put("extraFields", extraFields);
328

    
329
					final Map<String, String> accessParams = Maps.newHashMap();
330
					if (iface.getAccessParams() != null) {
331
						for (String k : iface.getAccessParams().keySet()) {
332
							if (k != null && !k.trim().isEmpty()) {
333
								accessParams.put(asSqlValue(k), asSqlValue(iface.getAccessParams().get(k)));
334
							}
335
						}
336
					}
337
					mapIface.put("accessParams", accessParams);
338

    
339
					ifaces.add(mapIface);
340
				}
341
			}
342

    
343
			map.put("interfaces", ifaces);
344
		}
345

    
346
		return map;
347
	}
348

    
349
	public static Map<String, Object> asMapOfSqlValues(final Map<String, String> input) {
350
		final Map<String, Object> map = Maps.newHashMap();
351
		for (Map.Entry<String, String> e : input.entrySet()) {
352
			map.put(asSqlValue(e.getKey()), asSqlValue(e.getValue()));
353
		}
354
		return map;
355
	}
356

    
357
}
(1-1/5)