in src/wsdl/org/apache/axis/wsdl/symbolTable/CSchemaUtils.java [1435:1649]
private static QName getArrayComponentQName_JAXRPC(Node node,
IntHolder dims,
SymbolTable symbolTable)
{
dims.value = 0; // Assume 0
if (node == null)
return null;
// If the node kind is an element, dive into it.
if (isXSDNode(node, "element"))
{
NodeList children = node.getChildNodes();
for (int j = 0; j < children.getLength(); j++)
{
Node kid = children.item(j);
if (isXSDNode(kid, "complexType"))
{
node = kid;
break;
}
}
}
// Get the node kind, expecting a schema complexType
if (isXSDNode(node, "complexType"))
{
// Under the complexType there should be a complexContent.
// (There may be other #text nodes, which we will ignore).
NodeList children = node.getChildNodes();
Node complexContentNode = null;
for (int j = 0; j < children.getLength(); j++)
{
Node kid = children.item(j);
if (isXSDNode(kid, "complexContent") || isXSDNode(kid, "simpleContent"))
{
complexContentNode = kid;
break;
}
}
// Under the complexContent there should be a restriction.
// (There may be other #text nodes, which we will ignore).
Node restrictionNode = null;
if (complexContentNode != null)
{
children = complexContentNode.getChildNodes();
for (int j = 0; j < children.getLength(); j++)
{
Node kid = children.item(j);
if (isXSDNode(kid, "restriction"))
{
restrictionNode = kid;
break;
}
}
}
// The restriction node must have a base of soapenc:Array.
QName baseType = null;
if (restrictionNode != null)
{
baseType = Utils.getTypeQName(restrictionNode, new BooleanHolder(), false);
if (baseType != null)
{
if (!baseType.getLocalPart().equals("Array") ||
!Constants.isSOAP_ENC(baseType.getNamespaceURI()))
{
if (!symbolTable.arrayTypeQNames.contains(baseType))
baseType = null; // Did not find base=soapenc:Array
}
}
}
// Under the restriction there should be an attribute OR a sequence/all group node.
// (There may be other #text nodes, which we will ignore).
Node groupNode = null;
Node attributeNode = null;
if (baseType != null)
{
children = restrictionNode.getChildNodes();
for (int j = 0; (j < children.getLength())
&& (groupNode == null)
&& (attributeNode == null); j++)
{
Node kid = children.item(j);
if (isXSDNode(kid, "sequence") || isXSDNode(kid, "all"))
{
groupNode = kid;
if (groupNode.getChildNodes().getLength() == 0)
{
// This covers the rather odd but legal empty sequence.
// <complexType name="ArrayOfString">
// <complexContent>
// <restriction base="soapenc:Array">
// <sequence/>
// <attribute ref="soapenc:arrayType" wsdl:arrayType="string[]"/>
// </restriction>
// </complexContent>
// </complexType>
groupNode = null;
}
}
if (isXSDNode(kid, "attribute"))
{
// If the attribute node does not have ref="soapenc:arrayType"
// then keep looking.
BooleanHolder isRef = new BooleanHolder();
QName refQName = Utils.getTypeQName(kid, isRef, false);
if ((refQName != null) && isRef.value
&& refQName.getLocalPart().equals("arrayType")
&& Constants.isSOAP_ENC(refQName.getNamespaceURI()))
attributeNode = kid;
}
}
}
// If there is an attribute node, look at wsdl:arrayType to get the element type
if (attributeNode != null)
{
String wsdlArrayTypeValue = null;
Vector attrs = Utils.getAttributesWithLocalName(attributeNode, "arrayType");
for (int i = 0;
(i < attrs.size()) && (wsdlArrayTypeValue == null);
i++)
{
Node attrNode = (Node) attrs.elementAt(i);
String attrName = attrNode.getNodeName();
QName attrQName = Utils.getQNameFromPrefixedName(attributeNode, attrName);
if (Constants.isWSDL(attrQName.getNamespaceURI()))
wsdlArrayTypeValue = attrNode.getNodeValue();
}
// The value could have any number of [] or [,] on the end
// Strip these off to get the prefixed name.
// The convert the prefixed name into a qname.
// Count the number of [ and , to get the dim information.
if (wsdlArrayTypeValue != null)
{
int i = wsdlArrayTypeValue.indexOf('[');
if (i > 0)
{
String prefixedName = wsdlArrayTypeValue.substring(0, i);
String mangledString = wsdlArrayTypeValue.replace(',', '[');
dims.value = 0;
int index = mangledString.indexOf('[');
while (index > 0)
{
dims.value++;
index = mangledString.indexOf('[', index + 1);
}
return Utils.getQNameFromPrefixedName(restrictionNode, prefixedName);
}
}
}
else if (groupNode != null)
{
// Get the first element node under the group node.
NodeList elements = groupNode.getChildNodes();
Node elementNode = null;
for (int i = 0; (i < elements.getLength()) && (elementNode == null); i++)
{
Node kid = elements.item(i);
if (isXSDNode(kid, "element"))
{
elementNode = elements.item(i);
break;
}
}
// The element node should have maxOccurs="unbounded" and
// a type
if (elementNode != null)
{
String maxOccursValue = Utils.getAttribute(elementNode, "maxOccurs");
if ((maxOccursValue != null) && maxOccursValue.equalsIgnoreCase("unbounded"))
{
// Get the QName of the type without considering maxOccurs
dims.value = 1;
return Utils.getTypeQName(elementNode, new BooleanHolder(), true);
}
}
}
}
return null;
}