blob: 2fcb98684ccbed5a1292efa7a77e199f710bda98 [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.oxm;
import org.eclipse.persistence.exceptions.XMLMarshalException;
import org.eclipse.persistence.internal.oxm.Root;
import org.eclipse.persistence.platform.xml.XMLParser;
import org.eclipse.persistence.platform.xml.XMLPlatform;
import org.eclipse.persistence.platform.xml.XMLPlatformException;
import org.eclipse.persistence.platform.xml.XMLPlatformFactory;
import org.w3c.dom.Document;
import org.xml.sax.ErrorHandler;
/**
* <p>Class used to validate XML. This is used to check if the XML created during
* a marshal operation would be valid XML before the marshal operation is performed.
* <p>Create an XMLValidator from an XMLContext.<br>
* <em>Code Sample</em><br>
* <code>
* XMLContext context = new XMLContext("mySessionName");<br>
* XMLValidator validator = context.createValidator();<br>
* </code>
*
* <p>The validateRoot method is used to validate objects which are mapped to global
* elements in a schema and which have a default root element specified in the TopLink
* project. The validate method is used to validate all other mapped objects.
*
* @see org.eclipse.persistence.oxm.XMLContext
*/
public class XMLValidator {
public static final int NONVALIDATING = XMLParser.NONVALIDATING;
public static final int SCHEMA_VALIDATION = XMLParser.SCHEMA_VALIDATION;
public static final int DTD_VALIDATION = XMLParser.DTD_VALIDATION;
private XMLContext xmlContext;
private XMLMarshaller marshaller;
private ErrorHandler errorHandler;
protected XMLValidator(XMLContext xmlContext) {
this.xmlContext = xmlContext;
this.marshaller = new XMLMarshaller(xmlContext);
}
/**
* Validate the given root object.
* @param rootObject A single root object to validate
* @return true if this is a valid object, otherwise false
*/
public boolean validateRoot(Object rootObject) throws XMLMarshalException {
if (rootObject == null) {
throw XMLMarshalException.nullArgumentException();
}
XMLDescriptor xmlDescriptor = (XMLDescriptor)xmlContext.getSession(rootObject).getDescriptor(rootObject);
Document document = marshaller.objectToXML(rootObject, xmlDescriptor, false);
if (xmlDescriptor.getSchemaReference() == null) {
throw XMLMarshalException.schemaReferenceNotSet(xmlDescriptor);
}
return xmlDescriptor.getSchemaReference().isValid(document, getErrorHandler());
}
/**
* Validate the given object.
* @param object A single object to validate
* @return true if this is a valid object, otherwise false
*/
public boolean validate(Object object) throws XMLMarshalException {
if (object == null) {
throw XMLMarshalException.nullArgumentException();
}
try {
// Create a new XML Record using the object's class name (not fully qualified) as the root
String name = ((XMLDescriptor)xmlContext.getSession(object).getDescriptor(object)).getDefaultRootElement();
if (name == null) {
String qualifiedName = object.getClass().getName();
int idx = qualifiedName.lastIndexOf('.');
name = qualifiedName.substring(idx + 1);
}
XMLDescriptor descriptor = marshaller.getDescriptor(object);
Root root = new Root();
root.setObject(object);
root.setLocalName(name);
XMLPlatform xmlPlatform = XMLPlatformFactory.getInstance().getXMLPlatform();
Document doc = xmlPlatform.createDocument();
marshaller.marshal(root, doc);
return xmlPlatform.validate(doc.getDocumentElement(), descriptor, getErrorHandler());
} catch (XMLPlatformException e) {
throw XMLMarshalException.validateException(e);
}
}
/**
* Set the error handler to be used during validation
* @param handler the error handler to be used during validation
*/
public void setErrorHandler(ErrorHandler handler) {
this.errorHandler = handler;
}
/**
* Get the error handler to be used during validation
* @return the error handler associated with this XMLValidator
*/
public ErrorHandler getErrorHandler() {
return errorHandler;
}
}