/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.xml.xsd.typeprovider.validator;
import gw.internal.xml.XmlSimpleValueValidationContext;
import gw.internal.xml.xsd.typeprovider.XmlWhitespaceHandling;
import gw.internal.xml.xsd.typeprovider.primitive.XmlSchemaPrimitiveType;
import gw.xml.XmlSimpleValueException;
import java.util.ArrayList;
import java.util.List;
public class XmlSimpleUnionValueValidator extends XmlSimpleValueValidator {
private final List<XmlSimpleValueValidator> _validators;
public XmlSimpleUnionValueValidator(List<XmlSimpleValueValidator> validators) {
_validators = validators;
}
@Override
public void validate( String value, XmlSimpleValueValidationContext validationContext ) throws XmlSimpleValueException {
getMatchingValidator( value, validationContext );
}
private XmlSimpleValueValidator getMatchingValidator( String value, XmlSimpleValueValidationContext validationContext ) {
List<XmlSimpleValueException> exceptions = new ArrayList<XmlSimpleValueException>( 0 );
for ( XmlSimpleValueValidator validator : _validators ) {
try {
validator.validate( value, validationContext );
return validator;
}
catch ( XmlSimpleValueException ex ) {
exceptions.add( ex );
}
}
StringBuilder sb = new StringBuilder( "value does not match any of xsd:union members " );
boolean gotOne = false;
for ( XmlSimpleValueException ex : exceptions ) {
if ( gotOne ) {
sb.append( ", " );
}
sb.append( "[ " );
sb.append( ex.getMessage() );
sb.append( " ]" );
gotOne = true;
}
throw new XmlSimpleValueException( sb.toString(), exceptions );
}
@Override
public XmlSchemaPrimitiveType getPrimitiveType() {
return XmlSchemaPrimitiveType.UNION;
}
@Override
protected XmlWhitespaceHandling getWhitespaceHandling( String value ) {
// have to figure out which union component matches in order to determine whitespace facet
XmlSimpleValueValidator validator = getMatchingValidator( value, new XmlSimpleValueValidationContext() );
return validator.getWhitespaceHandling( value );
}
}