Repository: olingo-odata2
Updated Branches:
  refs/heads/master 2e5b98c5c -> 46afc9901


"Deep insert fix and Dual access changes"

Signed-off-by: Christian Amend <[email protected]>


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

Branch: refs/heads/master
Commit: 46afc9901873094faa8d3bb337d8ba2d6706aaaf
Parents: 2e5b98c
Author: Shankara G <[email protected]>
Authored: Tue May 17 10:39:30 2016 +0530
Committer: Christian Amend <[email protected]>
Committed: Tue May 24 09:41:24 2016 +0200

----------------------------------------------------------------------
 .../core/access/data/JPAEntityParser.java       | 67 ++++++++++++++------
 .../jpa/processor/core/access/data/JPALink.java | 50 +++++++++------
 2 files changed, 80 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46afc990/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java
----------------------------------------------------------------------
diff --git 
a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java
 
b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java
index 203712c..47361a5 100644
--- 
a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java
+++ 
b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityParser.java
@@ -45,6 +45,7 @@ import org.apache.olingo.odata2.api.edm.EdmStructuralType;
 import org.apache.olingo.odata2.api.edm.EdmTypeKind;
 import 
org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
 import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmMapping;
+import org.apache.olingo.odata2.jpa.processor.core.model.JPAEdmMappingImpl;
 
 public final class JPAEntityParser {
 
@@ -113,7 +114,15 @@ public final class JPAEntityParser {
         if (method == null) {
           String methodName = 
jpaEmbeddableKeyMap.get(jpaEntityAccessKey).get(propertyName);
           if (methodName != null) {
-            propertyValue = getEmbeddablePropertyValue(methodName, 
propertyValue);
+                 boolean isVirtualAccess = false; 
+                 if (property.getMapping() != null && property.getMapping() 
instanceof JPAEdmMappingImpl) {
+                         isVirtualAccess = ((JPAEdmMappingImpl) 
property.getMapping()).isVirtualAccess();
+                 }
+               if (isVirtualAccess) {
+                       propertyValue = getEmbeddablePropertyValue(methodName, 
propertyValue, true);
+               } else {
+                       propertyValue = getEmbeddablePropertyValue(methodName, 
propertyValue);
+               }
           }
         } else {
           propertyValue = 
getPropertyValue(accessModifierMap.get(propertyName), propertyValue, 
propertyName);
@@ -174,7 +183,8 @@ public final class JPAEntityParser {
                        methodName = 
getAccessModifierName(navigationProperty.getName(),
                                        navigationProperty.getMapping(), 
ACCESS_MODIFIER_GET);
                        Method getterMethod = null;
-                       
if(((JPAEdmMapping)navigationProperty.getMapping()).isVirtualAccess()) {
+                       JPAEdmMapping jpaEdmMapping = 
(JPAEdmMapping)navigationProperty.getMapping();
+                       if(jpaEdmMapping != null && 
jpaEdmMapping.isVirtualAccess()) {
                                getterMethod = 
jpaEntity.getClass().getMethod(ACCESS_MODIFIER_GET, String.class);
                        }else{
                                getterMethod = jpaEntity.getClass()
@@ -392,7 +402,7 @@ public final class JPAEntityParser {
     }
   }
 
-  public Object getEmbeddablePropertyValue(final String methodName, final 
Object jpaEntity)
+  public Object getEmbeddablePropertyValue(final String methodName, final 
Object jpaEntity, boolean isVirtualAccess)
       throws ODataJPARuntimeException {
 
     String[] nameParts = methodName.split("\\.");
@@ -403,7 +413,13 @@ public final class JPAEntityParser {
         if (propertyValue == null) {
           break;
         }
-        method = propertyValue.getClass().getMethod(namePart, (Class<?>[]) 
null);
+        if (isVirtualAccess) {
+
+               method = 
propertyValue.getClass().getMethod(ACCESS_MODIFIER_GET, String.class);
+               namePart = namePart.replaceFirst(ACCESS_MODIFIER_GET, "");
+        } else {
+               method = propertyValue.getClass().getMethod(namePart, 
(Class<?>[]) null);
+        }
         method.setAccessible(true);
         propertyValue = getPropertyValue(method, propertyValue,namePart);
       }
@@ -415,6 +431,12 @@ public final class JPAEntityParser {
     return propertyValue;
   }
 
+  public Object getEmbeddablePropertyValue(final String methodName, final 
Object jpaEntity)
+             throws ODataJPARuntimeException {
+
+         return getEmbeddablePropertyValue(methodName, jpaEntity, false);
+  }
+  
   public static String toString(final Character[] input) {
     if (input == null) {
       return null;
@@ -497,22 +519,29 @@ public final class JPAEntityParser {
     try {
 
       JPAEdmMapping navPropMapping = (JPAEdmMapping) 
navigationProperty.getMapping();
-      String name = getAccessModifierName(navigationProperty.getName(), 
(EdmMapping) navPropMapping, accessModifier);
 
+      String name;
       Class<?>[] params = null;
-      if (accessModifier.equals(ACCESS_MODIFIER_SET)) {
-        EdmAssociationEnd end = 
navigationProperty.getRelationship().getEnd(navigationProperty.getToRole());
-        switch (end.getMultiplicity()) {
-        case MANY:
-          params = new Class<?>[] { navPropMapping.getJPAType() };
-          break;
-        case ONE:
-          params = new Class<?>[] { ((JPAEdmMapping) 
end.getEntityType().getMapping()).getJPAType() };
-        default:
-          break;
-        }
+      if (navPropMapping != null && navPropMapping.isVirtualAccess()) {
+  
+         return jpaEntityType.getMethod(ACCESS_MODIFIER_SET, String.class, 
Object.class);
+      } else {
+             name = getAccessModifierName(navigationProperty.getName(), 
(EdmMapping) navPropMapping, accessModifier);
+       
+             if (accessModifier.equals(ACCESS_MODIFIER_SET)) {
+               EdmAssociationEnd end = 
navigationProperty.getRelationship().getEnd(navigationProperty.getToRole());
+               switch (end.getMultiplicity()) {
+               case MANY:
+                 params = new Class<?>[] { navPropMapping.getJPAType() };
+                 break;
+               case ONE:
+                 params = new Class<?>[] { ((JPAEdmMapping) 
end.getEntityType().getMapping()).getJPAType() };
+               default:
+                 break;
+               }
+             }
+             return jpaEntityType.getMethod(name, params);
       }
-      return jpaEntityType.getMethod(name, params);
 
     } catch (NoSuchMethodException e) {
       throw 
ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION,
 e);
@@ -555,7 +584,7 @@ public final class JPAEntityParser {
           } else {
                  if (accessModifier.equals(ACCESS_MODIFIER_SET)) {
                          JPAEdmMapping jpaEdmMapping = (JPAEdmMapping) 
property.getMapping();
-                         if(jpaEdmMapping.isVirtualAccess()) {
+                         if(jpaEdmMapping != null && 
jpaEdmMapping.isVirtualAccess()) {
                                  accessModifierMap.put(propertyName, 
jpaEntityType.getMethod(ACCESS_MODIFIER_SET,
                                                  new Class<?>[] { 
String.class,Object.class }));
                          }else {
@@ -619,4 +648,4 @@ public final class JPAEntityParser {
     return edmProperties;
   }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46afc990/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
----------------------------------------------------------------------
diff --git 
a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
 
b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
index dd806a5..06db261 100644
--- 
a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
+++ 
b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
@@ -49,6 +49,7 @@ import 
org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAModelExcepti
 import 
org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
 import org.apache.olingo.odata2.jpa.processor.api.factory.ODataJPAFactory;
 import org.apache.olingo.odata2.jpa.processor.core.ODataEntityParser;
+import org.apache.olingo.odata2.jpa.processor.core.model.JPAEdmMappingImpl;
 
 public class JPALink {
 
@@ -213,26 +214,39 @@ public class JPALink {
     if (targetJPAEntities == null || sourceJPAEntity == null || 
navigationProperty == null) {
       return;
     }
+
     try {
+
       JPAEntityParser entityParser = new JPAEntityParser();
-      Method setMethod = 
entityParser.getAccessModifier(sourceJPAEntity.getClass(),
-          navigationProperty, JPAEntityParser.ACCESS_MODIFIER_SET);
-      switch (navigationProperty.getMultiplicity()) {
-      case MANY:
-        Method getMethod = 
entityParser.getAccessModifier(sourceJPAEntity.getClass(),
-            navigationProperty, JPAEntityParser.ACCESS_MODIFIER_GET);
-        Collection<Object> relatedEntities = (Collection<Object>) 
getMethod.invoke(sourceJPAEntity);
-        if (relatedEntities == null) {
-          throw 
ODataJPARuntimeException.throwException(ODataJPARuntimeException.ERROR_JPQL_CREATE_REQUEST,
 null);
-        }
-        relatedEntities.addAll(targetJPAEntities);
-        setMethod.invoke(sourceJPAEntity, relatedEntities);
-        break;
-      case ONE:
-      case ZERO_TO_ONE:
-        setMethod.invoke(sourceJPAEntity, targetJPAEntities.iterator().next());
-        break;
-      }
+         Method setMethod = 
entityParser.getAccessModifier(sourceJPAEntity.getClass(),
+                       navigationProperty, 
JPAEntityParser.ACCESS_MODIFIER_SET);
+
+         JPAEdmMappingImpl jpaEdmMappingImpl = null;
+         if (navigationProperty.getMapping() instanceof JPAEdmMappingImpl) {
+             jpaEdmMappingImpl = (JPAEdmMappingImpl) 
navigationProperty.getMapping();  
+         }
+         if (jpaEdmMappingImpl != null && jpaEdmMappingImpl.isVirtualAccess()) 
{
+                 setMethod.invoke(sourceJPAEntity, 
jpaEdmMappingImpl.getInternalName(), 
+                               targetJPAEntities.iterator().next());
+         } else {
+             switch (navigationProperty.getMultiplicity()) {
+             case MANY:
+               Method getMethod = 
entityParser.getAccessModifier(sourceJPAEntity.getClass(),
+                   navigationProperty, JPAEntityParser.ACCESS_MODIFIER_GET);
+               Collection<Object> relatedEntities = (Collection<Object>) 
getMethod.invoke(sourceJPAEntity);
+               if (relatedEntities == null) {
+                 throw ODataJPARuntimeException.throwException(
+                     ODataJPARuntimeException.ERROR_JPQL_CREATE_REQUEST, null);
+               }
+               relatedEntities.addAll(targetJPAEntities);
+               setMethod.invoke(sourceJPAEntity, relatedEntities);
+               break;
+             case ONE:
+             case ZERO_TO_ONE:
+               setMethod.invoke(sourceJPAEntity, 
targetJPAEntities.iterator().next());
+               break;
+             }
+         }
     } catch (EdmException e) {
       throw 
ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION,
 e);
     } catch (IllegalArgumentException e) {

Reply via email to