Fix for bug 415706
Reviewed by Blaise Doughan
diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/oxm/QNameInheritancePolicy.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/oxm/QNameInheritancePolicy.java
index a51e905..48a7603 100644
--- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/oxm/QNameInheritancePolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/internal/oxm/QNameInheritancePolicy.java
@@ -154,40 +154,45 @@
      */

     public void initialize(AbstractSession session) {

         super.initialize(session);

-

         // If we have a namespace resolver, check any of the class-indicator values

         // for prefixed type names and resolve the namespaces.

-        if (!this.shouldUseClassNameAsIndicator()){ 

-            // Must first clone the map to avoid concurrent modification.

-            Iterator<Map.Entry> entries = new HashMap(getClassIndicatorMapping()).entrySet().iterator();

-            while (entries.hasNext()) {

-                Map.Entry entry = entries.next();

-                Object key = entry.getKey();

-                XPathFragment frag = ((XMLField) getClassIndicatorField()).getXPathFragment();

-                if (frag.getLocalName().equals(Constants.SCHEMA_TYPE_ATTRIBUTE) && frag.getNamespaceURI() != null && frag.getNamespaceURI().equals(javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI)) {

+        if (!this.shouldUseClassNameAsIndicator()){

+            if(classIndicatorField != null){

+                XPathFragment frag = ((XMLField) classIndicatorField).getXPathFragment();

+                if (frag.getLocalName().equals(Constants.SCHEMA_TYPE_ATTRIBUTE) && javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI.equals(frag.getNamespaceURI())) {

                     usesXsiType = true;

-                }

-                if (key instanceof String) {

-                    XPathQName qname;

-

-                    String indicatorValue = (String) key;

-                    if (!usesXsiType || namespaceResolver == null) {

-                        qname = new XPathQName(indicatorValue, true);

-                    } else {

-                        int index = indicatorValue.indexOf(Constants.COLON);

-                        if (index != -1 && namespaceResolver != null) {

-                            String prefix = indicatorValue.substring(0, index);

-                            String localPart = indicatorValue.substring(index + 1);

-                            String uri = namespaceResolver.resolveNamespacePrefix(prefix);

-                            qname = new XPathQName(uri, localPart, true);

+                 }

+             }

+            if(!isChildDescriptor()){ 

+         

+                // Must first clone the map to avoid concurrent modification.

+                Iterator<Map.Entry> entries = new HashMap(getClassIndicatorMapping()).entrySet().iterator();

+                while (entries.hasNext()) {

+                    Map.Entry entry = entries.next();

+                    Object key = entry.getKey();

+                  

+                    if (key instanceof String) {

+                        XPathQName qname;

+    

+                        String indicatorValue = (String) key;

+                        if (!usesXsiType || namespaceResolver == null) {

+                            qname = new XPathQName(indicatorValue, true);

                         } else {

-                            qname = new XPathQName(namespaceResolver.getDefaultNamespaceURI(), indicatorValue, true);

+                            int index = indicatorValue.indexOf(Constants.COLON);

+                            if (index != -1 && namespaceResolver != null) {

+                                String prefix = indicatorValue.substring(0, index);

+                                String localPart = indicatorValue.substring(index + 1);

+                                String uri = namespaceResolver.resolveNamespacePrefix(prefix);

+                                qname = new XPathQName(uri, localPart, true);

+                            } else {

+                                qname = new XPathQName(namespaceResolver.getDefaultNamespaceURI(), indicatorValue, true);

+                            }

                         }

+                        getClassIndicatorMapping().put(qname, entry.getValue());

+                    } else if (key instanceof QName) {

+                        XPathQName xpathQName = new XPathQName((QName) key, true);

+                        getClassIndicatorMapping().put(xpathQName, entry.getValue());

                     }

-                    getClassIndicatorMapping().put(qname, entry.getValue());

-                } else if (key instanceof QName) {

-                    XPathQName xpathQName = new XPathQName((QName) key, true);

-                    getClassIndicatorMapping().put(xpathQName, entry.getValue());

                 }

             }

         }

diff --git a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/JAXBContext.java b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/JAXBContext.java
index 0e4dce2..52239a9 100644
--- a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/JAXBContext.java
+++ b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/JAXBContext.java
@@ -898,6 +898,7 @@
                 jModel.setMetadataCompletePackageMap(metadataComplete);

             }

 

+            jModel.setHasXmlBindings(xmlBindings != null || !xmlBindings.isEmpty());

             JavaModelInputImpl inputImpl = new JavaModelInputImpl(classesToBeBound, jModel);

             try {

                 Generator generator = new Generator(inputImpl, xmlBindings, loader, defaultTargetNamespace, enableXmlAccessorFactory);

@@ -1029,6 +1030,7 @@
                 jModel = new JavaModelImpl(loader);

             }

 

+            jModel.setHasXmlBindings(xmlBindings != null || !xmlBindings.isEmpty());

             // create Map of package names to metadata complete indicators

             Map<String, Boolean> metadataComplete = new HashMap<String, Boolean>();

             for (String packageName : xmlBindings.keySet()) {

diff --git a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/AnnotationsProcessor.java b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/AnnotationsProcessor.java
index 3bb6a9c..60e625a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/AnnotationsProcessor.java
+++ b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/AnnotationsProcessor.java
@@ -527,22 +527,18 @@
      */

     public Map<String, TypeInfo> preBuildTypeInfo(JavaClass[] javaClasses) {

         for (JavaClass javaClass : javaClasses) {

-            if (javaClass == null || !shouldGenerateTypeInfo(javaClass) || isXmlRegistry(javaClass) || javaClass.isArray()) {

+            String qualifiedName = javaClass.getQualifiedName();

+

+            TypeInfo info = typeInfo.get(qualifiedName);

+            if (javaClass == null || javaClass.isArray()|| (info!=null && info.isPreBuilt()) || !shouldGenerateTypeInfo(javaClass) || isXmlRegistry(javaClass) ) {

                 continue;

             }

 

-            String qualifiedName = javaClass.getQualifiedName();

-            TypeInfo info = typeInfo.get(qualifiedName);

-            if (info != null) {

-                if (info.isPreBuilt()) {

-                    continue;

-                }

-            }

 

             if (javaClass.isEnum()) {

-                info = new EnumTypeInfo(helper);

+                info = new EnumTypeInfo(helper, javaClass);

             } else {

-                info = new TypeInfo(helper);

+                info = new TypeInfo(helper, javaClass);

             }

             info.setJavaClassName(qualifiedName);

             info.setPreBuilt(true);

@@ -813,7 +809,7 @@
 

             // handle superclass if necessary

             JavaClass superClass = (JavaClass) javaClass.getSuperclass();

-            if (shouldGenerateTypeInfo(superClass)) {

+            if (shouldGenerateTypeInfo(superClass) && typeInfo.get(superClass.getQualifiedName()) == null) {

                 JavaClass[] jClassArray = new JavaClass[] { superClass };

                 buildNewTypeInfo(jClassArray);

             }

@@ -861,13 +857,13 @@
      * 

      */

     public void finalizeProperties() {    

-        ArrayList<JavaClass> jClasses = getTypeInfoClasses();

-        for (JavaClass jClass : jClasses) {

-            TypeInfo tInfo = getTypeInfo().get(jClass.getQualifiedName());

+    	

+        for (TypeInfo tInfo: getTypeInfo().values()) {

             // don't need to validate props on a transient class at this point

             if (tInfo.isTransient()) {

                 continue;

             }

+            JavaClass jClass = tInfo.getJavaClass();

             String[] propOrder = tInfo.getPropOrder();

             boolean hasPropOrder = propOrder.length > 0 && !(propOrder.length == 1 && propOrder[0].equals(Constants.EMPTY_STRING));                               

             // If a property is marked transient, ensure it doesn't exist in the propOrder

@@ -1048,13 +1044,13 @@
 

             if (property.isMap()) {

                 JavaClass keyType = property.getKeyType();

-                if (shouldGenerateTypeInfo(keyType)) {

+                if (shouldGenerateTypeInfo(keyType) && typeInfo.get(keyType.getQualifiedName()) == null) {

                     JavaClass[] jClassArray = new JavaClass[] { keyType };

                     buildNewTypeInfo(jClassArray);

                 }

 

                 JavaClass valueType = property.getValueType();

-                if (shouldGenerateTypeInfo(valueType)) {

+                if (shouldGenerateTypeInfo(valueType) && typeInfo.get(valueType.getQualifiedName()) == null) {

                     JavaClass[] jClassArray = new JavaClass[] { valueType };

                     buildNewTypeInfo(jClassArray);

                 }

@@ -1290,7 +1286,7 @@
      * @param classesToProcess

      */

     private void processClass(JavaClass javaClass, ArrayList<JavaClass> classesToProcess) {

-        if (shouldGenerateTypeInfo(javaClass)) {

+        if (shouldGenerateTypeInfo(javaClass) ){

             if (isXmlRegistry(javaClass)) {

                 this.processObjectFactory(javaClass, classesToProcess);

             } else {

@@ -1358,7 +1354,7 @@
             if (paramTypes != null && paramTypes.length > 0) {

                 String[] paramTypeNames = new String[paramTypes.length];

                 for (int i = 0; i < paramTypes.length; i++) {

-                	if(shouldGenerateTypeInfo(paramTypes[i])){

+                	if(shouldGenerateTypeInfo(paramTypes[i]) && typeInfo.get(paramTypes[i].getQualifiedName()) == null){

                            JavaClass[] jClassArray = new JavaClass[] { paramTypes[i] };

                            buildNewTypeInfo(jClassArray);

                 	}

@@ -1613,7 +1609,7 @@
             while (next != null && !(next.getName().equals(JAVA_LANG_OBJECT))) {

                 TypeInfo parentInfo = this.typeInfo.get(next.getName());

                 // If parentInfo is null, hasn't been processed yet

-                if (shouldGenerateTypeInfo(next)) {

+                if (shouldGenerateTypeInfo(next)  && typeInfo.get(next.getQualifiedName()) == null) {

                     buildNewTypeInfo(new JavaClass[] { next });

                     parentInfo = this.typeInfo.get(next.getName());

                 }

@@ -2323,7 +2319,7 @@
             	 TypeInfo tInfo = typeInfo.get(next.getType());

                  if(tInfo == null){

                 	 JavaClass nextCls =  helper.getJavaClass(next.getType());

-                	 if(shouldGenerateTypeInfo(nextCls)) {

+                	 if(shouldGenerateTypeInfo(nextCls) && typeInfo.get(nextCls.getQualifiedName()) == null) {

                 		 buildNewTypeInfo(new JavaClass[]{nextCls});

                          tInfo = typeInfo.get(next.getType());

                      }                     

@@ -3564,16 +3560,17 @@
     }

 

     private void checkForCallbackMethods() {

+        JavaClass unmarshallerCls = helper.getJavaClass(Unmarshaller.class);

+        JavaClass marshallerCls = helper.getJavaClass(Marshaller.class);

+        JavaClass objectCls = helper.getJavaClass(Object.class);

+        JavaClass[] unmarshalParams = new JavaClass[] { unmarshallerCls, objectCls };

+        JavaClass[] marshalParams = new JavaClass[] { marshallerCls };

+

         for (JavaClass next : typeInfoClasses) {

             if (next == null) {

                 continue;

             }

 

-            JavaClass unmarshallerCls = helper.getJavaClass(Unmarshaller.class);

-            JavaClass marshallerCls = helper.getJavaClass(Marshaller.class);

-            JavaClass objectCls = helper.getJavaClass(Object.class);

-            JavaClass[] unmarshalParams = new JavaClass[] { unmarshallerCls, objectCls };

-            JavaClass[] marshalParams = new JavaClass[] { marshallerCls };

             UnmarshalCallback unmarshalCallback = null;

             MarshalCallback marshalCallback = null;

             // look for before unmarshal callback

diff --git a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/EnumTypeInfo.java b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/EnumTypeInfo.java
index eea3328..ab4ebd7 100644
--- a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/EnumTypeInfo.java
+++ b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/EnumTypeInfo.java
@@ -17,6 +17,7 @@
 

 import javax.xml.namespace.QName;

 import org.eclipse.persistence.jaxb.javamodel.Helper;

+import org.eclipse.persistence.jaxb.javamodel.JavaClass;

 

 /**

  * INTERNAL:

@@ -38,8 +39,8 @@
     private List<String> m_fieldNames;

     private List<Object> m_xmlEnumValues;

     

-    public EnumTypeInfo(Helper helper) {

-        super(helper);

+    public EnumTypeInfo(Helper helper, JavaClass javaClass) {

+        super(helper, javaClass);

         m_fieldNames = new ArrayList<String>();

         m_xmlEnumValues = new ArrayList<Object>();

     }

diff --git a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/TypeInfo.java b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/TypeInfo.java
index a147c8f..14d7f26 100644
--- a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/TypeInfo.java
+++ b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/TypeInfo.java
@@ -121,6 +121,7 @@
     private XMLNameTransformer xmlNameTransformer;

     

     private boolean isLocationAware = false;

+    private JavaClass javaClass;

 

     public static XMLNameTransformer DEFAULT_NAME_TRANSFORMER = new DefaultXMLNameTransformer();

  

@@ -130,7 +131,7 @@
      * 

      * @param helper

      */

-    public TypeInfo(Helper helper) {

+    public TypeInfo(Helper helper, JavaClass javaClass) {

         propertyNames = new ArrayList<String>();

         properties = new HashMap<String, Property>();

         originalProperties = new HashMap<String, Property>();

@@ -139,6 +140,7 @@
         isSetXmlTransient = false;

         isPreBuilt = false;

         isPostBuilt = false;

+        this.javaClass = javaClass;

     }

 

     /**

@@ -1197,4 +1199,13 @@
         }

         return this.objectGraphs;

     }

+

+    public JavaClass getJavaClass() {

+        return javaClass;

+    }

+

+    public void setJavaClass(JavaClass javaClass) {

+        this.javaClass = javaClass;

+    }

+

 }
\ No newline at end of file
diff --git a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/javamodel/reflection/JavaClassImpl.java b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/javamodel/reflection/JavaClassImpl.java
index 44dc2ab..7b10d74 100644
--- a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/javamodel/reflection/JavaClassImpl.java
+++ b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/javamodel/reflection/JavaClassImpl.java
@@ -437,6 +437,9 @@
         if(arg0 == null) {

             return false;

         }

+        if(!this.javaModelImpl.hasXmlBindings()) {

+        	return false;

+        }

         if(!(arg0.getClass() == this.getClass())) { 

             return false;

         }

diff --git a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelImpl.java b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelImpl.java
index 2e094f6..6d72828 100644
--- a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelImpl.java
+++ b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelImpl.java
@@ -43,6 +43,7 @@
     private AnnotationHelper annotationHelper;

     private Map<String, Boolean> metadataCompletePackages;

     private Map<String, JavaClassImpl> cachedJavaClasses;

+    private boolean hasXmlBindings = false;

     

     public JavaModelImpl(ClassLoader classLoader) {

         this.classLoader = classLoader;

@@ -121,4 +122,12 @@
         }

         return this.cachedJavaClasses;

     }

+

+	public boolean hasXmlBindings() {

+		return hasXmlBindings;

+	}

+

+	public void setHasXmlBindings(boolean hasXmlBindings) {

+		this.hasXmlBindings = hasXmlBindings;

+	}

 }
\ No newline at end of file
diff --git a/sdo/org.eclipse.persistence.sdo/src/org/eclipse/persistence/sdo/helper/delegates/SDOXMLHelperDelegate.java b/sdo/org.eclipse.persistence.sdo/src/org/eclipse/persistence/sdo/helper/delegates/SDOXMLHelperDelegate.java
index b4e7e50..ad031d7 100644
--- a/sdo/org.eclipse.persistence.sdo/src/org/eclipse/persistence/sdo/helper/delegates/SDOXMLHelperDelegate.java
+++ b/sdo/org.eclipse.persistence.sdo/src/org/eclipse/persistence/sdo/helper/delegates/SDOXMLHelperDelegate.java
@@ -638,10 +638,16 @@
    

     public void initializeDescriptor(XMLDescriptor descriptor){

         AbstractSession theSession = (AbstractSession)getXmlContext().getSession();

+        boolean isInitialized = descriptor.isFullyInitialized();

         //do initialization for new descriptor;        

         descriptor.preInitialize(theSession);

         descriptor.initialize(theSession);

         descriptor.postInitialize(theSession);

+        

+        if(isInitialized && descriptor.hasInheritance() && descriptor.getInheritancePolicy().isRootParentDescriptor()){

+            descriptor.getInheritancePolicy().initialize(theSession);

+        }

+        

         descriptor.getObjectBuilder().initializePrimaryKey(theSession);

         getXmlContext().storeXMLDescriptorByQName(descriptor);                           

     }