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);
}