Revision 49076
Added by Michele Artini over 5 years ago
modules/dnet-openaireplus-datasource-manager/trunk/deploy.info | ||
---|---|---|
1 |
{"type_source": "SVN", "goal": "package -U -T 4C source:jar", "url": "http://svn-public.driver.research-infrastructures.eu/driver/dnet45/modules/dnet-openaireplus-datasource-manager-service/trunk/", "deploy_repository": "dnet45-snapshots", "version": "4", "mail": "sandro.labruzzo@isti.cnr.it,michele.artini@isti.cnr.it, claudio.atzori@isti.cnr.it, alessia.bardi@isti.cnr.it", "deploy_repository_url": "http://maven.research-infrastructures.eu/nexus/content/repositories/dnet45-snapshots", "name": "dnet-openaireplus-datasource-manager-service"} |
modules/dnet-openaireplus-datasource-manager/trunk/src/main/java/eu/dnetlib/enabling/datasources/DatasourceFunctions.java | ||
---|---|---|
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 org.antlr.stringtemplate.StringTemplate; |
|
12 |
import org.apache.commons.io.IOUtils; |
|
13 |
import org.apache.commons.lang.StringEscapeUtils; |
|
14 |
import org.apache.commons.lang.StringUtils; |
|
15 |
import org.apache.commons.logging.Log; |
|
16 |
import org.apache.commons.logging.LogFactory; |
|
17 |
import org.dom4j.Document; |
|
18 |
import org.dom4j.Node; |
|
19 |
import org.springframework.core.io.ClassPathResource; |
|
20 |
import org.springframework.core.io.Resource; |
|
21 |
|
|
22 |
import com.google.common.base.Splitter; |
|
23 |
import com.google.common.collect.Lists; |
|
24 |
import com.google.common.collect.Maps; |
|
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; |
|
30 |
|
|
31 |
public class DatasourceFunctions { |
|
32 |
|
|
33 |
private static final Log log = LogFactory.getLog(DatasourceFunctions.class); // NOPMD by marko on 11/24/08 5:02 PM |
|
34 |
|
|
35 |
private static Resource ifaceTemplate = new ClassPathResource("/eu/dnetlib/enabling/datasources/repo_interface.st"); |
|
36 |
|
|
37 |
public static String buildInterface(final String infopackage) { |
|
38 |
final IfaceDesc iface = generateIfaceDesc(infopackage); |
|
39 |
|
|
40 |
if (iface != null) { |
|
41 |
final StringTemplate i = getTemplate(ifaceTemplate); |
|
42 |
i.setAttribute("ifc", iface); |
|
43 |
|
|
44 |
return i.toString(); |
|
45 |
} else { |
|
46 |
return ""; |
|
47 |
} |
|
48 |
} |
|
49 |
|
|
50 |
public static IfaceDesc generateIfaceDesc(final String infopackage) { |
|
51 |
if (infopackage == null || infopackage.trim().isEmpty()) { return null; } |
|
52 |
|
|
53 |
final IfaceDesc iface = new IfaceDesc(); |
|
54 |
iface.setId(getValueBetween(infopackage, null, "<==1==>")); |
|
55 |
iface.setTypology(getValueBetween(infopackage, "<==1==>", "<==2==>")); |
|
56 |
iface.setCompliance(getValueBetween(infopackage, "<==2==>", "<==3==>")); |
|
57 |
iface.setContentDescription(getValueBetween(infopackage, "<==3==>", "<==4==>")); |
|
58 |
iface.setAccessProtocol(getValueBetween(infopackage, "<==4==>", "<==5==>")); |
|
59 |
iface.setActive(Boolean.parseBoolean(getValueBetween(infopackage, "<==5==>", "<==6==>"))); |
|
60 |
iface.setRemovable(Boolean.parseBoolean(getValueBetween(infopackage, "<==6==>", "<==7==>"))); |
|
61 |
|
|
62 |
final Map<String, String> accessParams = Maps.newHashMap(); |
|
63 |
final Map<String, String> extraParams = Maps.newHashMap(); |
|
64 |
|
|
65 |
for (String param : parseParams(getValueBetween(infopackage, "<==7==>", null))) { |
|
66 |
|
|
67 |
final String[] arr = param.split("###"); |
|
68 |
|
|
69 |
if (arr.length == 3) { |
|
70 |
final boolean accessParam = Boolean.parseBoolean(arr[0].trim()); |
|
71 |
final String paramName = arr[1].trim(); |
|
72 |
final String paramValue = arr.length > 2 ? arr[2].trim() : ""; |
|
73 |
|
|
74 |
if (accessParam) { |
|
75 |
if (paramName.equals(DatasourceParams.baseUrl.toString())) { |
|
76 |
iface.setBaseUrl(paramValue); |
|
77 |
} else { |
|
78 |
accessParams.put(paramName, paramValue); |
|
79 |
} |
|
80 |
} else { |
|
81 |
extraParams.put(paramName, paramValue); |
|
82 |
} |
|
83 |
} else { |
|
84 |
log.debug("Invalid Datasource Parameter"); |
|
85 |
} |
|
86 |
} |
|
87 |
|
|
88 |
iface.setAccessParams(accessParams); |
|
89 |
iface.setExtraFields(extraParams); |
|
90 |
|
|
91 |
return iface; |
|
92 |
} |
|
93 |
|
|
94 |
private static String getValueBetween(final String s, final String pre, final String post) { |
|
95 |
if (pre == null && post == null) { |
|
96 |
return StringEscapeUtils.escapeXml(s); |
|
97 |
} else if (pre == null) { |
|
98 |
return StringEscapeUtils.escapeXml(StringUtils.substringBefore(s, post)); |
|
99 |
} else if (post == null) { |
|
100 |
return StringEscapeUtils.escapeXml(StringUtils.substringAfter(s, pre)); |
|
101 |
} else { |
|
102 |
return StringEscapeUtils.escapeXml(StringUtils.substringBetween(s, pre, post)); |
|
103 |
} |
|
104 |
} |
|
105 |
|
|
106 |
private static Iterable<String> parseParams(final String s) { |
|
107 |
return Splitter.on("@@@").omitEmptyStrings().trimResults().split(s); |
|
108 |
} |
|
109 |
|
|
110 |
private static StringTemplate getTemplate(final Resource res) { |
|
111 |
try { |
|
112 |
return new StringTemplate(IOUtils.toString(res.getInputStream())); |
|
113 |
} catch (IOException e) { |
|
114 |
log.error("unable to get template", e); |
|
115 |
throw new RuntimeException(e); |
|
116 |
} |
|
117 |
} |
|
118 |
|
|
119 |
public static String asSqlValue(final String s) { |
|
120 |
return s == null ? "NULL" : "'" + StringEscapeUtils.escapeSql(s) + "'"; |
|
121 |
} |
|
122 |
|
|
123 |
public static String asSqlValue(final Boolean b) { |
|
124 |
return b == null ? "NULL" : b.toString(); |
|
125 |
} |
|
126 |
|
|
127 |
private static String asSqlValue(final Double d) { |
|
128 |
return d == null ? "NULL" : d.toString(); |
|
129 |
} |
|
130 |
|
|
131 |
private static Object asSqlValue(final Date date) { |
|
132 |
if (date == null) { return "NULL"; } |
|
133 |
final long millis = date.getTime(); |
|
134 |
final java.sql.Date sqlDate = new java.sql.Date(millis); |
|
135 |
return "'" + sqlDate.toString() + "'"; |
|
136 |
} |
|
137 |
|
|
138 |
public static boolean verifyCompliance(final Document doc) { |
|
139 |
|
|
140 |
for (Object o : doc.selectNodes("//INTERFACE")) { |
|
141 |
final String compliance = ((Node) o).valueOf("./INTERFACE_EXTRA_FIELD[@name='" + DatasourceConstants.OVERRIDING_COMPLIANCE_FIELD + "']"); |
|
142 |
if (!StringUtils.isEmpty(compliance)) { |
|
143 |
if (!"unknown".equalsIgnoreCase(compliance) && !"notCompatible".equalsIgnoreCase(compliance)) { return true; } |
|
144 |
} else { |
|
145 |
final String compliance2 = ((Node) o).valueOf("@compliance"); |
|
146 |
if (!"unknown".equalsIgnoreCase(compliance2) && !"notCompatible".equalsIgnoreCase(compliance2)) { return true; } |
|
147 |
} |
|
148 |
} |
|
149 |
|
|
150 |
return false; |
|
151 |
} |
|
152 |
|
|
153 |
@SuppressWarnings("unchecked") |
|
154 |
public static DatasourceDesc xmlToDatasourceDesc(final Document doc) throws DatasourceManagerServiceException { |
|
155 |
|
|
156 |
final DatasourceDesc ds = new DatasourceDesc(); |
|
157 |
|
|
158 |
ds.setId(findValue(doc, "id", String.class)); |
|
159 |
ds.setOfficialName(findValue(doc, "officialname", String.class)); |
|
160 |
ds.setEnglishName(findValue(doc, "englishname", String.class)); |
|
161 |
ds.setWebsiteUrl(findValue(doc, "websiteurl", String.class)); |
|
162 |
ds.setLogoUrl(findValue(doc, "logourl", String.class)); |
|
163 |
ds.setCountryCode(findValue(doc, "countrycode", String.class)); |
|
164 |
ds.setCountryName(findValue(doc, "countryname", String.class)); |
|
165 |
ds.setOrganization(findValue(doc, "organization", String.class)); |
|
166 |
ds.setContactEmail(findValue(doc, "contactemail", String.class)); |
|
167 |
ds.setLatitude(findValue(doc, "latitude", Double.class)); |
|
168 |
ds.setLongitude(findValue(doc, "longitude", Double.class)); |
|
169 |
ds.setTimezone(findValue(doc, "timezone", Double.class)); |
|
170 |
ds.setNamespacePrefix(findValue(doc, "namespaceprefix", String.class)); |
|
171 |
ds.setOdNumberOfItems(findValue(doc, "od_numberofitems", String.class)); |
|
172 |
ds.setOdNumberOfItemsDate(findValue(doc, "od_numberofitemsdate", String.class)); |
|
173 |
ds.setOdPolicies(findValue(doc, "od_policies", String.class)); |
|
174 |
ds.setOdLanguages(findValue(doc, "od_languages", String.class)); |
|
175 |
ds.setOdContentTypes(findValue(doc, "od_contenttypes", String.class)); |
|
176 |
ds.setCollectedFrom(findValue(doc, "collectedfrom", String.class)); |
|
177 |
ds.setInferred(findValue(doc, "inferred", Boolean.class)); |
|
178 |
ds.setDeletedByInference(findValue(doc, "deletedbyinference", Boolean.class)); |
|
179 |
ds.setTrust(findValue(doc, "trust", Double.class)); |
|
180 |
ds.setInferenceProvenance(findValue(doc, "inferenceprovenance", String.class)); |
|
181 |
ds.setDateOfValidation(findValue(doc, "dateofvalidation", Date.class)); |
|
182 |
ds.setRegisteredBy(findValue(doc, "registeredby", String.class)); |
|
183 |
ds.setDatasourceClass(findValue(doc, "datasourceclass", String.class)); |
|
184 |
ds.setProvenanceActionClass(findValue(doc, "provenanceactionclass", String.class)); |
|
185 |
ds.setDateOfCollection(findValue(doc, "dateofcollection", Date.class)); |
|
186 |
ds.setTypology(findValue(doc, "typology", String.class)); |
|
187 |
ds.setActivationId(findValue(doc, "activationid", String.class)); |
|
188 |
ds.setMergehomonyms(findValue(doc, "mergehomonyms", Boolean.class)); |
|
189 |
ds.setDescription(findValue(doc, "description", String.class)); |
|
190 |
ds.setReleaseStartDate(findValue(doc, "releasestartdate", Date.class)); |
|
191 |
ds.setReleaseEndDate(findValue(doc, "releaseenddate", Date.class)); |
|
192 |
ds.setMissionStatementUrl(findValue(doc, "missionstatementurl", String.class)); |
|
193 |
ds.setDataProvider(findValue(doc, "dataprovider", Boolean.class)); |
|
194 |
ds.setServiceProvider(findValue(doc, "serviceprovider", Boolean.class)); |
|
195 |
ds.setDatabaseAccessType(findValue(doc, "databaseaccesstype", String.class)); |
|
196 |
ds.setDataUploadType(findValue(doc, "datauploadtype", String.class)); |
|
197 |
ds.setDatabaseAccessRestriction(findValue(doc, "databaseaccessrestriction", String.class)); |
|
198 |
ds.setDataUploadRestriction(findValue(doc, "datauploadrestriction", String.class)); |
|
199 |
ds.setVersioning(findValue(doc, "versioning", Boolean.class)); |
|
200 |
ds.setCitationGuidelineUrl(findValue(doc, "citationguidelineurl", String.class)); |
|
201 |
ds.setQualityManagementKind(findValue(doc, "qualitymanagementkind", String.class)); |
|
202 |
ds.setPidSystems(findValue(doc, "pidsystems", String.class)); |
|
203 |
ds.setCertificates(findValue(doc, "certificates", String.class)); |
|
204 |
ds.setAggregator(findValue(doc, "aggregator", String.class)); |
|
205 |
ds.setIssn(findValue(doc, "issn", String.class)); |
|
206 |
ds.setEissn(findValue(doc, "eissn", String.class)); |
|
207 |
ds.setLissn(findValue(doc, "lissn", String.class)); |
|
208 |
ds.setInterfaces(findValue(doc, "accessinfopackage", List.class)); |
|
209 |
|
|
210 |
return ds; |
|
211 |
} |
|
212 |
|
|
213 |
@SuppressWarnings("unchecked") |
|
214 |
private static <T> T findValue(final Document doc, final String elem, final Class<T> clazz) throws DatasourceManagerServiceException { |
|
215 |
|
|
216 |
if (clazz == List.class) { |
|
217 |
if (elem.equalsIgnoreCase("accessinfopackage")) { |
|
218 |
final List<IfaceDesc> ifaces = Lists.newArrayList(); |
|
219 |
for (Object o : doc.selectNodes("//FIELD[@name='accessinfopackage']/ITEM")) { |
|
220 |
final IfaceDesc ifaceDesc = generateIfaceDesc(((Node) o).getText()); |
|
221 |
if (ifaceDesc != null) { |
|
222 |
ifaces.add(ifaceDesc); |
|
223 |
} |
|
224 |
} |
|
225 |
return (T) ifaces; |
|
226 |
} else { |
|
227 |
throw new DatasourceManagerServiceException("Invalid List element " + elem); |
|
228 |
} |
|
229 |
} else { |
|
230 |
final String val = doc.valueOf("//FIELD[@name='" + elem + "' and not(@isNull='true')]"); |
|
231 |
|
|
232 |
if (clazz == String.class) { |
|
233 |
return (T) val; |
|
234 |
} else if (val == null || val.isEmpty()) { |
|
235 |
return null; |
|
236 |
} else if (clazz == Boolean.class) { |
|
237 |
return (T) new Boolean(val); |
|
238 |
} else if (clazz == Double.class) { |
|
239 |
return (T) new Double(val); |
|
240 |
} else if (clazz == Date.class) { |
|
241 |
try { |
|
242 |
return (T) new SimpleDateFormat("yyyy-MM-dd").parse(val); |
|
243 |
} catch (ParseException e) { |
|
244 |
throw new DatasourceManagerServiceException("Invalid date: " + val); |
|
245 |
} |
|
246 |
} else { |
|
247 |
throw new DatasourceManagerServiceException("Invalid type " + clazz + " for element " + elem); |
|
248 |
} |
|
249 |
} |
|
250 |
|
|
251 |
} |
|
252 |
|
|
253 |
public static Map<String, Object> asMapOfSqlValues(final DatasourceDesc ds) { |
|
254 |
final Map<String, Object> map = Maps.newHashMap(); |
|
255 |
map.put("id", asSqlValue(ds.getId())); |
|
256 |
map.put("officialName", asSqlValue(ds.getOfficialName())); |
|
257 |
map.put("englishName", asSqlValue(ds.getEnglishName())); |
|
258 |
map.put("websiteUrl", asSqlValue(ds.getWebsiteUrl())); |
|
259 |
map.put("logoUrl", asSqlValue(ds.getLogoUrl())); |
|
260 |
map.put("countryCode", asSqlValue(ds.getCountryCode())); |
|
261 |
map.put("countryName", asSqlValue(ds.getCountryName())); |
|
262 |
map.put("organization", asSqlValue(ds.getOrganization())); |
|
263 |
map.put("contactEmail", asSqlValue(ds.getContactEmail())); |
|
264 |
map.put("latitude", asSqlValue(ds.getLatitude())); |
|
265 |
map.put("longitude", asSqlValue(ds.getLongitude())); |
|
266 |
map.put("timezone", asSqlValue(ds.getTimezone())); |
|
267 |
map.put("namespacePrefix", asSqlValue(ds.getNamespacePrefix())); |
|
268 |
map.put("odNumberOfItems", asSqlValue(ds.getOdNumberOfItems())); |
|
269 |
map.put("odNumberOfItemsDate", asSqlValue(ds.getOdNumberOfItemsDate())); |
|
270 |
map.put("odPolicies", asSqlValue(ds.getOdPolicies())); |
|
271 |
map.put("odLanguages", asSqlValue(ds.getOdLanguages())); |
|
272 |
map.put("odContentTypes", asSqlValue(ds.getOdContentTypes())); |
|
273 |
map.put("collectedFrom", asSqlValue(ds.getCollectedFrom())); |
|
274 |
map.put("inferred", asSqlValue(ds.isInferred())); |
|
275 |
map.put("deletedByInference", asSqlValue(ds.isDeletedByInference())); |
|
276 |
map.put("trust", asSqlValue(ds.getTrust())); |
|
277 |
map.put("inferenceProvenance", asSqlValue(ds.getInferenceProvenance())); |
|
278 |
map.put("dateOfValidation", asSqlValue(ds.getDateOfValidation())); |
|
279 |
map.put("registeredBy", asSqlValue(ds.getRegisteredBy())); |
|
280 |
map.put("datasourceClass", asSqlValue(ds.getDatasourceClass())); |
|
281 |
map.put("provenanceActionClass", asSqlValue(ds.getProvenanceActionClass())); |
|
282 |
map.put("dateOfCollection", asSqlValue(ds.getDateOfCollection())); |
|
283 |
map.put("typology", asSqlValue(ds.getTypology())); |
|
284 |
map.put("activationId", asSqlValue(ds.getActivationId())); |
|
285 |
map.put("mergehomonyms", asSqlValue(ds.isMergehomonyms())); |
|
286 |
map.put("description", asSqlValue(ds.getDescription())); |
|
287 |
map.put("releaseStartDate", asSqlValue(ds.getReleaseStartDate())); |
|
288 |
map.put("releaseEndDate", asSqlValue(ds.getReleaseEndDate())); |
|
289 |
map.put("missionStatementUrl", asSqlValue(ds.getMissionStatementUrl())); |
|
290 |
map.put("dataProvider", asSqlValue(ds.isDataProvider())); |
|
291 |
map.put("serviceProvider", asSqlValue(ds.isServiceProvider())); |
|
292 |
map.put("databaseAccessType", asSqlValue(ds.getDatabaseAccessType())); |
|
293 |
map.put("dataUploadType", asSqlValue(ds.getDataUploadType())); |
|
294 |
map.put("databaseAccessRestriction", asSqlValue(ds.getDatabaseAccessRestriction())); |
|
295 |
map.put("dataUploadRestriction", asSqlValue(ds.getDataUploadRestriction())); |
|
296 |
map.put("versioning", asSqlValue(ds.isVersioning())); |
|
297 |
map.put("citationGuidelineUrl", asSqlValue(ds.getCitationGuidelineUrl())); |
|
298 |
map.put("qualityManagementKind", asSqlValue(ds.getQualityManagementKind())); |
|
299 |
map.put("pidSystems", asSqlValue(ds.getPidSystems())); |
|
300 |
map.put("certificates", asSqlValue(ds.getCertificates())); |
|
301 |
map.put("aggregator", asSqlValue(ds.getAggregator())); |
|
302 |
map.put("issn", asSqlValue(ds.getIssn())); |
|
303 |
map.put("eissn", asSqlValue(ds.getEissn())); |
|
304 |
map.put("lissn", asSqlValue(ds.getLissn())); |
|
305 |
|
|
306 |
final ArrayList<Map<String, Object>> ifaces = new ArrayList<Map<String, Object>>(); |
|
307 |
|
|
308 |
if (ds.getInterfaces() != null) { |
|
309 |
|
|
310 |
for (IfaceDesc iface : ds.getInterfaces()) { |
|
311 |
if (iface.getId() != null && !iface.getId().trim().isEmpty()) { |
|
312 |
final Map<String, Object> mapIface = Maps.newHashMap(); |
|
313 |
|
|
314 |
mapIface.put("id", asSqlValue(iface.getId())); |
|
315 |
mapIface.put("typology", asSqlValue(iface.getTypology())); |
|
316 |
mapIface.put("compliance", asSqlValue(iface.getCompliance())); |
|
317 |
mapIface.put("contentDescription", asSqlValue(iface.getContentDescription())); |
|
318 |
mapIface.put("accessProtocol", asSqlValue(iface.getAccessProtocol())); |
|
319 |
mapIface.put("baseUrl", asSqlValue(iface.getBaseUrl())); |
|
320 |
|
|
321 |
final Map<String, String> extraFields = Maps.newHashMap(); |
|
322 |
if (iface.getExtraFields() != null) { |
|
323 |
for (String k : iface.getExtraFields().keySet()) { |
|
324 |
if (k != null && !k.trim().isEmpty()) { |
|
325 |
extraFields.put(asSqlValue(k), asSqlValue(iface.getExtraFields().get(k))); |
|
326 |
} |
|
327 |
} |
|
328 |
} |
|
329 |
mapIface.put("extraFields", extraFields); |
|
330 |
|
|
331 |
final Map<String, String> accessParams = Maps.newHashMap(); |
|
332 |
if (iface.getAccessParams() != null) { |
|
333 |
for (String k : iface.getAccessParams().keySet()) { |
|
334 |
if (k != null && !k.trim().isEmpty()) { |
|
335 |
accessParams.put(asSqlValue(k), asSqlValue(iface.getAccessParams().get(k))); |
|
336 |
} |
|
337 |
} |
|
338 |
} |
|
339 |
mapIface.put("accessParams", accessParams); |
|
340 |
|
|
341 |
ifaces.add(mapIface); |
|
342 |
} |
|
343 |
} |
|
344 |
|
|
345 |
map.put("interfaces", ifaces); |
|
346 |
} |
|
347 |
|
|
348 |
return map; |
|
349 |
} |
|
350 |
|
|
351 |
public static Map<String, Object> asMapOfSqlValues(final Map<String, String> input) { |
|
352 |
final Map<String, Object> map = Maps.newHashMap(); |
|
353 |
for (Map.Entry<String, String> e : input.entrySet()) { |
|
354 |
map.put(asSqlValue(e.getKey()), asSqlValue(e.getValue())); |
|
355 |
} |
|
356 |
return map; |
|
357 |
} |
|
358 |
|
|
359 |
} |
modules/dnet-openaireplus-datasource-manager/trunk/src/main/java/eu/dnetlib/enabling/datasources/DatasourceManagerClients.java | ||
---|---|---|
1 |
package eu.dnetlib.enabling.datasources; |
|
2 |
|
|
3 |
import java.io.StringReader; |
|
4 |
import java.text.ParseException; |
|
5 |
import java.util.Date; |
|
6 |
import java.util.List; |
|
7 |
import java.util.Map; |
|
8 |
import java.util.regex.Pattern; |
|
9 |
|
|
10 |
import javax.xml.ws.wsaddressing.W3CEndpointReference; |
|
11 |
|
|
12 |
import org.antlr.stringtemplate.StringTemplate; |
|
13 |
import org.apache.commons.io.IOUtils; |
|
14 |
import org.apache.commons.logging.Log; |
|
15 |
import org.apache.commons.logging.LogFactory; |
|
16 |
import org.dom4j.Document; |
|
17 |
import org.dom4j.io.SAXReader; |
|
18 |
import org.quartz.CronExpression; |
|
19 |
import org.springframework.beans.factory.annotation.Required; |
|
20 |
import org.springframework.core.io.ClassPathResource; |
|
21 |
import org.springframework.core.io.Resource; |
|
22 |
|
|
23 |
import com.google.common.collect.Lists; |
|
24 |
import com.google.common.collect.Maps; |
|
25 |
|
|
26 |
import eu.dnetlib.enabling.database.rmi.DatabaseException; |
|
27 |
import eu.dnetlib.enabling.database.rmi.DatabaseService; |
|
28 |
import eu.dnetlib.enabling.datasources.rmi.DatasourceDesc; |
|
29 |
import eu.dnetlib.enabling.datasources.rmi.DatasourceManagerServiceException; |
|
30 |
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException; |
|
31 |
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; |
|
32 |
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; |
|
33 |
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService; |
|
34 |
import eu.dnetlib.enabling.locators.UniqueServiceLocator; |
|
35 |
import eu.dnetlib.enabling.resultset.client.ResultSetClientFactory; |
|
36 |
import eu.dnetlib.miscutils.functional.UnaryFunction; |
|
37 |
import eu.dnetlib.miscutils.functional.xml.ApplyXslt; |
|
38 |
|
|
39 |
public class DatasourceManagerClients { |
|
40 |
|
|
41 |
private static final Resource xslt = new ClassPathResource("/eu/dnetlib/enabling/datasources/repo_2_is.xslt"); |
|
42 |
private static final String REPOSITORY_SERVICE_RESOURCE_TYPE = "RepositoryServiceResourceType"; |
|
43 |
private static final Log log = LogFactory.getLog(DatasourceManagerClients.class); |
|
44 |
private static final String TMPLS_BASEDIR = "/eu/dnetlib/enabling/datasources/"; |
|
45 |
private String db; |
|
46 |
private UniqueServiceLocator serviceLocator; |
|
47 |
private ResultSetClientFactory resultSetClientFactory; |
|
48 |
|
|
49 |
public String findDatasourceId(final String profileId) throws DatasourceManagerServiceException { |
|
50 |
try { |
|
51 |
return serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery( |
|
52 |
"/*[.//RESOURCE_IDENTIFIER/@value='" + profileId + "']//EXTRA_FIELDS/FIELD[./key='OpenAireDataSourceId']/value/text()"); |
|
53 |
} catch (final Exception e) { |
|
54 |
log.error("Error finding dsId of profile " + profileId, e); |
|
55 |
throw new DatasourceManagerServiceException("Error finding dsId of profile " + profileId, e); |
|
56 |
} |
|
57 |
} |
|
58 |
|
|
59 |
public String getDatasourceProfile(final String dsId) throws DatasourceManagerServiceException { |
|
60 |
try { |
|
61 |
return serviceLocator.getService(ISLookUpService.class) |
|
62 |
.getResourceProfileByQuery( |
|
63 |
"collection('/db/DRIVER/RepositoryServiceResources/RepositoryServiceResourceType')/*[.//EXTRA_FIELDS/FIELD[./key='OpenAireDataSourceId']/value/text() = '" |
|
64 |
+ dsId + "']"); |
|
65 |
} catch (final Exception e) { |
|
66 |
return null; |
|
67 |
} |
|
68 |
} |
|
69 |
|
|
70 |
public boolean deleteProfile(final String dsId) throws DatasourceManagerServiceException { |
|
71 |
try { |
|
72 |
final SAXReader reader = new SAXReader(); |
|
73 |
|
|
74 |
final String profile = getDatasourceProfile(dsId); |
|
75 |
|
|
76 |
if (profile != null) { |
|
77 |
final Document docOld = reader.read(new StringReader(profile)); |
|
78 |
final String profId = docOld.valueOf("//RESOURCE_IDENTIFIER/@value"); |
|
79 |
serviceLocator.getService(ISRegistryService.class).deleteProfile(profId); |
|
80 |
} |
|
81 |
return true; |
|
82 |
} catch (final Exception e) { |
|
83 |
log.error("Error deleting profile", e); |
|
84 |
throw new DatasourceManagerServiceException("Error deleting profile", e); |
|
85 |
} |
|
86 |
} |
|
87 |
|
|
88 |
public boolean regenerateProfile(final String dsId) throws DatasourceManagerServiceException { |
|
89 |
|
|
90 |
try { |
|
91 |
final SAXReader reader = new SAXReader(); |
|
92 |
|
|
93 |
final List<String> list = getTransformedDatasourcesByCondition("ds.id= '" + dsId + "'", new ApplyXslt(xslt)); |
|
94 |
|
|
95 |
if (list.size() != 1) { throw new DatasourceManagerServiceException("Illegal number of datasource with id " + dsId + ", size: " + list.size()); } |
|
96 |
|
|
97 |
final Document doc = reader.read(new StringReader(list.get(0))); |
|
98 |
|
|
99 |
final ISRegistryService registry = serviceLocator.getService(ISRegistryService.class); |
|
100 |
|
|
101 |
final String profile = getDatasourceProfile(dsId); |
|
102 |
|
|
103 |
if (profile != null) { |
|
104 |
final Document docOld = reader.read(new StringReader(profile)); |
|
105 |
final String profId = docOld.valueOf("//RESOURCE_IDENTIFIER/@value"); |
|
106 |
|
|
107 |
doc.selectSingleNode("//RESOURCE_IDENTIFIER/@value").setText(profId); |
|
108 |
|
|
109 |
registry.updateProfile(profId, doc.asXML(), REPOSITORY_SERVICE_RESOURCE_TYPE); |
|
110 |
log.info("Profile " + profId + " UPDATED for ds " + dsId); |
|
111 |
} else { |
|
112 |
final String profId = registry.registerProfile(doc.asXML()); |
|
113 |
log.info("Valid Profile " + profId + " REGISTERED for ds " + dsId); |
|
114 |
} |
|
115 |
return true; |
|
116 |
} catch (final Exception e) { |
|
117 |
log.error("Error saving profile, id: " + dsId, e); |
|
118 |
throw new DatasourceManagerServiceException("Error regenerating profile", e); |
|
119 |
} |
|
120 |
} |
|
121 |
|
|
122 |
public Iterable<String> searchSQL(final String sql) throws DatabaseException { |
|
123 |
final W3CEndpointReference epr = serviceLocator.getService(DatabaseService.class).searchSQL(getDb(), sql); |
|
124 |
return resultSetClientFactory.getClient(epr); |
|
125 |
} |
|
126 |
|
|
127 |
public boolean updateSQL(final String dsId, final String sql, final boolean delete, final boolean updateprofile) throws DatasourceManagerServiceException { |
|
128 |
log.debug("Executing query SQL: " + sql); |
|
129 |
|
|
130 |
try { |
|
131 |
serviceLocator.getService(DatabaseService.class).updateSQL(getDb(), sql); |
|
132 |
} catch (final DatabaseException e) { |
|
133 |
throw new DatasourceManagerServiceException(e); |
|
134 |
} |
|
135 |
|
|
136 |
if (updateprofile) { |
|
137 |
if (delete) { |
|
138 |
return deleteProfile(dsId); |
|
139 |
} else { |
|
140 |
return regenerateProfile(dsId); |
|
141 |
} |
|
142 |
} |
|
143 |
return false; |
|
144 |
} |
|
145 |
|
|
146 |
public boolean updateSQL(final String dsId, final String sqlTemplate, final Map<String, Object> params, final boolean delete, final boolean updateProfile) |
|
147 |
throws DatasourceManagerServiceException { |
|
148 |
|
|
149 |
verifyParams(params.values()); |
|
150 |
verifyParams(params.keySet().toArray()); |
|
151 |
|
|
152 |
try { |
|
153 |
final Resource resource = new ClassPathResource(TMPLS_BASEDIR + sqlTemplate); |
|
154 |
final StringTemplate st = new StringTemplate(IOUtils.toString(resource.getInputStream())); |
|
155 |
st.setAttributes(params); |
|
156 |
return updateSQL(dsId, st.toString(), delete, updateProfile); |
|
157 |
} catch (final Exception e) { |
|
158 |
log.error("Error in updateSQL", e); |
|
159 |
throw new DatasourceManagerServiceException("Error in updateSQL", e); |
|
160 |
} |
|
161 |
} |
|
162 |
|
|
163 |
public List<DatasourceDesc> getDatasourcesByCondition(final String condition) throws DatasourceManagerServiceException { |
|
164 |
final SAXReader reader = new SAXReader(); |
|
165 |
final List<DatasourceDesc> list = Lists.newArrayList(); |
|
166 |
try { |
|
167 |
for (final String s : getXmlDatasourcesByCondition(condition)) { |
|
168 |
final Document doc = reader.read(new StringReader(s)); |
|
169 |
list.add(DatasourceFunctions.xmlToDatasourceDesc(doc)); |
|
170 |
} |
|
171 |
} catch (final Exception e) { |
|
172 |
log.error("Error obtaining datasources from db", e); |
|
173 |
throw new DatasourceManagerServiceException("Error obtaining datasources from db", e); |
|
174 |
} |
|
175 |
return list; |
|
176 |
|
|
177 |
} |
|
178 |
|
|
179 |
private void verifyParams(final Object... params) throws DatasourceManagerServiceException { |
|
180 |
|
|
181 |
final Pattern pattern = Pattern.compile("\\n"); |
|
182 |
|
|
183 |
for (final Object p : params) { |
|
184 |
log.debug("TESTING SQL PARAM:" + p); |
|
185 |
if ((p == null) || p.toString().isEmpty()) { |
|
186 |
log.error("Parameter null or empty"); |
|
187 |
throw new DatasourceManagerServiceException("Parameter null or empty"); |
|
188 |
} else if (pattern.matcher(p.toString()).matches()) { |
|
189 |
log.error("Parameter [" + p + "] contains an invalid character"); |
|
190 |
throw new DatasourceManagerServiceException("Parameter [" + p + "] contains an invalid character"); |
|
191 |
} else { |
|
192 |
log.debug("TEST OK"); |
|
193 |
} |
|
194 |
} |
|
195 |
} |
|
196 |
|
|
197 |
private List<String> getTransformedDatasourcesByCondition(final String condition, final UnaryFunction<String, String> function) |
|
198 |
throws DatasourceManagerServiceException { |
|
199 |
final List<String> list = Lists.newArrayList(); |
|
200 |
try { |
|
201 |
for (final String s : getXmlDatasourcesByCondition(condition)) { |
|
202 |
list.add(function.evaluate(s)); |
|
203 |
} |
|
204 |
} catch (final Exception e) { |
|
205 |
log.error("Error obtaining datasources from db", e); |
|
206 |
throw new DatasourceManagerServiceException("Error obtaining datasources from db", e); |
|
207 |
} |
|
208 |
return list; |
|
209 |
} |
|
210 |
|
|
211 |
private Iterable<String> getXmlDatasourcesByCondition(final String condition) throws DatasourceManagerServiceException { |
|
212 |
try { |
|
213 |
final Map<String, Object> params = Maps.newHashMap(); |
|
214 |
|
|
215 |
if ((condition != null) && !condition.trim().isEmpty()) { |
|
216 |
params.put("condition", condition); |
|
217 |
} |
|
218 |
return searchSQL("getDatasources.sql.st", params); |
|
219 |
} catch (final Exception e) { |
|
220 |
log.error("Error obtaining datasources from db", e); |
|
221 |
throw new DatasourceManagerServiceException("Error obtaining datasources from db", e); |
|
222 |
} |
|
223 |
} |
|
224 |
|
|
225 |
public Iterable<String> searchSQL(final String sqlTemplate, final Map<String, Object> params) throws DatasourceManagerServiceException { |
|
226 |
try { |
|
227 |
final Resource resource = new ClassPathResource(TMPLS_BASEDIR + sqlTemplate); |
|
228 |
final StringTemplate st = new StringTemplate(IOUtils.toString(resource.getInputStream())); |
|
229 |
if (params != null) { |
|
230 |
st.setAttributes(params); |
|
231 |
} |
|
232 |
|
|
233 |
final String sql = st.toString(); |
|
234 |
|
|
235 |
log.debug("Executing SQL: " + sql); |
|
236 |
|
|
237 |
return searchSQL(sql); |
|
238 |
} catch (final Exception e) { |
|
239 |
log.error("Error executing sql", e); |
|
240 |
|
|
241 |
throw new DatasourceManagerServiceException("Error obtaining datasources from db", e); |
|
242 |
} |
|
243 |
} |
|
244 |
|
|
245 |
public boolean isDefinedParam(final String ifaceId, final String field) throws DatasourceManagerServiceException { |
|
246 |
final Map<String, Object> params = Maps.newHashMap(); |
|
247 |
params.put("ifaceId", DatasourceFunctions.asSqlValue(ifaceId)); |
|
248 |
params.put("field", DatasourceFunctions.asSqlValue(field)); |
|
249 |
|
|
250 |
final List<String> list = Lists.newArrayList(searchSQL("searchApiCollectionParam.sql.st", params)); |
|
251 |
|
|
252 |
return !list.isEmpty(); |
|
253 |
} |
|
254 |
|
|
255 |
public Date findNextScheduledExecution(final String dsId, final String ifaceId) throws DatasourceManagerServiceException { |
|
256 |
final String xquery = "/*[.//DATAPROVIDER/@interface='" + ifaceId + "' and .//SCHEDULING/@enabled='true']//CRON/text()"; |
|
257 |
try { |
|
258 |
final String cronExpression = serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery(xquery); |
|
259 |
final CronExpression cron = new CronExpression(cronExpression); |
|
260 |
return cron.getNextValidTimeAfter(new Date()); |
|
261 |
} catch (final ISLookUpDocumentNotFoundException e) { |
|
262 |
// When the value is not found a null value must be returned |
|
263 |
return null; |
|
264 |
} catch (final ISLookUpException e) { |
|
265 |
log.error("Error in xquery: " + xquery, e); |
|
266 |
throw new DatasourceManagerServiceException("Error in xquery: " + xquery, e); |
|
267 |
} catch (final ParseException e) { |
|
268 |
log.error("Error parsing cron expression", e); |
|
269 |
throw new DatasourceManagerServiceException("Error parsing cron expression", e); |
|
270 |
} |
|
271 |
} |
|
272 |
|
|
273 |
public String getDb() { |
|
274 |
return db; |
|
275 |
} |
|
276 |
|
|
277 |
@Required |
|
278 |
public void setDb(final String db) { |
|
279 |
this.db = db; |
|
280 |
} |
|
281 |
|
|
282 |
public ResultSetClientFactory getResultSetClientFactory() { |
|
283 |
return resultSetClientFactory; |
|
284 |
} |
|
285 |
|
|
286 |
@Required |
|
287 |
public void setResultSetClientFactory(final ResultSetClientFactory resultSetClientFactory) { |
|
288 |
this.resultSetClientFactory = resultSetClientFactory; |
|
289 |
} |
|
290 |
|
|
291 |
public UniqueServiceLocator getServiceLocator() { |
|
292 |
return serviceLocator; |
|
293 |
} |
|
294 |
|
|
295 |
@Required |
|
296 |
public void setServiceLocator(final UniqueServiceLocator serviceLocator) { |
|
297 |
this.serviceLocator = serviceLocator; |
|
298 |
} |
|
299 |
|
|
300 |
} |
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/DbBrowsableField.java | ||
---|---|---|
1 |
package eu.dnetlib.enabling.datasources; |
|
2 |
|
|
3 |
import eu.dnetlib.enabling.datasources.rmi.BrowsableField; |
|
4 |
|
|
5 |
public class DbBrowsableField extends BrowsableField { |
|
6 |
|
|
7 |
private String sql; |
|
8 |
|
|
9 |
private boolean text = true; |
|
10 |
|
|
11 |
public DbBrowsableField() { |
|
12 |
super(); |
|
13 |
} |
|
14 |
|
|
15 |
public DbBrowsableField(final String id, final String label) { |
|
16 |
super(id, label); |
|
17 |
} |
|
18 |
|
|
19 |
public DbBrowsableField(final String id, final String label, final String sql) { |
|
20 |
super(id, label); |
|
21 |
this.sql = sql; |
|
22 |
} |
|
23 |
|
|
24 |
public String getSql() { |
|
25 |
return sql; |
|
26 |
} |
|
27 |
|
|
28 |
public void setSql(final String sql) { |
|
29 |
this.sql = sql; |
|
30 |
} |
|
31 |
|
|
32 |
public boolean isText() { |
|
33 |
return text; |
|
34 |
} |
|
35 |
|
|
36 |
public void setText(boolean text) { |
|
37 |
this.text = text; |
|
38 |
} |
|
39 |
|
|
40 |
} |
modules/dnet-openaireplus-datasource-manager/trunk/src/main/java/eu/dnetlib/enabling/datasources/DatasourceParams.java | ||
---|---|---|
1 |
package eu.dnetlib.enabling.datasources; |
|
2 |
|
|
3 |
public enum DatasourceParams { |
|
4 |
baseUrl, iis_processing_workflow, metadata_identifier_path |
|
5 |
} |
modules/dnet-openaireplus-datasource-manager/trunk/src/main/resources/db_fixes/script.sql | ||
---|---|---|
1 |
alter table dsm_api add column compatibility_override varchar(255) default NULL; |
modules/dnet-openaireplus-datasource-manager/trunk/src/main/resources/eu/dnetlib/enabling/datasources/searchApiCollectionParam.sql.st | ||
---|---|---|
1 |
SELECT * FROM apicollections WHERE api = $ifaceId$ AND lower(param) = lower($field$) |
modules/dnet-openaireplus-datasource-manager/trunk/src/main/resources/eu/dnetlib/enabling/datasources/deleteOldExtraFields.sql.st | ||
---|---|---|
1 |
DELETE FROM apicollections WHERE api = $ifaceId$ AND accessparam = false; |
modules/dnet-openaireplus-datasource-manager/trunk/src/main/resources/eu/dnetlib/enabling/datasources/searchRepoInterfaces.sql.st | ||
---|---|---|
1 |
SELECT * FROM (SELECT |
|
2 |
(array_agg(DISTINCT o.countryclass))[1] AS country, |
|
3 |
(array_agg(DISTINCT o.legalname))[1] AS organization, |
|
4 |
d.id AS repoid, |
|
5 |
d.officialname AS reponame, |
|
6 |
d.englishname AS othername, |
|
7 |
d.namespaceprefix AS repoprefix, |
|
8 |
d.websiteurl AS repourl, |
|
9 |
a.id AS id, |
|
10 |
a.active AS active, |
|
11 |
a.protocolclass AS protocol, |
|
12 |
a.typologyclass AS type, |
|
13 |
CASE |
|
14 |
WHEN (accomp.edited IS NOT NULL) THEN accomp.edited |
|
15 |
WHEN (accomp.original IS NOT NULL) THEN accomp.original |
|
16 |
ELSE a.compatibilityclass |
|
17 |
END AS compliance, |
|
18 |
CASE |
|
19 |
WHEN (acaggrdate.edited IS NOT NULL) THEN acaggrdate.edited |
|
20 |
WHEN (acaggrdate.original IS NOT NULL) THEN acaggrdate.original |
|
21 |
WHEN (acdowndate.edited IS NOT NULL) THEN acdowndate.edited |
|
22 |
WHEN (acdowndate.original IS NOT NULL) THEN acdowndate.original |
|
23 |
ELSE '' |
|
24 |
END AS aggrdate, |
|
25 |
CASE |
|
26 |
WHEN (acaggrtotal.edited IS NOT NULL) THEN acaggrtotal.edited |
|
27 |
WHEN (acaggrtotal.original IS NOT NULL) THEN acaggrtotal.original |
|
28 |
WHEN (acdowntotal.edited IS NOT NULL) THEN acdowntotal.edited |
|
29 |
WHEN (acdowntotal.original IS NOT NULL) THEN acdowntotal.original |
|
30 |
ELSE '0' |
|
31 |
END AS aggrtotal |
|
32 |
FROM |
|
33 |
api a |
|
34 |
LEFT OUTER JOIN datasources d ON (a.datasource = d.id) |
|
35 |
LEFT OUTER JOIN datasource_organization dao ON (d.id = dao.datasource) |
|
36 |
LEFT OUTER JOIN organizations o ON (dao.organization = o.id) |
|
37 |
LEFT OUTER JOIN apicollections accomp ON (a.id = accomp.api AND accomp.param = 'overriding_compliance') |
|
38 |
LEFT OUTER JOIN apicollections acaggrdate ON (a.id = acaggrdate.api AND acaggrdate.param = 'last_aggregation_date') |
|
39 |
LEFT OUTER JOIN apicollections acaggrtotal ON (a.id = acaggrtotal.api AND acaggrtotal.param = 'last_aggregation_total') |
|
40 |
LEFT OUTER JOIN apicollections acdowndate ON (a.id = acdowndate.api AND acdowndate.param = 'last_download_date') |
|
41 |
LEFT OUTER JOIN apicollections acdowntotal ON (a.id = acdowntotal.api AND acdowntotal.param = 'last_download_total') |
|
42 |
GROUP BY |
|
43 |
d.id, d.officialname, d.englishname, d.namespaceprefix, d.websiteurl, |
|
44 |
a.id, a.active, a.protocolclass, a.typologyclass, a.compatibilityclass, |
|
45 |
accomp.edited, accomp.original, |
|
46 |
acaggrdate.edited, acaggrdate.original, |
|
47 |
acdowndate.edited, acdowndate.original, |
|
48 |
acaggrtotal.edited, acaggrtotal.original, |
|
49 |
acdowntotal.edited, acdowntotal.original |
|
50 |
) AS t WHERE |
|
51 |
$if(field)$ |
|
52 |
$field$ = $delimeter$$value$$delimeter$ |
|
53 |
$else$ |
|
54 |
repoid ILIKE '%$value$%' |
|
55 |
OR reponame ILIKE '%$value$%' |
|
56 |
OR othername ILIKE '%$value$%' |
|
57 |
OR repoprefix ILIKE '%$value$%' |
|
58 |
OR repourl ILIKE '%$value$%' |
|
59 |
OR organization ILIKE '%$value$%' |
|
60 |
$endif$ |
|
61 |
|
|
62 |
|
modules/dnet-openaireplus-datasource-manager/trunk/src/main/resources/eu/dnetlib/enabling/datasources/simpleFindRepos.sql.st | ||
---|---|---|
1 |
SELECT |
|
2 |
d.id AS id, |
|
3 |
d.officialname AS name, |
|
4 |
array_agg(DISTINCT a.id) AS apis |
|
5 |
FROM |
|
6 |
datasources d |
|
7 |
LEFT OUTER JOIN api a ON (d.id = a.datasource) |
|
8 |
WHERE |
|
9 |
datasourceclass = '$type$' |
|
10 |
GROUP BY |
|
11 |
d.id, |
|
12 |
d.officialname |
|
13 |
ORDER BY |
|
14 |
d.officialname |
|
15 |
|
modules/dnet-openaireplus-datasource-manager/trunk/src/main/resources/eu/dnetlib/enabling/datasources/addDatasource.sql.st | ||
---|---|---|
1 |
BEGIN; |
|
2 |
|
|
3 |
INSERT INTO datasources ( |
|
4 |
_dnet_resource_identifier_, |
|
5 |
id, |
|
6 |
officialName, |
|
7 |
englishName, |
|
8 |
websiteUrl, |
|
9 |
logoUrl, |
|
10 |
contactEmail, |
|
11 |
latitude, |
|
12 |
longitude, |
|
13 |
timezone, |
|
14 |
namespacePrefix, |
|
15 |
od_NumberOfItems, |
|
16 |
od_NumberOfItemsDate, |
|
17 |
od_Policies, |
|
18 |
od_Languages, |
|
19 |
od_ContentTypes, |
|
20 |
collectedFrom, |
|
21 |
inferred, |
|
22 |
deletedByInference, |
|
23 |
trust, |
|
24 |
inferenceProvenance, |
|
25 |
dateOfValidation, |
|
26 |
registeredby, |
|
27 |
datasourceClass, |
|
28 |
provenanceActionClass, |
|
29 |
dateOfCollection, |
|
30 |
typology, |
|
31 |
activationId, |
|
32 |
mergehomonyms, |
|
33 |
description, |
|
34 |
releaseStartDate, |
|
35 |
releaseEndDate, |
|
36 |
missionStatementUrl, |
|
37 |
dataProvider, |
|
38 |
serviceProvider, |
|
39 |
databaseAccessType, |
|
40 |
dataUploadType, |
|
41 |
databaseAccessRestriction, |
|
42 |
dataUploadRestriction, |
|
43 |
versioning, |
|
44 |
citationGuidelineUrl, |
|
45 |
qualityManagementKind, |
|
46 |
pidSystems, |
|
47 |
certificates, |
|
48 |
aggregator, |
|
49 |
issn, |
|
50 |
eissn, |
|
51 |
lissn |
|
52 |
) VALUES ( |
|
53 |
$id$, |
|
54 |
$id$, |
|
55 |
$officialName$, |
|
56 |
$englishName$, |
|
57 |
$websiteUrl$, |
|
58 |
$logoUrl$, |
|
59 |
$contactEmail$, |
|
60 |
$latitude$, |
|
61 |
$longitude$, |
|
62 |
$timezone$, |
|
63 |
$namespacePrefix$, |
|
64 |
$odNumberOfItems$, |
|
65 |
$odNumberOfItemsDate$, |
|
66 |
$odPolicies$, |
|
67 |
$odLanguages$, |
|
68 |
$odContentTypes$, |
|
69 |
$collectedFrom$, |
|
70 |
$inferred$, |
|
71 |
$deletedByInference$, |
|
72 |
$trust$, |
|
73 |
$inferenceProvenance$, |
|
74 |
$dateOfValidation$, |
|
75 |
$registeredBy$, |
|
76 |
$datasourceClass$, |
|
77 |
$provenanceActionClass$, |
|
78 |
$dateOfCollection$, |
|
79 |
$typology$, |
|
80 |
$activationId$, |
|
81 |
$mergehomonyms$, |
|
82 |
$description$, |
|
83 |
$releaseStartDate$, |
|
84 |
$releaseEndDate$, |
|
85 |
$missionStatementUrl$, |
|
86 |
$dataProvider$, |
|
87 |
$serviceProvider$, |
|
88 |
$databaseAccessType$, |
|
89 |
$dataUploadType$, |
|
90 |
$databaseAccessRestriction$, |
|
91 |
$dataUploadRestriction$, |
|
92 |
$versioning$, |
|
93 |
$citationGuidelineUrl$, |
|
94 |
$qualityManagementKind$, |
|
95 |
$pidSystems$, |
|
96 |
$certificates$, |
|
97 |
$aggregator$, |
|
98 |
$issn$, |
|
99 |
$eissn$, |
|
100 |
$lissn$ |
|
101 |
); |
|
102 |
|
|
103 |
$if(hasOrganization)$ |
|
104 |
INSERT INTO organizations ( |
|
105 |
_dnet_resource_identifier_, |
|
106 |
id, |
|
107 |
legalname, |
|
108 |
countryclass |
|
109 |
) VALUES ( |
|
110 |
$id$||'::'||$organization$, |
|
111 |
$id$||'::'||$organization$, |
|
112 |
$organization$, |
|
113 |
$countryCode$ |
|
114 |
); |
|
115 |
|
|
116 |
INSERT INTO datasource_organization ( |
|
117 |
_dnet_resource_identifier_, |
|
118 |
datasource, |
|
119 |
organization |
|
120 |
) VALUES ( |
|
121 |
$id$||'@@'||$id$||'::'||$organization$, |
|
122 |
$id$, |
|
123 |
$id$||'::'||$organization$ |
|
124 |
); |
|
125 |
$endif$ |
|
126 |
|
|
127 |
|
|
128 |
|
|
129 |
$interfaces:{ifc| |
|
130 |
INSERT INTO api ( |
|
131 |
_dnet_resource_identifier_, |
|
132 |
id, |
|
133 |
datasource, |
|
134 |
protocolclass, |
|
135 |
contentdescriptionclass, |
|
136 |
removable, |
|
137 |
typologyclass, |
|
138 |
compatibilityclass |
|
139 |
) VALUES ( |
|
140 |
$ifc.id$, |
|
141 |
$ifc.id$, |
|
142 |
$id$, |
Also available in: Unified diff
new module