/*
* 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.XmlSchemaFlattenedChild;
import gw.internal.xml.xsd.typeprovider.XmlSchemaIndex;
import gw.internal.xml.xsd.typeprovider.XmlSchemaPropertyType;
import gw.internal.xml.xsd.typeprovider.XmlSchemaResourceTypeLoaderBase;
import gw.internal.xml.xsd.typeprovider.XmlSchemaTypeInstanceTypeData;
import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaComplexType;
import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaContentModel;
import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaType;
import gw.util.GosuClassUtil;
import gw.util.Pair;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
public class XmlSchemaComplexTypeIndexer extends XmlSchemaIndexer<XmlSchemaComplexType> {
@Override
public <T> void index( XmlSchemaComplexType xsdType, 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 ) {
flattenedChildren = new ArrayList<XmlSchemaFlattenedChild>(); // properties are rooted at the complex type level
pluralityMap = new HashMap<Pair<XmlSchemaPropertyType, QName>, Boolean>();
usedElementNames = new HashMap<QName, XmlSchemaElementTypeData>();
isPlural = false;
xsdType.getSchemaIndex().registerFlattenedChildrenBySchemaType( xsdType, flattenedChildren );
xsdType.getSchemaIndex().registerChildrenPluralityBySchemaType( xsdType, pluralityMap );
String xsdTypeName = xsdType.getName();
String packageName = xsdType.getSchemaIndex().getPackageName();
boolean createGosuType = true;
boolean anonymous = false;
XmlSchemaResourceTypeLoaderBase typeLoader = xsdType.getSchemaIndex().getTypeLoader();
if ( xsdTypeName == null ) {
if ( currentType != null ) {
createGosuType = false;
}
packageName += typeLoader.getAnonymousNamespacePrefix() + ".types.complex";
anonymous = true;
}
else {
packageName += typeLoader.getTypesNamespacePrefix() + ".complex";
}
prefix = appendToPrefix( prefix, XmlSchemaIndex.makeCamelCase( xsdTypeName, null ) );
if ( createGosuType && createTypes ) {
String typeName = xsdType.getSchemaIndex().makeUniqueTypeName( packageName, prefix );
prefix = GosuClassUtil.getNameNoPackage( typeName ); // in case a suffix was picked up
@SuppressWarnings( { "unchecked" } )
XmlSchemaTypeInstanceTypeData type = new XmlSchemaTypeInstanceTypeData<T>( ( XmlSchemaIndex<T> ) xsdType.getSchemaIndex(), typeLoader, typeName, xsdType, anonymous, context );
xsdType.getSchemaIndex().putTypeDataByName( typeName, type );
xsdType.getSchemaIndex().putTypeDataBySchemaObject( xsdType, type );
}
XmlSchemaContentModel contentModel = xsdType.getContentModel();
if ( contentModel != null ) {
XmlSchemaIndexer.invokeIndexer( contentModel, prefix, flattenedChildren, false, isPlural, xsdType, createTypes, usedElementNames, pluralityMap, context, todo );
}
}
}