use of alma.acs.cdbChecker.BaciSchemaChecker in project ACS by ACS-Community.
the class CDBChecker method validateSchemas.
/**
* This method validates the XSD files.
*
* @param xsdFilenames names with absolute path of the XSD file to validate.
*/
protected void validateSchemas(Vector<String> xsdFilenames) {
System.out.println("*** Will verify XSD files in: " + this.XSDPath);
// We share the resolver, to benefit more from its cache.
CDBSchemasResolver resolver = new CDBSchemasResolver(this, schemaFolder + File.pathSeparator + XSDPath);
ErrorHandler errorHandler = new CDBErrorHandler(this);
for (String xsdFilename : xsdFilenames) {
final File xsdFile = new File(xsdFilename);
if (xsdFile.length() != 0) {
if (verbose) {
System.out.print(" " + xsdFilename);
}
try {
validateFileEncoding(xsdFilename);
SP.reset();
// not sure why, but this is the legacy behavior
resolver.setResolveOnlyHttp(true);
SP.setEntityResolver(resolver);
SP.setFeature("http://xml.org/sax/features/validation", true);
SP.setFeature("http://apache.org/xml/features/validation/schema", true);
SP.setFeature("http://xml.org/sax/features/namespace-prefixes", false);
SP.setFeature("http://xml.org/sax/features/namespaces", true);
SP.setErrorHandler(errorHandler);
SP.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation", "http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd");
FileInputStream fis = new FileInputStream(xsdFile);
InputSource inputSource = new InputSource(fis);
inputSource.setSystemId("file:///" + xsdFile.getAbsolutePath());
SP.parse(inputSource);
fis.close();
try {
// Now we know that the schema is technically valid (well, it does not seem to check xsd imports...)
// Still we have to check special requirements for CharacteristicComponent XSDs.
// This second check probably includes the first check's functionality, so that the
// first check could be removed once we have verified XSOM's xsd error reporting
// and hooked up the shared error handler in BaciSchemaChecker.
// here we want to resolve all schemas
resolver.setResolveOnlyHttp(false);
BaciSchemaChecker baciChecker = new BaciSchemaChecker(xsdFile, resolver, errorHandler, logger);
List<BaciPropertyLocator> badProps = baciChecker.findBaciPropsOutsideCharacteristicComp();
if (!badProps.isEmpty()) {
// Reduce the available error output to show only xsd element(s), not the individual baci properties
Set<String> badXsdElementNames = new HashSet<String>();
for (BaciPropertyLocator badProp : badProps) {
badXsdElementNames.add(badProp.elementName);
}
System.out.println(xsdFilename + ": illegal use of baci properties in xsd elements that are not derived from baci:CharacteristicComponent. " + "Offending element(s): " + StringUtils.join(badXsdElementNames, ' '));
errorFlag = true;
globalErrorFlag = true;
}
} catch (SAXException ex) {
// ignore SAXException coming from BaciSchemaChecker, because we don't want to report errors
// twice when the xsd file is really messed up.
// There are cases where xerces reports a normal error but XSOM reports a fatal error and throws this exception.
}
if (verbose && !errorFlag) {
System.out.println("[OK]");
}
} catch (SAXException e) {
System.out.println("Caught a SAXException in validateSchemas: ");
e.printStackTrace(System.out);
} catch (IOException e) {
System.out.println("[IOException] Probably " + xsdFilename + " doesn't exists.");
}
} else {
System.out.print(xsdFilename + ": [Warning] file is empty.\n");
}
}
// back to legacy mode again... yuck, our resolver still sticks to the "SP" field and will be used elsewhere!
resolver.setResolveOnlyHttp(true);
}
Aggregations