blob: ca89d098e88d96643bc64471946b36f925c36b86 [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.xmlbeans.samples.validation;
import org.apache.xmlbeans.*;
import org.apache.xmlbeans.samples.validation.todolist.*;
import org.apache.xmlbeans.samples.validation.todolist.TodolistDocument.Todolist;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
/**
* A sample to illustrate two means for validating XML against schema
* using features of the XMLBeans API. The features illustrated are:
*
* - Validating after changes by using the XmlObject.validate method.
* This method is exposed by types generated by compiling schema. The
* validate method validates instances against all aspects of schema.
* Also, with this method you can specify a Collection instance to
* capture errors that occur during validation.
*
* - Validating "on the fly" using the XmlOptions.VALIDATE_ON_SET constant.
* This option prompts XMLBeans to validate XML against simple schema types
* <em>as you set them</em>, rather than by expressly calling for validation.
* You can set this option by calling XmlOptions.setValidateOnSet, then
* specifying the XmlOptions instance as a parameter when creating
* a new instance from schema or parsing an existing one.
*
* Note that it is also possible to validate instances from the
* command line by using tools you'll find in the bin directory of the
* XMLBeans distribution.
*/
public class Validation
{
private static XmlOptions m_validationOptions;
/**
* Receives a todo list XML instance, twice rendering it invalid
* and validating it using the XMLBeans API.
*
* @param args An array in which the first item is a
* path to the XML instance file.
*/
public static void main(String[] args)
{
Validation thisSample = new Validation();
// Use the validate method to validate an instance after
// updates.
boolean isValidAfterChanges = thisSample.isValidAfterChanges(args[0]);
// Use the VALIDATE_ON_SET option to validate an instance
// as updates are made.
boolean isValidOnTheFly = thisSample.isValidOnTheFly(args[0]);
}
/**
* Illustrates use of the validate method by making changes to incoming
* XML that invalidate the XML, then validating the instance and
* printing resulting error messages.
*
* Because this code is designed to generate invalid XML, it
* returns false when successful.
*
* @param xmlPath A path to the XML instance file.
* @return <code>true if the XML is valid after changes;
* otherwise, <code>false</code>.
*/
public boolean isValidAfterChanges(String xmlPath)
{
System.out.println("Validating after changes: \n");
// Set up the validation error listener.
ArrayList validationErrors = new ArrayList();
m_validationOptions = new XmlOptions();
m_validationOptions.setErrorListener(validationErrors);
TodolistDocument todoList = (TodolistDocument)parseXml(xmlPath, null);
// Schema defines the <name> element as required (minOccurs = '1').
// So this statement renders the XML invalid because it sets the
// <name> element to nil.
todoList.getTodolist().getItemArray(0).setName(null);
// During validation, errors are added to the ArrayList for
// retrieval and printing by the printErrors method.
boolean isValid = todoList.validate(m_validationOptions);
if (!isValid)
{
printErrors(validationErrors);
}
return isValid;
}
/**
* Illustrates the "validate on set" feature, which validates XML
* for simple types on the fly. As XML for those types is "set" through
* accessors generated by compiling schema, XMLBeans checks the XML's
* validity. The code here uses generated types to retrieve the first
* <item> in a <todolist>, then update the <item>'s id attribute. The code
* throws an exception when it tries to set an id attribute value that
* is too high.
*
* Because this code is designed to generate invalid XML, it
* returns false when successful.
*
* @param xmlPath A path to the XML instance file.
* @return <code>true</code> if valid XML is successfully created;
* otherwise, <code>false</code>.
*/
public boolean isValidOnTheFly(String xmlPath)
{
System.out.println("Validating on-the-fly: \n");
m_validationOptions = new XmlOptions();
m_validationOptions.setValidateOnSet();
TodolistDocument todoList = (TodolistDocument)parseXml(xmlPath, m_validationOptions);
Todolist list = todoList.getTodolist();
ItemType firstItem = list.getItemArray(0);
// Schema defines the <id> element as allowing values up to 100. So
// this line throws an exception because it invalidates the XML the
// code is updating.
firstItem.setId(8587);
// This line will not be reached.
return todoList.validate();
}
/**
* Receives the collection containing errors found during
* validation and print the errors to the console.
*
* @param validationErrors The validation errors.
*/
public void printErrors(ArrayList validationErrors)
{
System.out.println("Errors discovered during validation: \n");
Iterator iter = validationErrors.iterator();
while (iter.hasNext())
{
System.out.println(">> " + iter.next() + "\n");
}
}
/**
* <p>Creates a File from the XML path provided in main arguments, then
* parses the file's contents into a type generated from schema.</p>
* <p/>
* <p>Note that this work might have been done in main. Isolating it here
* makes the code separately available from outside this class.</p>
*
* @param xmlFilePath A path to XML based on the schema in inventory.xsd.
* @return An instance of a generated schema type that contains the parsed
* XML.
*/
public XmlObject parseXml(String xmlFilePath, XmlOptions validationOptions)
{
File xmlFile = new File(xmlFilePath);
XmlObject xml = null;
try
{
xml = XmlObject.Factory.parse(xmlFile, validationOptions);
} catch (XmlException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
return xml;
}
}