From 6afb574c7cb9259ca99708715eac383f56f2df6c Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Thu, 16 Jun 2016 13:48:58 +0000 Subject: [PATCH] 4250: Geonetwork Resolver upgrade: it must return only "private" Metadata Ids for CKAN harversting Task-Url: https://support.d4science.org/issues/4250 Updated git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-transfer/uri-resolver@129138 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../gis/util/GetResponseRecordFilter.java | 67 +++++++++++++++++-- src/main/resources/log4j.properties | 29 ++++++++ 2 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/log4j.properties diff --git a/src/main/java/org/gcube/datatransfer/resolver/gis/util/GetResponseRecordFilter.java b/src/main/java/org/gcube/datatransfer/resolver/gis/util/GetResponseRecordFilter.java index c6483c0..cec6bd7 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/gis/util/GetResponseRecordFilter.java +++ b/src/main/java/org/gcube/datatransfer/resolver/gis/util/GetResponseRecordFilter.java @@ -7,8 +7,11 @@ package org.gcube.datatransfer.resolver.gis.util; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; @@ -19,10 +22,13 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** @@ -37,12 +43,11 @@ public class GetResponseRecordFilter { /** * Delete summary record. * - * @param doc - * the doc - * @param identifier - * the identifier + * @param doc the doc + * @param identifier the identifier + * @return true, if successful */ - private static void deleteSummaryRecord(Document doc, String identifier) { + private static boolean deleteSummaryRecord(Document doc, String identifier) { // list NodeList nodes = doc.getElementsByTagName("csw:SummaryRecord"); @@ -56,8 +61,10 @@ public class GetResponseRecordFilter { if (idValue.equals(identifier)) { summaryRecord.getParentNode().removeChild(summaryRecord); logger.trace("Removed child " + idValue); + return true; } } + return false; } @@ -78,9 +85,36 @@ public class GetResponseRecordFilter { dbf.setValidating(false); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(bis); + int removed = 0; for (String identifier : idsToRemove) { - deleteSummaryRecord(doc, identifier); + if(deleteSummaryRecord(doc, identifier)) + removed++; } + logger.debug("Removed "+removed +" node/s"); + + NodeList nodeList = doc.getElementsByTagName("csw:SearchResults"); + if(nodeList!=null && nodeList.item(0)!=null){ + Node nd = nodeList.item(0); + // update staff attribute + NamedNodeMap attr = nd.getAttributes(); + Node numberOfRecordsMatched = attr.getNamedItem("numberOfRecordsMatched"); + Node numberOfRecordsReturned = attr.getNamedItem("numberOfRecordsReturned"); + logger.trace("Old numberOfRecordsMatched: "+numberOfRecordsMatched.getTextContent()); + logger.trace("Old numberOfRecordsReturned: "+numberOfRecordsReturned.getTextContent()); + try{ + int oldValueM = Integer.parseInt(numberOfRecordsMatched.getTextContent()); + int oldValueR = Integer.parseInt(numberOfRecordsReturned.getTextContent()); + int newValueM = oldValueM-removed; + int newValueR = oldValueR-removed; + logger.trace("Updating numberOfRecordsMatched at: "+newValueM); + logger.trace("Updating numberOfRecordsReturned at: "+newValueR); + numberOfRecordsMatched.setTextContent(newValueM+""); + numberOfRecordsReturned.setTextContent(newValueR+""); + }catch (Exception e) { + logger.warn("An error occurred during attribe numberOfRecordsMatched updating, skipping operation"); + } + } + return documentToInputStream(doc); } catch (Exception e) { @@ -107,4 +141,25 @@ public class GetResponseRecordFilter { return new ByteArrayInputStream(outputStream.toByteArray()); // return out.toString(); } + + + public static void main(String[] args) { + + File file = new File("GetResponseRecords.xml"); + List idsToRemove = new ArrayList(); + idsToRemove.add("fao-species-map-hef"); + idsToRemove.add("fao-species-map-hea"); + idsToRemove.add("fao-species-map-crb"); + idsToRemove.add("fao-fsa-map-41.1.2"); + try { + InputStream is = GetResponseRecordFilter.removeSummaryIdsByListIds(new FileInputStream(file), idsToRemove); + + System.out.println(IOUtils.toString(is)); + } + catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } } diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 0000000..5e7e35d --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,29 @@ +# Created by Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + +# Set root category priority to ERROR and its only appender to LOGFILE. +log4j.rootCategory=ERROR, LOGFILE + +log4j.appender.LOGFILE=org.apache.log4j.RollingFileAppender +log4j.appender.LOGFILE.MaxFileSize=25MB +log4j.appender.LOGFILE.MaxBackupIndex=10 +log4j.appender.LOGFILE.File=logs/uri-resolver.log +log4j.appender.LOGFILE.Append=true +log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout +log4j.appender.LOGFILE.layout.ConversionPattern=[%-5p] %d %c - %m%n +#log4j.category.org.gcube=TRACE,A1 + +##GCube +log4j.category.org.gcube=ERROR, LOGFILE +log4j.additivity.org.gcube=false + +##HomeLibrary +#log4j.logger.org.gcube.portlets.user.homelibrary=INFO, LOGFILE + +###MongoLog +log4j.logger.com.mongodb=SEVERE, LOGFILE + +##UriResolver +log4j.logger.org.gcube.datatransfer.resolver=DEBUG + +##Storage +log4j.logger.org.gcube.contentmanager=INFO \ No newline at end of file