You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2013/12/03 19:01:47 UTC

[1/2] git commit: [OLINGO-52] - Support java.util.Set data type for JPA Relationship properties

Updated Branches:
  refs/heads/master 223c457ba -> 17cbcf57b


[OLINGO-52] - Support java.util.Set data type for JPA Relationship
properties

-> $expand
-> deep insert operations


Signed-off-by: Chandan V A <ch...@sap.com>

Project: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/commit/73765535
Tree: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/tree/73765535
Diff: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/diff/73765535

Branch: refs/heads/master
Commit: 73765535a9080d402fe34d894d343dd2488e2232
Parents: d4df5cc
Author: Chandan V A <ch...@sap.com>
Authored: Tue Dec 3 23:30:45 2013 +0530
Committer: Chandan V A <ch...@sap.com>
Committed: Tue Dec 3 23:30:45 2013 +0530

----------------------------------------------------------------------
 .../core/jpa/access/data/JPAEntity.java         | 85 ++++++++++++--------
 .../core/jpa/access/data/JPAEntityParser.java   |  6 +-
 .../core/jpa/access/data/JPAExpandCallBack.java |  3 +-
 .../jpa/access/model/JPAEdmNameBuilder.java     |  5 +-
 .../core/jpa/mock/data/EdmMockUtilV2.java       |  4 +-
 .../core/jpa/mock/data/JPATypeMock.java         |  3 +-
 .../processor/ref/model/SalesOrderHeader.java   |  8 +-
 7 files changed, 69 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/73765535/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAEntity.java
