Bug#506168: Shared NestedEmbeddables dont support AttributeOverride

Signed-off-by: Will Dazey <dazeydev.3@gmail.com>
Reviewed-by: Dalia Abo Sheasha <daliasheasha@gmail.com>
diff --git a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/mappings/AggregateObjectMapping.java b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/mappings/AggregateObjectMapping.java
index 9dfa6aa..85aff35 100644
--- a/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/mappings/AggregateObjectMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/mappings/AggregateObjectMapping.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016 Oracle and/or its affiliates. All rights reserved.
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
  * which accompanies this distribution.
@@ -22,6 +22,8 @@
  *     06/03/2013-2.5.1 Guy Pelletier
  *       - 402380: 3 jpa21/advanced tests failed on server with
  *         "java.lang.NoClassDefFoundError: org/eclipse/persistence/testing/models/jpa21/advanced/enums/Gender"
+ *     10/19/2016-2.6 Will Dazey
+ *       - 506168: Make sure nestedTranslation map is new reference when cloned
  ******************************************************************************/
 package org.eclipse.persistence.mappings;
 
@@ -924,6 +926,10 @@ public Object clone() {
         aggregateToSourceFields.putAll(getAggregateToSourceFields());
         mappingObject.setAggregateToSourceFields(aggregateToSourceFields);
 
+        Map<String, Object[]> nestedTranslations = new HashMap<String, Object[]>();
+        nestedTranslations.putAll(getNestedFieldTranslations());
+        mappingObject.setNestedFieldTranslations(nestedTranslations);
+
         return mappingObject;
     }
 
@@ -1162,6 +1168,14 @@ public Map<String, DatabaseField> getAggregateToSourceFields() {
     }
 
     /**
+     * INTERNAL:
+     * Return the hashtable that stores the nested field translations.
+     */
+    public Map<String, Object[]> getNestedFieldTranslations() {
+        return nestedFieldTranslations;
+    }
+
+    /**
      * PUBLIC:
      * The classification type for the attribute this mapping represents
      */
@@ -1871,6 +1885,15 @@ public void setAggregateToSourceFields(Map<String, DatabaseField> aggregateToSou
     }
 
     /**
+     * INTERNAL:
+     * Set the hashtable that stores a field in the source table 
+     * to a field name in a nested aggregate descriptor.
+     */
+    public void setNestedFieldTranslations(Map<String, Object[]> fieldTranslations) {
+        nestedFieldTranslations = fieldTranslations;
+    }
+
+    /**
      * PUBLIC:
      * Configure if all the fields in the database row for the aggregate object are NULL,
      * then, by default, the mapping will place a null in the appropriate source object
diff --git a/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/TestNestedEmbeddable.java b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/TestNestedEmbeddable.java
index 28dd000..785ebde 100644
--- a/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/TestNestedEmbeddable.java
+++ b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/TestNestedEmbeddable.java
@@ -10,13 +10,19 @@
  * Contributors:
  *     08/24/2016 - Will Dazey
  *       - 500145 : Nested Embeddables Test
+ *     10/19/2016 - Will Dazey
+ *       - 506168 : Nested Embeddables AttributeOverride Test
  ******************************************************************************/
 package org.eclipse.persistence.jpa.embeddable;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.jpa.JpaEntityManager;
 import org.eclipse.persistence.jpa.embeddable.model.Address;
+import org.eclipse.persistence.jpa.embeddable.model.DeepOrderPK;
+import org.eclipse.persistence.jpa.embeddable.model.DeepOrder;
 import org.eclipse.persistence.jpa.embeddable.model.Order;
 import org.eclipse.persistence.jpa.embeddable.model.OrderPK;
 import org.eclipse.persistence.jpa.embeddable.model.Zipcode;
