/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.xml.xsd.typeprovider.xmlmatcher; import gw.internal.xml.xsd.typeprovider.NotFoundException; import gw.internal.xml.xsd.typeprovider.XmlSchemaIndex; import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaCollection; import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaElement; import javax.xml.namespace.QName; public class XmlSchemaElementMatchHandler extends XmlMatchHandler { private final XmlSchemaElement _element; private boolean _done; public XmlSchemaElementMatchHandler( XmlSchemaElement element ) { if ( element.getRefName() != null ) { element = element.getSchemaIndex().getXmlSchemaElementByQName( element.getRefName() ); } _element = element; } public void match( QName elementName, XmlSchemaCollection collection ) { if ( ! _done ) { _done = true; QName origElementName = elementName; while ( elementName != null ) { if ( elementName.equals( _element.getQName() ) ) { XmlSchemaElement element; if ( _element.isTopLevel() ) { element = collection.getElementByQName( origElementName ); } else { element = _element; } throw new MatchFoundException( XmlSchemaIndex.getGosuTypeBySchemaObject( element ) ); } if ( ! _element.isTopLevel() ) { break; // can't be a substitution group if it's not a top-level element } // check for substitution group head XmlSchemaElement element = collection.getElementByQName( elementName ); if ( element == null ) { break; } elementName = element.getSubstitutionGroup(); } throw new NotFoundException( "Unexpected element: " + origElementName ); } } }