blob: 518f70de54e33ef955c5609435b5c9a582650862 [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.
*/
/*
* Contributed by Dutta Satadip for adding functionality to retrieve xml validation errors
* programatically.
*/
package org.apache.xmlbeans;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.stream.Location;
/**
* The XmlValidationError class extends the {@link XmlError }XMLError class. The XML Validator contains
* extra attributes that can be used to construct the XML validation error programatically.
* <p>
* To extract the validation error cast the errors to XmlValidationError instead of
* XmlError for example:
* <br/>
* <pre>
* xobj.validate(new XmlOptions().setErrorListener(errors))
* for (Iterator it = errors.iterator(); it.hasNext(); )
* {
* XmlError err = (XmlError)it.next());
* if (err instanceof XmlValidationError)
* {
* XmlValidationError validationError = (XmlValidationError) err;
* }
* }
*</pre>
*
*
* Whenever an XmlValidationError is retrieved it will always be populated with
* the following information:
* <ul>
* <li>Message</li>
* <li>Severity</li>
* <li>Error Type </li>
* </ul>
*
* <p>
* The error type is very important because the other attributes of the
* XMLValidationError are populated based on the error type.
* </p>
* if errortype == INCORRECT_ELEMENT then
* <br/>
* offendingQName, badSchemaType will always be present, however expectedSchemaType and
* expectedQNames are available only if it is possible to determine them during vaildation.
*<br/>
*
* <p>
* if errortype == ELEMENT_NOT_ALLOWED then
* <br/>
* badSchemaType will always be present, however expectedSchemaType and
* offendingQName are available only if it is possible to determine them during vaildation.
* <br/>
*
* <p>
* if errortype == INCORRECT_ATTRIBUTE then
* <br/>
* offendingQName, badSchemaType will always be present
* <br/>
*
* <p>
* if errortype == ATTRIBUTE_TYPE_INVALID then
* <br/>
* no other addtional attributes are populated
* <br/>
*
* <p>
* if errortype == LIST_INVALID then
* <br/>
* expectedSchemaType will always be present
* <br/>
*
* <p>
* if errortype == UNION_INVALID then
* <br/>
* expectedSchemaType will always be present
* <br/>
*
*
* <p>
* if errortype == NIL_ELEMENT then
* <br/>
* offendingQName, expectedSchemaType and badSchemaType will always be present
* <br/>
*
* <p>
* if errortype == ELEMENT_TYPE_INVALID then
* <br/>
* offendingQName will always be present, other attributes may be available
* <br/>
*/
public class XmlValidationError extends XmlError
{
public static final int INCORRECT_ELEMENT = 1;
public static final int ELEMENT_NOT_ALLOWED = 2;
public static final int ELEMENT_TYPE_INVALID = 3;
public static final int NIL_ELEMENT = 4;
public static final int INCORRECT_ATTRIBUTE = 1000;
public static final int ATTRIBUTE_TYPE_INVALID = 1001;
public static final int LIST_INVALID = 2000;
public static final int UNION_INVALID = 3000;
public static final int UNDEFINED = 10000;
// QName of field in error. can be null.
private QName _fieldQName;
private QName _offendingQName;
private SchemaType _expectedSchemaType;
private List _expectedQNames;
private int _errorType;
private SchemaType _badSchemaType;
/**
* The static factory methods should be used instead of
* this constructor.
*/
// KHK: remove this
private XmlValidationError(String message, int severity,
XmlCursor cursor, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
List expectedQNames, int errorType, SchemaType badSchemaType)
{
super(message, (String)null, severity, cursor);
setFieldQName(fieldQName);
setOffendingQName(offendingQname);
setExpectedSchemaType(expectedSchemaType);
setExpectedQNames(expectedQNames);
setErrorType(errorType);
setBadSchemaType(badSchemaType);
}
/**
* The static factory methods should be used instead of
* this constructor.
*/
private XmlValidationError(String code, Object[] args, int severity,
XmlCursor cursor, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
List expectedQNames, int errorType, SchemaType badSchemaType)
{
super(code, args, severity, cursor);
setFieldQName(fieldQName);
setOffendingQName(offendingQname);
setExpectedSchemaType(expectedSchemaType);
setExpectedQNames(expectedQNames);
setErrorType(errorType);
setBadSchemaType(badSchemaType);
}
/**
* The static factory methods should be used instead of
* this constructor.
*/
// KHK: remove this
private XmlValidationError(String message, int severity,
Location loc, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
List expectedQNames, int errorType, SchemaType badSchemaType)
{
super(message, (String)null, severity, loc);
setFieldQName(fieldQName);
setOffendingQName(offendingQname);
setExpectedSchemaType(expectedSchemaType);
setExpectedQNames(expectedQNames);
setErrorType(errorType);
setBadSchemaType(badSchemaType);
}
/**
* The static factory methods should be used instead of
* this constructor.
*/
private XmlValidationError(String code, Object[] args, int severity,
Location loc, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
List expectedQNames, int errorType, SchemaType badSchemaType)
{
super(code, args, severity, loc);
setFieldQName(fieldQName);
setOffendingQName(offendingQname);
setExpectedSchemaType(expectedSchemaType);
setExpectedQNames(expectedQNames);
setErrorType(errorType);
setBadSchemaType(badSchemaType);
}
public static XmlValidationError forCursorWithDetails( String message, String code, Object[] args, int severity,
XmlCursor cursor, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
List expectedQNames, int errorType, SchemaType badSchemaType)
{
if (code == null)
return new XmlValidationError(message, severity, cursor, fieldQName, offendingQname,
expectedSchemaType, expectedQNames, errorType, badSchemaType);
else
return new XmlValidationError(code, args, severity, cursor, fieldQName, offendingQname,
expectedSchemaType, expectedQNames, errorType, badSchemaType);
}
public static XmlValidationError forLocationWithDetails( String message, String code, Object[] args, int severity,
Location location, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
List expectedQNames, int errorType, SchemaType badSchemaType)
{
if (code == null)
return new XmlValidationError(message, severity, location, fieldQName, offendingQname,
expectedSchemaType, expectedQNames, errorType, badSchemaType);
else
return new XmlValidationError(code, args, severity, location, fieldQName, offendingQname,
expectedSchemaType, expectedQNames, errorType, badSchemaType);
}
public String getMessage()
{
if (_fieldQName != null)
{
String msg = super.getMessage();
StringBuilder sb = new StringBuilder(msg.length() + 100);
sb.append(msg);
sb.append(" in element ");
sb.append(_fieldQName.getLocalPart());
if (_fieldQName.getNamespaceURI() != null && _fieldQName.getNamespaceURI().length() != 0)
sb.append('@').append(_fieldQName.getNamespaceURI());
return sb.toString();
}
else
return super.getMessage();
}
public SchemaType getBadSchemaType()
{
return _badSchemaType;
}
public void setBadSchemaType(SchemaType _badSchemaType)
{
this._badSchemaType = _badSchemaType;
}
public int getErrorType()
{
return _errorType;
}
public void setErrorType(int _errorType)
{
this._errorType = _errorType;
}
public List getExpectedQNames()
{
return _expectedQNames;
}
public void setExpectedQNames(List _expectedQNames)
{
this._expectedQNames = _expectedQNames;
}
public QName getFieldQName()
{
return _fieldQName;
}
public void setFieldQName(QName _fieldQName)
{
this._fieldQName = _fieldQName;
}
public QName getOffendingQName()
{
return _offendingQName;
}
public void setOffendingQName(QName _offendingQName)
{
this._offendingQName = _offendingQName;
}
public SchemaType getExpectedSchemaType()
{
return _expectedSchemaType;
}
public void setExpectedSchemaType(SchemaType _expectedSchemaType)
{
this._expectedSchemaType = _expectedSchemaType;
}
}