@@ -29,7 +35,7 @@
 
 @RunWith(EmfRunner.class)
 public class TestNestedEmbeddable {
-    @Emf(createTables = DDLGen.DROP_CREATE, classes = { Order.class, OrderPK.class, Address.class, Zipcode.class })
+    @Emf(createTables = DDLGen.DROP_CREATE, classes = { DeepOrder.class, DeepOrderPK.class, Order.class, OrderPK.class, Address.class, Zipcode.class })
         private EntityManagerFactory emf;
     
     @Test
@@ -73,4 +79,31 @@ public void persistTest() {
             em.close();
         }
     }
+
+    @Test
+    public void testDeeperEmbeddingMappings() {
+        if (emf == null)
+            return;
+        EntityManager em = emf.createEntityManager();
+        try {
+            ClassDescriptor orderDescriptor = ((JpaEntityManager)em).getServerSession().getDescriptor(Order.class);
+            ClassDescriptor orderpkDescriptor = orderDescriptor.getMappingForAttributeName("id").getReferenceDescriptor();
+            ClassDescriptor addressDescriptor = orderpkDescriptor.getMappingForAttributeName("billingAddress").getReferenceDescriptor();
+            ClassDescriptor zipcodeDescriptor = addressDescriptor.getMappingForAttributeName("zipcode").getReferenceDescriptor();
+            Assert.assertEquals("BILL_ZIP", zipcodeDescriptor.getFields().get(0).getName());
+
+            ClassDescriptor deepOrderDescriptor = ((JpaEntityManager)em).getServerSession().getDescriptor(DeepOrder.class);
+            ClassDescriptor deepOrderpkDescriptor = deepOrderDescriptor.getMappingForAttributeName("id").getReferenceDescriptor();
+            ClassDescriptor orderpkDescriptor2 = deepOrderpkDescriptor.getMappingForAttributeName("orderpk").getReferenceDescriptor();
+            ClassDescriptor addressDescriptor2 = orderpkDescriptor2.getMappingForAttributeName("billingAddress").getReferenceDescriptor();
+            ClassDescriptor zipcodeDescriptor2 = addressDescriptor2.getMappingForAttributeName("zipcode").getReferenceDescriptor();
+            Assert.assertEquals("deepOverride", zipcodeDescriptor2.getFields().get(0).getName());
+
+        } finally {
+            if (em.getTransaction().isActive()) {
+                em.getTransaction().rollback();
+            }
+            em.close();
+        }
+    }
 }
diff --git a/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrder.java b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrder.java
new file mode 100644
index 0000000..b2e42e8
--- /dev/null
+++ b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrder.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2016 IBM Corporation. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     10/19/2016 - 2.6 Will Dazey
+ *       - 506168 : Nested Embeddables AttributeOverride Test
+ ******************************************************************************/
+package org.eclipse.persistence.jpa.embeddable.model;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+@Entity
+public class DeepOrder {
+
+    @EmbeddedId
+    @AttributeOverride(name = "orderpk.billingAddress.zipcode.zip", column = @Column(name="deepOverride"))
+    private DeepOrderPK id;
+
+    public DeepOrder() { }
+
+    public DeepOrderPK getId() {
+        return id;
+    }
+
+    public void setId(DeepOrderPK id) {
+        this.id = id;
+    }
+}
diff --git a/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrderPK.java b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrderPK.java
new file mode 100644
index 0000000..cdcc7c0
--- /dev/null
+++ b/jpa/eclipselink.jpa.test.jse/src/org/eclipse/persistence/jpa/embeddable/model/DeepOrderPK.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 IBM Corporation. All rights reserved.
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
+ * which accompanies this distribution. 
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at 
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     10/19/2016 - 2.6 Will Dazey
+ *       - 506168 : Nested Embeddables AttributeOverride Test
+ ******************************************************************************/
+package org.eclipse.persistence.jpa.embeddable.model;
+
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class DeepOrderPK {
+
+    private OrderPK orderpk;
+
+    public DeepOrderPK() {}
+
+    public OrderPK getOrderpk() {
+        return orderpk;
+    }
+
+    public void setOrderpk(OrderPK orderpk) {
+        this.orderpk = orderpk;
+    }
+}