You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by il...@apache.org on 2014/07/21 16:43:13 UTC
git commit: Fixing ContextURL for contained entity sets
Repository: olingo-odata4
Updated Branches:
refs/heads/master 08218d4ed -> 3a060746c
Fixing ContextURL for contained entity sets
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/3a060746
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/3a060746
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/3a060746
Branch: refs/heads/master
Commit: 3a060746c35080f5319bd3e4c5b0935c8f2eeab4
Parents: 08218d4
Author: Francesco Chicchiriccò <--global>
Authored: Mon Jul 21 16:42:59 2014 +0200
Committer: Francesco Chicchiriccò <--global>
Committed: Mon Jul 21 16:42:59 2014 +0200
----------------------------------------------------------------------
.../core/serialization/AbstractODataBinder.java | 71 ++++++++++++++------
.../apache/olingo/client/core/v4/JSONTest.java | 33 +++++----
.../olingo/commons/api/data/ContextURL.java | 10 +--
.../olingo/commons/api/data/ContextURLTest.java | 53 ++++++++-------
4 files changed, 98 insertions(+), 69 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a060746/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java
index 4232496..afc32d0 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java
@@ -309,20 +309,51 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
odataLinked.addLink(new ODataInlineEntity(client.getServiceVersion(),
URIUtils.getURI(base, link.getHref()), ODataLinkType.ENTITY_NAVIGATION, link.getTitle(),
getODataEntity(new ResWrap<Entity>(
- inlineEntity.getBaseURI() == null ? null : inlineEntity.getBaseURI(),
- metadataETag,
- inlineEntity))));
+ inlineEntity.getBaseURI() == null ? null : inlineEntity.getBaseURI(),
+ metadataETag,
+ inlineEntity))));
} else {
odataLinked.addLink(new ODataInlineEntitySet(client.getServiceVersion(),
URIUtils.getURI(base, link.getHref()), ODataLinkType.ENTITY_SET_NAVIGATION, link.getTitle(),
getODataEntitySet(new ResWrap<EntitySet>(
- inlineEntitySet.getBaseURI() == null ? null : inlineEntitySet.getBaseURI(),
- metadataETag,
- inlineEntitySet))));
+ inlineEntitySet.getBaseURI() == null ? null : inlineEntitySet.getBaseURI(),
+ metadataETag,
+ inlineEntitySet))));
}
}
}
+ private EdmEntityType findEntityType(
+ final String entitySetOrSingletonOrType, final EdmEntityContainer container) {
+
+ EdmEntityType type = null;
+
+ final String firstToken = StringUtils.substringBefore(entitySetOrSingletonOrType, "/");
+ EdmBindingTarget bindingTarget = container.getEntitySet(firstToken);
+ if (bindingTarget == null) {
+ bindingTarget = container.getSingleton(firstToken);
+ }
+ if (bindingTarget != null) {
+ type = bindingTarget.getEntityType();
+ }
+
+ if (entitySetOrSingletonOrType.indexOf('/') != -1) {
+ final String[] splitted = entitySetOrSingletonOrType.split("/");
+ if (splitted.length > 1) {
+ for (int i = 1; i < splitted.length && type != null; i++) {
+ final EdmNavigationProperty navProp = type.getNavigationProperty(splitted[i]);
+ if (navProp == null) {
+ type = null;
+ } else {
+ type = navProp.getType();
+ }
+ }
+ }
+ }
+
+ return type;
+ }
+
/**
* Infer type name from various sources of information including Edm and context URL, if available.
*
@@ -340,19 +371,17 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
for (EdmSchema schema : edm.getSchemas()) {
final EdmEntityContainer container = schema.getEntityContainer();
if (container != null) {
- EdmBindingTarget bindingTarget = container.getEntitySet(contextURL.getEntitySetOrSingletonOrType());
- if (bindingTarget == null) {
- bindingTarget = container.getSingleton(contextURL.getEntitySetOrSingletonOrType());
- }
- if (bindingTarget != null) {
+ final EdmEntityType entityType = findEntityType(contextURL.getEntitySetOrSingletonOrType(), container);
+
+ if (entityType != null) {
if (contextURL.getNavOrPropertyPath() == null) {
- type = bindingTarget.getEntityType();
+ type = entityType;
} else {
- final EdmNavigationProperty navProp = bindingTarget.getEntityType().
- getNavigationProperty(contextURL.getNavOrPropertyPath());
+ final EdmNavigationProperty navProp =
+ entityType.getNavigationProperty(contextURL.getNavOrPropertyPath());
type = navProp == null
- ? bindingTarget.getEntityType()
+ ? entityType
: navProp.getType();
}
}
@@ -397,7 +426,7 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
final CommonODataEntity entity = resource.getPayload().getSelfLink() == null
? client.getObjectFactory().newEntity(typeName)
: client.getObjectFactory().newEntity(typeName,
- URIUtils.getURI(base, resource.getPayload().getSelfLink().getHref()));
+ URIUtils.getURI(base, resource.getPayload().getSelfLink().getHref()));
if (StringUtils.isNotBlank(resource.getPayload().getETag())) {
entity.setETag(resource.getPayload().getETag());
@@ -489,15 +518,15 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
value = client.getObjectFactory().newPrimitiveValueBuilder()
.setValue(valuable.asGeospatial())
.setType(type == null
- || EdmPrimitiveTypeKind.Geography.getFullQualifiedName().equals(type)
- || EdmPrimitiveTypeKind.Geometry.getFullQualifiedName().equals(type)
- ? valuable.asGeospatial().getEdmPrimitiveTypeKind()
- : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), type.toString())).build();
+ || EdmPrimitiveTypeKind.Geography.getFullQualifiedName().equals(type)
+ || EdmPrimitiveTypeKind.Geometry.getFullQualifiedName().equals(type)
+ ? valuable.asGeospatial().getEdmPrimitiveTypeKind()
+ : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), type.toString())).build();
} else if (valuable.isPrimitive() || valuable.getValueType() == null) {
value = client.getObjectFactory().newPrimitiveValueBuilder()
.setValue(valuable.asPrimitive())
.setType(type == null || !EdmPrimitiveType.EDM_NAMESPACE.equals(type.getNamespace()) ? null
- : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), type.toString())).build();
+ : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), type.toString())).build();
} else if (valuable.isComplex() || valuable.isLinkedComplex()) {
value = client.getObjectFactory().newComplexValue(type == null ? null : type.toString());
if (!valuable.isNull()) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a060746/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java
index b46f422..277aff0 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java
@@ -18,6 +18,10 @@
*/
package org.apache.olingo.client.core.v4;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -30,7 +34,6 @@ import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.commons.api.format.ODataFormat;
import org.junit.Test;
-
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.util.ArrayList;
@@ -38,10 +41,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
public class JSONTest extends AbstractTest {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@@ -94,11 +93,11 @@ public class JSONTest extends AbstractTest {
final String key = field.getKey();
if (key.charAt(0) == '#'
- || key.endsWith(version.getJsonName(ODataServiceVersion.JsonKey.TYPE))
- || key.endsWith(version.getJsonName(ODataServiceVersion.JsonKey.MEDIA_EDIT_LINK))
- || key.endsWith(version.getJsonName(ODataServiceVersion.JsonKey.MEDIA_CONTENT_TYPE))
- || key.endsWith(version.getJsonName(ODataServiceVersion.JsonKey.ASSOCIATION_LINK))
- || key.endsWith(version.getJsonName(ODataServiceVersion.JsonKey.MEDIA_ETAG))) {
+ || key.endsWith(version.getJsonName(ODataServiceVersion.JsonKey.TYPE))
+ || key.endsWith(version.getJsonName(ODataServiceVersion.JsonKey.MEDIA_EDIT_LINK))
+ || key.endsWith(version.getJsonName(ODataServiceVersion.JsonKey.MEDIA_CONTENT_TYPE))
+ || key.endsWith(version.getJsonName(ODataServiceVersion.JsonKey.ASSOCIATION_LINK))
+ || key.endsWith(version.getJsonName(ODataServiceVersion.JsonKey.MEDIA_ETAG))) {
toRemove.add(key);
} else if (field.getValue().isObject()) {
@@ -117,8 +116,8 @@ public class JSONTest extends AbstractTest {
protected void assertSimilar(final String filename, final String actual) throws Exception {
final JsonNode expected = OBJECT_MAPPER.readTree(IOUtils.toString(getClass().getResourceAsStream(filename)).
- replace(getClient().getServiceVersion().getJsonName(ODataServiceVersion.JsonKey.NAVIGATION_LINK),
- Constants.JSON_BIND_LINK_SUFFIX));
+ replace(getClient().getServiceVersion().getJsonName(ODataServiceVersion.JsonKey.NAVIGATION_LINK),
+ Constants.JSON_BIND_LINK_SUFFIX));
cleanup((ObjectNode) expected);
final ObjectNode actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes()));
cleanup(actualNode);
@@ -128,7 +127,7 @@ public class JSONTest extends AbstractTest {
protected void entitySet(final String filename, final ODataFormat format) throws Exception {
final StringWriter writer = new StringWriter();
getClient().getSerializer(format).write(writer, getClient().getDeserializer(format).toEntitySet(
- getClass().getResourceAsStream(filename + "." + getSuffix(format))).getPayload());
+ getClass().getResourceAsStream(filename + "." + getSuffix(format))).getPayload());
assertSimilar(filename + "." + getSuffix(format), writer.toString());
}
@@ -142,7 +141,7 @@ public class JSONTest extends AbstractTest {
protected void entity(final String filename, final ODataFormat format) throws Exception {
final StringWriter writer = new StringWriter();
getClient().getSerializer(format).write(writer, getClient().getDeserializer(format).toEntity(
- getClass().getResourceAsStream(filename + "." + getSuffix(format))).getPayload());
+ getClass().getResourceAsStream(filename + "." + getSuffix(format))).getPayload());
assertSimilar(filename + "." + getSuffix(format), writer.toString());
}
@@ -169,7 +168,7 @@ public class JSONTest extends AbstractTest {
protected void property(final String filename, final ODataFormat format) throws Exception {
final StringWriter writer = new StringWriter();
getClient().getSerializer(format).write(writer, getClient().getDeserializer(format).
- toProperty(getClass().getResourceAsStream(filename + "." + getSuffix(format))).getPayload());
+ toProperty(getClass().getResourceAsStream(filename + "." + getSuffix(format))).getPayload());
assertSimilar(filename + "." + getSuffix(format), writer.toString());
}
@@ -185,12 +184,12 @@ public class JSONTest extends AbstractTest {
@Test
public void crossjoin() throws Exception {
assertNotNull(getClient().getDeserializer(ODataFormat.JSON_FULL_METADATA).toEntitySet(
- getClass().getResourceAsStream("crossjoin.json")));
+ getClass().getResourceAsStream("crossjoin.json")));
}
protected void delta(final String filename, final ODataFormat format) throws Exception {
final Delta delta = getClient().getDeserializer(format).toDelta(
- getClass().getResourceAsStream(filename + "." + getSuffix(format))).getPayload();
+ getClass().getResourceAsStream(filename + "." + getSuffix(format))).getPayload();
assertNotNull(delta);
assertNotNull(delta.getDeltaLink());
assertEquals(5, delta.getCount(), 0);
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a060746/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/ContextURL.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/ContextURL.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/ContextURL.java
index 6ee284c..91ab86f 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/ContextURL.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/ContextURL.java
@@ -82,19 +82,15 @@ public class ContextURL {
} else if (contextURLasString.endsWith("/$ref")) {
instance.suffix = Suffix.REFERENCE;
contextURLasString = contextURLasString.replace("/$ref", StringUtils.EMPTY);
-
} else if (contextURLasString.endsWith("/$delta")) {
instance.suffix = Suffix.DELTA;
contextURLasString = contextURLasString.replace("/$delta", StringUtils.EMPTY);
-
} else if (contextURLasString.endsWith("/$deletedEntity")) {
instance.suffix = Suffix.DELTA_DELETED_ENTITY;
contextURLasString = contextURLasString.replace("/$deletedEntity", StringUtils.EMPTY);
-
} else if (contextURLasString.endsWith("/$link")) {
instance.suffix = Suffix.DELTA_LINK;
contextURLasString = contextURLasString.replace("/$link", StringUtils.EMPTY);
-
} else if (contextURLasString.endsWith("/$deletedLink")) {
instance.suffix = Suffix.DELTA_DELETED_LINK;
contextURLasString = contextURLasString.replace("/$deletedLink", StringUtils.EMPTY);
@@ -125,8 +121,8 @@ public class ContextURL {
}
}
- final int slashIdx = instance.entitySetOrSingletonOrType.indexOf('/');
- if (slashIdx != -1) {
+ final int slashIdx = instance.entitySetOrSingletonOrType.lastIndexOf('/');
+ if (slashIdx != -1 && instance.entitySetOrSingletonOrType.substring(slashIdx + 1).indexOf('.') != -1) {
final String clone = instance.entitySetOrSingletonOrType;
instance.entitySetOrSingletonOrType = clone.substring(0, slashIdx);
instance.derivedEntity = clone.substring(slashIdx + 1);
@@ -226,7 +222,7 @@ public class ContextURL {
}
public ContextURL build() {
- StringBuilder result = new StringBuilder();
+ final StringBuilder result = new StringBuilder();
if (contextURL.serviceRoot != null) {
result.append(contextURL.serviceRoot);
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3a060746/lib/commons-api/src/test/java/org/apache/olingo/commons/api/data/ContextURLTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/test/java/org/apache/olingo/commons/api/data/ContextURLTest.java b/lib/commons-api/src/test/java/org/apache/olingo/commons/api/data/ContextURLTest.java
index 6317d66..abef744 100644
--- a/lib/commons-api/src/test/java/org/apache/olingo/commons/api/data/ContextURLTest.java
+++ b/lib/commons-api/src/test/java/org/apache/olingo/commons/api/data/ContextURLTest.java
@@ -18,6 +18,11 @@
*/
package org.apache.olingo.commons.api.data;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
import org.apache.olingo.commons.api.data.ContextURL.Suffix;
import org.apache.olingo.commons.api.edm.EdmEntitySet;
import org.apache.olingo.commons.api.edm.EdmEntityType;
@@ -27,11 +32,6 @@ import org.mockito.Mockito;
import java.net.URI;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
public class ContextURLTest {
@Test
@@ -52,6 +52,11 @@ public class ContextURLTest {
assertNull(contextURL.getSelectList());
assertEquals("Items", contextURL.getNavOrPropertyPath());
assertFalse(contextURL.isEntity());
+
+ contextURL = ContextURL.getInstance(URI.create("http://host/service/$metadata#Me/Folders('Inbox')/Messages"));
+
+ assertEquals("Me/Folders", contextURL.getEntitySetOrSingletonOrType());
+ assertEquals("Messages", contextURL.getNavOrPropertyPath());
}
@Test
@@ -96,7 +101,7 @@ public class ContextURLTest {
@Test
public void collectionOfDerivedEntities() {
final ContextURL contextURL = ContextURL.getInstance(
- URI.create("http://host/service/$metadata#Customers/Model.VipCustomer"));
+ URI.create("http://host/service/$metadata#Customers/Model.VipCustomer"));
assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
assertEquals("Model.VipCustomer", contextURL.getDerivedEntity());
@@ -108,7 +113,7 @@ public class ContextURLTest {
@Test
public void derivedEntity() {
final ContextURL contextURL = ContextURL.getInstance(
- URI.create("http://host/service/$metadata#Customers/Model.VipCustomer/$entity"));
+ URI.create("http://host/service/$metadata#Customers/Model.VipCustomer/$entity"));
assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
assertEquals("Model.VipCustomer", contextURL.getDerivedEntity());
@@ -120,7 +125,7 @@ public class ContextURLTest {
@Test
public void collectionOfProjectedEntities() {
final ContextURL contextURL = ContextURL.getInstance(
- URI.create("http://host/service/$metadata#Customers(Address,Orders)"));
+ URI.create("http://host/service/$metadata#Customers(Address,Orders)"));
assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
assertNull(contextURL.getDerivedEntity());
@@ -132,7 +137,7 @@ public class ContextURLTest {
@Test
public void projectedEntity() {
ContextURL contextURL = ContextURL.getInstance(
- URI.create("http://host/service/$metadata#Customers(Name,Rating)/$entity"));
+ URI.create("http://host/service/$metadata#Customers(Name,Rating)/$entity"));
assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
assertNull(contextURL.getDerivedEntity());
@@ -141,7 +146,7 @@ public class ContextURLTest {
assertTrue(contextURL.isEntity());
contextURL = ContextURL.getInstance(
- URI.create("http://host/service/$metadata#Customers(Name,Address/Country)"));
+ URI.create("http://host/service/$metadata#Customers(Name,Address/Country)"));
assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
assertNull(contextURL.getDerivedEntity());
@@ -153,8 +158,8 @@ public class ContextURLTest {
@Test
public void collectionOfProjectedExpandedEntities() {
final ContextURL contextURL = ContextURL.getInstance(
- URI.create("http://host/service/$metadata#Employees/"
- + "Sales.Manager(DirectReports,DirectReports+(FirstName,LastName))"));
+ URI.create("http://host/service/$metadata#Employees/"
+ + "Sales.Manager(DirectReports,DirectReports+(FirstName,LastName))"));
assertEquals("Employees", contextURL.getEntitySetOrSingletonOrType());
assertEquals("Sales.Manager", contextURL.getDerivedEntity());
@@ -166,7 +171,7 @@ public class ContextURLTest {
@Test
public void propertyValue() {
final ContextURL contextURL = ContextURL.getInstance(
- URI.create("http://host/service/$metadata#Customers(1)/Addresses"));
+ URI.create("http://host/service/$metadata#Customers(1)/Addresses"));
assertEquals("Customers", contextURL.getEntitySetOrSingletonOrType());
assertNull(contextURL.getDerivedEntity());
@@ -178,7 +183,7 @@ public class ContextURLTest {
@Test
public void CollectionOfComplexOrPrimitiveTypes() {
final ContextURL contextURL = ContextURL.getInstance(
- URI.create("http://host/service/$metadata#Collection(Edm.String)"));
+ URI.create("http://host/service/$metadata#Collection(Edm.String)"));
assertEquals("Collection(Edm.String)", contextURL.getEntitySetOrSingletonOrType());
assertNull(contextURL.getDerivedEntity());
@@ -260,8 +265,8 @@ public class ContextURLTest {
EdmEntitySet entitySet = Mockito.mock(EdmEntitySet.class);
Mockito.when(entitySet.getName()).thenReturn("Customers");
ContextURL contextURL = ContextURL.create().serviceRoot(URI.create("http://host/service/"))
- .entitySet(entitySet)
- .build();
+ .entitySet(entitySet)
+ .build();
assertEquals("http://host/service/$metadata#Customers", contextURL.getURI().toASCIIString());
}
@@ -272,9 +277,9 @@ public class ContextURLTest {
EdmEntityType derivedType = Mockito.mock(EdmEntityType.class);
Mockito.when(derivedType.getFullQualifiedName()).thenReturn(new FullQualifiedName("Model", "VipCustomer"));
ContextURL contextURL = ContextURL.create().serviceRoot(URI.create("http://host/service/"))
- .entitySet(entitySet)
- .derived(derivedType)
- .build();
+ .entitySet(entitySet)
+ .derived(derivedType)
+ .build();
assertEquals("http://host/service/$metadata#Customers/Model.VipCustomer", contextURL.getURI().toASCIIString());
}
@@ -292,12 +297,12 @@ public class ContextURLTest {
EdmEntityType derivedType = Mockito.mock(EdmEntityType.class);
Mockito.when(derivedType.getFullQualifiedName()).thenReturn(new FullQualifiedName("Model", "VipCustomer"));
ContextURL contextURL = ContextURL.create().serviceRoot(URI.create("http://host/service/"))
- .entitySet(entitySet)
- .derived(derivedType)
- .suffix(Suffix.ENTITY)
- .build();
+ .entitySet(entitySet)
+ .derived(derivedType)
+ .suffix(Suffix.ENTITY)
+ .build();
assertEquals("http://host/service/$metadata#Customers/Model.VipCustomer/$entity",
- contextURL.getURI().toASCIIString());
+ contextURL.getURI().toASCIIString());
}
@Test(expected = IllegalArgumentException.class)