Skip to content
Snippets Groups Projects
Commit 189f5cb8 authored by Andreas Romeyke's avatar Andreas Romeyke
Browse files

- use anonymous error handler class

- refactoring, extracted checkIfWellformed()
- refactoring, extracted validateAgainstSchema()
- fix getErrors()
- fixed main
parent 1e2166f3
Branches
Tags
No related merge requests found
...@@ -19,7 +19,9 @@ package org.slub.rosetta.dps.repository.plugin; ...@@ -19,7 +19,9 @@ package org.slub.rosetta.dps.repository.plugin;
import com.exlibris.core.infra.common.exceptions.logging.ExLogger; import com.exlibris.core.infra.common.exceptions.logging.ExLogger;
import com.exlibris.dps.sdk.techmd.FormatValidationPlugin; import com.exlibris.dps.sdk.techmd.FormatValidationPlugin;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import javax.xml.XMLConstants; import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
...@@ -28,6 +30,7 @@ import javax.xml.parsers.ParserConfigurationException; ...@@ -28,6 +30,7 @@ import javax.xml.parsers.ParserConfigurationException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -50,7 +53,22 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { ...@@ -50,7 +53,22 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
private final List<String> errors = new ArrayList<>(); private final List<String> errors = new ArrayList<>();
private final List<String> details = new ArrayList<>(); private final List<String> details = new ArrayList<>();
private ValidationCatalogResolver validationCatalogResolver = null; private ValidationCatalogResolver validationCatalogResolver = null;
private final ValidationErrorHandler validationErrorHandler = new ValidationErrorHandler(); private final ErrorHandler validationErrorHandler = new ErrorHandler() {
@Override
public void warning(SAXParseException e) {
}
@Override
public void error(SAXParseException e) {
errors.add( e.getMessage());
}
@Override
public void fatalError(SAXParseException e) {
errors.add( e.getMessage());
}
};
public SLUBXmlFormatValidationPlugin () { public SLUBXmlFormatValidationPlugin () {
dbf.setNamespaceAware(true); dbf.setNamespaceAware(true);
dbf.setValidating(false); dbf.setValidating(false);
...@@ -100,52 +118,64 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { ...@@ -100,52 +118,64 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
@Override @Override
public boolean validateFormat(String filePath) { public boolean validateFormat(String filePath) {
try { try {
/* detect XML type via NS */ if (checkIfWellformed(filePath)) {
dbf.setFeature(XMLConstants.USE_CATALOG, true); wellformed = true;
dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); errors.clear();
DocumentBuilder db = dbf.newDocumentBuilder(); valid = validateAgainstSchema(filePath);
Document doc = db.parse(new File(filePath));
xmlInfoRecord info = getXMLinfo(doc);
reportDetail("detect XML type via NS:" + info.nameSpaceUri);
printXMLinfo(doc);
if (!info.xmlVersion.equals("1.0")) {
reportError("not an expected XML 1.0 document, found " + info.xmlVersion, filePath);
wellformed = false;
valid = false;
return false;
} }
wellformed=true;
reportDetail("checked XML is wellformed");
/* TODO: validate against schema */
dbf.setFeature(XMLConstants.USE_CATALOG, true);
dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
dbf.setValidating(true);
DocumentBuilder dbValidate = dbf.newDocumentBuilder();
Document docValidate;
dbValidate.setEntityResolver(validationCatalogResolver);
dbValidate.setErrorHandler(validationErrorHandler);
reportDetail("align entitity resolver");
docValidate = dbValidate.parse(new File(filePath));
assert(dbValidate.isValidating());
var version = docValidate.getXmlVersion();
reportDetail("reparse using own catalog");
valid = true;
wellformed = true;
} catch (ParserConfigurationException e) { } catch (ParserConfigurationException e) {
reportError("ParserconfExc file=" + filePath + " Exc:" + e.getMessage()); reportError("ParserconfExc file=" + filePath + " Exc:" + e.getMessage());
} catch (IOException e) { } catch (IOException e) {
reportError("IOExc file=" + filePath + " Exc:"+ e.getMessage()); reportError("IOExc file=" + filePath + " Exc:"+ e.getMessage());
} catch (SAXException e) { } catch (SAXException e) {
wellformed = false;
reportError("not a XML file, " + e.getMessage(), filePath); reportError("not a XML file, " + e.getMessage(), filePath);
e.getStackTrace(); e.getStackTrace();
} }
return valid; return valid;
} }
private boolean checkIfWellformed(String filePath) throws ParserConfigurationException, IOException, SAXException {
/* detect XML type via NS */
boolean isWellformedXml = false;
dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File(filePath));
xmlInfoRecord info = getXMLinfo(doc);
reportDetail("detect XML type via NS:" + info.nameSpaceUri);
//printXMLinfo(doc);
if (!info.xmlVersion.equals("1.0")) {
reportError("not an expected XML 1.0 document, found " + info.xmlVersion, filePath);
} else {
isWellformedXml = true;
reportDetail("checked XML is wellformed");
}
return isWellformedXml;
}
private boolean validateAgainstSchema(String filePath) throws ParserConfigurationException, SAXException, IOException {
boolean isValidXml = false;
dbf.setFeature(XMLConstants.USE_CATALOG, true);
dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
dbf.setValidating(true);
DocumentBuilder dbValidate = dbf.newDocumentBuilder();
Document docValidate;
dbValidate.setEntityResolver(validationCatalogResolver);
dbValidate.setErrorHandler(validationErrorHandler);
reportDetail("align entitity resolver");
docValidate = dbValidate.parse(new File(filePath));
if (dbValidate.isValidating()) {
docValidate.getXmlVersion();
reportDetail("reparse using own catalog");
if (errors.isEmpty()) {
isValidXml = true;
}
}
return isValidXml;
}
private void reportError(String msg) { private void reportError(String msg) {
errors.add(msg); errors.add(msg);
System.out.println(msg); // System.out.println(msg);
// TODO: log.warn(msg); // TODO: log.warn(msg);
} }
private void reportError(String msg, String filepath) { private void reportError(String msg, String filepath) {
...@@ -154,7 +184,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { ...@@ -154,7 +184,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
private void reportDetail(String msg) { private void reportDetail(String msg) {
details.add(msg); details.add(msg);
System.out.println(msg); // System.out.println(msg);
} }
@Override @Override
...@@ -164,7 +194,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { ...@@ -164,7 +194,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
@Override @Override
public boolean isValid() { public boolean isValid() {
return false; return valid;
} }
@Override @Override
...@@ -174,7 +204,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { ...@@ -174,7 +204,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
@Override @Override
public List<String> getErrors() { public List<String> getErrors() {
return null; return Collections.unmodifiableList(errors);
} }
@Override @Override
...@@ -191,7 +221,17 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin { ...@@ -191,7 +221,17 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
System.out.println("Agent: '" + plugin.getAgent() + "'"); System.out.println("Agent: '" + plugin.getAgent() + "'");
System.out.println(); System.out.println();
for (String file : args) { for (String file : args) {
System.out.println("Validation RESULT: " + plugin.isValid()); System.out.println("validation of file " + file);
plugin.validateFormat( file );
System.out.println("\tisValid: " + plugin.isValid());
System.out.println("\tgetValidationDetails: ");
System.out.println("\t..........");
System.out.println(plugin.getValidationDetails());
System.out.println("\t..........");
System.out.println("\tgetErrors : ");
System.out.println("\t..........");
System.out.println(plugin.getErrors());
System.out.println("\t..........");
} }
System.out.println("----------------------------------"); System.out.println("----------------------------------");
System.out.println("getAgent:"); System.out.println("getAgent:");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment