/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.xml.xsd.typeprovider.schemaindexer;
import gw.internal.xml.xsd.typeprovider.XmlSchemaElementTypeData;
import gw.internal.xml.xsd.typeprovider.XmlSchemaEnumerationTypeData;
import gw.internal.xml.xsd.typeprovider.XmlSchemaFlattenedChild;
import gw.internal.xml.xsd.typeprovider.XmlSchemaPropertyType;
import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaEnumerationFacet;
import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaFacet;
import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaSimpleTypeRestriction;
import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaType;
import gw.util.Pair;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
public class XmlSchemaSimpleTypeRestrictionIndexer extends XmlSchemaIndexer<XmlSchemaSimpleTypeRestriction> {
@Override
public <T> void index( XmlSchemaSimpleTypeRestriction restriction, String prefix, List<XmlSchemaFlattenedChild> flattenedChildren, boolean topLevel, boolean isPlural, XmlSchemaType currentType, boolean createTypes, Map<QName, XmlSchemaElementTypeData> usedElementNames, Map<Pair<XmlSchemaPropertyType, QName>, Boolean> pluralityMap, T context, List<Runnable> todo ) {
Iterator<XmlSchemaFacet> iter = restriction.getFacets().iterator();
handleEnumerations( prefix, currentType, createTypes, iter, context, restriction.getBaseType(), restriction.getBaseTypeName() );
if ( restriction.getBaseType() != null ) {
invokeIndexer( restriction.getBaseType(), prefix, flattenedChildren, false, isPlural, currentType, createTypes, usedElementNames, pluralityMap, context, todo );
}
}
static <T> void handleEnumerations( String prefix, XmlSchemaType currentType, boolean createTypes, Iterator<XmlSchemaFacet> iter, T context, XmlSchemaType baseType, QName baseTypeName ) {
if ( createTypes ) {
List<XmlSchemaEnumerationFacet> enumerations = new ArrayList<XmlSchemaEnumerationFacet>( 0 );
while ( iter.hasNext() ) {
XmlSchemaFacet facet = iter.next();
if ( facet instanceof XmlSchemaEnumerationFacet ) {
// String stringValue = facet.getValue();
enumerations.add( (XmlSchemaEnumerationFacet) facet );
}
}
if ( ! enumerations.isEmpty() ) {
String packageName = currentType.getSchemaIndex().getPackageName() + currentType.getSchemaIndex().getTypeLoader().getEnumerationsNamespacePrefix();
String typeName = currentType.getSchemaIndex().makeUniqueTypeName( packageName, prefix );
XmlSchemaEnumerationTypeData typeData = new XmlSchemaEnumerationTypeData<T>( typeName, enumerations, context, baseType, baseTypeName, currentType );
currentType.getSchemaIndex().putTypeDataByName( typeName, typeData );
currentType.getSchemaIndex().registerEnumeration( currentType, typeData );
}
}
}
}