You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by sk...@apache.org on 2014/05/19 15:28:14 UTC
[25/50] [abbrv] git commit: [OLINGO-260] provided primitive keys
integration test on proxy + some refactoring ... still missing EdmTime
review: what about BigDecimal in place of Duration?
[OLINGO-260] provided primitive keys integration test on proxy + some refactoring ... still missing EdmTime review: what about BigDecimal in place of Duration?
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/22f6a6a2
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/22f6a6a2
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/22f6a6a2
Branch: refs/heads/master
Commit: 22f6a6a2ad96adbb14875f4f9020caa9d00ec9e0
Parents: ad77086
Author: fmartelli <fa...@gmail.com>
Authored: Tue May 13 18:59:14 2014 +0200
Committer: Stephan Klevenz <st...@sap.com>
Committed: Mon May 19 14:32:45 2014 +0200
----------------------------------------------------------------------
.../commons/AbstractInvocationHandler.java | 58 ++--
.../proxy/commons/ComplexInvocationHandler.java | 47 +--
.../proxy/commons/EntityInvocationHandler.java | 44 +--
.../olingo/ext/proxy/utils/CoreUtils.java | 289 +++++--------------
fit/src/it/primitiveKeysServiceV3/pom.xml | 2 +-
.../org/apache/olingo/fit/AbstractServices.java | 7 +-
.../olingo/fit/proxy/v3/AbstractTestITCase.java | 3 +
.../olingo/fit/proxy/v4/PropertyTestITCase.java | 8 +-
.../client/core/v3/PrimitiveValueTest.java | 14 +-
.../core/edm/primitivetype/EdmDuration.java | 1 +
10 files changed, 118 insertions(+), 355 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/22f6a6a2/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractInvocationHandler.java
index e3a2bc9..9da6aab 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AbstractInvocationHandler.java
@@ -26,6 +26,7 @@ import java.lang.reflect.Proxy;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -49,22 +50,22 @@ import org.apache.olingo.ext.proxy.api.annotations.Parameter;
import org.apache.olingo.ext.proxy.utils.ClassUtils;
import org.apache.olingo.ext.proxy.utils.CoreUtils;
-abstract class AbstractInvocationHandler implements InvocationHandler {
+abstract class AbstractInvocationHandler<C extends CommonEdmEnabledODataClient<?>> implements InvocationHandler {
private static final long serialVersionUID = 358520026931462958L;
- protected final CommonEdmEnabledODataClient<?> client;
+ protected final C client;
- protected EntityContainerInvocationHandler containerHandler;
+ protected EntityContainerInvocationHandler<C> containerHandler;
protected AbstractInvocationHandler(
- final CommonEdmEnabledODataClient<?> client, final EntityContainerInvocationHandler containerHandler) {
+ final C client, final EntityContainerInvocationHandler<C> containerHandler) {
this.client = client;
this.containerHandler = containerHandler;
}
- protected CommonEdmEnabledODataClient<?> getClient() {
+ protected C getClient() {
return client;
}
@@ -87,7 +88,7 @@ abstract class AbstractInvocationHandler implements InvocationHandler {
}
@SuppressWarnings({"unchecked", "rawtypes"})
- protected Object getEntityCollectionProxy(
+ protected Object getEntityCollection(
final Class<?> typeRef,
final Class<?> typeCollectionRef,
final String entityContainerName,
@@ -99,47 +100,36 @@ abstract class AbstractInvocationHandler implements InvocationHandler {
for (CommonODataEntity entityFromSet : entitySet.getEntities()) {
items.add(getEntityProxy(
- entityFromSet.getEditLink(), entityFromSet, entityContainerName, null, typeRef, checkInTheContext));
+ entityFromSet, entityContainerName, null, typeRef, checkInTheContext));
}
return Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class<?>[] {typeCollectionRef},
- new EntityCollectionInvocationHandler(containerHandler, items, typeRef, uri));
+ new EntityCollectionInvocationHandler(containerHandler, items, typeRef, entityContainerName, uri));
}
- protected Object getEntitySetProxy(
- final Class<?> typeRef,
- final URI uri) {
-
- return Proxy.newProxyInstance(
- Thread.currentThread().getContextClassLoader(),
- new Class<?>[] {typeRef},
- EntitySetInvocationHandler.getInstance(typeRef, containerHandler, uri));
- }
-
- protected Object getEntityProxy(
- final URI entityURI,
+ protected <T> T getEntityProxy(
final CommonODataEntity entity,
final String entityContainerName,
- final URI entitySetURI,
+ final String entitySetName,
final Class<?> type,
final boolean checkInTheContext) {
- return getEntityProxy(entityURI, entity, entityContainerName, entitySetURI, type, null, checkInTheContext);
+ return getEntityProxy(entity, entityContainerName, entitySetName, type, null, checkInTheContext);
}
- protected Object getEntityProxy(
- final URI entityURI,
+ @SuppressWarnings({"unchecked"})
+ protected <T> T getEntityProxy(
final CommonODataEntity entity,
final String entityContainerName,
- final URI entitySetURI,
+ final String entitySetName,
final Class<?> type,
final String eTag,
final boolean checkInTheContext) {
- EntityInvocationHandler handler =
- EntityInvocationHandler.getInstance(entityURI, entity, entitySetURI, type, containerHandler);
+ EntityTypeInvocationHandler<C> handler = (EntityTypeInvocationHandler<C>) EntityTypeInvocationHandler.getInstance(
+ entity, entitySetName, type, containerHandler);
if (StringUtils.isNotBlank(eTag)) {
// override ETag into the wrapped object.
@@ -147,10 +137,11 @@ abstract class AbstractInvocationHandler implements InvocationHandler {
}
if (checkInTheContext && EntityContainerFactory.getContext().entityContext().isAttached(handler)) {
- handler = EntityContainerFactory.getContext().entityContext().getEntity(handler.getUUID());
+ handler = (EntityTypeInvocationHandler<C>) EntityContainerFactory.getContext().entityContext().
+ getEntity(handler.getUUID());
}
- return Proxy.newProxyInstance(
+ return (T) Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class<?>[] {type},
handler);
@@ -166,7 +157,7 @@ abstract class AbstractInvocationHandler implements InvocationHandler {
IllegalArgumentException, InvocationTargetException {
// 1. invoke params (if present)
- final Map<String, ODataValue> parameterValues = new LinkedHashMap<String, ODataValue>();
+ final Map<String, ODataValue> parameterValues = new HashMap<String, ODataValue>();
if (!parameters.isEmpty()) {
for (Map.Entry<Parameter, Object> parameter : parameters.entrySet()) {
@@ -202,12 +193,12 @@ abstract class AbstractInvocationHandler implements InvocationHandler {
final EdmTypeInfo edmType = new EdmTypeInfo.Builder().
setEdm(client.getCachedEdm()).setTypeExpression(annotation.returnType()).build();
-
+
if (edmType.isEntityType()) {
if (edmType.isCollection()) {
final ParameterizedType collType = (ParameterizedType) method.getReturnType().getGenericInterfaces()[0];
final Class<?> collItemType = (Class<?>) collType.getActualTypeArguments()[0];
- return getEntityCollectionProxy(
+ return getEntityCollection(
collItemType,
method.getReturnType(),
null,
@@ -216,14 +207,13 @@ abstract class AbstractInvocationHandler implements InvocationHandler {
false);
} else {
return getEntityProxy(
- ((CommonODataEntity) result).getEditLink(),
(CommonODataEntity) result,
null,
null,
method.getReturnType(),
false);
}
- } else {
+ }else{
return CoreUtils.getValueFromProperty(client, (CommonODataProperty) result, method.getGenericReturnType(), null);
}
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/22f6a6a2/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
index 28bf280..fe645ae 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
@@ -20,7 +20,6 @@ package org.apache.olingo.ext.proxy.commons;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
import java.util.ArrayList;
@@ -32,7 +31,6 @@ import org.apache.olingo.client.api.CommonEdmEnabledODataClient;
import org.apache.olingo.commons.api.domain.CommonODataProperty;
import org.apache.olingo.commons.api.domain.ODataComplexValue;
import org.apache.olingo.commons.api.domain.ODataLinked;
-import org.apache.olingo.commons.api.domain.ODataValue;
import org.apache.olingo.commons.api.edm.EdmElement;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.core.edm.EdmTypeInfo;
@@ -77,7 +75,7 @@ public class ComplexTypeInvocationHandler<C extends CommonEdmEnabledODataClient<
}
@SuppressWarnings({"unchecked", "rawtypes"})
- static ComplexTypeInvocationHandler<?> getInstance(
+ public static ComplexTypeInvocationHandler<?> getInstance(
final CommonEdmEnabledODataClient<?> client,
final ODataComplexValue<?> complex,
final Class<?> typeRef,
@@ -112,48 +110,7 @@ public class ComplexTypeInvocationHandler<C extends CommonEdmEnabledODataClient<
@Override
protected Object getPropertyValue(final String name, final Type type) {
try {
- final Object res;
-
- final CommonODataProperty property = getComplex().get(name);
- if (property == null) {
- res = null;
- } else if (property.hasComplexValue()) {
- res = Proxy.newProxyInstance(
- Thread.currentThread().getContextClassLoader(),
- new Class<?>[] {(Class<?>) type},
- ComplexTypeInvocationHandler.getInstance(
- client, property.getValue().asComplex(), (Class<?>) type, targetHandler));
-
- } else if (property.hasCollectionValue()) {
- final ParameterizedType collType = (ParameterizedType) type;
- final Class<?> collItemClass = (Class<?>) collType.getActualTypeArguments()[0];
-
- final ArrayList<Object> collection = new ArrayList<Object>();
-
- final Iterator<ODataValue> collPropItor = property.getValue().asCollection().iterator();
- while (collPropItor.hasNext()) {
- final ODataValue value = collPropItor.next();
- if (value.isPrimitive()) {
- collection.add(CoreUtils.primitiveValueToObject(value.asPrimitive()));
- } else if (value.isComplex()) {
- final Object collItem = Proxy.newProxyInstance(
- Thread.currentThread().getContextClassLoader(),
- new Class<?>[] {collItemClass},
- ComplexTypeInvocationHandler.getInstance(
- client, value.asComplex(), collItemClass, targetHandler));
-
- collection.add(collItem);
- }
- }
-
- res = collection;
- } else {
- res = type == null
- ? CoreUtils.getValueFromProperty(client, property)
- : CoreUtils.getValueFromProperty(client, property, type);
- }
-
- return res;
+ return CoreUtils.getValueFromProperty(client, getComplex().get(name), type, targetHandler);
} catch (Exception e) {
throw new IllegalArgumentException("Error getting value for property '" + name + "'", e);
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/22f6a6a2/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityInvocationHandler.java
index 0e093b4..9f81634 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityInvocationHandler.java
@@ -21,15 +21,11 @@ package org.apache.olingo.ext.proxy.commons;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
import java.net.URI;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.apache.commons.io.IOUtils;
@@ -40,7 +36,6 @@ import org.apache.olingo.client.core.uri.URIUtils;
import org.apache.olingo.commons.api.domain.CommonODataEntity;
import org.apache.olingo.commons.api.domain.CommonODataProperty;
import org.apache.olingo.commons.api.domain.ODataLinked;
-import org.apache.olingo.commons.api.domain.ODataValue;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.format.ODataMediaFormat;
@@ -194,45 +189,8 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
Object res;
if (propertyChanges.containsKey(name)) {
res = propertyChanges.get(name);
- } else if (property == null) {
- res = null;
- } else if (property.hasComplexValue()) {
- res = Proxy.newProxyInstance(
- Thread.currentThread().getContextClassLoader(),
- new Class<?>[] {(Class<?>) type},
- ComplexTypeInvocationHandler.getInstance(
- client, property.getValue().asComplex(), (Class<?>) type, this));
-
- addPropertyChanges(name, res);
- } else if (property.hasCollectionValue()) {
- final ParameterizedType collType = (ParameterizedType) type;
- final Class<?> collItemClass = (Class<?>) collType.getActualTypeArguments()[0];
-
- final ArrayList<Object> collection = new ArrayList<Object>();
-
- final Iterator<ODataValue> collPropItor = property.getValue().asCollection().iterator();
- while (collPropItor.hasNext()) {
- final ODataValue value = collPropItor.next();
- if (value.isPrimitive()) {
- collection.add(CoreUtils.primitiveValueToObject(value.asPrimitive()));
- } else if (value.isComplex()) {
- final Object collItem = Proxy.newProxyInstance(
- Thread.currentThread().getContextClassLoader(),
- new Class<?>[] {collItemClass},
- ComplexTypeInvocationHandler.getInstance(
- client, value.asComplex(), collItemClass, this));
-
- collection.add(collItem);
- }
- }
-
- res = collection;
-
- addPropertyChanges(name, res);
} else {
- res = type == null
- ? CoreUtils.getValueFromProperty(client, property)
- : CoreUtils.getValueFromProperty(client, property, type);
+ res = CoreUtils.getValueFromProperty(client, property, type, this);
if (res != null) {
addPropertyChanges(name, res);
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/22f6a6a2/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
index 3c4843a..981d285 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
@@ -33,36 +33,25 @@ import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
import org.apache.olingo.client.api.CommonEdmEnabledODataClient;
import org.apache.olingo.client.api.v3.UnsupportedInV3Exception;
-import org.apache.olingo.commons.api.Constants;
import org.apache.olingo.commons.api.domain.CommonODataEntity;
import org.apache.olingo.commons.api.domain.CommonODataProperty;
import org.apache.olingo.commons.api.domain.ODataLink;
import org.apache.olingo.commons.api.domain.ODataPrimitiveValue;
import org.apache.olingo.commons.api.domain.ODataValue;
-import org.apache.olingo.commons.api.domain.v4.ODataEnumValue;
-import org.apache.olingo.commons.api.domain.v4.ODataObjectFactory;
-import org.apache.olingo.commons.api.domain.v4.ODataProperty;
import org.apache.olingo.commons.api.edm.EdmElement;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
-import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.EdmType;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.commons.core.edm.EdmTypeInfo;
-import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
-import org.apache.olingo.ext.proxy.api.annotations.ComplexType;
import org.apache.olingo.ext.proxy.api.annotations.CompoundKeyElement;
-import org.apache.olingo.ext.proxy.api.annotations.EnumType;
import org.apache.olingo.ext.proxy.api.annotations.Key;
-import org.apache.olingo.ext.proxy.api.annotations.Namespace;
import org.apache.olingo.ext.proxy.api.annotations.Property;
-import org.apache.olingo.ext.proxy.commons.AbstractStructuredInvocationHandler;
-import org.apache.olingo.ext.proxy.commons.ComplexInvocationHandler;
-import org.apache.olingo.ext.proxy.commons.EntityInvocationHandler;
+import org.apache.olingo.ext.proxy.commons.AbstractTypeInvocationHandler;
+import org.apache.olingo.ext.proxy.commons.ComplexTypeInvocationHandler;
+import org.apache.olingo.ext.proxy.commons.EntityTypeInvocationHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -102,35 +91,42 @@ public final class CoreUtils {
}
} else {
- throw new UnsupportedOperationException("Unsupported object type " + intType.getFullQualifiedName());
+ throw new UnsupportedOperationException("Usupported object type " + intType.getFullQualifiedName());
}
}
} else if (type.isComplexType()) {
- Object objHandler;
+ value = client.getObjectFactory().newComplexValue(type.getFullQualifiedName().toString());
+
+ final Object oo;
if (obj instanceof Proxy) {
- objHandler = Proxy.getInvocationHandler(obj);
+ oo = Proxy.getInvocationHandler(obj);
} else {
- objHandler = obj;
+ oo = obj;
}
- if (objHandler instanceof ComplexInvocationHandler) {
- value = ((ComplexInvocationHandler) objHandler).getComplex();
- final Class<?> typeRef = ((ComplexInvocationHandler) objHandler).getTypeRef();
+ if (oo instanceof ComplexTypeInvocationHandler<?>) {
+ final Class<?> typeRef = ((ComplexTypeInvocationHandler<?>) oo).getTypeRef();
+ final Object complex = Proxy.newProxyInstance(
+ Thread.currentThread().getContextClassLoader(),
+ new Class<?>[] {typeRef},
+ (ComplexTypeInvocationHandler<?>) oo);
+
for (Method method : typeRef.getMethods()) {
- final Property propAnn = method.getAnnotation(Property.class);
- if (propAnn != null) {
- try {
+ final Property complexPropertyAnn = method.getAnnotation(Property.class);
+ try {
+ if (complexPropertyAnn != null) {
value.asComplex().add(getODataComplexProperty(
- client, type.getFullQualifiedName(), propAnn.name(), method.invoke(objHandler)));
- } catch (Exception ignore) {
- // ignore value
- LOG.warn("Error attaching complex {} for field '{}.{}'",
- type.getFullQualifiedName(), typeRef.getName(), propAnn.name(), ignore);
+ client, type.getFullQualifiedName(), complexPropertyAnn.name(), method.invoke(complex)));
}
+ } catch (Exception ignore) {
+ // ignore value
+ LOG.warn("Error attaching complex {} for field '{}.{}'",
+ type.getFullQualifiedName(), typeRef.getName(), complexPropertyAnn.name(), ignore);
}
}
} else {
- throw new IllegalArgumentException(objHandler.getClass().getName() + "' is not a complex value");
+ throw new IllegalArgumentException(
+ "Object '" + oo.getClass().getSimpleName() + "' is not a complex value");
}
} else if (type.isEnumType()) {
if (client.getServiceVersion().compareTo(ODataServiceVersion.V30) <= 0) {
@@ -173,18 +169,12 @@ public final class CoreUtils {
final String property,
final Object obj) {
- final EdmTypeInfo type;
- if (edmProperty == null) {
- // maybe opentype ...
- type = null;
- } else {
- final EdmType edmType = edmProperty.getType();
+ final EdmType edmType = edmProperty.getType();
- type = new EdmTypeInfo.Builder().setEdm(client.getCachedEdm()).setTypeExpression(
- edmProperty.isCollection()
- ? "Collection(" + edmType.getFullQualifiedName().toString() + ")"
- : edmType.getFullQualifiedName().toString()).build();
- }
+ final EdmTypeInfo type = new EdmTypeInfo.Builder().setEdm(client.getCachedEdm()).setTypeExpression(
+ edmProperty.isCollection()
+ ? "Collection(" + edmType.getFullQualifiedName().toString() + ")"
+ : edmType.getFullQualifiedName().toString()).build();
return getODataProperty(client, property, type, obj);
}
@@ -195,39 +185,28 @@ public final class CoreUtils {
CommonODataProperty oprop;
try {
- if (obj == null) {
+ if (type == null || obj == null) {
oprop = client.getObjectFactory().newPrimitiveProperty(name, null);
- } else {
- final EdmTypeInfo valueType;
- if (type == null) {
- valueType = guessTypeFromObject(client, obj);
- } else {
- valueType = type;
- }
-
- if (valueType.isCollection()) {
- // create collection property
- oprop = client.getObjectFactory().newCollectionProperty(name, getODataValue(client, valueType, obj).
- asCollection());
- } else if (valueType.isPrimitiveType()) {
- // create a primitive property
- oprop = client.getObjectFactory().newPrimitiveProperty(name, getODataValue(client, valueType, obj).
- asPrimitive());
- } else if (valueType.isComplexType()) {
- // create a complex property
- oprop = client.getObjectFactory().newComplexProperty(name, getODataValue(client, valueType, obj).
- asComplex());
- } else if (valueType.isEnumType()) {
- if (client.getServiceVersion().compareTo(ODataServiceVersion.V30) <= 0) {
- throw new UnsupportedInV3Exception();
- } else {
- oprop = ((ODataObjectFactory) client.getObjectFactory()).newEnumProperty(name,
- ((org.apache.olingo.commons.api.domain.v4.ODataValue) getODataValue(client, valueType, obj)).
- asEnum());
- }
+ } else if (type.isCollection()) {
+ // create collection property
+ oprop = client.getObjectFactory().newCollectionProperty(name, getODataValue(client, type, obj).asCollection());
+ } else if (type.isPrimitiveType()) {
+ // create a primitive property
+ oprop = client.getObjectFactory().newPrimitiveProperty(name, getODataValue(client, type, obj).asPrimitive());
+ } else if (type.isComplexType()) {
+ // create a complex property
+ oprop = client.getObjectFactory().newComplexProperty(name, getODataValue(client, type, obj).asComplex());
+ } else if (type.isEnumType()) {
+ if (client.getServiceVersion().compareTo(ODataServiceVersion.V30) <= 0) {
+ throw new UnsupportedInV3Exception();
} else {
- throw new UnsupportedOperationException("Usupported object type " + valueType.getFullQualifiedName());
+ oprop = ((org.apache.olingo.commons.api.domain.v4.ODataObjectFactory) client.getObjectFactory()).
+ newEnumProperty(name,
+ ((org.apache.olingo.commons.api.domain.v4.ODataValue) getODataValue(client, type, obj)).
+ asEnum());
}
+ } else {
+ throw new UnsupportedOperationException("Usupported object type " + type.getFullQualifiedName());
}
return oprop;
@@ -236,51 +215,6 @@ public final class CoreUtils {
}
}
- private static EdmTypeInfo guessTypeFromObject(
- final CommonEdmEnabledODataClient<?> client, final Object obj) {
-
- final EdmTypeInfo.Builder edmTypeInfo = new EdmTypeInfo.Builder().setEdm(client.getCachedEdm());
-
- if (Collection.class.isAssignableFrom(obj.getClass())) {
- final EdmTypeInfo type = guessPrimitiveType(client, ClassUtils.extractTypeArg(obj.getClass()));
- return edmTypeInfo.setTypeExpression("Collection(" + type.getFullQualifiedName() + ")").build();
- } else if (obj instanceof Proxy) {
- final Class<?> typeRef = obj.getClass().getInterfaces()[0];
- final String ns = typeRef.getAnnotation(Namespace.class).value();
- final String name = typeRef.getAnnotation(ComplexType.class).name();
- return edmTypeInfo.setTypeExpression(new FullQualifiedName(ns, name).toString()).build();
- } else if (obj.getClass().getAnnotation(EnumType.class) != null) {
- final Class<?> typeRef = obj.getClass();
- final String ns = typeRef.getAnnotation(Namespace.class).value();
- final String name = typeRef.getAnnotation(EnumType.class).name();
- return edmTypeInfo.setTypeExpression(new FullQualifiedName(ns, name).toString()).build();
- } else {
- return guessPrimitiveType(client, obj.getClass());
- }
- }
-
- private static EdmTypeInfo guessPrimitiveType(final CommonEdmEnabledODataClient<?> client, final Class<?> clazz) {
- EdmPrimitiveTypeKind bckCandidate = null;
-
- for (EdmPrimitiveTypeKind kind : EdmPrimitiveTypeKind.values()) {
- if (kind.getSupportedVersions().contains(client.getServiceVersion())) {
- final Class<?> target = EdmPrimitiveTypeFactory.getInstance(kind).getDefaultType();
-
- if (clazz.equals(target)) {
- return new EdmTypeInfo.Builder().setEdm(client.getCachedEdm()).setTypeExpression(kind.toString()).build();
- } else if (target.isAssignableFrom(clazz)) {
- bckCandidate = kind;
- }
- }
- }
-
- if (bckCandidate == null) {
- throw new IllegalArgumentException(clazz.getSimpleName() + " is not a simple type");
- } else {
- return new EdmTypeInfo.Builder().setEdm(client.getCachedEdm()).setTypeExpression(bckCandidate.toString()).build();
- }
- }
-
@SuppressWarnings("unchecked")
public static void addProperties(
final CommonEdmEnabledODataClient<?> client,
@@ -299,28 +233,15 @@ public final class CoreUtils {
}
}
- @SuppressWarnings({"unchecked", "rawtypes"})
- private static Enum<?> enumValueToObject(final ODataEnumValue value, final Class<?> reference) {
- final Namespace namespace = reference.getAnnotation(Namespace.class);
- final EnumType enumType = reference.getAnnotation(EnumType.class);
- if (value.getTypeName().equals(namespace.value() + "." + enumType.name())) {
- return Enum.valueOf((Class<Enum>) reference, value.getValue());
- }
-
- return null;
- }
-
- private static Object primitiveValueToObject(final ODataPrimitiveValue value, final Class<?> reference) {
+ public static Object primitiveValueToObject(final ODataPrimitiveValue value) {
Object obj;
try {
obj = value.toValue() instanceof Timestamp
? value.toCastValue(Calendar.class)
- : reference == null
- ? value.toValue()
- : value.toCastValue(reference);
+ : value.toValue();
} catch (EdmPrimitiveTypeException e) {
- LOG.warn("While casting primitive value {} to {}", value, reference, e);
+ LOG.warn("Could not read temporal value as Calendar, reverting to Timestamp", e);
obj = value.toValue();
}
@@ -335,19 +256,6 @@ public final class CoreUtils {
bean.getClass().getMethod(setterName, getter.getReturnType()).invoke(bean, value);
}
- private static Class<?> getPropertyClass(final Class<?> entityClass, final String propertyName) {
- Class<?> propertyClass = null;
- try {
- final Method getter = entityClass.getMethod("get" + StringUtils.capitalize(propertyName));
- if (getter != null) {
- propertyClass = getter.getReturnType();
- }
- } catch (Exception e) {
- LOG.error("Could not determine the Java type of {}", propertyName, e);
- }
- return propertyClass;
- }
-
public static Object getKey(
final CommonEdmEnabledODataClient<?> client, final Class<?> entityTypeRef, final CommonODataEntity entity) {
@@ -358,8 +266,7 @@ public final class CoreUtils {
if (keyRef == null) {
final CommonODataProperty property = entity.getProperty(firstValidEntityKey(entityTypeRef));
if (property != null && property.hasPrimitiveValue()) {
- res = primitiveValueToObject(
- property.getPrimitiveValue(), getPropertyClass(entityTypeRef, property.getName()));
+ res = primitiveValueToObject(property.getPrimitiveValue());
}
} else {
try {
@@ -385,8 +292,8 @@ public final class CoreUtils {
final Class<?> typeRef;
if (bean instanceof Proxy) {
final InvocationHandler handler = Proxy.getInvocationHandler(bean);
- if (handler instanceof AbstractStructuredInvocationHandler) {
- typeRef = ((ComplexInvocationHandler) handler).getTypeRef();
+ if (handler instanceof AbstractTypeInvocationHandler) {
+ typeRef = ((ComplexTypeInvocationHandler<?>) handler).getTypeRef();
} else {
throw new IllegalStateException("Invalid bean " + bean);
}
@@ -419,13 +326,12 @@ public final class CoreUtils {
if (property.hasNullValue()) {
setPropertyValue(bean, getter, null);
} else if (property.hasPrimitiveValue()) {
- setPropertyValue(bean, getter, primitiveValueToObject(
- property.getPrimitiveValue(), getPropertyClass(reference, property.getName())));
+ setPropertyValue(bean, getter, primitiveValueToObject(property.getPrimitiveValue()));
} else if (property.hasComplexValue()) {
final Object complex = Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class<?>[] {getter.getReturnType()},
- ComplexInvocationHandler.getInstance(
+ ComplexTypeInvocationHandler.getInstance(
client, property.getName(), getter.getReturnType(), null));
populate(client, complex, Property.class, property.getValue().asComplex().iterator());
@@ -444,13 +350,12 @@ public final class CoreUtils {
while (collPropItor.hasNext()) {
final ODataValue value = collPropItor.next();
if (value.isPrimitive()) {
- collection.add(primitiveValueToObject(
- value.asPrimitive(), getPropertyClass(reference, property.getName())));
+ collection.add(primitiveValueToObject(value.asPrimitive()));
} else if (value.isComplex()) {
final Object collItem = Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class<?>[] {collItemClass},
- ComplexInvocationHandler.getInstance(
+ ComplexTypeInvocationHandler.getInstance(
client, property.getName(), collItemClass, null));
populate(client, collItem, Property.class, value.asComplex().iterator());
@@ -471,9 +376,11 @@ public final class CoreUtils {
final CommonEdmEnabledODataClient<?> client,
final CommonODataProperty property,
final Type typeRef,
- final EntityInvocationHandler entityHandler)
+ final EntityTypeInvocationHandler<?> entityHandler)
throws InstantiationException, IllegalAccessException {
+ final Object res;
+
Class<?> internalRef;
if (typeRef == null) {
internalRef = null;
@@ -485,18 +392,15 @@ public final class CoreUtils {
}
}
- final Object res;
-
if (property == null || property.hasNullValue()) {
res = null;
} else if (property.hasComplexValue()) {
- // complex types supports inheritance in V4, best to re-read actual type
- internalRef = getComplexTypeRef(property);
res = Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class<?>[] {internalRef},
- ComplexInvocationHandler.getInstance(
+ ComplexTypeInvocationHandler.getInstance(
client, property.getValue().asComplex(), internalRef, entityHandler));
+
} else if (property.hasCollectionValue()) {
final ArrayList<Object> collection = new ArrayList<Object>();
@@ -504,13 +408,12 @@ public final class CoreUtils {
while (collPropItor.hasNext()) {
final ODataValue value = collPropItor.next();
if (value.isPrimitive()) {
- collection.add(CoreUtils.primitiveValueToObject(value.asPrimitive(), internalRef));
+ collection.add(CoreUtils.primitiveValueToObject(value.asPrimitive()));
} else if (value.isComplex()) {
- internalRef = getComplexTypeRef(property);
final Object collItem = Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class<?>[] {internalRef},
- ComplexInvocationHandler.getInstance(
+ ComplexTypeInvocationHandler.getInstance(
client, value.asComplex(), internalRef, entityHandler));
collection.add(collItem);
@@ -518,61 +421,13 @@ public final class CoreUtils {
}
res = collection;
- } else if (property instanceof ODataProperty && ((ODataProperty) property).hasEnumValue()) {
- if (internalRef == null) {
- internalRef = getEnumTypeRef(property);
- }
- res = enumValueToObject(((ODataProperty) property).getEnumValue(), internalRef);
} else {
- res = primitiveValueToObject(property.getPrimitiveValue(), internalRef);
+ res = CoreUtils.primitiveValueToObject(property.getPrimitiveValue());
}
return res;
}
- private static Class<?> getEnumTypeRef(final CommonODataProperty property) {
- return getTypeRef(property, "META-INF/" + Constants.PROXY_ENUM_CLASS_LIST, EnumType.class);
- }
-
- private static Class<?> getComplexTypeRef(final CommonODataProperty property) {
- return getTypeRef(property, "META-INF/" + Constants.PROXY_COMPLEX_CLASS_LIST, ComplexType.class);
- }
-
- private static Class<?> getTypeRef(
- final CommonODataProperty property,
- final String proxyClassListFile,
- final Class<? extends Annotation> annType) {
-
- if (!annType.isAssignableFrom(EnumType.class) && !annType.isAssignableFrom(ComplexType.class)) {
- throw new IllegalArgumentException("Invalid annotation type " + annType);
- }
-
- try {
- final List<String> pkgs = IOUtils.readLines(
- CoreUtils.class.getClassLoader().getResourceAsStream(proxyClassListFile),
- Constants.UTF8);
-
- for (String pkg : pkgs) {
- final Class<?> clazz = Class.forName(pkg);
- final Annotation ann = clazz.getAnnotation(annType);
- final Namespace ns = clazz.getAnnotation(Namespace.class);
-
- if (ns != null && ann != null) {
- if (property.getValue().getTypeName().replaceAll("^Collection\\(", "").replaceAll("\\)$", "").equals(
- new FullQualifiedName(ns.value(), annType.isAssignableFrom(EnumType.class)
- ? EnumType.class.cast(ann).name()
- : ComplexType.class.cast(ann).name()).toString())) {
- return clazz;
- }
- }
- }
- } catch (Exception e) {
- LOG.warn("Error retrieving proxy complex class list", e);
- }
-
- throw new IllegalArgumentException("Provided property '" + property + "' is not complex");
- }
-
private static String firstValidEntityKey(final Class<?> entityTypeRef) {
for (Method method : entityTypeRef.getDeclaredMethods()) {
if (method.getAnnotation(Key.class) != null) {
@@ -585,10 +440,10 @@ public final class CoreUtils {
return null;
}
- public static URI getMediaEditLink(final String name, final CommonODataEntity entity) {
- for (ODataLink link : entity.getMediaEditLinks()) {
- if (name.equalsIgnoreCase(link.getName())) {
- return link.getLink();
+ public static URI getEditMediaLink(final String name, final CommonODataEntity entity) {
+ for (ODataLink editMediaLink : entity.getMediaEditLinks()) {
+ if (name.equalsIgnoreCase(editMediaLink.getName())) {
+ return editMediaLink.getLink();
}
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/22f6a6a2/fit/src/it/primitiveKeysServiceV3/pom.xml
----------------------------------------------------------------------
diff --git a/fit/src/it/primitiveKeysServiceV3/pom.xml b/fit/src/it/primitiveKeysServiceV3/pom.xml
index 6a8efd0..a01701f 100644
--- a/fit/src/it/primitiveKeysServiceV3/pom.xml
+++ b/fit/src/it/primitiveKeysServiceV3/pom.xml
@@ -27,7 +27,7 @@
<groupId>org.apache.olingo</groupId>
<version>@project.version@</version>
<name>${project.artifactId}</name>
- <description>A simple IT verifying the basic use case of pojogen-maven-plugin.</description>
+ <description>A simple IT verifying the basic use case of pojogen-man-plugin.</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/22f6a6a2/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
index 4ccea54..0bb7c7d 100644
--- a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
+++ b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
@@ -116,7 +116,7 @@ public abstract class AbstractServices {
private static final Pattern REQUEST_PATTERN = Pattern.compile("(.*) (http://.*) HTTP/.*");
- private static final Pattern BATCH_REQUEST_REF_PATTERN = Pattern.compile("(.*) ([$]\\d+)(.*) HTTP/.*");
+ private static final Pattern BATCH_REQUEST_REF_PATTERN = Pattern.compile("(.*) ([$].*) HTTP/.*");
private static final Pattern REF_PATTERN = Pattern.compile("([$]\\d+)");
@@ -242,7 +242,7 @@ public abstract class AbstractServices {
return xml.createResponse(new ByteArrayInputStream(content.toByteArray()), null, Accept.JSON_FULLMETA);
} catch (Exception e) {
LOG.error("While creating StoredPI", e);
- return xml.createFaultResponse(Accept.JSON_FULLMETA.toString(version), e);
+ return xml.createFaultResponse(Accept.JSON_FULLMETA.toString(version),e);
}
}
@@ -259,6 +259,7 @@ public abstract class AbstractServices {
}
protected Response bodyPartRequest(final MimeBodyPart body, final Map<String, String> references) throws Exception {
+
@SuppressWarnings("unchecked")
final Enumeration<Header> en = (Enumeration<Header>) body.getAllHeaders();
@@ -284,7 +285,7 @@ public abstract class AbstractServices {
url = matcher.group(2);
method = matcher.group(1);
} else if (matcherRef.find()) {
- url = references.get(matcherRef.group(2)) + matcherRef.group(3);
+ url = references.get(matcherRef.group(2));
method = matcherRef.group(1);
} else {
url = null;
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/22f6a6a2/fit/src/test/java/org/apache/olingo/fit/proxy/v3/AbstractTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/AbstractTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/AbstractTestITCase.java
index e9afca9..73d5c32 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/AbstractTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/AbstractTestITCase.java
@@ -55,6 +55,8 @@ public abstract class AbstractTestITCase {
protected static String testStaticServiceRootURL;
+ protected static String testPrimitiveKeysServiceRootURL;
+
protected static String testKeyAsSegmentServiceRootURL;
protected static String testActionOverloadingServiceRootURL;
@@ -74,6 +76,7 @@ public abstract class AbstractTestITCase {
@BeforeClass
public static void setUpODataServiceRoot() throws IOException {
testStaticServiceRootURL = "http://localhost:9080/stub/StaticService/V30/Static.svc";
+ testPrimitiveKeysServiceRootURL = "http://localhost:9080/stub/StaticService/V30/PrimitiveKeys.svc";
testKeyAsSegmentServiceRootURL = "http://localhost:9080/stub/StaticService/V30/KeyAsSegment.svc";
testActionOverloadingServiceRootURL = "http://localhost:9080/stub/StaticService/V30/ActionOverloading.svc";
testOpenTypeServiceRootURL = "http://localhost:9080/stub/StaticService/V30/OpenType.svc";
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/22f6a6a2/fit/src/test/java/org/apache/olingo/fit/proxy/v4/PropertyTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/PropertyTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/PropertyTestITCase.java
index 7c7fde7..e8f7158 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/PropertyTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/PropertyTestITCase.java
@@ -18,12 +18,12 @@
*/
package org.apache.olingo.fit.proxy.v4;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
import org.apache.olingo.ext.proxy.EntityContainerFactory;
import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.types.Customer;
import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.types.StoredPI;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
import org.junit.Test;
/**
@@ -33,7 +33,7 @@ public class PropertyTestITCase extends AbstractTestITCase {
@Test
public void nullNullableProperty() {
- final Customer customer = container.getCustomers().get(1);
+ Customer customer = container.getCustomers().get(1);
customer.setFirstName(null);
container.flush();
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/22f6a6a2/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PrimitiveValueTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PrimitiveValueTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PrimitiveValueTest.java
index 12a3678..f902a0d 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PrimitiveValueTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PrimitiveValueTest.java
@@ -29,12 +29,12 @@ import java.util.Iterator;
import java.util.List;
import java.util.TimeZone;
import java.util.UUID;
+import javax.xml.datatype.Duration;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.olingo.commons.api.domain.ODataValue;
import org.apache.olingo.client.api.v3.ODataClient;
import org.apache.olingo.client.core.AbstractTest;
-import org.apache.olingo.commons.api.domain.ODataPrimitiveValue;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.geo.Geospatial;
@@ -122,14 +122,12 @@ public class PrimitiveValueTest extends AbstractTest {
@Test
public void time() throws EdmPrimitiveTypeException {
final String primitive = "-P9DT51M10.5063807S";
- final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
- setType(EdmPrimitiveTypeKind.Time).setText(primitive).build();
+ final ODataValue value =
+ getClient().getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Time).
+ setText(primitive).build();
assertEquals(EdmPrimitiveTypeKind.Time, value.asPrimitive().getTypeKind());
- assertEquals(BigDecimal.valueOf(-780670.5063807), value.asPrimitive().toCastValue(BigDecimal.class));
-
- final ODataPrimitiveValue write = getClient().getObjectFactory().newPrimitiveValueBuilder().
- setType(EdmPrimitiveTypeKind.Time).setValue(BigDecimal.valueOf(-780670.5063807)).build();
- assertEquals(primitive, write.toString());
+ // performed cast to improve the check
+ assertEquals("-780670.5063807", value.asPrimitive().toCastValue(BigDecimal.class).toString());
}
@Test
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/22f6a6a2/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDuration.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDuration.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDuration.java
index cd0aaea..e39b8e7 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDuration.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmDuration.java
@@ -81,6 +81,7 @@ public class EdmDuration extends SingletonPrimitiveType {
throw new EdmPrimitiveTypeException(
"EdmPrimitiveTypeException.LITERAL_UNCONVERTIBLE_TO_VALUE_TYPE.addContent(value, returnType), e");
} catch (final ClassCastException e) {
+ e.printStackTrace();
throw new EdmPrimitiveTypeException(
"EdmPrimitiveTypeException.VALUE_TYPE_NOT_SUPPORTED.addContent(returnType), e");
}