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;
+ }
}