b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v1.0.6-b27-fcs
b87033953be26b0dc7dead8febd499b666a54126Peter Major// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
b87033953be26b0dc7dead8febd499b666a54126Peter Major// Any modifications to this file will be lost upon recompilation of the source schema.
b87033953be26b0dc7dead8febd499b666a54126Peter Major// Generated on: 2012.09.08 at 08:59:44 DU CEST
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Majorpackage com.sun.identity.diagnostic.base.core.jaxbgen.impl.runtime;
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport java.util.HashMap;
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport java.util.HashSet;
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport java.util.Iterator;
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport java.util.Map;
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport javax.xml.bind.ValidationEvent;
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport javax.xml.bind.ValidationEventHandler;
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport javax.xml.bind.helpers.NotIdentifiableEventImpl;
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport javax.xml.bind.helpers.ValidationEventImpl;
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport javax.xml.bind.helpers.ValidationEventLocatorImpl;
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport org.xml.sax.SAXException;
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport com.sun.xml.bind.ProxyGroup;
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport com.sun.xml.bind.serializer.AbortSerializationException;
b87033953be26b0dc7dead8febd499b666a54126Peter Majorimport com.sun.xml.bind.validator.Messages;
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major/**
b87033953be26b0dc7dead8febd499b666a54126Peter Major * Maintains information that needs to be stored across
b87033953be26b0dc7dead8febd499b666a54126Peter Major * validations of multiple objects.
b87033953be26b0dc7dead8febd499b666a54126Peter Major *
b87033953be26b0dc7dead8febd499b666a54126Peter Major * Specifically, this object is responsible for:
b87033953be26b0dc7dead8febd499b666a54126Peter Major *
b87033953be26b0dc7dead8febd499b666a54126Peter Major * <ol>
b87033953be26b0dc7dead8febd499b666a54126Peter Major * <li>detecting a cycle in a content tree by keeping track of
b87033953be26b0dc7dead8febd499b666a54126Peter Major * objects that were validated.
b87033953be26b0dc7dead8febd499b666a54126Peter Major *
b87033953be26b0dc7dead8febd499b666a54126Peter Major * <li>keeping an instance of NamespaceContextImpl, which is
b87033953be26b0dc7dead8febd499b666a54126Peter Major * shared by all MSVValidators.
b87033953be26b0dc7dead8febd499b666a54126Peter Major *
b87033953be26b0dc7dead8febd499b666a54126Peter Major * <li>keeping a reference to {@link ValidationErrorHandler}.
b87033953be26b0dc7dead8febd499b666a54126Peter Major * MSVValidators should use this error handler to report any error.
b87033953be26b0dc7dead8febd499b666a54126Peter Major * </ol>
b87033953be26b0dc7dead8febd499b666a54126Peter Major */
b87033953be26b0dc7dead8febd499b666a54126Peter Majorclass ValidationContext
b87033953be26b0dc7dead8febd499b666a54126Peter Major{
b87033953be26b0dc7dead8febd499b666a54126Peter Major final DefaultJAXBContextImpl jaxbContext;
b87033953be26b0dc7dead8febd499b666a54126Peter Major /**
b87033953be26b0dc7dead8febd499b666a54126Peter Major * @param validateID
b87033953be26b0dc7dead8febd499b666a54126Peter Major * if true, ID/IDREF validation will be performed.
b87033953be26b0dc7dead8febd499b666a54126Peter Major */
b87033953be26b0dc7dead8febd499b666a54126Peter Major ValidationContext( DefaultJAXBContextImpl _context, ValidationEventHandler _eventHandler, boolean validateID ) {
b87033953be26b0dc7dead8febd499b666a54126Peter Major this.jaxbContext = _context;
b87033953be26b0dc7dead8febd499b666a54126Peter Major this.eventHandler = _eventHandler;
b87033953be26b0dc7dead8febd499b666a54126Peter Major this.validateID = validateID;
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major// detecting cycles.
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major /** Set of all validated objects. Used to detect a cycle. */
b87033953be26b0dc7dead8febd499b666a54126Peter Major private final IdentityHashSet validatedObjects = new IdentityHashSet();
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major /**
b87033953be26b0dc7dead8febd499b666a54126Peter Major * Validates the sub-tree rooted at <code>vo</code> and reports
b87033953be26b0dc7dead8febd499b666a54126Peter Major * any errors/warnings to the error handler.
b87033953be26b0dc7dead8febd499b666a54126Peter Major */
b87033953be26b0dc7dead8febd499b666a54126Peter Major public void validate( ValidatableObject vo ) throws SAXException {
b87033953be26b0dc7dead8febd499b666a54126Peter Major if( validatedObjects.add(ProxyGroup.unwrap(vo)) ) {
b87033953be26b0dc7dead8febd499b666a54126Peter Major // setup a new validator for this object and validate it.
b87033953be26b0dc7dead8febd499b666a54126Peter Major MSVValidator.validate(jaxbContext,this,vo);
b87033953be26b0dc7dead8febd499b666a54126Peter Major } else {
b87033953be26b0dc7dead8febd499b666a54126Peter Major // this object has already been validated once.
b87033953be26b0dc7dead8febd499b666a54126Peter Major reportEvent( vo, Messages.format( Messages.CYCLE_DETECTED ) );
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major// Keeping track of namespace bindings.
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major /** namespace context. */
b87033953be26b0dc7dead8febd499b666a54126Peter Major private final NamespaceContextImpl nsContext = new NamespaceContextImpl(null);
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major public NamespaceContextImpl getNamespaceContext() { return nsContext; }
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major// ID/IDREF validation
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major /** ID/IDREF validation is done only when this flag is true. */
b87033953be26b0dc7dead8febd499b666a54126Peter Major private final boolean validateID;
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major private final HashSet IDs = new HashSet();
b87033953be26b0dc7dead8febd499b666a54126Peter Major private final HashMap IDREFs = new HashMap();
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major public String onID( XMLSerializable owner, String value ) throws SAXException {
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major if(!validateID) return value;
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major if(!IDs.add(value)) {
b87033953be26b0dc7dead8febd499b666a54126Peter Major // this ID value has already been used.
b87033953be26b0dc7dead8febd499b666a54126Peter Major //reportEvent(Util.toValidatableObject(owner),
b87033953be26b0dc7dead8febd499b666a54126Peter Major // Messages.format(Messages.DUPLICATE_ID,value));
b87033953be26b0dc7dead8febd499b666a54126Peter Major reportEvent(jaxbContext.getGrammarInfo().castToValidatableObject(owner),
b87033953be26b0dc7dead8febd499b666a54126Peter Major Messages.format(Messages.DUPLICATE_ID,value));
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major return value;
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major public String onIDREF( XMLSerializable referer, String value ) throws SAXException {
b87033953be26b0dc7dead8febd499b666a54126Peter Major if(!validateID) return value;
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major if(IDs.contains(value))
b87033953be26b0dc7dead8febd499b666a54126Peter Major return value; // this IDREF has the corresponding ID.
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major // remember the value to check the value later.
b87033953be26b0dc7dead8febd499b666a54126Peter Major IDREFs.put(value,referer);
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major return value;
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major /** Tests if all IDREFs have corresponding IDs. */
b87033953be26b0dc7dead8febd499b666a54126Peter Major protected void reconcileIDs() throws SAXException {
b87033953be26b0dc7dead8febd499b666a54126Peter Major if(!validateID) return;
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major for (Iterator itr = IDREFs.entrySet().iterator(); itr.hasNext();) {
b87033953be26b0dc7dead8febd499b666a54126Peter Major Map.Entry e = (Map.Entry) itr.next();
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major if(IDs.contains(e.getKey()))
b87033953be26b0dc7dead8febd499b666a54126Peter Major continue; // OK.
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major // ID was not found.
b87033953be26b0dc7dead8febd499b666a54126Peter Major ValidatableObject source = (ValidatableObject)e.getValue();
b87033953be26b0dc7dead8febd499b666a54126Peter Major reportEvent(
b87033953be26b0dc7dead8febd499b666a54126Peter Major source,
b87033953be26b0dc7dead8febd499b666a54126Peter Major new NotIdentifiableEventImpl(
b87033953be26b0dc7dead8febd499b666a54126Peter Major ValidationEvent.ERROR,
b87033953be26b0dc7dead8febd499b666a54126Peter Major Messages.format( Messages.ID_NOT_FOUND, e.getKey() ),
b87033953be26b0dc7dead8febd499b666a54126Peter Major new ValidationEventLocatorImpl( source ) ) );
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major IDREFs.clear();
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major// Keeping track of ValidationErrorHandler
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major//
b87033953be26b0dc7dead8febd499b666a54126Peter Major private final ValidationEventHandler eventHandler;
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major /**
b87033953be26b0dc7dead8febd499b666a54126Peter Major * Reports an error to the application.
b87033953be26b0dc7dead8febd499b666a54126Peter Major */
b87033953be26b0dc7dead8febd499b666a54126Peter Major public void reportEvent(ValidatableObject source, String formattedMessage) throws AbortSerializationException {
b87033953be26b0dc7dead8febd499b666a54126Peter Major reportEvent(
b87033953be26b0dc7dead8febd499b666a54126Peter Major source,
b87033953be26b0dc7dead8febd499b666a54126Peter Major new ValidationEventImpl( ValidationEvent.ERROR,
b87033953be26b0dc7dead8febd499b666a54126Peter Major formattedMessage,
b87033953be26b0dc7dead8febd499b666a54126Peter Major new ValidationEventLocatorImpl(source) ) );
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major /**
b87033953be26b0dc7dead8febd499b666a54126Peter Major * Reports an error to the client.
b87033953be26b0dc7dead8febd499b666a54126Peter Major * This version should be used when an exception is thrown from sub-modules.
b87033953be26b0dc7dead8febd499b666a54126Peter Major */
b87033953be26b0dc7dead8febd499b666a54126Peter Major public void reportEvent(ValidatableObject source, Exception nestedException ) throws AbortSerializationException {
b87033953be26b0dc7dead8febd499b666a54126Peter Major reportEvent(
b87033953be26b0dc7dead8febd499b666a54126Peter Major source,
b87033953be26b0dc7dead8febd499b666a54126Peter Major new ValidationEventImpl( ValidationEvent.ERROR,
b87033953be26b0dc7dead8febd499b666a54126Peter Major nestedException.toString(),
b87033953be26b0dc7dead8febd499b666a54126Peter Major new ValidationEventLocatorImpl(source),
b87033953be26b0dc7dead8febd499b666a54126Peter Major nestedException ) );
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major public void reportEvent( ValidatableObject source, ValidationEvent event ) throws AbortSerializationException {
b87033953be26b0dc7dead8febd499b666a54126Peter Major boolean r;
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major try {
b87033953be26b0dc7dead8febd499b666a54126Peter Major r = eventHandler.handleEvent( event );
b87033953be26b0dc7dead8febd499b666a54126Peter Major } catch( RuntimeException re ) {
b87033953be26b0dc7dead8febd499b666a54126Peter Major // if the client event handler causes a RuntimeException, then
b87033953be26b0dc7dead8febd499b666a54126Peter Major // we have to return false.
b87033953be26b0dc7dead8febd499b666a54126Peter Major r = false;
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major if(!r) {
b87033953be26b0dc7dead8febd499b666a54126Peter Major // throw an exception to abort validation
b87033953be26b0dc7dead8febd499b666a54126Peter Major throw new AbortSerializationException( event.getMessage() );
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major }
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major
b87033953be26b0dc7dead8febd499b666a54126Peter Major}