/**
*
*/
package org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.validator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.ebayopensource.turmeric.runtime.codegen.common.SchemaNode;
import org.ebayopensource.turmeric.tools.codegen.fastserformat.protobuf.validator.FastSerFormatValidationHandler.Util;
/**
* @author rkulandaivel
*
* This class collects schema node information of the wsdl/xsds for post validation.
* The class is called by SchemaParserEventHandler to update the collection maintained by this class.
*
* This class creates separate map for each type because name of a complex type can be same as element name.
* also it can be same as group type name.
*/
public class SchemaNodeRepresentationByType implements SchemaConstuctConstants {
private static final List<SchemaNode> EMPTY_LIST = new ArrayList<SchemaNode>();
private Map<String, List<SchemaNode>> m_mapOfSchemaNodes = new HashMap<String, List<SchemaNode>>();
private Map<String, List<SchemaNode>> m_mapOfRootLevelSchemaNodes = new HashMap<String, List<SchemaNode>>();
private Map<QName, SchemaNode> m_mapOfAllComplexAndSimpleTypes = new HashMap<QName, SchemaNode>();
private Map<QName, SchemaNode> m_mapOfRootAttributeTypes = new HashMap<QName, SchemaNode>();
private Map<QName, SchemaNode> m_mapOfRootAttributeGroupTypes = new HashMap<QName, SchemaNode>();
private Map<QName, SchemaNode> m_mapOfRootElementTypes = new HashMap<QName, SchemaNode>();
private Map<QName, SchemaNode> m_mapOfGroupTypes = new HashMap<QName, SchemaNode>();
public SchemaNodeRepresentationByType() {
}
private void updateRootLevelNodesMap(SchemaNode currentNode){
List<SchemaNode> nodes = m_mapOfRootLevelSchemaNodes.get( currentNode.getNodeName() );
if( nodes == null){
nodes = new ArrayList<SchemaNode>();
m_mapOfRootLevelSchemaNodes.put(currentNode.getNodeName(), nodes);
}
nodes.add( currentNode );
if( currentNode.isNameAttrExists() ){
Map<QName, SchemaNode> map = getMapToUpdateForRootLevelTypes( currentNode );
if( map != null ){
map.put(new QName( currentNode.getTargetNamespace(), currentNode.getNameAttrValue() ), currentNode);
}
}
}
public void updateMap(SchemaNode currentNode){
List<SchemaNode> nodes = m_mapOfSchemaNodes.get( currentNode.getNodeName() );
if( nodes == null){
nodes = new ArrayList<SchemaNode>();
m_mapOfSchemaNodes.put(currentNode.getNodeName(), nodes);
}
nodes.add( currentNode );
Map<QName, SchemaNode> map = getMapToUpdate( currentNode );
if( map != null && currentNode.isNameAttrExists() ){
map.put(new QName( currentNode.getTargetNamespace(), currentNode.getNameAttrValue() ), currentNode);
}
if( Util.isRootNodeInSchema( currentNode ) ){
updateRootLevelNodesMap( currentNode );
}
}
private Map<QName, SchemaNode> getMapToUpdateForRootLevelTypes(SchemaNode currentNode){
if(Util.isInValidNodeName(currentNode, ELEMENT) ){
return m_mapOfRootElementTypes;
}
if(Util.isInValidNodeName(currentNode, ATTRIBUTE) ){
return m_mapOfRootAttributeTypes;
}
if(Util.isInValidNodeName(currentNode, ATTRIBUTE_GROUP) ){
return m_mapOfRootAttributeGroupTypes;
}
if(Util.isInValidNodeName(currentNode, GROUP) ){
return m_mapOfGroupTypes;
}
return null;
}
private Map<QName, SchemaNode> getMapToUpdate(SchemaNode currentNode){
if(Util.isInValidNodeName(currentNode, COMPLEXTYPE)
|| Util.isInValidNodeName(currentNode, SIMPLETYPE)
){
return m_mapOfAllComplexAndSimpleTypes;
}
return null;
}
public List<SchemaNode> getSchemaNodesList( String nodeName ){
List<SchemaNode> nodes = m_mapOfSchemaNodes.get(nodeName);
if( nodes == null ){
nodes = EMPTY_LIST;
}
return nodes;
}
public List<SchemaNode> getRootLevelSchemaNodesList( String nodeName ){
List<SchemaNode> nodes = m_mapOfRootLevelSchemaNodes.get(nodeName);
if( nodes == null ){
nodes = EMPTY_LIST;
}
return nodes;
}
public SchemaNode getType(QName typeQName){
return m_mapOfAllComplexAndSimpleTypes.get(typeQName);
}
public SchemaNode getRootElementNode(QName typeQName){
return m_mapOfRootElementTypes.get(typeQName);
}
public SchemaNode getRootAttributeNode(QName typeQName){
return m_mapOfRootAttributeTypes.get(typeQName);
}
public SchemaNode getRootAttributeGroupNode(QName typeQName){
return m_mapOfRootAttributeGroupTypes.get(typeQName);
}
public SchemaNode getRootGroupNode(QName typeQName){
return m_mapOfGroupTypes.get(typeQName);
}
public List<SchemaNode> getComplexTypeNodes(){
return getSchemaNodesList(COMPLEXTYPE);
}
}