Fix for bug 389818
Reviewed by Blaise Doughan
diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/UnmarshalRecord.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/UnmarshalRecord.java
index 41c8b76..eb75855 100644
--- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/UnmarshalRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/oxm/record/UnmarshalRecord.java
@@ -1359,7 +1359,6 @@
}else{
childRecord = (UnmarshalRecord) treeObjectBuilder.createRecord(session);
childRecord.setUnmarshaller(unmarshaller);
- childRecord.session = this.session;
childRecord.setTextWrapperFragment(textWrapperFragment);
childRecord.setXMLReader(this.xmlReader);
childRecord.setFragmentBuilder(fragmentBuilder);
diff --git a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
index c9d56d8..49b46bf 100644
--- a/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
+++ b/moxy/org.eclipse.persistence.moxy/src/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
@@ -465,7 +465,7 @@
* @param namespaceInfo
* @return newly created mapping
*/
- public DatabaseMapping generateMapping(Property property, XMLDescriptor descriptor, NamespaceInfo namespaceInfo) {
+ public DatabaseMapping generateMapping(Property property, XMLDescriptor descriptor, JavaClass descriptorJavaClass, NamespaceInfo namespaceInfo) {
if (property.isSetXmlJavaTypeAdapter()) {
// if we are dealing with a reference, generate mapping and return
if (property.isReference()) {
@@ -497,7 +497,7 @@
converter.setNestedConverter(((XMLCompositeDirectCollectionMapping)mapping).getValueConverter());
((XMLCompositeDirectCollectionMapping)mapping).setValueConverter(converter);
} else {
- mapping = generateCompositeCollectionMapping(property, descriptor, namespaceInfo, valueType.getQualifiedName());
+ mapping = generateCompositeCollectionMapping(property, descriptor,descriptorJavaClass, namespaceInfo, valueType.getQualifiedName());
((XMLCompositeCollectionMapping) mapping).setConverter(new XMLJavaTypeConverter(adapterClass.getQualifiedName()));
}
} else {
@@ -588,10 +588,10 @@
if (property.isAnyAttribute()) {
return generateAnyAttributeMapping(property, descriptor, namespaceInfo);
}
- return generateMapMapping(property, descriptor, namespaceInfo);
+ return generateMapMapping(property, descriptor, descriptorJavaClass, namespaceInfo);
}
if (isCollectionType(property)) {
- return generateCollectionMapping(property, descriptor, namespaceInfo);
+ return generateCollectionMapping(property, descriptor, descriptorJavaClass, namespaceInfo);
}
JavaClass referenceClass = property.getType();
@@ -604,13 +604,13 @@
return generateEnumCollectionMapping(property, descriptor, namespaceInfo,(EnumTypeInfo) reference);
}
if (areEquals(componentType, Object.class)){
- XMLCompositeCollectionMapping mapping = generateCompositeCollectionMapping(property, descriptor, namespaceInfo, null);
+ XMLCompositeCollectionMapping mapping = generateCompositeCollectionMapping(property, descriptor, descriptorJavaClass, namespaceInfo, null);
mapping.setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
return mapping;
}
if (reference != null || componentType.isArray()){
- return generateCompositeCollectionMapping(property, descriptor, namespaceInfo, componentType.getQualifiedName());
+ return generateCompositeCollectionMapping(property, descriptor, descriptorJavaClass, namespaceInfo, componentType.getQualifiedName());
}
return generateDirectCollectionMapping(property, descriptor, namespaceInfo);
}
@@ -1552,7 +1552,7 @@
return converter;
}
- public DatabaseMapping generateCollectionMapping(Property property, XMLDescriptor descriptor, NamespaceInfo namespaceInfo) {
+ public DatabaseMapping generateCollectionMapping(Property property, XMLDescriptor descriptor, JavaClass descriptorJavaClass, NamespaceInfo namespaceInfo) {
// check to see if this should be a composite or direct mapping
JavaClass javaClass = property.getActualType();
@@ -1568,10 +1568,10 @@
if (referenceInfo.isEnumerationType()) {
return generateEnumCollectionMapping(property, descriptor, namespaceInfo,(EnumTypeInfo) referenceInfo);
}
- return generateCompositeCollectionMapping(property, descriptor, namespaceInfo, javaClass.getQualifiedName());
+ return generateCompositeCollectionMapping(property, descriptor, descriptorJavaClass, namespaceInfo, javaClass.getQualifiedName());
}
if (!property.isAttribute() && javaClass != null && javaClass.getQualifiedName().equals(OBJECT_CLASS_NAME)){
- XMLCompositeCollectionMapping ccMapping = generateCompositeCollectionMapping(property, descriptor, namespaceInfo, null);
+ XMLCompositeCollectionMapping ccMapping = generateCompositeCollectionMapping(property, descriptor, descriptorJavaClass, namespaceInfo, null);
ccMapping.setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
return ccMapping;
}
@@ -1705,12 +1705,12 @@
return src.getRawName().equals(tgtCanonicalName);
}
- public XMLCompositeCollectionMapping generateMapMapping(Property property, XMLDescriptor descriptor, NamespaceInfo namespaceInfo) {
+ public XMLCompositeCollectionMapping generateMapMapping(Property property, XMLDescriptor descriptor, JavaClass descriptorClass, NamespaceInfo namespaceInfo) {
XMLCompositeCollectionMapping mapping = new XMLCompositeCollectionMapping();
mapping.setAttributeName(property.getPropertyName());
initializeXMLContainerMapping(mapping);
XMLField field = getXPathForField(property, namespaceInfo, false);
- JavaClass descriptorClass = helper.getJavaClass(descriptor.getJavaClassName());
+
JavaClass mapValueClass = helper.getJavaClass(MapValue.class);
if(mapValueClass.isAssignableFrom(descriptorClass)){
mapping.setXPath("entry");
@@ -1885,10 +1885,15 @@
return mapping;
}
- public XMLCompositeCollectionMapping generateCompositeCollectionMapping(Property property, XMLDescriptor descriptor, NamespaceInfo namespaceInfo, String referenceClassName) {
+ public XMLCompositeCollectionMapping generateCompositeCollectionMapping(Property property, XMLDescriptor descriptor, JavaClass javaClass, NamespaceInfo namespaceInfo, String referenceClassName) {
XMLCompositeCollectionMapping mapping = new XMLCompositeCollectionMapping();
mapping.setAttributeName(property.getPropertyName());
initializeXMLContainerMapping(mapping);
+
+ JavaClass manyValueJavaClass = helper.getJavaClass(ManyValue.class);
+ if (manyValueJavaClass.isAssignableFrom(javaClass)){
+ mapping.setReuseContainer(false);
+ }
// handle read-only set via metadata
if (property.isSetReadOnly()) {
mapping.setIsReadOnly(property.isReadOnly());
@@ -2258,7 +2263,7 @@
XMLDescriptor descriptor = info.getDescriptor();
if (descriptor != null) {
- generateMappings(info, descriptor, namespaceInfo);
+ generateMappings(info, descriptor, javaClass, namespaceInfo);
}
// set primary key fields (if necessary)
DatabaseMapping mapping;
@@ -2289,16 +2294,16 @@
* @param descriptor
* @param namespaceInfo
*/
- public void generateMappings(TypeInfo info, XMLDescriptor descriptor, NamespaceInfo namespaceInfo) {
+ public void generateMappings(TypeInfo info, XMLDescriptor descriptor, JavaClass descriptorJavaClass, NamespaceInfo namespaceInfo) {
if(info.isAnonymousComplexType()) {
//may need to generate inherited mappings
- generateInheritedMappingsForAnonymousType(info, descriptor, namespaceInfo);
+ generateInheritedMappingsForAnonymousType(info, descriptor, descriptorJavaClass, namespaceInfo);
}
List<Property> propertiesInOrder = info.getNonTransientPropertiesInPropOrder();
for (int i = 0; i < propertiesInOrder.size(); i++) {
Property next = propertiesInOrder.get(i);
if (next != null && (!next.isTransient() || (next.isTransient() && next.isXmlLocation()))) {
- DatabaseMapping mapping = generateMapping(next, descriptor, namespaceInfo);
+ DatabaseMapping mapping = generateMapping(next, descriptor, descriptorJavaClass, namespaceInfo);
if (next.isVirtual()) {
VirtualAttributeAccessor accessor = new VirtualAttributeAccessor();
accessor.setAttributeName(mapping.getAttributeName());
@@ -2331,14 +2336,13 @@
mapping.setProperties(next.getUserProperties());
}
//get package info
- JavaClass jClass = helper.getJavaClass(info.getJavaClassName());
AccessorFactoryWrapper accessorFactory = info.getXmlAccessorFactory();
if(accessorFactory == null) {
accessorFactory = info.getPackageLevelXmlAccessorFactory();
}
if(accessorFactory != null) {
try {
- Object accessor = CompilerHelper.createAccessorFor(jClass, next, helper, accessorFactory);
+ Object accessor = CompilerHelper.createAccessorFor(descriptorJavaClass, next, helper, accessorFactory);
if(accessor != null) {
CustomAccessorAttributeAccessor attributeAccessor = new CustomAccessorAttributeAccessor(accessor);
@@ -2351,9 +2355,9 @@
}
}
- private void generateInheritedMappingsForAnonymousType(TypeInfo info, XMLDescriptor descriptor, NamespaceInfo namespaceInfo) {
+ private void generateInheritedMappingsForAnonymousType(TypeInfo info, XMLDescriptor descriptor, JavaClass descriptorJavaClass, NamespaceInfo namespaceInfo) {
List<TypeInfo> mappedParents = new ArrayList<TypeInfo>();
- JavaClass next = CompilerHelper.getNextMappedSuperClass(helper.getJavaClass(info.getJavaClassName()), typeInfo, helper);
+ JavaClass next = CompilerHelper.getNextMappedSuperClass(descriptorJavaClass, typeInfo, helper);
while(next != null) {
TypeInfo nextInfo = this.typeInfo.get(next.getName());
mappedParents.add(0, nextInfo);
@@ -2364,7 +2368,7 @@
for (int i = 0; i < propertiesInOrder.size(); i++) {
Property nextProp = propertiesInOrder.get(i);
if (nextProp != null){
- DatabaseMapping mapping = generateMapping(nextProp, descriptor, namespaceInfo);
+ DatabaseMapping mapping = generateMapping(nextProp, descriptor, descriptorJavaClass, namespaceInfo);
descriptor.addMapping(mapping);
// set user-defined properties if necessary
if (nextProp.isSetUserProperties()) {