[441901] Non-default type mapping ecore:type is not taken into account
in xs:list mapping
diff --git a/plugins/org.eclipse.xsd/src/org/eclipse/xsd/ecore/XSDEcoreBuilder.java b/plugins/org.eclipse.xsd/src/org/eclipse/xsd/ecore/XSDEcoreBuilder.java
index f7ebe85..a66c98b 100644
--- a/plugins/org.eclipse.xsd/src/org/eclipse/xsd/ecore/XSDEcoreBuilder.java
+++ b/plugins/org.eclipse.xsd/src/org/eclipse/xsd/ecore/XSDEcoreBuilder.java
@@ -427,7 +427,11 @@
{
if (xsdSimpleTypeDefinition.getVariety() == XSDVariety.LIST_LITERAL)
{
- EDataType itemEDataType = getEDataType(xsdSimpleTypeDefinition.getItemTypeDefinition());
+ EDataType itemEDataType = getExplicitType(xsdSimpleTypeDefinition, eDataType);
+ if (itemEDataType == null)
+ {
+ itemEDataType = getEDataType(xsdSimpleTypeDefinition.getItemTypeDefinition());
+ }
extendedMetaData.setItemType(eDataType, itemEDataType);
eDataType.setInstanceTypeName("java.util.List");
}
@@ -459,7 +463,12 @@
}
else
{
- EDataType baseEDataType = getEDataType(baseTypeDefinition);
+ EDataType baseEDataType = getExplicitType(xsdSimpleTypeDefinition, eDataType);
+ if (baseEDataType == null)
+ {
+ baseEDataType = getEDataType(baseTypeDefinition);
+ }
+
String instanceClassName = getInstanceClassName(xsdSimpleTypeDefinition, baseEDataType);
// Don't set up circular inheritance.
@@ -1591,6 +1600,38 @@
return result;
}
+ private EDataType getExplicitType(XSDSimpleTypeDefinition xsdSimpleTypeDefinition, EModelElement context)
+ {
+ Element element = xsdSimpleTypeDefinition.getElement();
+ if (element != null)
+ {
+ for (Node node = element.getFirstChild(); node != null; node = node.getNextSibling())
+ {
+ if (node.getNodeType() == Node.ELEMENT_NODE)
+ {
+ int nodeType = XSDConstants.nodeType(node);
+ if (nodeType == XSDConstants.RESTRICTION_ELEMENT || nodeType == XSDConstants.LIST_ELEMENT)
+ {
+ String explicitType = getEcoreAttribute((Element)node, "type");
+ if (explicitType != null)
+ {
+ EGenericType explicitGenericType = getGenericType(xsdSimpleTypeDefinition, xsdSimpleTypeDefinition.getElement(), context, explicitType);
+ if (explicitGenericType != null)
+ {
+ EClassifier eClassifier = explicitGenericType.getEClassifier();
+ if (eClassifier instanceof EDataType && explicitGenericType.getETypeArguments().isEmpty() && explicitGenericType.getELowerBound() == null && explicitGenericType.getELowerBound() == null)
+ {
+ return (EDataType)eClassifier;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
protected boolean useSortedAttributes()
{
return true;