----------------------------------------------------------------------
diff --git a/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAEntity.java b/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAEntity.java
index 7045cd5..7c2ad29 100644
--- a/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAEntity.java
+++ b/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAEntity.java
@@ -21,6 +21,7 @@ package org.apache.olingo.odata2.processor.core.jpa.access.data;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -134,25 +135,26 @@ public class JPAEntity {
         case NAVIGATION:
         case ENTITY:
           structuralType = (EdmStructuralType) edmTyped.getType();
+          EdmNavigationProperty navProperty = (EdmNavigationProperty) edmTyped;
           accessModifier =
-              jpaEntityParser.getAccessModifier(jpaEntity, (EdmNavigationProperty) edmTyped,
+              jpaEntityParser.getAccessModifier(jpaEntity, navProperty,
                   JPAEntityParser.ACCESS_MODIFIER_SET);
-          EdmEntitySet edmRelatedEntitySet = oDataEntitySet.getRelatedEntitySet((EdmNavigationProperty) edmTyped);
+          EdmEntitySet edmRelatedEntitySet = oDataEntitySet.getRelatedEntitySet(navProperty);
           List<ODataEntry> relatedEntries = (List<ODataEntry>) oDataEntryProperties.get(propertyName);
-          List<Object> relatedJPAEntites = new ArrayList<Object>();
+          Collection<Object> relatedJPAEntites = instantiateRelatedJPAEntities(jpaEntity, navProperty);
           JPAEntity relatedEntity = new JPAEntity((EdmEntityType) structuralType, edmRelatedEntitySet);
           for (ODataEntry oDataEntry : relatedEntries) {
             relatedEntity.create(oDataEntry);
             relatedJPAEntites.add(relatedEntity.getJPAEntity());
           }
-          EdmNavigationProperty navProperty = (EdmNavigationProperty) edmTyped;
+
           switch (navProperty.getMultiplicity()) {
           case MANY:
             accessModifier.invoke(jpaEntity, relatedJPAEntites);
             break;
           case ONE:
           case ZERO_TO_ONE:
-            accessModifier.invoke(jpaEntity, relatedJPAEntites.get(0));
+            accessModifier.invoke(jpaEntity, relatedJPAEntites.iterator().next());
             break;
           }
 
@@ -172,6 +174,21 @@ public class JPAEntity {
     }
   }
 
+  @SuppressWarnings("unchecked")
+  private Collection<Object> instantiateRelatedJPAEntities(final Object jpaEntity,
+      final EdmNavigationProperty navProperty)
+      throws InstantiationException,
+      IllegalAccessException, EdmException, ODataJPARuntimeException, IllegalArgumentException,
+      InvocationTargetException {
+    Method accessModifier =
+        jpaEntityParser.getAccessModifier(jpaEntity, navProperty, JPAEntityParser.ACCESS_MODIFIER_GET);
+    Collection<Object> relatedJPAEntities = (Collection<Object>) accessModifier.invoke(jpaEntity);
+    if (relatedJPAEntities == null) {
+      relatedJPAEntities = new ArrayList<Object>();
+    }
+    return relatedJPAEntities;
+  }
+
   public void create(final ODataEntry oDataEntry) throws ODataJPARuntimeException {
     if (oDataEntry == null) {
       throw ODataJPARuntimeException
@@ -189,29 +206,6 @@ public class JPAEntity {
     write(oDataEntryProperties, true);
   }
 
-  private void normalizeInlineEntries(final Map<String, Object> oDataEntryProperties) throws ODataJPARuntimeException {
-    List<ODataEntry> entries = null;
-    try {
-      for (String navigationPropertyName : oDataEntityType.getNavigationPropertyNames()) {
-        Object inline = oDataEntryProperties.get(navigationPropertyName);
-        if (inline instanceof ODataFeed) {
-          entries = ((ODataFeed) inline).getEntries();
-        } else if (inline instanceof ODataEntry) {
-          entries = new ArrayList<ODataEntry>();
-          entries.add((ODataEntry) inline);
-        }
-        if (entries != null) {
-          oDataEntryProperties.put(navigationPropertyName, entries);
-          entries = null;
-        }
-      }
-    } catch (EdmException e) {
-      throw ODataJPARuntimeException
-          .throwException(ODataJPARuntimeException.GENERAL
-              .addContent(e.getMessage()), e);
-    }
-  }
-
   public void update(final ODataEntry oDataEntry) throws ODataJPARuntimeException {
     if (oDataEntry == null) {
       throw ODataJPARuntimeException
@@ -225,6 +219,14 @@ public class JPAEntity {
     write(oDataEntryProperties, false);
   }
 
+  public HashMap<EdmNavigationProperty, EdmEntitySet> getInlineJPAEntities() {
+    return inlinedEntities;
+  }
+
+  public void setJPAEntity(final Object jpaEntity) {
+    this.jpaEntity = jpaEntity;
+  }
+
   @SuppressWarnings("unchecked")
   protected void setComplexProperty(Method accessModifier, final Object jpaEntity,
       final EdmStructuralType edmComplexType, final HashMap<String, Object> propertyValue)
@@ -328,11 +330,26 @@ public class JPAEntity {
     return jpaType.newInstance();
   }
 
-  public HashMap<EdmNavigationProperty, EdmEntitySet> getInlineJPAEntities() {
-    return inlinedEntities;
-  }
-
-  public void setJPAEntity(final Object jpaEntity) {
-    this.jpaEntity = jpaEntity;
+  private void normalizeInlineEntries(final Map<String, Object> oDataEntryProperties) throws ODataJPARuntimeException {
+    List<ODataEntry> entries = null;
+    try {
+      for (String navigationPropertyName : oDataEntityType.getNavigationPropertyNames()) {
+        Object inline = oDataEntryProperties.get(navigationPropertyName);
+        if (inline instanceof ODataFeed) {
+          entries = ((ODataFeed) inline).getEntries();
+        } else if (inline instanceof ODataEntry) {
+          entries = new ArrayList<ODataEntry>();
+          entries.add((ODataEntry) inline);
+        }
+        if (entries != null) {
+          oDataEntryProperties.put(navigationPropertyName, entries);
+          entries = null;
+        }
+      }
+    } catch (EdmException e) {
+      throw ODataJPARuntimeException
+          .throwException(ODataJPARuntimeException.GENERAL
+              .addContent(e.getMessage()), e);
+    }
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/73765535/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAEntityParser.java
----------------------------------------------------------------------
diff --git a/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAEntityParser.java b/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAEntityParser.java
index e89bec7..756e1ca 100644
--- a/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAEntityParser.java
+++ b/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAEntityParser.java
@@ -422,15 +422,15 @@ public final class JPAEntityParser {
 
     try {
 
-      String name = getAccessModifierName(navigationProperty.getName(),
-          navigationProperty.getMapping(), accessModifier);
+      JPAEdmMapping navPropMapping = (JPAEdmMapping) navigationProperty.getMapping();
+      String name = getAccessModifierName(navigationProperty.getName(), (EdmMapping) navPropMapping, accessModifier);
 
       Class<?>[] params = null;
       if (accessModifier.equals(ACCESS_MODIFIER_SET)) {
         EdmAssociationEnd end = navigationProperty.getRelationship().getEnd(navigationProperty.getToRole());
         switch (end.getMultiplicity()) {
         case MANY:
-          params = new Class<?>[] { List.class };
+          params = new Class<?>[] { navPropMapping.getJPAType() };
           break;
         case ONE:
           params = new Class<?>[] { ((JPAEdmMapping) end.getEntityType().getMapping()).getJPAType() };

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/73765535/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAExpandCallBack.java
----------------------------------------------------------------------
diff --git a/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAExpandCallBack.java b/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAExpandCallBack.java
index 43ec80c..78a9ea5 100644
--- a/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAExpandCallBack.java
+++ b/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/data/JPAExpandCallBack.java
@@ -20,6 +20,7 @@ package org.apache.olingo.odata2.processor.core.jpa.access.data;
 
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -104,7 +105,7 @@ public class JPAExpandCallBack implements OnWriteFeedContent, OnWriteEntryConten
     EdmNavigationProperty currentNavigationProperty = context.getNavigationProperty();
     try {
       @SuppressWarnings({ "unchecked" })
-      List<Object> listOfItems = (List<Object>) inlinedEntry.get(context.getNavigationProperty().getName());
+      Collection<Object> listOfItems = (Collection<Object>) inlinedEntry.get(context.getNavigationProperty().getName());
       if (nextEntitySet == null) {
         nextEntitySet = context.getSourceEntitySet().getRelatedEntitySet(currentNavigationProperty);
       }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/73765535/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/model/JPAEdmNameBuilder.java
----------------------------------------------------------------------
diff --git a/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/model/JPAEdmNameBuilder.java b/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/model/JPAEdmNameBuilder.java
index df4b2e6..9cc7022 100644
--- a/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/model/JPAEdmNameBuilder.java
+++ b/odata2-processor-jpa/jpa-core/src/main/java/org/apache/olingo/odata2/processor/core/jpa/access/model/JPAEdmNameBuilder.java
@@ -440,7 +440,10 @@ public class JPAEdmNameBuilder {
         .getType();
 
     Attribute<?, ?> jpaAttribute = propertyView.getJPAAttribute();
-    navProp.setMapping(new Mapping().setInternalName(jpaAttribute.getName()));
+    JPAEdmMapping mapping = new JPAEdmMappingImpl();
+    ((Mapping) mapping).setInternalName(jpaAttribute.getName());
+    mapping.setJPAType(jpaAttribute.getJavaType());
+    navProp.setMapping((Mapping) mapping);
 
     String jpaEntityTypeName = propertyView.getJPAEdmEntityTypeView()
         .getJPAEntityType().getName();

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/73765535/odata2-processor-jpa/jpa-core/src/test/java/org/apache/olingo/odata2/processor/core/jpa/mock/data/EdmMockUtilV2.java
----------------------------------------------------------------------
diff --git a/odata2-processor-jpa/jpa-core/src/test/java/org/apache/olingo/odata2/processor/core/jpa/mock/data/EdmMockUtilV2.java b/odata2-processor-jpa/jpa-core/src/test/java/org/apache/olingo/odata2/processor/core/jpa/mock/data/EdmMockUtilV2.java
index 67de03a..6611fb1 100644
--- a/odata2-processor-jpa/jpa-core/src/test/java/org/apache/olingo/odata2/processor/core/jpa/mock/data/EdmMockUtilV2.java
+++ b/odata2-processor-jpa/jpa-core/src/test/java/org/apache/olingo/odata2/processor/core/jpa/mock/data/EdmMockUtilV2.java
@@ -185,11 +185,11 @@ public class EdmMockUtilV2 {
     EasyMock.expect(navigationProperty.getType()).andReturn(edmEntityType).anyTimes();
     EasyMock.expect(navigationProperty.getMultiplicity()).andReturn(multiplicity);
     EasyMock.expect(navigationProperty.getMapping()).andReturn(
-        (EdmMapping) mockEdmMapping(null, null, navigationPropertyName));
+        (EdmMapping) mockEdmMapping(null, null, navigationPropertyName)).anyTimes();
     EasyMock.expect(navigationProperty.getToRole()).andReturn("TO");
     EasyMock.expect(navigationProperty.getRelationship()).andReturn(mockEdmAssociation(navigationPropertyName));
     if (multiplicity.equals(EdmMultiplicity.ONE)) {
-      EasyMock.expect(navigationProperty.getName()).andReturn(JPATypeMock.NAVIGATION_PROPERTY_X);
+      EasyMock.expect(navigationProperty.getName()).andReturn(JPATypeMock.NAVIGATION_PROPERTY_X).anyTimes();
     }
 
     EasyMock.replay(navigationProperty);

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/73765535/odata2-processor-jpa/jpa-core/src/test/java/org/apache/olingo/odata2/processor/core/jpa/mock/data/JPATypeMock.java
----------------------------------------------------------------------
diff --git a/odata2-processor-jpa/jpa-core/src/test/java/org/apache/olingo/odata2/processor/core/jpa/mock/data/JPATypeMock.java b/odata2-processor-jpa/jpa-core/src/test/java/org/apache/olingo/odata2/processor/core/jpa/mock/data/JPATypeMock.java
index 1360b6d..d7bb703 100644
--- a/odata2-processor-jpa/jpa-core/src/test/java/org/apache/olingo/odata2/processor/core/jpa/mock/data/JPATypeMock.java
+++ b/odata2-processor-jpa/jpa-core/src/test/java/org/apache/olingo/odata2/processor/core/jpa/mock/data/JPATypeMock.java
@@ -18,6 +18,7 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.processor.core.jpa.mock.data;
 
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.List;
 import java.util.UUID;
@@ -41,7 +42,7 @@ public class JPATypeMock {
   private String mString;
   private Calendar mDateTime;
   private JPARelatedTypeMock mRelatedEntity;
-  private List<JPARelatedTypeMock> mRelatedEntities;
+  private List<JPARelatedTypeMock> mRelatedEntities = new ArrayList<JPATypeMock.JPARelatedTypeMock>();
 
   public String getMString() {
     return mString;

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/73765535/odata2-processor-jpa/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderHeader.java
----------------------------------------------------------------------
diff --git a/odata2-processor-jpa/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderHeader.java b/odata2-processor-jpa/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderHeader.java
index 2aad540..9af23f3 100644
--- a/odata2-processor-jpa/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderHeader.java
+++ b/odata2-processor-jpa/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderHeader.java
@@ -21,7 +21,9 @@ package org.apache.olingo.odata2.jpa.processor.ref.model;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.TimeZone;
 
 import javax.persistence.CascadeType;
@@ -101,7 +103,7 @@ public class SalesOrderHeader {
   private double netAmount;
 
   @OneToMany(mappedBy = "salesOrderHeader", cascade = CascadeType.ALL)
-  private List<SalesOrderItem> salesOrderItem = new ArrayList<SalesOrderItem>();
+  private Set<SalesOrderItem> salesOrderItem = new HashSet<SalesOrderItem>();
 
   @OneToMany(mappedBy = "salesOrderHeader", cascade = CascadeType.ALL)
   private List<Note> notes = new ArrayList<Note>();
@@ -192,11 +194,11 @@ public class SalesOrderHeader {
     this.netAmount = netAmount;
   }
 
-  public List<SalesOrderItem> getSalesOrderItem() {
+  public Set<SalesOrderItem> getSalesOrderItem() {
     return salesOrderItem;
   }
 
-  public void setSalesOrderItem(final List<SalesOrderItem> salesOrderItem) {
+  public void setSalesOrderItem(final Set<SalesOrderItem> salesOrderItem) {
     this.salesOrderItem = salesOrderItem;
   }
 


[2/2] git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2

Posted by ch...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2


Project: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/commit/17cbcf57
Tree: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/tree/17cbcf57
Diff: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/diff/17cbcf57

Branch: refs/heads/master
Commit: 17cbcf57bc8d2cd671c0ad1f0c151b62cd4221b4
Parents: 7376553 223c457
Author: Chandan V A <ch...@sap.com>
Authored: Tue Dec 3 23:31:13 2013 +0530
Committer: Chandan V A <ch...@sap.com>
Committed: Tue Dec 3 23:31:13 2013 +0530

----------------------------------------------------------------------
 .../odata2/core/edm/provider/EdmxProvider.java  |     2 -
 .../consumer/AtomServiceDocumentConsumer.java   |    33 +-
 .../core/ep/consumer/XmlEntryConsumer.java      |     6 +-
 .../core/ep/consumer/XmlFeedConsumer.java       |     5 +-
 .../core/ep/consumer/XmlLinkConsumer.java       |    12 +-
 .../core/ep/consumer/XmlMetadataConsumer.java   |     9 +-
 .../ep/consumer/AbstractXmlConsumerTest.java    |    45 +
 .../AtomServiceDocumentConsumerTest.java        |    10 +-
 .../consumer/ServiceDocumentConsumerTest.java   |     3 +-
 .../core/ep/consumer/XmlEntityConsumerTest.java |    15 +-
 .../core/ep/consumer/XmlFeedConsumerTest.java   |    22 +-
 .../core/ep/consumer/XmlLinkConsumerTest.java   |    25 +-
 .../ep/consumer/XmlMetadataConsumerTest.java    |    27 +-
 .../ep/consumer/XmlPropertyConsumerTest.java    |     6 +-
 .../src/test/resources/LargeEmployeeFeed.xml    | 12538 +++++++++++++++++
 15 files changed, 12675 insertions(+), 83 deletions(-)
----------------------------------------------------------------------