You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2016/04/26 22:52:48 UTC

[06/15] olingo-odata2 git commit: [OLINGO-895] First draft for virtual access implementation

[OLINGO-895] First draft for virtual access implementation

Based on the patch files which were contributed to Olingo. The patch files
can be found in our JIRA: https://issues.apache.org/jira/browse/OLINGO-895


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

Branch: refs/heads/OLINGO-882_EnableContainerManagedPersistence
Commit: 32689c14548ad4973b97ea970635b951d8f5b96b
Parents: eb806b9
Author: Christian Amend <ch...@sap.com>
Authored: Thu Mar 3 15:42:46 2016 +0100
Committer: Christian Amend <ch...@sap.com>
Committed: Thu Mar 3 15:42:46 2016 +0100

----------------------------------------------------------------------
 .../jpa/processor/api/model/JPAEdmMapping.java  |  4 ++
 .../processor/core/access/data/JPAEntity.java   | 16 +++--
 .../core/access/data/JPAEntityParser.java       | 66 +++++++++++++-------
 .../processor/core/model/JPAEdmMappingImpl.java | 11 ++++
 4 files changed, 69 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/32689c14/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmMapping.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmMapping.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmMapping.java
index 44f0f29..27fb683 100644
--- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmMapping.java
+++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/model/JPAEdmMapping.java
@@ -75,5 +75,9 @@ public interface JPAEdmMapping {
    * @return JPA EntityListener type
    */
   public Class<? extends ODataJPATombstoneEntityListener> getODataJPATombstoneEntityListener();
+  
+  public boolean isVirtualAccess();
+  
+  public void setVirtualAccess(boolean virtualAccess);
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/32689c14/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
index 07564d5..e8bcbeb 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
@@ -206,7 +206,7 @@ public class JPAEntity {
 
   @SuppressWarnings("unchecked")
   protected void setComplexProperty(Method accessModifier, final Object jpaEntity,
-      final EdmStructuralType edmComplexType, final HashMap<String, Object> propertyValue)
+      final EdmStructuralType edmComplexType, final HashMap<String, Object> propertyValue, String propertyName)
       throws EdmException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
       InstantiationException, ODataJPARuntimeException, NoSuchMethodException, SecurityException, SQLException {
 
@@ -223,19 +223,23 @@ public class JPAEntity {
       if (edmTyped.getType().getKind().toString().equals(EdmTypeKind.COMPLEX.toString())) {
         EdmStructuralType structualType = (EdmStructuralType) edmTyped.getType();
         setComplexProperty(accessModifier, embeddableObject, structualType, (HashMap<String, Object>) propertyValue
-            .get(edmPropertyName));
+            .get(edmPropertyName),propertyName);
       } else {
         setProperty(accessModifier, embeddableObject, propertyValue.get(edmPropertyName), (EdmSimpleType) edmTyped
-            .getType());
+            .getType(),propertyName);
       }
     }
   }
 
   @SuppressWarnings({ "unchecked", "rawtypes" })
   protected void setProperty(final Method method, final Object entity, final Object entityPropertyValue,
-      final EdmSimpleType type) throws
+      final EdmSimpleType type, String propertyName) throws
       IllegalAccessException, IllegalArgumentException, InvocationTargetException, ODataJPARuntimeException {
     if (entityPropertyValue != null) {
+    	if(method.getParameterTypes().length>1) {
+    		 method.invoke(entity, propertyName,entityPropertyValue);
+    		 return;
+    	}
       Class<?> parameterType = method.getParameterTypes()[0];
       if (type != null && type.getDefaultType().equals(String.class)) {
         if (parameterType.equals(String.class)) {
@@ -422,7 +426,7 @@ public class JPAEntity {
           }
           accessModifier = accessModifiersWrite.get(propertyName);
           setProperty(accessModifier, jpaEntity, oDataEntryProperties.get(propertyName), (EdmSimpleType) edmTyped
-              .getType());
+              .getType(),propertyName);
 
           break;
         case COMPLEX:
@@ -430,7 +434,7 @@ public class JPAEntity {
           accessModifier = accessModifiersWrite.get(propertyName);
           setComplexProperty(accessModifier, jpaEntity,
               structuralType,
-              (HashMap<String, Object>) oDataEntryProperties.get(propertyName));
+              (HashMap<String, Object>) oDataEntryProperties.get(propertyName),propertyName);
           break;
         case NAVIGATION:
         case ENTITY:

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/32689c14/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 03ef879..c8e3c8e 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
@@ -116,7 +116,7 @@ public final class JPAEntityParser {
             propertyValue = getEmbeddablePropertyValue(methodName, propertyValue);
           }
         } else {
-          propertyValue = getPropertyValue(accessModifierMap.get(propertyName), propertyValue);
+          propertyValue = getPropertyValue(accessModifierMap.get(propertyName), propertyValue, propertyName);
         }
         if (property.getType().getKind()
             .equals(EdmTypeKind.COMPLEX)) {
@@ -169,17 +169,24 @@ public final class JPAEntityParser {
     if (navigationPropertyList != null
         && navigationPropertyList.size() != 0) {
 
-      try {
-        for (EdmNavigationProperty navigationProperty : navigationPropertyList) {
-          methodName = getAccessModifierName(navigationProperty.getName(),
-              navigationProperty.getMapping(), ACCESS_MODIFIER_GET);
-          Method getterMethod = jpaEntity.getClass()
-              .getMethod(methodName, (Class<?>[]) null);
-          getterMethod.setAccessible(true);
-          result = getPropertyValue(getterMethod, jpaEntity);
-          navigationMap.put(navigationProperty.getName(), result);
-        }
-      } catch (IllegalArgumentException e) {
+    	try {
+    		for (EdmNavigationProperty navigationProperty : navigationPropertyList) {
+    			methodName = getAccessModifierName(navigationProperty.getName(),
+    					navigationProperty.getMapping(), ACCESS_MODIFIER_GET);
+    			Method getterMethod = null;
+    			if(((JPAEdmMapping)navigationProperty.getMapping()).isVirtualAccess()) {
+    				getterMethod = jpaEntity.getClass().getMethod("get", String.class);
+    			}else{
+    				getterMethod = jpaEntity.getClass()
+    						.getMethod(methodName, (Class<?>[]) null);
+    			}
+
+    			getterMethod.setAccessible(true);
+    			result = getPropertyValue(getterMethod, jpaEntity,
+    					navigationProperty.getMapping().getInternalName());
+    			navigationMap.put(navigationProperty.getName(), result);
+    		}
+    	} catch (IllegalArgumentException e) {
         throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
       } catch (EdmException e) {
         throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
@@ -215,7 +222,8 @@ public final class JPAEntityParser {
     return getAccessModifiers(getEdmProperties(structuralType), jpaEntity.getClass(), accessModifier);
   }
 
-  public static Object getPropertyValue(final Method method, final Object entity) throws ODataJPARuntimeException {
+  public static Object getPropertyValue(final Method method, final Object entity, String propertyName) 
+		  throws ODataJPARuntimeException {
     Object propertyValue = null;
     if (method == null) {
       return null;
@@ -246,7 +254,11 @@ public final class JPAEntityParser {
       } else if (returnType.equals(Clob.class)) {
         propertyValue = getString((Clob) method.invoke(entity));
       } else {
-        propertyValue = method.invoke(entity);
+    	  if(method.getParameterTypes().length>0) {
+    		  propertyValue = method.invoke(entity,propertyName);
+    	  } else {
+    		  propertyValue = method.invoke(entity);
+    	  }
       }
     } catch (IllegalAccessException e) {
       throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
@@ -393,7 +405,7 @@ public final class JPAEntityParser {
         }
         method = propertyValue.getClass().getMethod(namePart, (Class<?>[]) null);
         method.setAccessible(true);
-        propertyValue = getPropertyValue(method, propertyValue);
+        propertyValue = getPropertyValue(method, propertyValue,namePart);
       }
     } catch (NoSuchMethodException e) {
       throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
@@ -541,13 +553,23 @@ public final class JPAEntityParser {
               continue;
             }
           } else {
-            if (accessModifier.equals(ACCESS_MODIFIER_SET)) {
-              JPAEdmMapping jpaEdmMapping = (JPAEdmMapping) property.getMapping();
-              accessModifierMap.put(propertyName, jpaEntityType.getMethod(methodName,
-                  new Class<?>[] { jpaEdmMapping.getJPAType() }));
-            } else {
-              method = jpaEntityType.getMethod(methodName, (Class<?>[]) null);
-            }
+        	  if (accessModifier.equals(ACCESS_MODIFIER_SET)) {
+        		  JPAEdmMapping jpaEdmMapping = (JPAEdmMapping) property.getMapping();
+        		  if(jpaEdmMapping.isVirtualAccess()) {
+        			  accessModifierMap.put(propertyName, jpaEntityType.getMethod("set",
+        					  new Class<?>[] { String.class,Object.class }));
+        		  }else {
+        			  accessModifierMap.put(propertyName, jpaEntityType.getMethod(methodName,
+        					  new Class<?>[] { jpaEdmMapping.getJPAType() }));
+        		  }
+        	  } else {
+        		  JPAEdmMapping jpaEdmMapping = (JPAEdmMapping) property.getMapping();
+        		  if(jpaEdmMapping.isVirtualAccess()) {
+        			  method = jpaEntityType.getMethod("get", String.class);
+        		  }else{
+        			  method = jpaEntityType.getMethod(methodName, (Class<?>[]) null);
+        		  }
+        	  }
           }
         } catch (EdmException exp) {
           throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, exp);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/32689c14/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmMappingImpl.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmMappingImpl.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmMappingImpl.java
index 5944191..b07c7ca 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmMappingImpl.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmMappingImpl.java
@@ -27,6 +27,7 @@ public class JPAEdmMappingImpl extends Mapping implements JPAEdmMapping {
   private String columnName = null;
   private Class<?> type = null;
   private Class<? extends ODataJPATombstoneEntityListener> entityListener = null;
+  private boolean isVirtualAccess;
 
   @Override
   public void setJPAColumnName(final String name) {
@@ -60,4 +61,14 @@ public class JPAEdmMappingImpl extends Mapping implements JPAEdmMapping {
   public Class<? extends ODataJPATombstoneEntityListener> getODataJPATombstoneEntityListener() {
     return entityListener;
   }
+
+  @Override
+  public boolean isVirtualAccess() {
+	  return isVirtualAccess;
+  }
+
+  @Override
+  public void setVirtualAccess(boolean virtualAccess) {
+	  this.isVirtualAccess=virtualAccess;
+  }
 }