| /* |
| * 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.client.core; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNotNull; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.InputStream; |
| import java.io.StringWriter; |
| import java.net.URI; |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.apache.commons.io.IOUtils; |
| import org.apache.http.HttpEntity; |
| import org.apache.http.util.EntityUtils; |
| import org.apache.olingo.client.api.data.ResWrap; |
| import org.apache.olingo.client.api.domain.ClientAnnotation; |
| import org.apache.olingo.client.api.domain.ClientCollectionValue; |
| import org.apache.olingo.client.api.domain.ClientComplexValue; |
| import org.apache.olingo.client.api.domain.ClientEntity; |
| import org.apache.olingo.client.api.domain.ClientEnumValue; |
| import org.apache.olingo.client.api.domain.ClientLink; |
| import org.apache.olingo.client.api.domain.ClientOperation; |
| import org.apache.olingo.client.api.domain.ClientPrimitiveValue; |
| import org.apache.olingo.client.api.domain.ClientProperty; |
| import org.apache.olingo.client.api.domain.ClientValue; |
| import org.apache.olingo.client.core.domain.ClientAnnotationImpl; |
| import org.apache.olingo.client.core.serialization.JsonDeserializer; |
| import org.apache.olingo.client.core.serialization.JsonSerializer; |
| import org.apache.olingo.client.core.uri.URIUtils; |
| import org.apache.olingo.commons.api.Constants; |
| import org.apache.olingo.commons.api.data.ComplexValue; |
| import org.apache.olingo.commons.api.data.Delta; |
| import org.apache.olingo.commons.api.data.Entity; |
| import org.apache.olingo.commons.api.data.EntityCollection; |
| import org.apache.olingo.commons.api.data.Link; |
| import org.apache.olingo.commons.api.data.Property; |
| import org.apache.olingo.commons.api.data.ValueType; |
| import org.apache.olingo.commons.api.edm.EdmPrimitiveType; |
| import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; |
| import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; |
| import org.apache.olingo.commons.api.edm.FullQualifiedName; |
| import org.apache.olingo.commons.api.format.ContentType; |
| import org.junit.Test; |
| |
| import com.fasterxml.jackson.databind.JsonNode; |
| import com.fasterxml.jackson.databind.ObjectMapper; |
| import com.fasterxml.jackson.databind.node.ObjectNode; |
| |
| public class JSONTest extends AbstractTest { |
| |
| private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); |
| |
| protected ContentType getODataPubFormat() { |
| return ContentType.JSON; |
| } |
| |
| protected ContentType getODataFormat() { |
| return ContentType.JSON; |
| } |
| |
| protected ContentType getODataMetadataFullFormat() { |
| return ContentType.JSON_FULL_METADATA; |
| } |
| |
| protected ContentType getODataMetadataNoneFormat() { |
| return ContentType.JSON_NO_METADATA; |
| } |
| |
| private void cleanup(final ObjectNode node, boolean isServerMode) { |
| if (!isServerMode) { |
| if (node.has(Constants.JSON_CONTEXT)) { |
| node.remove(Constants.JSON_CONTEXT); |
| } |
| if (node.has(Constants.JSON_ETAG)) { |
| node.remove(Constants.JSON_ETAG); |
| } |
| if (node.has(Constants.JSON_COUNT)) { |
| node.remove(Constants.JSON_COUNT); |
| } |
| } |
| if (node.has(Constants.JSON_TYPE)) { |
| node.remove(Constants.JSON_TYPE); |
| } |
| if (node.has(Constants.JSON_EDIT_LINK)) { |
| node.remove(Constants.JSON_EDIT_LINK); |
| } |
| if (node.has(Constants.JSON_READ_LINK)) { |
| node.remove(Constants.JSON_READ_LINK); |
| } |
| if (node.has(Constants.JSON_MEDIA_EDIT_LINK)) { |
| node.remove(Constants.JSON_MEDIA_EDIT_LINK); |
| } |
| if (node.has(Constants.JSON_MEDIA_READ_LINK)) { |
| node.remove(Constants.JSON_MEDIA_READ_LINK); |
| } |
| if (node.has(Constants.JSON_MEDIA_CONTENT_TYPE)) { |
| node.remove(Constants.JSON_MEDIA_CONTENT_TYPE); |
| } |
| if (node.has(Constants.JSON_ID)) { |
| node.remove(Constants.JSON_ID); |
| } |
| final List<String> toRemove = new ArrayList<String>(); |
| for (final Iterator<Map.Entry<String, JsonNode>> itor = node.fields(); itor.hasNext();) { |
| final Map.Entry<String, JsonNode> field = itor.next(); |
| |
| final String key = field.getKey(); |
| if (key.charAt(0) == '#' |
| || key.endsWith(Constants.JSON_TYPE) |
| || key.endsWith(Constants.JSON_MEDIA_EDIT_LINK) |
| || key.endsWith(Constants.JSON_MEDIA_CONTENT_TYPE) |
| || key.endsWith(Constants.JSON_ASSOCIATION_LINK) |
| || key.endsWith(Constants.JSON_MEDIA_ETAG) |
| || key.endsWith(Constants.JSON_BIND_LINK_SUFFIX)) { |
| |
| toRemove.add(key); |
| } else if (field.getValue().isObject()) { |
| cleanup((ObjectNode) field.getValue(), false); |
| } else if (field.getValue().isArray()) { |
| for (final Iterator<JsonNode> arrayItems = field.getValue().elements(); arrayItems.hasNext();) { |
| final JsonNode arrayItem = arrayItems.next(); |
| if (arrayItem.isObject()) { |
| cleanup((ObjectNode) arrayItem, false); |
| } |
| } |
| } |
| } |
| node.remove(toRemove); |
| } |
| |
| private void cleanupWithFullMetadata(final ObjectNode node, boolean isServerMode) { |
| if (!isServerMode) { |
| if (node.has(Constants.JSON_CONTEXT)) { |
| node.remove(Constants.JSON_CONTEXT); |
| } |
| if (node.has(Constants.JSON_ETAG)) { |
| node.remove(Constants.JSON_ETAG); |
| } |
| if (node.has(Constants.JSON_COUNT)) { |
| node.remove(Constants.JSON_COUNT); |
| } |
| if (node.has(Constants.JSON_EDIT_LINK)) { |
| node.remove(Constants.JSON_EDIT_LINK); |
| } |
| if (node.has(Constants.JSON_MEDIA_READ_LINK)) { |
| node.remove(Constants.JSON_MEDIA_READ_LINK); |
| } |
| } |
| |
| if (node.has(Constants.JSON_READ_LINK)) { |
| node.remove(Constants.JSON_READ_LINK); |
| } |
| |
| if (node.has(Constants.JSON_MEDIA_CONTENT_TYPE)) { |
| node.remove(Constants.JSON_MEDIA_CONTENT_TYPE); |
| } |
| if (node.has(Constants.JSON_MEDIA_ETAG)) { |
| node.remove(Constants.JSON_MEDIA_ETAG); |
| } |
| final List<String> toRemove = new ArrayList<String>(); |
| for (final Iterator<Map.Entry<String, JsonNode>> itor = node.fields(); itor.hasNext();) { |
| final Map.Entry<String, JsonNode> field = itor.next(); |
| |
| final String key = field.getKey(); |
| if (key.charAt(0) == '#' |
| || (!isServerMode && key.endsWith(Constants.JSON_TYPE)) |
| || (!isServerMode && key.endsWith(Constants.JSON_MEDIA_EDIT_LINK)) |
| || key.endsWith(Constants.JSON_MEDIA_CONTENT_TYPE) |
| || (!isServerMode && key.endsWith(Constants.JSON_ASSOCIATION_LINK)) |
| || key.endsWith(Constants.JSON_MEDIA_ETAG)) { |
| |
| toRemove.add(key); |
| } else if (field.getValue().isObject()) { |
| cleanup((ObjectNode) field.getValue(), false); |
| } else if (field.getValue().isArray()) { |
| for (final Iterator<JsonNode> arrayItems = field.getValue().elements(); arrayItems.hasNext();) { |
| final JsonNode arrayItem = arrayItems.next(); |
| if (arrayItem.isObject()) { |
| cleanup((ObjectNode) arrayItem, false); |
| } |
| } |
| } |
| } |
| node.remove(toRemove); |
| } |
| |
| |
| private void cleanupWithNoMetadata(final ObjectNode node, boolean isServerMode) { |
| if (node.has(Constants.JSON_CONTEXT)) { |
| node.remove(Constants.JSON_CONTEXT); |
| } |
| if (node.has(Constants.JSON_ETAG)) { |
| node.remove(Constants.JSON_ETAG); |
| } |
| if (node.has(Constants.JSON_ID)) { |
| node.remove(Constants.JSON_ID); |
| } |
| if (node.has(Constants.JSON_EDIT_LINK)) { |
| node.remove(Constants.JSON_EDIT_LINK); |
| } |
| if (node.has(Constants.JSON_MEDIA_READ_LINK)) { |
| node.remove(Constants.JSON_MEDIA_READ_LINK); |
| } |
| if (node.has(Constants.JSON_READ_LINK)) { |
| node.remove(Constants.JSON_READ_LINK); |
| } |
| |
| if (node.has(Constants.JSON_MEDIA_CONTENT_TYPE)) { |
| node.remove(Constants.JSON_MEDIA_CONTENT_TYPE); |
| } |
| final List<String> toRemove = new ArrayList<String>(); |
| for (final Iterator<Map.Entry<String, JsonNode>> itor = node.fields(); itor.hasNext();) { |
| final Map.Entry<String, JsonNode> field = itor.next(); |
| |
| final String key = field.getKey(); |
| if (key.charAt(0) == '#' |
| || key.endsWith(Constants.JSON_TYPE) |
| || key.endsWith(Constants.JSON_MEDIA_EDIT_LINK) |
| || key.endsWith(Constants.JSON_MEDIA_CONTENT_TYPE) |
| || key.endsWith(Constants.JSON_ASSOCIATION_LINK) |
| || key.endsWith(Constants.JSON_MEDIA_ETAG) |
| || key.endsWith(Constants.JSON_BIND_LINK_SUFFIX)) { |
| |
| toRemove.add(key); |
| } else if (field.getValue().isObject()) { |
| cleanup((ObjectNode) field.getValue(), false); |
| } else if (field.getValue().isArray()) { |
| for (final Iterator<JsonNode> arrayItems = field.getValue().elements(); arrayItems.hasNext();) { |
| final JsonNode arrayItem = arrayItems.next(); |
| if (arrayItem.isObject()) { |
| cleanup((ObjectNode) arrayItem, false); |
| } |
| } |
| } |
| } |
| node.remove(toRemove); |
| } |
| |
| protected void assertSimilar(final String filename, final String actual, |
| boolean isServerMode) throws Exception { |
| final JsonNode expected = OBJECT_MAPPER.readTree(IOUtils.toString(getClass().getResourceAsStream(filename)). |
| replace(Constants.JSON_NAVIGATION_LINK, Constants.JSON_BIND_LINK_SUFFIX)); |
| cleanup((ObjectNode) expected, isServerMode); |
| final ObjectNode actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes())); |
| cleanup(actualNode, isServerMode); |
| assertEquals(expected, actualNode); |
| } |
| |
| protected void assertSimilarWithFullMetadata(final String filename, final String actual, |
| boolean isServerMode) throws Exception { |
| String value = IOUtils.toString(getClass().getResourceAsStream(filename)); |
| final JsonNode expected = isServerMode ? OBJECT_MAPPER.readTree(value. |
| replace(Constants.JSON_MEDIA_EDIT_LINK, Constants.JSON_MEDIA_READ_LINK)) : |
| OBJECT_MAPPER.readTree(value. |
| replace(Constants.JSON_NAVIGATION_LINK, Constants.JSON_BIND_LINK_SUFFIX)); |
| cleanupWithFullMetadata((ObjectNode) expected, isServerMode); |
| final ObjectNode actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes())); |
| cleanupWithFullMetadata(actualNode, isServerMode); |
| assertEquals(expected, actualNode); |
| } |
| |
| protected void assertSimilarWithNoMetadata(final String filename, final String actual, |
| boolean isServerMode) throws Exception { |
| final JsonNode expected = OBJECT_MAPPER.readTree(IOUtils.toString(getClass().getResourceAsStream(filename)). |
| replace(Constants.JSON_NAVIGATION_LINK, Constants.JSON_BIND_LINK_SUFFIX)); |
| cleanupWithNoMetadata((ObjectNode) expected, isServerMode); |
| final ObjectNode actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes())); |
| cleanupWithNoMetadata(actualNode, isServerMode); |
| assertEquals(expected, actualNode); |
| } |
| |
| private void assertJSONSimilar(final String filename, final String actual) throws Exception { |
| final JsonNode expected = OBJECT_MAPPER.readTree(IOUtils.toString(getClass().getResourceAsStream(filename)). |
| replace(Constants.JSON_NAVIGATION_LINK, Constants.JSON_BIND_LINK_SUFFIX)); |
| cleanup((ObjectNode) expected, false); |
| final ObjectNode actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes())); |
| cleanup(actualNode, false); |
| assertEquals(expected, actualNode); |
| } |
| |
| protected void entitySet(final String filename, final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType).toEntitySet( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| |
| assertSimilar(filename + "." + getSuffix(contentType), writer.toString(), false); |
| } |
| |
| protected void entitySetWithFullMetadata(final String filename, |
| final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType).toEntitySet( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| |
| assertSimilarWithFullMetadata(filename + "." + getSuffix(contentType), writer.toString(), false); |
| } |
| |
| protected void entitySetWithNoMetadata(final String filename, |
| final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType).toEntitySet( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| |
| assertSimilarWithNoMetadata(filename + "." + getSuffix(contentType), writer.toString(), false); |
| } |
| |
| protected void entitySetInServerModeWithFullMetadata(final String filename, |
| final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| new JsonSerializer(true, contentType).write(writer, client.getDeserializer(contentType).toEntitySet( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType)))); |
| |
| assertSimilarWithFullMetadata(filename + "." + getSuffix(contentType), writer.toString(), true); |
| } |
| |
| protected void entitySetInServerModeWithNoMetadata(final String filename, |
| final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| new JsonSerializer(true, contentType).write(writer, client.getDeserializer(contentType).toEntitySet( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType)))); |
| |
| assertSimilarWithNoMetadata(filename + "." + getSuffix(contentType), writer.toString(), true); |
| } |
| |
| protected void entitySetInServerMode(final String filename, final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| if (contentType == ContentType.JSON) { |
| new JsonSerializer(true, contentType).write(writer, client.getDeserializer(contentType).toEntitySet( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType)))); |
| } else { |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType).toEntitySet( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| } |
| assertSimilar(filename + "." + getSuffix(contentType), writer.toString(), true); |
| } |
| |
| @Test |
| public void entitySets() throws Exception { |
| entitySet("Customers", getODataPubFormat()); |
| entitySetInServerMode("Customers", getODataPubFormat()); |
| entitySet("collectionOfEntityReferences", getODataPubFormat()); |
| entitySetInServerMode("collectionOfEntityReferences", getODataPubFormat()); |
| } |
| |
| @Test |
| public void entitySetsWithFullMetadata() throws Exception { |
| entitySetWithFullMetadata("Customers", getODataMetadataFullFormat()); |
| entitySetWithFullMetadata("collectionOfEntityReferences", getODataMetadataFullFormat()); |
| } |
| |
| @Test |
| public void entitySetsWithFullMetadataInServerMode() throws Exception { |
| entitySetInServerModeWithFullMetadata("Customers_InServerMode", getODataMetadataFullFormat()); |
| } |
| |
| @Test |
| public void entitySetsWithNoMetadata() throws Exception { |
| entitySetWithNoMetadata("Customers", getODataMetadataFullFormat()); |
| entitySetInServerModeWithNoMetadata("Customers", getODataMetadataFullFormat()); |
| entitySetWithNoMetadata("collectionOfEntityReferences", getODataMetadataFullFormat()); |
| entitySetInServerModeWithNoMetadata("collectionOfEntityReferences", getODataMetadataFullFormat()); |
| } |
| |
| protected void entity(final String filename, final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType).toEntity( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| assertSimilar(filename + "." + getSuffix(contentType), writer.toString(), false); |
| } |
| |
| protected void entityWithFullMetadata(final String filename, final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType).toEntity( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| assertSimilarWithFullMetadata(filename + "." + getSuffix(contentType), writer.toString(), false); |
| } |
| |
| protected void entityWithNoMetadata(final String filename, final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType).toEntity( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| assertSimilarWithNoMetadata(filename + "." + getSuffix(contentType), writer.toString(), false); |
| } |
| |
| |
| protected void entityInServerMode(final String filename, final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| if (contentType == ContentType.JSON) { |
| new JsonSerializer(true, contentType).write(writer, client.getDeserializer(contentType).toEntity( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType)))); |
| } else { |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType).toEntity( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| } |
| assertSimilar(filename + "." + getSuffix(contentType), writer.toString(), true); |
| } |
| |
| protected void entityWithFullMetadataInServerMode(final String filename, |
| final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| new JsonSerializer(true, contentType).write(writer, client.getDeserializer(contentType).toEntity( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType)))); |
| assertSimilarWithFullMetadata(filename + "." + getSuffix(contentType), writer.toString(), true); |
| } |
| |
| protected void entityWithNoMetadataInServerMode(final String filename, |
| final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| new JsonSerializer(true, contentType).write(writer, client.getDeserializer(contentType).toEntity( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType)))); |
| assertSimilarWithNoMetadata(filename + "." + getSuffix(contentType), writer.toString(), true); |
| } |
| |
| @Test |
| public void additionalEntities() throws Exception { |
| entity("entity.minimal", getODataPubFormat()); |
| entity("entity.primitive", getODataPubFormat()); |
| entity("entity.complex", getODataPubFormat()); |
| entity("entity.collection.primitive", getODataPubFormat()); |
| entity("entity.collection.complex", getODataPubFormat()); |
| } |
| |
| @Test |
| public void entities() throws Exception { |
| entity("Products_5", getODataPubFormat()); |
| entityInServerMode("Products_5", getODataPubFormat()); |
| entity("VipCustomer", getODataPubFormat()); |
| entityInServerMode("VipCustomer", getODataPubFormat()); |
| entity("Advertisements_f89dee73-af9f-4cd4-b330-db93c25ff3c7", getODataPubFormat()); |
| entityInServerMode("Advertisements_f89dee73-af9f-4cd4-b330-db93c25ff3c7", getODataPubFormat()); |
| entity("entityReference", getODataPubFormat()); |
| entityInServerMode("entityReference", getODataPubFormat()); |
| entity("entity.withcomplexnavigation", getODataPubFormat()); |
| entityInServerMode("entity.withcomplexnavigation", getODataPubFormat()); |
| entity("annotated", getODataPubFormat()); |
| entityInServerMode("annotated", getODataPubFormat()); |
| } |
| |
| @Test |
| public void entitiesWithMetadataFull() throws Exception { |
| entityWithFullMetadata("Products_5", getODataMetadataFullFormat()); |
| entityWithFullMetadata("VipCustomer", getODataMetadataFullFormat()); |
| entityWithFullMetadata("Advertisements_f89dee73-af9f-4cd4-b330-db93c25ff3c7", |
| getODataMetadataFullFormat()); |
| entityWithFullMetadata("entityReference", getODataMetadataFullFormat()); |
| entityWithFullMetadata("entity.withcomplexnavigation", getODataMetadataFullFormat()); |
| entityWithFullMetadata("annotated", getODataMetadataFullFormat()); |
| } |
| |
| @Test |
| public void entitiesWithMetadataFullInServerMode() throws Exception { |
| entityWithFullMetadataInServerMode("Products_5_InServerMode", getODataMetadataFullFormat()); |
| } |
| |
| @Test |
| public void entitiesWithMetadataNone() throws Exception { |
| entityWithNoMetadata("Products_5", getODataMetadataNoneFormat()); |
| entityWithNoMetadataInServerMode("Products_5", getODataMetadataNoneFormat()); |
| entityWithNoMetadata("VipCustomer", getODataMetadataNoneFormat()); |
| entityWithNoMetadataInServerMode("VipCustomer", getODataMetadataNoneFormat()); |
| entityWithNoMetadata("Advertisements_f89dee73-af9f-4cd4-b330-db93c25ff3c7", |
| getODataMetadataNoneFormat()); |
| entityWithNoMetadataInServerMode("Advertisements_f89dee73-af9f-4cd4-b330-db93c25ff3c7", |
| getODataMetadataNoneFormat()); |
| entityWithNoMetadata("entityReference", getODataMetadataNoneFormat()); |
| entityWithNoMetadataInServerMode("entityReference", getODataMetadataNoneFormat()); |
| entityWithNoMetadata("entity.withcomplexnavigation", getODataMetadataNoneFormat()); |
| entityWithNoMetadataInServerMode("entity.withcomplexnavigation", getODataMetadataNoneFormat()); |
| } |
| |
| protected void property(final String filename, final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType). |
| toProperty(getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| |
| assertSimilar(filename + "." + getSuffix(contentType), writer.toString(), false); |
| } |
| |
| protected void propertyWithNoMetadata(final String filename, |
| final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType). |
| toProperty(getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| |
| assertSimilarWithNoMetadata(filename + "." + getSuffix(contentType), writer.toString(), false); |
| } |
| |
| protected void propertyWithFullMetadata(final String filename, |
| final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType). |
| toProperty(getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| |
| assertSimilarWithFullMetadata(filename + "." + getSuffix(contentType), writer.toString(), false); |
| } |
| |
| protected void propertyInServerModeWithNoMetadata(final String filename, |
| final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| new JsonSerializer(true, contentType).write(writer, client.getDeserializer(contentType). |
| toProperty(getClass().getResourceAsStream(filename + "." + getSuffix(contentType)))); |
| |
| assertSimilarWithNoMetadata(filename + "." + getSuffix(contentType), writer.toString(), true); |
| } |
| |
| protected void propertyInServerModeWithFullMetadata(final String filename, |
| final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| new JsonSerializer(true, contentType).write(writer, client.getDeserializer(contentType). |
| toProperty(getClass().getResourceAsStream(filename + "." + getSuffix(contentType)))); |
| |
| if (filename.equals("Products_5_SkinColor_NullType")) { |
| assertEquals(writer.toString(), "{\"@odata.context\":" |
| + "\"http://odatae2etest.azurewebsites.net/javatest/DefaultService/$metadata#Products(5)/SkinColor\"," |
| + "\"@odata.type\":\"String\",\"odata.null\":true}"); |
| } else { |
| assertSimilarWithFullMetadata(filename + "." + getSuffix(contentType), writer.toString(), true); |
| } |
| } |
| |
| protected void propertyInServerMode(final String filename, final ContentType contentType) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| if (contentType == ContentType.JSON) { |
| new JsonSerializer(true, contentType).write(writer, client.getDeserializer(contentType). |
| toProperty(getClass().getResourceAsStream(filename + "." + getSuffix(contentType)))); |
| } else { |
| client.getSerializer(contentType).write(writer, client.getDeserializer(contentType). |
| toProperty(getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload()); |
| } |
| |
| assertSimilar(filename + "." + getSuffix(contentType), writer.toString(), true); |
| } |
| |
| @Test |
| public void properties() throws Exception { |
| property("Products_5_SkinColor", getODataFormat()); |
| propertyInServerMode("Products_5_SkinColor", getODataFormat()); |
| property("Products_5_CoverColors", getODataFormat()); |
| propertyInServerMode("Products_5_CoverColors", getODataFormat()); |
| property("Employees_3_HomeAddress", getODataFormat()); |
| propertyInServerMode("Employees_3_HomeAddress", getODataFormat()); |
| } |
| |
| @Test |
| public void propertiesWithNoMetadata() throws Exception { |
| propertyWithNoMetadata("Products_5_SkinColor", getODataMetadataNoneFormat()); |
| propertyInServerModeWithNoMetadata("Products_5_SkinColor", getODataMetadataNoneFormat()); |
| propertyWithNoMetadata("Products_5_CoverColors", getODataMetadataNoneFormat()); |
| propertyInServerModeWithNoMetadata("Products_5_CoverColors", getODataMetadataNoneFormat()); |
| propertyWithNoMetadata("Employees_3_HomeAddress", getODataMetadataNoneFormat()); |
| propertyInServerModeWithNoMetadata("Employees_3_HomeAddress", getODataMetadataNoneFormat()); |
| } |
| |
| @Test |
| public void propertiesWithFullMetadata() throws Exception { |
| propertyWithFullMetadata("Products_5_SkinColor", getODataMetadataFullFormat()); |
| propertyWithFullMetadata("Products_5_CoverColors", getODataMetadataFullFormat()); |
| propertyInServerModeWithFullMetadata("Products_5_CoverColors", getODataMetadataFullFormat()); |
| propertyWithFullMetadata("Employees_3_HomeAddress", getODataMetadataFullFormat()); |
| } |
| |
| @Test |
| public void propertiesWithFullMetadataInServerMode() throws Exception { |
| propertyInServerModeWithFullMetadata("Employees_3_HomeAddress_InServerMode", getODataMetadataFullFormat()); |
| propertyInServerModeWithFullMetadata("Products_5_SkinColor_Null", getODataMetadataFullFormat()); |
| propertyInServerModeWithFullMetadata("Products_5_SkinColor_NullType", getODataMetadataFullFormat()); |
| propertyInServerModeWithFullMetadata("Products_5_SkinColor_PrimitiveType", getODataMetadataFullFormat()); |
| } |
| |
| @Test |
| public void crossjoin() throws Exception { |
| assertNotNull(client.getDeserializer(ContentType.JSON_FULL_METADATA).toEntitySet( |
| getClass().getResourceAsStream("crossjoin.json"))); |
| } |
| |
| protected void delta(final String filename, final ContentType contentType) throws Exception { |
| final Delta delta = client.getDeserializer(contentType).toDelta( |
| getClass().getResourceAsStream(filename + "." + getSuffix(contentType))).getPayload(); |
| assertNotNull(delta); |
| assertNotNull(delta.getDeltaLink()); |
| assertEquals(5, delta.getCount(), 0); |
| |
| assertEquals(1, delta.getDeletedEntities().size()); |
| assertTrue(delta.getDeletedEntities().get(0).getId().toASCIIString().endsWith("Customers('ANTON')")); |
| |
| assertEquals(1, delta.getAddedLinks().size()); |
| assertTrue(delta.getAddedLinks().get(0).getSource().toASCIIString().endsWith("Customers('BOTTM')")); |
| assertEquals("Orders", delta.getAddedLinks().get(0).getRelationship()); |
| |
| assertEquals(1, delta.getDeletedLinks().size()); |
| assertTrue(delta.getDeletedLinks().get(0).getSource().toASCIIString().endsWith("Customers('ALFKI')")); |
| assertEquals("Orders", delta.getDeletedLinks().get(0).getRelationship()); |
| |
| assertEquals(2, delta.getEntities().size()); |
| Property property = delta.getEntities().get(0).getProperty("ContactName"); |
| assertNotNull(property); |
| assertTrue(property.isPrimitive()); |
| property = delta.getEntities().get(1).getProperty("ShippingAddress"); |
| assertNotNull(property); |
| assertTrue(property.isComplex()); |
| } |
| |
| @Test |
| public void deltas() throws Exception { |
| delta("delta", getODataPubFormat()); |
| } |
| |
| @Test |
| public void issueOLINGO390() throws Exception { |
| final ClientEntity message = client.getObjectFactory(). |
| newEntity(new FullQualifiedName("Microsoft.Exchange.Services.OData.Model.Message")); |
| |
| final ClientComplexValue toRecipient = client.getObjectFactory(). |
| newComplexValue("Microsoft.Exchange.Services.OData.Model.Recipient"); |
| toRecipient.add(client.getObjectFactory().newPrimitiveProperty("Name", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("challen_olingo_client"))); |
| toRecipient.add(client.getObjectFactory().newPrimitiveProperty("Address", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("challenh@microsoft.com"))); |
| final ClientCollectionValue<ClientValue> toRecipients = client.getObjectFactory(). |
| newCollectionValue("Microsoft.Exchange.Services.OData.Model.Recipient"); |
| toRecipients.add(toRecipient); |
| message.getProperties().add(client.getObjectFactory().newCollectionProperty("ToRecipients", toRecipients)); |
| |
| final ClientComplexValue body = |
| client.getObjectFactory().newComplexValue("Microsoft.Exchange.Services.OData.Model.ItemBody"); |
| body.add(client.getObjectFactory().newPrimitiveProperty("Content", |
| client.getObjectFactory().newPrimitiveValueBuilder(). |
| buildString("this is a simple email body content"))); |
| body.add(client.getObjectFactory().newEnumProperty("ContentType", |
| client.getObjectFactory().newEnumValue("Microsoft.Exchange.Services.OData.Model.BodyType", "text"))); |
| message.getProperties().add(client.getObjectFactory().newComplexProperty("Body", body)); |
| |
| String actual = IOUtils.toString(client.getWriter().writeEntity(message, ContentType.JSON)); |
| JsonNode expected = |
| OBJECT_MAPPER.readTree(IOUtils.toString(getClass().getResourceAsStream("olingo390.json")). |
| replace(Constants.JSON_NAVIGATION_LINK, Constants.JSON_BIND_LINK_SUFFIX)); |
| cleanup((ObjectNode) expected, false); |
| ObjectNode actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes())); |
| assertEquals(expected, actualNode); |
| |
| actual = IOUtils.toString(client.getWriter().writeEntity(message, ContentType.JSON_FULL_METADATA)); |
| expected = |
| OBJECT_MAPPER.readTree(IOUtils.toString(getClass().getResourceAsStream("olingo390.json")). |
| replace(Constants.JSON_NAVIGATION_LINK, Constants.JSON_BIND_LINK_SUFFIX)); |
| actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes())); |
| assertEquals(expected, actualNode); |
| } |
| |
| @Test |
| public void issue1OLINGO1073() throws Exception { |
| final ClientEntity message = client.getObjectFactory(). |
| newEntity(new FullQualifiedName("Microsoft.Exchange.Services.OData.Model.Entity")); |
| |
| final ClientComplexValue complType1 = client.getObjectFactory(). |
| newComplexValue("Microsoft.Exchange.Services.OData.Model.ComplexType1"); |
| complType1.add(client.getObjectFactory().newPrimitiveProperty("Name1", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("challen_olingo_client"))); |
| complType1.add(client.getObjectFactory().newPrimitiveProperty("Address1", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("challenh@microsoft.com"))); |
| |
| final ClientComplexValue complType2 = client.getObjectFactory(). |
| newComplexValue("Microsoft.Exchange.Services.OData.Model.ComplexType2"); |
| complType2.add(client.getObjectFactory().newPrimitiveProperty("Name2", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("challen_olingo_client"))); |
| complType2.add(client.getObjectFactory().newPrimitiveProperty("Address2", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("challenh@microsoft.com"))); |
| final ClientCollectionValue<ClientValue> toRecipients = client.getObjectFactory(). |
| newCollectionValue("Microsoft.Exchange.Services.OData.Model.Recipient"); |
| toRecipients.add(complType1); |
| toRecipients.add(complType2); |
| message.getProperties().add(client.getObjectFactory().newCollectionProperty("ToRecipients", toRecipients)); |
| |
| String actual = IOUtils.toString(client.getWriter().writeEntity(message, ContentType.JSON)); |
| JsonNode expected = |
| OBJECT_MAPPER.readTree(IOUtils.toString(getClass().getResourceAsStream("olingo1073.json")). |
| replace(Constants.JSON_NAVIGATION_LINK, Constants.JSON_BIND_LINK_SUFFIX)); |
| cleanup((ObjectNode) expected, false); |
| ObjectNode actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes())); |
| assertEquals(expected, actualNode); |
| |
| actual = IOUtils.toString(client.getWriter().writeEntity(message, ContentType.JSON_FULL_METADATA)); |
| expected = |
| OBJECT_MAPPER.readTree(IOUtils.toString(getClass().getResourceAsStream("olingo1073.json")). |
| replace(Constants.JSON_NAVIGATION_LINK, Constants.JSON_BIND_LINK_SUFFIX)); |
| actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes())); |
| assertEquals(expected, actualNode); |
| } |
| |
| @Test |
| public void issue2OLINGO1073() throws Exception { |
| final ClientEntity message = client.getObjectFactory(). |
| newEntity(new FullQualifiedName("Microsoft.OData.SampleService.Models.TripPin.Person")); |
| |
| final ClientComplexValue cityComplexType = getCityComplexType(); |
| |
| final ClientComplexValue locationComplexType = client.getObjectFactory(). |
| newComplexValue("Microsoft.OData.SampleService.Models.TripPin.Location"); |
| locationComplexType.add(client.getObjectFactory().newPrimitiveProperty("Address", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln."))); |
| locationComplexType.add(client.getObjectFactory().newComplexProperty("City",cityComplexType)); |
| |
| final ClientComplexValue eventLocationComplexType = client.getObjectFactory(). |
| newComplexValue("Microsoft.OData.SampleService.Models.TripPin.EventLocation"); |
| eventLocationComplexType.add(client.getObjectFactory().newPrimitiveProperty("BuildingInfo", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln12."))); |
| eventLocationComplexType.add(client.getObjectFactory().newPrimitiveProperty("Address", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln12."))); |
| eventLocationComplexType.add(client.getObjectFactory().newComplexProperty("City",cityComplexType)); |
| |
| final ClientComplexValue airportLocationComplexType = client.getObjectFactory(). |
| newComplexValue("Microsoft.OData.SampleService.Models.TripPin.AirportLocation"); |
| airportLocationComplexType.add(client.getObjectFactory().newPrimitiveProperty("Address", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln123."))); |
| airportLocationComplexType.add(client.getObjectFactory().newComplexProperty("City",cityComplexType)); |
| |
| final ClientCollectionValue<ClientValue> collectionAddressInfo = client.getObjectFactory(). |
| newCollectionValue("Microsoft.OData.SampleService.Models.TripPin.Location"); |
| collectionAddressInfo.add(locationComplexType); |
| collectionAddressInfo.add(eventLocationComplexType); |
| collectionAddressInfo.add(airportLocationComplexType); |
| |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("UserName", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("russellwhyte"))); |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("FirstName", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("Russell"))); |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("LastName", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("Whyte"))); |
| |
| final ClientCollectionValue<ClientValue> emailCollectionValue = client.getObjectFactory(). |
| newCollectionValue("String"); |
| emailCollectionValue.add(client.getObjectFactory().newPrimitiveValueBuilder().buildString("Russell@example.com")); |
| emailCollectionValue.add(client.getObjectFactory().newPrimitiveValueBuilder().buildString("Russell@contoso.com")); |
| message.getProperties().add(client.getObjectFactory().newCollectionProperty("Emails", emailCollectionValue)); |
| |
| message.getProperties().add(client.getObjectFactory().newCollectionProperty("AddressInfo", collectionAddressInfo)); |
| message.getProperties().add(client.getObjectFactory().newEnumProperty("Gender", |
| client.getObjectFactory().newEnumValue("Microsoft.OData.SampleService.Models.TripPin.PersonGender", "Male"))); |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Concurrency", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildInt64(Long.valueOf("636293755917400747")))); |
| message.setId(URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/People('russellwhyte')")); |
| message.setETag("W/\"08D491CCBE417AAB\""); |
| message.setEditLink(URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/People('russellwhyte')")); |
| |
| String actual = IOUtils.toString(client.getWriter().writeEntity(message, ContentType.JSON)); |
| JsonNode expected = |
| OBJECT_MAPPER.readTree(IOUtils.toString(getClass().getResourceAsStream("olingo1073_1.json")). |
| replace(Constants.JSON_NAVIGATION_LINK, Constants.JSON_BIND_LINK_SUFFIX)); |
| cleanup((ObjectNode) expected, false); |
| ObjectNode actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes())); |
| assertEquals(expected, actualNode); |
| |
| actual = IOUtils.toString(client.getWriter().writeEntity(message, ContentType.JSON_FULL_METADATA)); |
| expected = |
| OBJECT_MAPPER.readTree(IOUtils.toString(getClass().getResourceAsStream("olingo1073_1.json")). |
| replace(Constants.JSON_NAVIGATION_LINK, Constants.JSON_BIND_LINK_SUFFIX)); |
| actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes())); |
| assertEquals(expected, actualNode); |
| } |
| |
| |
| /** |
| * @return ClientComplexValue |
| */ |
| private ClientComplexValue getCityComplexType() { |
| final ClientComplexValue cityComplexType = client.getObjectFactory(). |
| newComplexValue("Microsoft.OData.SampleService.Models.TripPin.City"); |
| cityComplexType.add(client.getObjectFactory().newPrimitiveProperty("CountryRegion", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("United States"))); |
| cityComplexType.add(client.getObjectFactory().newPrimitiveProperty("Name", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("Boise"))); |
| cityComplexType.add(client.getObjectFactory().newPrimitiveProperty("Region", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("ID"))); |
| return cityComplexType; |
| } |
| |
| @Test |
| public void issue3OLINGO1073() throws Exception { |
| final ClientEntity message = client.getObjectFactory(). |
| newEntity(new FullQualifiedName("Microsoft.OData.SampleService.Models.TripPin.Person")); |
| |
| final ClientComplexValue cityComplexType = getCityComplexType(); |
| |
| final ClientComplexValue locationComplexType = client.getObjectFactory(). |
| newComplexValue("Microsoft.OData.SampleService.Models.TripPin.Location"); |
| locationComplexType.add(client.getObjectFactory().newPrimitiveProperty("Address", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln."))); |
| locationComplexType.add(client.getObjectFactory().newComplexProperty("City",cityComplexType)); |
| |
| final ClientComplexValue eventLocationComplexType = client.getObjectFactory(). |
| newComplexValue("Microsoft.OData.SampleService.Models.TripPin.EventLocation"); |
| eventLocationComplexType.add(client.getObjectFactory().newPrimitiveProperty("BuildingInfo", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln12."))); |
| eventLocationComplexType.add(client.getObjectFactory().newPrimitiveProperty("Address", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln12."))); |
| eventLocationComplexType.add(client.getObjectFactory().newComplexProperty("City",cityComplexType)); |
| |
| final ClientComplexValue airportLocationComplexType = client.getObjectFactory(). |
| newComplexValue("Microsoft.OData.SampleService.Models.TripPin.AirportLocation"); |
| airportLocationComplexType.add(client.getObjectFactory().newPrimitiveProperty("Address", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln123."))); |
| airportLocationComplexType.add(client.getObjectFactory().newComplexProperty("City",cityComplexType)); |
| |
| final ClientCollectionValue<ClientValue> collectionAddressInfo = client.getObjectFactory(). |
| newCollectionValue("Microsoft.OData.SampleService.Models.TripPin.Location"); |
| collectionAddressInfo.add(locationComplexType); |
| collectionAddressInfo.add(eventLocationComplexType); |
| collectionAddressInfo.add(airportLocationComplexType); |
| |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("UserName", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("russellwhyte"))); |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("FirstName", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("Russell"))); |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("LastName", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("Whyte"))); |
| |
| final ClientCollectionValue<ClientValue> emailCollectionValue = client.getObjectFactory(). |
| newCollectionValue("String"); |
| emailCollectionValue.add(client.getObjectFactory().newPrimitiveValueBuilder().buildString("Russell@example.com")); |
| emailCollectionValue.add(client.getObjectFactory().newPrimitiveValueBuilder().buildString("Russell@contoso.com")); |
| message.getProperties().add(client.getObjectFactory().newCollectionProperty("Emails", emailCollectionValue)); |
| |
| message.getProperties().add(client.getObjectFactory().newCollectionProperty("AddressInfo", collectionAddressInfo)); |
| message.getProperties().add(client.getObjectFactory().newEnumProperty("Gender", |
| client.getObjectFactory().newEnumValue( |
| "Microsoft.OData.SampleService.Models.TripPin.PersonGender", "Male"))); |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Concurrency", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildInt64(Long.valueOf("636293755917400747")))); |
| message.setId(URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/People('russellwhyte')")); |
| message.setETag("W/\"08D491CCBE417AAB\""); |
| message.setEditLink(URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/People('russellwhyte')")); |
| |
| InputStream inputStream = client.getWriter().writeEntity(message, ContentType.JSON_FULL_METADATA); |
| ResWrap<Entity> entity = new JsonDeserializer(true).toEntity(inputStream); |
| assertNotNull(entity); |
| assertEquals(7, entity.getPayload().getProperties().size()); |
| assertEquals(3, entity.getPayload().getProperty("AddressInfo").asCollection().size()); |
| assertEquals("#Microsoft.OData.SampleService.Models.TripPin.Location", |
| ((ComplexValue)entity.getPayload().getProperty("AddressInfo").asCollection().get(0)).getTypeName()); |
| assertEquals("#Microsoft.OData.SampleService.Models.TripPin.EventLocation", |
| ((ComplexValue)entity.getPayload().getProperty("AddressInfo").asCollection().get(1)).getTypeName()); |
| assertEquals("#Microsoft.OData.SampleService.Models.TripPin.AirportLocation", |
| ((ComplexValue)entity.getPayload().getProperty("AddressInfo").asCollection().get(2)).getTypeName()); |
| assertEquals("Collection(Microsoft.OData.SampleService.Models.TripPin.Location)", |
| entity.getPayload().getProperty("AddressInfo").getType()); |
| } |
| |
| @Test |
| public void issue4OLINGO1073_WithAnnotations() throws Exception { |
| InputStream inputStream = getClass().getResourceAsStream( |
| "olingo1073_2" + "." + getSuffix(ContentType.APPLICATION_JSON)); |
| ClientEntity entity = client.getReader().readEntity(inputStream, ContentType.APPLICATION_JSON); |
| assertNotNull(entity); |
| assertEquals(7, entity.getProperties().size()); |
| assertEquals(1, entity.getAnnotations().size()); |
| assertEquals("com.contoso.PersonalInfo.PhoneNumbers", entity.getAnnotations().get(0).getTerm()); |
| assertEquals(2, entity.getAnnotations().get(0).getCollectionValue().size()); |
| |
| assertEquals("com.contoso.display.style", entity.getProperty("LastName"). |
| getAnnotations().get(0).getTerm()); |
| assertEquals(2, entity.getProperty("LastName"). |
| getAnnotations().get(0).getComplexValue().asComplex().asJavaMap().size()); |
| |
| assertEquals(3, entity.getProperty("AddressInfo").getCollectionValue().asCollection().size()); |
| assertEquals("Collection(Microsoft.OData.SampleService.Models.TripPin.Location)", |
| entity.getProperty("AddressInfo").getCollectionValue().asCollection().getTypeName()); |
| assertEquals(true, entity.getProperty("AddressInfo").getCollectionValue().isCollection()); |
| ClientCollectionValue<ClientValue> collectionValue = entity.getProperty("AddressInfo"). |
| getCollectionValue().asCollection(); |
| int i = 0; |
| for (ClientValue _value : collectionValue) { |
| if (i == 0) { |
| assertEquals("#Microsoft.OData.SampleService.Models.TripPin.Location", _value.getTypeName()); |
| assertEquals(2, _value.asComplex().asJavaMap().size()); |
| assertEquals("Microsoft.OData.SampleService.Models.TripPin.City", |
| _value.asComplex().get("City").getComplexValue().getTypeName()); |
| } else if (i == 1) { |
| assertEquals("#Microsoft.OData.SampleService.Models.TripPin.EventLocation", _value.getTypeName()); |
| assertEquals(3, _value.asComplex().asJavaMap().size()); |
| assertEquals("com.contoso.display.style", _value.asComplex().get("Address").getAnnotations().get(0).getTerm()); |
| assertEquals(2, _value.asComplex().get("Address").getAnnotations().get(0).getComplexValue().asJavaMap().size()); |
| } else if (i == 2) { |
| assertEquals("#Microsoft.OData.SampleService.Models.TripPin.AirportLocation", _value.getTypeName()); |
| assertEquals(3, _value.asComplex().asJavaMap().size()); |
| } |
| i++; |
| } |
| } |
| |
| @Test |
| public void testOLINGO1114() throws Exception { |
| ClientEntity entityIncNullValue = client.getObjectFactory() |
| .newEntity(new FullQualifiedName("Microsoft.Dynamics.CRM", "account")); |
| List<ClientProperty> properties = entityIncNullValue.getProperties(); |
| |
| // Property "name" |
| ClientPrimitiveValue.Builder valueBuilder = client.getObjectFactory().newPrimitiveValueBuilder(); |
| valueBuilder.setType(EdmPrimitiveTypeKind.String); |
| valueBuilder.setValue("testString"); |
| ClientProperty name = client.getObjectFactory().newPrimitiveProperty("name", valueBuilder.build()); |
| properties.add(name); |
| |
| // Property "testDecimal" |
| valueBuilder = client.getObjectFactory().newPrimitiveValueBuilder(); |
| valueBuilder.setType(EdmPrimitiveTypeKind.Decimal); |
| valueBuilder.setValue(null); |
| ClientProperty revenue = client.getObjectFactory().newPrimitiveProperty("testDecimal", valueBuilder.build()); |
| properties.add(revenue); |
| |
| // Property "testByte" |
| valueBuilder = client.getObjectFactory().newPrimitiveValueBuilder(); |
| valueBuilder.setType(EdmPrimitiveTypeKind.Byte); |
| valueBuilder.setValue(null); |
| ClientProperty testByte = client.getObjectFactory().newPrimitiveProperty("testByte", valueBuilder.build()); |
| properties.add(testByte); |
| |
| // Property "testDouble" |
| valueBuilder = client.getObjectFactory().newPrimitiveValueBuilder(); |
| valueBuilder.setType(EdmPrimitiveTypeKind.Double); |
| valueBuilder.setValue(null); |
| ClientProperty testDouble = client.getObjectFactory().newPrimitiveProperty("testDouble", valueBuilder.build()); |
| properties.add(testDouble); |
| |
| // Property "testInt64" |
| valueBuilder = client.getObjectFactory().newPrimitiveValueBuilder(); |
| valueBuilder.setType(EdmPrimitiveTypeKind.Int64); |
| valueBuilder.setValue(null); |
| ClientProperty testInt64 = client.getObjectFactory().newPrimitiveProperty("testInt64", valueBuilder.build()); |
| properties.add(testInt64); |
| |
| // Property "testInt32" |
| valueBuilder = client.getObjectFactory().newPrimitiveValueBuilder(); |
| valueBuilder.setType(EdmPrimitiveTypeKind.Int32); |
| valueBuilder.setValue(null); |
| ClientProperty testInt32 = client.getObjectFactory().newPrimitiveProperty("testInt32", valueBuilder.build()); |
| properties.add(testInt32); |
| |
| // Property "testInt16" |
| valueBuilder = client.getObjectFactory().newPrimitiveValueBuilder(); |
| valueBuilder.setType(EdmPrimitiveTypeKind.Int16); |
| valueBuilder.setValue(null); |
| ClientProperty testInt16 = client.getObjectFactory().newPrimitiveProperty("testInt16", valueBuilder.build()); |
| properties.add(testInt16); |
| |
| InputStream inputStream = client.getWriter().writeEntity(entityIncNullValue, ContentType.JSON_FULL_METADATA); |
| HttpEntity httpEntity = URIUtils.buildInputStreamEntity(client, inputStream); |
| |
| final String actual = EntityUtils.toString(httpEntity); |
| final JsonNode expected = |
| OBJECT_MAPPER.readTree(IOUtils.toString(getClass().getResourceAsStream("olingo1114.json")). |
| replace(Constants.JSON_NAVIGATION_LINK, Constants.JSON_BIND_LINK_SUFFIX)); |
| final ObjectNode actualNode = (ObjectNode) OBJECT_MAPPER.readTree(new ByteArrayInputStream(actual.getBytes())); |
| assertEquals(expected, actualNode); |
| } |
| |
| |
| @Test |
| public void issueOLINGO1152() throws Exception { |
| InputStream inputStream = getClass().getResourceAsStream( |
| "olingo1152" + "." + getSuffix(ContentType.APPLICATION_JSON)); |
| ClientEntity entity = client.getReader().readEntity(inputStream, ContentType.APPLICATION_JSON); |
| assertNotNull(entity); |
| ClientProperty prop = entity.getProperty("Gender"); |
| assertNotNull(prop); |
| ClientValue value = prop.getValue(); |
| assertNotNull(value); |
| assertTrue(value.asEnum() == null); |
| |
| } |
| |
| @Test |
| public void issue2OLINGO1073_WithEntitySet() throws Exception { |
| final ClientEntity message = createClientEntity(); |
| |
| InputStream inputStream = client.getWriter().writeEntity(message, ContentType.APPLICATION_JSON); |
| ResWrap<Entity> entity = new JsonDeserializer(false).toEntity(inputStream); |
| assertNotNull(entity); |
| |
| StringWriter writer = new StringWriter(); |
| setNavigationBindingLinkOnEntity(entity); |
| |
| client.getSerializer(ContentType.APPLICATION_JSON).write(writer, entity); |
| assertNotNull(writer.toString()); |
| writer = new StringWriter(); |
| client.getSerializer(ContentType.APPLICATION_JSON).write(writer, |
| new ResWrap<URI>(URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/"), null, |
| URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/People('russellwhyte')"))); |
| assertNotNull(writer.toString()); |
| assertEquals("{\"@odata.context\":\"http://services.odata.org/V4/(" |
| + "S(fe5rsnxo3fkkkk2bvmh1nl1y))/TripPinServiceRW/\",\"@odata.id\":" |
| + "\"http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/TripPinServiceRW/" |
| + "People('russellwhyte')\"}", writer.toString()); |
| |
| writer = new StringWriter(); |
| Link linkPayload = new Link(); |
| linkPayload.setBindingLink("Photos"); |
| linkPayload.setMediaETag("xyz"); |
| linkPayload.setInlineEntity(createEntity()); |
| linkPayload.setTitle("Photos"); |
| linkPayload.setHref("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/Photos"); |
| client.getSerializer(ContentType.APPLICATION_JSON).write(writer, |
| new ResWrap<Link>(URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/"), linkPayload.getMediaETag(), linkPayload)); |
| assertNotNull(writer.toString()); |
| assertEquals("{\"url\":\"http://services.odata.org/V4/" |
| + "(S(fe5rsnxo3fkkkk2bvmh1nl1y))/TripPinServiceRW/Photos\"}", writer.toString()); |
| } |
| |
| /** |
| * @return |
| */ |
| private ClientEntity createClientEntity() { |
| final ClientEntity message = client.getObjectFactory(). |
| newEntity(new FullQualifiedName("Microsoft.OData.SampleService.Models.TripPin.Person")); |
| |
| final ClientComplexValue cityComplexType = getCityComplexType(); |
| |
| final ClientComplexValue locationComplexType = client.getObjectFactory(). |
| newComplexValue("Microsoft.OData.SampleService.Models.TripPin.Location"); |
| locationComplexType.add(client.getObjectFactory().newPrimitiveProperty("Address", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln."))); |
| locationComplexType.add(client.getObjectFactory().newComplexProperty("City",cityComplexType)); |
| |
| final ClientComplexValue eventLocationComplexType = client.getObjectFactory(). |
| newComplexValue("Microsoft.OData.SampleService.Models.TripPin.EventLocation"); |
| eventLocationComplexType.add(client.getObjectFactory().newPrimitiveProperty("BuildingInfo", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln12."))); |
| eventLocationComplexType.add(client.getObjectFactory().newPrimitiveProperty("Address", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln12."))); |
| eventLocationComplexType.add(client.getObjectFactory().newComplexProperty("City",cityComplexType)); |
| |
| final ClientComplexValue airportLocationComplexType = client.getObjectFactory(). |
| newComplexValue("Microsoft.OData.SampleService.Models.TripPin.AirportLocation"); |
| airportLocationComplexType.add(client.getObjectFactory().newPrimitiveProperty("Address", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("187 Suffolk Ln123."))); |
| airportLocationComplexType.add(client.getObjectFactory().newComplexProperty("City",cityComplexType)); |
| |
| final ClientCollectionValue<ClientValue> collectionAddressInfo = client.getObjectFactory(). |
| newCollectionValue("Microsoft.OData.SampleService.Models.TripPin.Location"); |
| collectionAddressInfo.add(locationComplexType); |
| collectionAddressInfo.add(eventLocationComplexType); |
| collectionAddressInfo.add(airportLocationComplexType); |
| |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("UserName", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("russellwhyte"))); |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("FirstName", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("Russell"))); |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("LastName", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("Whyte"))); |
| final ClientLink messageLink1 = client.getObjectFactory().newEntityNavigationLink("Photo", |
| URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/People('russellwhyte')/Photo")); |
| final ClientAnnotation messageLink1Annotation = createAnnotation(); |
| messageLink1.getAnnotations().add(messageLink1Annotation); |
| |
| final ClientLink messageLink2 = client.getObjectFactory().newEntitySetNavigationLink("Friends", |
| URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/People('russellwhyte')/Friends")); |
| final ClientAnnotation messageLink2Annotation = createAnnotation(); |
| messageLink2.getAnnotations().add(messageLink2Annotation); |
| |
| final ClientLink messageLink3 = client.getObjectFactory().newEntitySetNavigationLink("Trips", |
| URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/People('russellwhyte')/Trips")); |
| final ClientAnnotation messageLink3Annotation = createAnnotation(); |
| messageLink3.getAnnotations().add(messageLink3Annotation); |
| |
| message.getNavigationLinks().add(messageLink1); |
| message.getNavigationLinks().add(messageLink2); |
| message.getNavigationLinks().add(messageLink3); |
| |
| final ClientAnnotation messageAnnotation = createAnnotation(); |
| message.getAnnotations().add(messageAnnotation); |
| |
| final ClientCollectionValue<ClientValue> emailCollectionValue = client.getObjectFactory(). |
| newCollectionValue("String"); |
| emailCollectionValue.add(client.getObjectFactory().newPrimitiveValueBuilder().buildString("Russell@example.com")); |
| emailCollectionValue.add(client.getObjectFactory().newPrimitiveValueBuilder().buildString("Russell@contoso.com")); |
| message.getProperties().add(client.getObjectFactory().newCollectionProperty("Emails", emailCollectionValue)); |
| |
| message.getProperties().add(client.getObjectFactory().newCollectionProperty("AddressInfo", collectionAddressInfo)); |
| message.getProperties().add(client.getObjectFactory().newEnumProperty("Gender", |
| client.getObjectFactory().newEnumValue( |
| "Microsoft.OData.SampleService.Models.TripPin.PersonGender", "Male"))); |
| message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Concurrency", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildInt64(Long.valueOf("636293755917400747")))); |
| message.setId(URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/People('russellwhyte')")); |
| message.setETag("W/\"08D491CCBE417AAB\""); |
| message.setEditLink(URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/People('russellwhyte')")); |
| |
| final ClientEntity innerEntity = client.getObjectFactory(). |
| newEntity(new FullQualifiedName("Microsoft.OData.SampleService.Models.TripPin.Photo")); |
| innerEntity.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Id", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildInt64(Long.valueOf(123)))); |
| innerEntity.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Name", |
| client.getObjectFactory().newPrimitiveValueBuilder().buildString("ABC"))); |
| innerEntity.getAnnotations().add(createAnnotation()); |
| final ClientLink link = client.getObjectFactory().newDeepInsertEntity("Photos", innerEntity); |
| final ClientAnnotation linkAnnotation = createAnnotation(); |
| link.getAnnotations().add(linkAnnotation); |
| message.getNavigationLinks().add(link); |
| |
| final ClientLink assoLink = client.getObjectFactory().newAssociationLink("Photos", |
| URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/People('russellwhyte')/Photo")); |
| final ClientAnnotation assoLinkAnnotation = createAnnotation(); |
| assoLink.getAnnotations().add(assoLinkAnnotation); |
| |
| message.getAssociationLinks().add(assoLink); |
| final ClientOperation operation = new ClientOperation(); |
| operation.setTarget(URI.create("http://services.odata.org/V4/(S(fe5rsnxo3fkkkk2bvmh1nl1y))/" |
| + "TripPinServiceRW/Photos")); |
| operation.setTitle("Photos"); |
| message.getOperations().add(operation); |
| return message; |
| } |
| |
| /** |
| * @param entity |
| */ |
| private void setNavigationBindingLinkOnEntity(ResWrap<Entity> entity) { |
| Link entityLink = new Link(); |
| Entity en = createEntity(); |
| |
| entityLink.setBindingLink("Photos"); |
| entityLink.setInlineEntity(en); |
| entityLink.setType("Microsoft.OData.SampleService.Models.TripPin.Photos"); |
| |
| Link entityColLink = new Link(); |
| EntityCollection enCol = new EntityCollection(); |
| enCol.getEntities().add(en); |
| |
| entityColLink.setBindingLink("Friends"); |
| entityColLink.setInlineEntitySet(enCol); |
| entityColLink.setType("Microsoft.OData.SampleService.Models.TripPin.Friends"); |
| |
| Link link = new Link(); |
| link.setBindingLink("Trips"); |
| link.setType("Microsoft.OData.SampleService.Models.TripPin.Trips"); |
| |
| entity.getPayload().getNavigationBindings().add(entityLink); |
| entity.getPayload().getNavigationBindings().add(entityColLink); |
| entity.getPayload().getNavigationBindings().add(link); |
| } |
| |
| /** |
| * @return |
| */ |
| private Entity createEntity() { |
| Entity en = new Entity(); |
| Property p1 = new Property(); |
| p1.setName("Id"); |
| p1.setType("Int64"); |
| p1.setValue(ValueType.PRIMITIVE, Long.valueOf(123)); |
| en.addProperty(p1); |
| |
| Property p2 = new Property(); |
| p2.setName("Name"); |
| p2.setType("String"); |
| p2.setValue(ValueType.PRIMITIVE, "ABC"); |
| en.addProperty(p2); |
| return en; |
| } |
| |
| /** |
| * @return |
| */ |
| private ClientAnnotation createAnnotation() { |
| final ClientAnnotation messageAnnotation = |
| new ClientAnnotationImpl("Org.OData.Core.V1.Permissions", new ClientPrimitiveValue() { |
| |
| @Override |
| public boolean isPrimitive() { |
| return false; |
| } |
| |
| @Override |
| public boolean isEnum() { |
| return true; |
| } |
| |
| @Override |
| public boolean isComplex() { |
| return false; |
| } |
| |
| @Override |
| public boolean isCollection() { |
| return false; |
| } |
| |
| @Override |
| public String getTypeName() { |
| return "String"; |
| } |
| |
| @Override |
| public ClientPrimitiveValue asPrimitive() { |
| return null; |
| } |
| |
| @Override |
| public ClientEnumValue asEnum() { |
| return client.getObjectFactory().newEnumValue("Org.OData.Core.V1.Permissions", "Read"); |
| } |
| |
| @Override |
| public ClientComplexValue asComplex() { |
| return null; |
| } |
| |
| @Override |
| public <T extends ClientValue> ClientCollectionValue<T> asCollection() { |
| return null; |
| } |
| |
| @Override |
| public Object toValue() { |
| return client.getObjectFactory().newEnumValue("Org.OData.Core.V1.Permissions", "Read"); |
| } |
| |
| @Override |
| public <T> T toCastValue(Class<T> reference) throws EdmPrimitiveTypeException { |
| return null; |
| } |
| |
| @Override |
| public EdmPrimitiveTypeKind getTypeKind() { |
| return null; |
| } |
| |
| @Override |
| public EdmPrimitiveType getType() { |
| return null; |
| } |
| }); |
| return messageAnnotation; |
| } |
| |
| protected void property1(final String filename) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(ContentType.APPLICATION_JSON).write(writer, |
| client.getDeserializer(ContentType.APPLICATION_JSON). |
| toProperty(getClass().getResourceAsStream(filename + ".json"))); |
| |
| assertJSONSimilar(filename + ".json", writer.toString()); |
| } |
| |
| @Test |
| public void properties1() throws Exception { |
| property1("Products_5_SkinColor"); |
| property1("Products_5_CoverColors"); |
| property1("Employees_3_HomeAddress"); |
| property1("Employees_3_HomeAddress"); |
| } |
| |
| protected void entity1(final String filename) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(ContentType.APPLICATION_JSON).write(writer, client.getDeserializer( |
| ContentType.APPLICATION_JSON).toEntity( |
| getClass().getResourceAsStream(filename + ".json"))); |
| assertJSONSimilar(filename + ".json", writer.toString()); |
| } |
| |
| @Test |
| public void additionalEntities1() throws Exception { |
| entity1("entity.minimal"); |
| entity1("entity.primitive"); |
| entity1("entity.complex"); |
| entity1("entity.collection.primitive"); |
| entity1("entity.collection.complex"); |
| } |
| |
| @Test |
| public void entities1() throws Exception { |
| entity1("Products_5"); |
| entity1("VipCustomer"); |
| entity1("Advertisements_f89dee73-af9f-4cd4-b330-db93c25ff3c7"); |
| entity1("entityReference"); |
| entity1("entity.withcomplexnavigation"); |
| entity1("annotated"); |
| } |
| |
| protected void entitySet1(final String filename) throws Exception { |
| final StringWriter writer = new StringWriter(); |
| client.getSerializer(ContentType.APPLICATION_JSON).write(writer, |
| client.getDeserializer(ContentType.APPLICATION_JSON).toEntitySet( |
| getClass().getResourceAsStream(filename + ".json"))); |
| |
| assertJSONSimilar(filename + ".json", writer.toString()); |
| } |
| |
| @Test |
| public void entitySets1() throws Exception { |
| entitySet1("Customers"); |
| entitySet1("collectionOfEntityReferences"); |
| } |
| } |