[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/4ad25f2a Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/4ad25f2a Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/4ad25f2a Branch: refs/heads/olingo-266-ref Commit: 4ad25f2a3fb93973723d4bd307cb79ec7cce59c0 Parents: 5909845 Author: fmartelli <[email protected]> Authored: Tue May 13 18:59:14 2014 +0200 Committer: Stephan Klevenz <[email protected]> Committed: Mon May 19 12:33:26 2014 +0200 ---------------------------------------------------------------------- .../commons/AbstractInvocationHandler.java | 13 +- .../commons/ComplexTypeInvocationHandler.java | 47 +----- .../commons/EntityTypeInvocationHandler.java | 44 +----- .../olingo/ext/proxy/utils/CoreUtils.java | 110 +++++--------- fit/src/it/primitiveKeysServiceV3/pom.xml | 93 ++++++++++++ fit/src/it/primitiveKeysServiceV3/verify.groovy | 20 +++ .../org/apache/olingo/fit/AbstractServices.java | 85 ++++++++--- .../org/apache/olingo/fit/V3PrimitiveKeys.java | 55 +++++++ .../main/resources/V30/Driver/'2'/entity.xml | 38 +++++ .../resources/V30/primitiveKeysMetadata.xml | 147 +++++++++++++++++++ .../main/webapp/WEB-INF/applicationContext.xml | 1 + .../olingo/fit/proxy/v3/AbstractTestITCase.java | 3 + .../olingo/fit/proxy/v3/PropertyTestITCase.java | 56 +++++++ .../olingo/fit/proxy/v4/PropertyTestITCase.java | 56 +++++++ .../client/core/v3/PrimitiveValueTest.java | 2 +- .../core/edm/primitivetype/EdmDuration.java | 3 +- .../commons/core/edm/primitivetype/EdmTime.java | 48 +----- 17 files changed, 579 insertions(+), 242 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/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 3ffb6be..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 @@ -193,14 +193,7 @@ abstract class AbstractInvocationHandler<C extends CommonEdmEnabledODataClient<? final EdmTypeInfo edmType = new EdmTypeInfo.Builder(). setEdm(client.getCachedEdm()).setTypeExpression(annotation.returnType()).build(); - - if (edmType.isEnumType()) { - throw new UnsupportedOperationException("Usupported enum type " + edmType.getFullQualifiedName()); - } - - if (edmType.isPrimitiveType() || edmType.isComplexType()) { - return CoreUtils.getValueFromProperty(client, (CommonODataProperty) result, method.getGenericReturnType()); - } + if (edmType.isEntityType()) { if (edmType.isCollection()) { final ParameterizedType collType = (ParameterizedType) method.getReturnType().getGenericInterfaces()[0]; @@ -220,9 +213,9 @@ abstract class AbstractInvocationHandler<C extends CommonEdmEnabledODataClient<? method.getReturnType(), false); } + }else{ + return CoreUtils.getValueFromProperty(client, (CommonODataProperty) result, method.getGenericReturnType(), null); } - - throw new IllegalArgumentException("Could not process the functionImport information"); } @Override http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexTypeInvocationHandler.java ---------------------------------------------------------------------- diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexTypeInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexTypeInvocationHandler.java index 28bf280..fe645ae 100644 --- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexTypeInvocationHandler.java +++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexTypeInvocationHandler.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/4ad25f2a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityTypeInvocationHandler.java ---------------------------------------------------------------------- diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityTypeInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityTypeInvocationHandler.java index 0e093b4..9f81634 100644 --- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityTypeInvocationHandler.java +++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityTypeInvocationHandler.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/4ad25f2a/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 ea2832b..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,10 +33,8 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.ServiceLoader; import org.apache.olingo.client.api.CommonEdmEnabledODataClient; import org.apache.olingo.client.api.v3.UnsupportedInV3Exception; -import org.apache.olingo.client.core.edm.xml.AbstractComplexType; import org.apache.olingo.commons.api.domain.CommonODataEntity; import org.apache.olingo.commons.api.domain.CommonODataProperty; import org.apache.olingo.commons.api.domain.ODataLink; @@ -48,12 +46,12 @@ 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.ext.proxy.api.annotations.ComplexType; import org.apache.olingo.ext.proxy.api.annotations.CompoundKeyElement; import org.apache.olingo.ext.proxy.api.annotations.Key; import org.apache.olingo.ext.proxy.api.annotations.Property; 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; @@ -375,97 +373,59 @@ public final class CoreUtils { @SuppressWarnings("unchecked") public static Object getValueFromProperty( - final CommonEdmEnabledODataClient<?> client, final CommonODataProperty property) + final CommonEdmEnabledODataClient<?> client, + final CommonODataProperty property, + final Type typeRef, + final EntityTypeInvocationHandler<?> entityHandler) throws InstantiationException, IllegalAccessException { - final Object value; + final Object res; - if (property == null || property.hasNullValue()) { - value = null; - } else if (property.hasCollectionValue()) { - value = new ArrayList<Object>(); - - final Iterator<ODataValue> collPropItor = property.getValue().asCollection().iterator(); - while (collPropItor.hasNext()) { - final ODataValue odataValue = collPropItor.next(); - if (odataValue.isPrimitive()) { - ((Collection) value).add(primitiveValueToObject(odataValue.asPrimitive())); - } - if (odataValue.isComplex()) { - final Object collItem = - buildComplexInstance(client, property.getName(), odataValue.asComplex().iterator()); - ((Collection) value).add(collItem); - } - } - } else if (property.hasPrimitiveValue()) { - value = primitiveValueToObject(property.getPrimitiveValue()); - } else if (property.hasComplexValue()) { - value = buildComplexInstance(client, property.getValue().asComplex().getTypeName(), - property.getValue().asComplex().iterator()); + Class<?> internalRef; + if (typeRef == null) { + internalRef = null; } else { - throw new IllegalArgumentException("Invalid property " + property); - } - - return value; - } - - @SuppressWarnings("unchecked") - private static <C extends AbstractComplexType> C buildComplexInstance( - final CommonEdmEnabledODataClient<?> client, - final String name, - final Iterator<CommonODataProperty> properties) { - - for (C complex : (Iterable<C>) ServiceLoader.load(AbstractComplexType.class)) { - final ComplexType ann = complex.getClass().getAnnotation(ComplexType.class); - final String fn = ann == null ? null : ClassUtils.getNamespace(complex.getClass()) + "." + ann.name(); - - if (name.equals(fn)) { - populate(client, complex, Property.class, properties); - return complex; + try { + internalRef = (Class<?>) ((ParameterizedType) typeRef).getActualTypeArguments()[0]; + } catch (ClassCastException e) { + internalRef = (Class<?>) typeRef; } } - return null; - } - - @SuppressWarnings({"unchecked", "rawtypes"}) - public static Object getValueFromProperty( - final CommonEdmEnabledODataClient<?> client, - final CommonODataProperty property, final Type type) - throws InstantiationException, IllegalAccessException { - - final Object value; - if (property == null || property.hasNullValue()) { - value = null; - } else if (property.hasCollectionValue()) { - value = new ArrayList(); + res = null; + } else if (property.hasComplexValue()) { + res = Proxy.newProxyInstance( + Thread.currentThread().getContextClassLoader(), + new Class<?>[] {internalRef}, + ComplexTypeInvocationHandler.getInstance( + client, property.getValue().asComplex(), internalRef, entityHandler)); - final ParameterizedType collType = (ParameterizedType) type; - final Class<?> collItemClass = (Class<?>) collType.getActualTypeArguments()[0]; + } else if (property.hasCollectionValue()) { + final ArrayList<Object> collection = new ArrayList<Object>(); final Iterator<ODataValue> collPropItor = property.getValue().asCollection().iterator(); while (collPropItor.hasNext()) { - final ODataValue odataValue = collPropItor.next(); - if (odataValue.isPrimitive()) { - ((Collection) value).add(primitiveValueToObject(odataValue.asPrimitive())); - } - if (odataValue.isComplex()) { + 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}, - new ComplexTypeInvocationHandler(client, odataValue.asComplex(), collItemClass, null)); - populate(client, collItem, Property.class, odataValue.asComplex().iterator()); - ((Collection) value).add(collItem); + new Class<?>[] {internalRef}, + ComplexTypeInvocationHandler.getInstance( + client, value.asComplex(), internalRef, entityHandler)); + + collection.add(collItem); } } - } else if (property.hasPrimitiveValue()) { - value = primitiveValueToObject(property.getPrimitiveValue()); + + res = collection; } else { - throw new IllegalArgumentException("Invalid property " + property); + res = CoreUtils.primitiveValueToObject(property.getPrimitiveValue()); } - return value; + return res; } private static String firstValidEntityKey(final Class<?> entityTypeRef) { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/fit/src/it/primitiveKeysServiceV3/pom.xml ---------------------------------------------------------------------- diff --git a/fit/src/it/primitiveKeysServiceV3/pom.xml b/fit/src/it/primitiveKeysServiceV3/pom.xml new file mode 100644 index 0000000..a01701f --- /dev/null +++ b/fit/src/it/primitiveKeysServiceV3/pom.xml @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <artifactId>pojogen-maven-plugin-v3test</artifactId> + <groupId>org.apache.olingo</groupId> + <version>@project.version@</version> + <name>${project.artifactId}</name> + <description>A simple IT verifying the basic use case of pojogen-man-plugin.</description> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> + + <dependencies> + <dependency> + <artifactId>pojogen-maven-plugin</artifactId> + <groupId>org.apache.olingo</groupId> + <version>@project.version@</version> + <scope>runtime</scope> + </dependency> + + <dependency> + <artifactId>olingo-client-proxy</artifactId> + <groupId>org.apache.olingo</groupId> + <version>@project.version@</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <version>1.8</version> + <executions> + <execution> + <phase>process-sources</phase> + <goals> + <goal>add-source</goal> + </goals> + <configuration> + <sources> + <source>${project.build.directory}/generated-sources</source> + </sources> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>@project.groupId@</groupId> + <artifactId>pojogen-maven-plugin</artifactId> + <version>@project.version@</version> + <executions> + <execution> + <configuration> + <outputDirectory>${project.build.directory}/generated-sources</outputDirectory> + <serviceRootURL>http://localhost:9080/stub/StaticService/V30/PrimitiveKeys.svc</serviceRootURL> + <basePackage>org.apache.olingo.fit.proxy.v3.primitivekeys</basePackage> + </configuration> + <id>v3pojoGen</id> + <phase>generate-sources</phase> + <goals> + <goal>v3pojoGen</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/fit/src/it/primitiveKeysServiceV3/verify.groovy ---------------------------------------------------------------------- diff --git a/fit/src/it/primitiveKeysServiceV3/verify.groovy b/fit/src/it/primitiveKeysServiceV3/verify.groovy new file mode 100644 index 0000000..9b74ad2 --- /dev/null +++ b/fit/src/it/primitiveKeysServiceV3/verify.groovy @@ -0,0 +1,20 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +File basepkg = new File( basedir, "target/generated-sources/ojc-plugin/org/apache/olingo/fit/proxy/v3" ); +assert basepkg.isDirectory() && basepkg.listFiles().length>0; http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/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 da7907c..0bb7c7d 100644 --- a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java +++ b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java @@ -83,6 +83,7 @@ import org.apache.olingo.commons.core.data.AtomEntityImpl; import org.apache.olingo.commons.core.data.AtomPropertyImpl; import org.apache.olingo.commons.core.data.AtomSerializer; import org.apache.olingo.commons.core.data.JSONEntityImpl; +import org.apache.olingo.commons.core.data.JSONPropertyImpl; import org.apache.olingo.commons.core.data.NullValueImpl; import org.apache.olingo.commons.core.data.PrimitiveValueImpl; import org.apache.olingo.fit.metadata.EntityType; @@ -209,6 +210,50 @@ public abstract class AbstractServices { } } + // ---------------------------------------------- + // just for non nullable property test into PropertyTestITCase + // ---------------------------------------------- + @PATCH + @Path("/Driver('2')") + public Response patchDriver() { + return xml.createFaultResponse(Accept.JSON_FULLMETA.toString(version), new Exception("Non nullable properties")); + } + + @GET + @Path("/StoredPIs(1000)") + public Response getStoredPI(@Context UriInfo uriInfo) { + final JSONEntityImpl entity = new JSONEntityImpl(); + entity.setType("Microsoft.Test.OData.Services.ODataWCFService.StoredPI"); + final Property id = new JSONPropertyImpl(); + id.setType("Edm.Int32"); + id.setName("StoredPIID"); + id.setValue(new PrimitiveValueImpl("1000")); + entity.getProperties().add(id); + final Link edit = new LinkImpl(); + edit.setHref(uriInfo.getRequestUri().toASCIIString()); + edit.setRel("edit"); + edit.setTitle("StoredPI"); + entity.setEditLink(edit); + + final ByteArrayOutputStream content = new ByteArrayOutputStream(); + final OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING); + try { + mapper.writeValue(writer, new JSONEntryContainer(null, null, entity)); + 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); + } + } + + @PATCH + @Path("/StoredPIs(1000)") + public Response patchStoredPI() { + // just for non nullable property test into PropertyTestITCase + return xml.createFaultResponse(Accept.JSON_FULLMETA.toString(version), new Exception("Non nullable properties")); + } + // ---------------------------------------------- + protected Response bodyPartRequest(final MimeBodyPart body) throws Exception { return bodyPartRequest(body, Collections.<String, String>emptyMap()); } @@ -420,7 +465,7 @@ public abstract class AbstractServices { } else { final ResWrap<JSONEntityImpl> jcont = mapper.readValue(IOUtils.toInputStream(changes, Constants.ENCODING), new TypeReference<JSONEntityImpl>() { - }); + }); entryChanges = dataBinder.toAtomEntity(jcont.getPayload()); } @@ -607,8 +652,8 @@ public abstract class AbstractServices { } else { final ResWrap<JSONEntityImpl> jcontainer = mapper.readValue(IOUtils.toInputStream(entity, Constants.ENCODING), - new TypeReference<JSONEntityImpl>() { - }); + new TypeReference<JSONEntityImpl>() { + }); entry = dataBinder.toAtomEntity(jcontainer.getPayload()); @@ -635,7 +680,7 @@ public abstract class AbstractServices { ResWrap<AtomEntityImpl> result = atomDeserializer.read(serialization, AtomEntityImpl.class); result = new ResWrap<AtomEntityImpl>( URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX) - + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)), + + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)), null, result.getPayload()); final String path = Commons.getEntityBasePath(entitySetName, entityKey); @@ -697,7 +742,7 @@ public abstract class AbstractServices { final FSManager fsManager = FSManager.instance(version); fsManager.putInMemory(xml.writeEntity(Accept.ATOM, container), fsManager.getAbsolutePath(Commons.getEntityBasePath("Person", entityId) + Constants.get(version, - ConstantKey.ENTITY), Accept.ATOM)); + ConstantKey.ENTITY), Accept.ATOM)); return utils.getValue().createResponse(null, null, null, utils.getKey(), Response.Status.NO_CONTENT); } catch (Exception e) { @@ -749,9 +794,9 @@ public abstract class AbstractServices { final Long newSalary = Long.valueOf(salaryMatcher.group(1)) + n; newContent = newContent. replaceAll("\"Salary\":" + salaryMatcher.group(1) + ",", - "\"Salary\":" + newSalary + ","). + "\"Salary\":" + newSalary + ","). replaceAll("\\<d:Salary m:type=\"Edm.Int32\"\\>" + salaryMatcher.group(1) + "</d:Salary\\>", - "<d:Salary m:type=\"Edm.Int32\">" + newSalary + "</d:Salary>"); + "<d:Salary m:type=\"Edm.Int32\">" + newSalary + "</d:Salary>"); } FSManager.instance(version).putInMemory(IOUtils.toInputStream(newContent, Constants.ENCODING), @@ -790,7 +835,7 @@ public abstract class AbstractServices { final FSManager fsManager = FSManager.instance(version); fsManager.putInMemory(xml.writeEntity(Accept.ATOM, container), fsManager.getAbsolutePath(Commons.getEntityBasePath("Product", entityId) + Constants.get(version, - ConstantKey.ENTITY), Accept.ATOM)); + ConstantKey.ENTITY), Accept.ATOM)); return utils.getValue().createResponse(null, null, null, utils.getKey(), Response.Status.NO_CONTENT); } catch (Exception e) { @@ -826,7 +871,7 @@ public abstract class AbstractServices { final FSManager fsManager = FSManager.instance(version); fsManager.putInMemory(xml.writeEntity(Accept.ATOM, container), fsManager.getAbsolutePath(Commons.getEntityBasePath("ComputerDetail", entityId) + Constants.get(version, - ConstantKey.ENTITY), Accept.ATOM)); + ConstantKey.ENTITY), Accept.ATOM)); return utils.getValue().createResponse(null, null, null, utils.getKey(), Response.Status.NO_CONTENT); } catch (Exception e) { @@ -971,7 +1016,7 @@ public abstract class AbstractServices { } else { mapper.writeValue( writer, new JSONFeedContainer(container.getContextURL(), container.getMetadataETag(), - dataBinder.toJSONEntitySet(container.getPayload()))); + dataBinder.toJSONEntitySet(container.getPayload()))); } return xml.createResponse( @@ -1696,8 +1741,8 @@ public abstract class AbstractServices { mapper.writeValue( writer, new JSONFeedContainer(container.getContextURL(), - container.getMetadataETag(), - dataBinder.toJSONEntitySet((AtomEntitySetImpl) container.getPayload()))); + container.getMetadataETag(), + dataBinder.toJSONEntitySet((AtomEntitySetImpl) container.getPayload()))); } } else { final ResWrap<Entity> container = @@ -1710,8 +1755,8 @@ public abstract class AbstractServices { mapper.writeValue( writer, new JSONEntryContainer(container.getContextURL(), - container.getMetadataETag(), - dataBinder.toJSONEntity((AtomEntityImpl) container.getPayload()))); + container.getMetadataETag(), + dataBinder.toJSONEntity((AtomEntityImpl) container.getPayload()))); } } @@ -1781,9 +1826,9 @@ public abstract class AbstractServices { final ResWrap<AtomPropertyImpl> container = new ResWrap<AtomPropertyImpl>( URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX) - + (version.compareTo(ODataServiceVersion.V40) >= 0 - ? entitySetName + "(" + entityId + ")/" + path - : property.getType())), + + (version.compareTo(ODataServiceVersion.V40) >= 0 + ? entitySetName + "(" + entityId + ")/" + path + : property.getType())), entryContainer.getMetadataETag(), property); @@ -1791,9 +1836,9 @@ public abstract class AbstractServices { null, searchForValue ? IOUtils.toInputStream( - container.getPayload().getValue() == null || container.getPayload().getValue().isNull() - ? StringUtils.EMPTY - : container.getPayload().getValue().asPrimitive().get(), Constants.ENCODING) + container.getPayload().getValue() == null || container.getPayload().getValue().isNull() + ? StringUtils.EMPTY + : container.getPayload().getValue().asPrimitive().get(), Constants.ENCODING) : utils.writeProperty(acceptType, container), Commons.getETag(Commons.getEntityBasePath(entitySetName, entityId), version), acceptType); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/fit/src/main/java/org/apache/olingo/fit/V3PrimitiveKeys.java ---------------------------------------------------------------------- diff --git a/fit/src/main/java/org/apache/olingo/fit/V3PrimitiveKeys.java b/fit/src/main/java/org/apache/olingo/fit/V3PrimitiveKeys.java new file mode 100644 index 0000000..3b159af --- /dev/null +++ b/fit/src/main/java/org/apache/olingo/fit/V3PrimitiveKeys.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.olingo.fit; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.apache.olingo.fit.utils.Accept; +import org.apache.olingo.fit.utils.FSManager; +import org.springframework.stereotype.Service; + +@Service +@Path("/V30/PrimitiveKeys.svc") +public class V3PrimitiveKeys extends V3Services { + + public V3PrimitiveKeys() throws Exception { + super(); + } + + /** + * Provide sample large metadata. + * + * @return metadata. + */ + @GET + @Path("/$metadata") + @Produces(MediaType.APPLICATION_XML) + @Override + public Response getMetadata() { + try { + return xml.createResponse( + null, FSManager.instance(version).readFile("primitiveKeysMetadata", Accept.XML), null, Accept.XML); + } catch (Exception e) { + return xml.createFaultResponse(Accept.XML.toString(version), e); + } + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/fit/src/main/resources/V30/Driver/'2'/entity.xml ---------------------------------------------------------------------- diff --git a/fit/src/main/resources/V30/Driver/'2'/entity.xml b/fit/src/main/resources/V30/Driver/'2'/entity.xml new file mode 100644 index 0000000..777a62b --- /dev/null +++ b/fit/src/main/resources/V30/Driver/'2'/entity.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + +--> +<entry xml:base="http://localhost:8080/DefaultService.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> + <id>http://localhost:8080/DefaultService.svc/Driver('2')</id> + <category term="Microsoft.Test.OData.Services.AstoriaDefaultService.Driver" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> + <link rel="edit" title="Driver" href="Driver('2')" /> + <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/License" type="application/atom+xml;type=entry" title="License" href="Driver('2')/License" /> + <title /> + <updated>2014-05-13T14:07:58Z</updated> + <author> + <name /> + </author> + <content type="application/xml"> + <m:properties> + <d:Name>2</d:Name> + <d:BirthDate m:type="Edm.DateTime">2012-07-03T05:54:46.6217744</d:BirthDate> + </m:properties> + </content> +</entry> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/fit/src/main/resources/V30/primitiveKeysMetadata.xml ---------------------------------------------------------------------- diff --git a/fit/src/main/resources/V30/primitiveKeysMetadata.xml b/fit/src/main/resources/V30/primitiveKeysMetadata.xml new file mode 100644 index 0000000..2e65aed --- /dev/null +++ b/fit/src/main/resources/V30/primitiveKeysMetadata.xml @@ -0,0 +1,147 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + +--> +<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx"> + <edmx:DataServices m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> + <Schema Namespace="Microsoft.Test.OData.Services.PrimitiveKeysService" xmlns="http://schemas.microsoft.com/ado/2009/11/edm"> + <EntityType Name="EdmBinary"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Binary" Nullable="false" /> + </EntityType> + <EntityType Name="EdmBoolean"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Boolean" Nullable="false" /> + </EntityType> + <EntityType Name="EdmByte"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Byte" Nullable="false" /> + </EntityType> + <EntityType Name="EdmDateTime"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.DateTime" Nullable="false" /> + </EntityType> + <EntityType Name="EdmDecimal"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Decimal" Nullable="false" /> + </EntityType> + <EntityType Name="EdmDouble"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Double" Nullable="false" /> + </EntityType> + <EntityType Name="EdmSingle"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Single" Nullable="false" /> + </EntityType> + <EntityType Name="EdmGuid"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Guid" Nullable="false" /> + </EntityType> + <EntityType Name="EdmInt16"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Int16" Nullable="false" /> + </EntityType> + <EntityType Name="EdmInt32"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Int32" Nullable="false" /> + </EntityType> + <EntityType Name="EdmInt64"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Int64" Nullable="false" /> + </EntityType> + <EntityType Name="EdmString"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.String" Nullable="false" /> + </EntityType> + <EntityType Name="EdmTime"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Time" Nullable="false" /> + </EntityType> + <EntityType Name="EdmDateTimeOffset"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.DateTimeOffset" Nullable="false" /> + </EntityType> + <EntityType Name="Folder"> + <Key> + <PropertyRef Name="Id" /> + </Key> + <Property Name="Id" Type="Edm.Int32" Nullable="false" /> + <Property Name="Name" Type="Edm.String" /> + <NavigationProperty Name="Parent" Relationship="Microsoft.Test.OData.Services.PrimitiveKeysService.Folder_Parent" ToRole="Parent" FromRole="Folder" /> + </EntityType> + <Association Name="Folder_Parent"> + <End Type="Microsoft.Test.OData.Services.PrimitiveKeysService.Folder" Role="Parent" Multiplicity="0..1" /> + <End Type="Microsoft.Test.OData.Services.PrimitiveKeysService.Folder" Role="Folder" Multiplicity="*" /> + </Association> + <EntityContainer Name="TestContext" m:IsDefaultEntityContainer="true"> + <EntitySet Name="EdmBinarySet" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmBinary" /> + <EntitySet Name="EdmBooleanSet" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmBoolean" /> + <EntitySet Name="EdmByteSet" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmByte" /> + <EntitySet Name="EdmDateTimeSet" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmDateTime" /> + <EntitySet Name="EdmDecimalSet" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmDecimal" /> + <EntitySet Name="EdmDoubleSet" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmDouble" /> + <EntitySet Name="EdmSingleSet" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmSingle" /> + <EntitySet Name="EdmGuidSet" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmGuid" /> + <EntitySet Name="EdmInt16Set" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmInt16" /> + <EntitySet Name="EdmInt32Set" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmInt32" /> + <EntitySet Name="EdmInt64Set" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmInt64" /> + <EntitySet Name="EdmStringSet" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmString" /> + <EntitySet Name="EdmTimeSet" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmTime" /> + <EntitySet Name="EdmDateTimeOffsetSet" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.EdmDateTimeOffset" /> + <EntitySet Name="Folders" EntityType="Microsoft.Test.OData.Services.PrimitiveKeysService.Folder" /> + <AssociationSet Name="Folder_Parent" Association="Microsoft.Test.OData.Services.PrimitiveKeysService.Folder_Parent"> + <End Role="Folder" EntitySet="Folders" /> + <End Role="Parent" EntitySet="Folders" /> + </AssociationSet> + </EntityContainer> + <Annotations Target="Microsoft.Test.OData.Services.PrimitiveKeysService.TestContext"> + <ValueAnnotation Term="Com.Microsoft.Data.Services.Conventions.V1.UrlConventions" String="KeyAsSegment" /> + </Annotations> + </Schema> + </edmx:DataServices> +</edmx:Edmx> http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/fit/src/main/webapp/WEB-INF/applicationContext.xml ---------------------------------------------------------------------- diff --git a/fit/src/main/webapp/WEB-INF/applicationContext.xml b/fit/src/main/webapp/WEB-INF/applicationContext.xml index f228583..53605e9 100644 --- a/fit/src/main/webapp/WEB-INF/applicationContext.xml +++ b/fit/src/main/webapp/WEB-INF/applicationContext.xml @@ -42,6 +42,7 @@ <bean class="org.apache.olingo.fit.V3Services"/> <bean class="org.apache.olingo.fit.V3KeyAsSegment"/> <bean class="org.apache.olingo.fit.V3ActionOverloading"/> + <bean class="org.apache.olingo.fit.V3PrimitiveKeys"/> <bean class="org.apache.olingo.fit.V3OpenType"/> <bean class="org.apache.olingo.fit.V4Services"/> <bean class="org.apache.olingo.fit.V4KeyAsSegment"/> http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/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/4ad25f2a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/PropertyTestITCase.java ---------------------------------------------------------------------- diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/PropertyTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/PropertyTestITCase.java new file mode 100644 index 0000000..0296bac --- /dev/null +++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/PropertyTestITCase.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.olingo.fit.proxy.v3; + +import org.apache.olingo.ext.proxy.EntityContainerFactory; +import org.apache.olingo.fit.proxy.v3.staticservice.microsoft.test.odata.services.astoriadefaultservice.types.Driver; +import org.apache.olingo.fit.proxy.v3.staticservice.microsoft.test.odata.services.astoriadefaultservice.types.Order; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; + +import org.junit.Test; + +/** + * This is the unit test class to check actions overloading. + */ +public class PropertyTestITCase extends AbstractTestITCase { + + @Test + public void nullNullableProperty() { + Order order = container.getOrder().get(-8); + order.setCustomerId(null); + container.flush(); + + assertNull(container.getOrder().get(-8).getCustomerId()); + } + + @Test + public void nullNonNullableProperty() { + Driver driver = container.getDriver().get("2"); + driver.setBirthDate(null); + + try { + container.flush(); + fail(); + } catch (IllegalStateException e) { + // ignore and detach all + EntityContainerFactory.getContext().detachAll(); + } + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/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 new file mode 100644 index 0000000..e8f7158 --- /dev/null +++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/PropertyTestITCase.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.olingo.fit.proxy.v4; + +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; + +/** + * This is the unit test class to check actions overloading. + */ +public class PropertyTestITCase extends AbstractTestITCase { + + @Test + public void nullNullableProperty() { + Customer customer = container.getCustomers().get(1); + customer.setFirstName(null); + container.flush(); + + assertNull(container.getCustomers().get(1).getFirstName()); + } + + @Test + public void nullNonNullableProperty() { + final StoredPI storedPI = container.getStoredPIs().get(1000); + storedPI.setPIName(null); + + try { + container.flush(); + fail(); + } catch (IllegalStateException e) { + // ignore and detach all + EntityContainerFactory.getContext().detachAll(); + } + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/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 1438a3f..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 @@ -127,7 +127,7 @@ public class PrimitiveValueTest extends AbstractTest { setText(primitive).build(); assertEquals(EdmPrimitiveTypeKind.Time, value.asPrimitive().getTypeKind()); // performed cast to improve the check - assertEquals(primitive, value.asPrimitive().toCastValue(Duration.class).toString()); + assertEquals("-780670.5063807", value.asPrimitive().toCastValue(BigDecimal.class).toString()); } @Test http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/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 87944c0..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 @@ -25,7 +25,7 @@ import java.util.regex.Pattern; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -public final class EdmDuration extends SingletonPrimitiveType { +public class EdmDuration extends SingletonPrimitiveType { private static final Pattern PATTERN = Pattern.compile( "[-+]?P(?:(\\p{Digit}+)D)?(?:T(?:(\\p{Digit}+)H)?(?:(\\p{Digit}+)M)?" @@ -81,6 +81,7 @@ public final 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"); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/4ad25f2a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmTime.java ---------------------------------------------------------------------- diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmTime.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmTime.java index 8f52253..34ee020 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmTime.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmTime.java @@ -18,15 +18,10 @@ */ package org.apache.olingo.commons.core.edm.primitivetype; -import javax.xml.datatype.DatatypeFactory; -import javax.xml.datatype.Duration; - -import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; - /** * Implementation of the EDM primitive type Time. */ -public final class EdmTime extends SingletonPrimitiveType { +public final class EdmTime extends EdmDuration { private static final EdmTime INSTANCE = new EdmTime(); @@ -38,45 +33,4 @@ public final class EdmTime extends SingletonPrimitiveType { uriPrefix = "time'"; uriSuffix = "'"; } - - @Override - public Class<?> getDefaultType() { - return Duration.class; - } - - @Override - protected <T> T internalValueOfString(final String value, - final Boolean isNullable, final Integer maxLength, final Integer precision, - final Integer scale, final Boolean isUnicode, final Class<T> returnType) throws EdmPrimitiveTypeException { - - Duration duration = null; - try { - final DatatypeFactory dtFactory = DatatypeFactory.newInstance(); - duration = dtFactory.newDuration(value); - } catch (Exception e) { - throw new EdmPrimitiveTypeException("EdmPrimitiveTypeException.LITERAL_ILLEGAL_CONTENT.addContent(value)", e); - } - - if (returnType.isAssignableFrom(Duration.class)) { - return returnType.cast(duration); - } else { - throw new EdmPrimitiveTypeException( - "EdmPrimitiveTypeException.LITERAL_UNCONVERTIBLE_TO_VALUE_TYPE.addContent(value, returnType)"); - } - } - - @Override - protected <T> String internalValueToString(final T value, - final Boolean isNullable, final Integer maxLength, final Integer precision, - final Integer scale, final Boolean isUnicode) throws EdmPrimitiveTypeException { - - if (value instanceof Duration) { - final Duration duration = (Duration) value; - return duration.toString(); - } else { - throw new EdmPrimitiveTypeException( - "EdmPrimitiveTypeException.VALUE_TYPE_NOT_SUPPORTED.addContent(value.getClass())"); - } - - } }
