Repository: olingo-odata4 Updated Branches: refs/heads/master 3baa3993e -> 824c174d7
[OLINGO-931] Replace NPE with correct exception Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/824c174d Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/824c174d Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/824c174d Branch: refs/heads/master Commit: 824c174d75bb28a29d177bc48376225c093439e8 Parents: 3baa399 Author: Michael Bolz <[email protected]> Authored: Thu Apr 14 08:20:22 2016 +0200 Committer: Michael Bolz <[email protected]> Committed: Thu Apr 14 08:20:22 2016 +0200 ---------------------------------------------------------------------- .../api/serializer/SerializerException.java | 2 ++ .../serializer/json/ODataJsonSerializer.java | 20 ++++++++++++--- .../server-core-exceptions-i18n.properties | 1 + .../json/ODataJsonSerializerTest.java | 27 ++++++++++++++++++++ 4 files changed, 47 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/824c174d/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/SerializerException.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/SerializerException.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/SerializerException.java index 99dda4b..be3416b 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/SerializerException.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/SerializerException.java @@ -41,6 +41,8 @@ public class SerializerException extends ODataLibraryException { INCONSISTENT_PROPERTY_TYPE, /** parameter: property name */ MISSING_PROPERTY, + /** parameter: - */ + MISSING_ID, /** parameters: property name, property value */ WRONG_PROPERTY_VALUE, /** parameters: primitive-type name, value */ http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/824c174d/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java index 3e03bb5..396261f 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java @@ -267,7 +267,7 @@ public class ODataJsonSerializer extends AbstractODataSerializer { for (final Entity entity : entitySet) { if (onlyReference) { json.writeStartObject(); - json.writeStringField(Constants.JSON_ID, entity.getId().toASCIIString()); + json.writeStringField(Constants.JSON_ID, getEntityId(entity)); json.writeEndObject(); } else { writeEntity(metadata, entityType, entity, null, expand, select, false, json); @@ -276,6 +276,20 @@ public class ODataJsonSerializer extends AbstractODataSerializer { json.writeEndArray(); } + /** + * Get the ascii representation of the entity id + * or thrown an {@link SerializerException} if id is <code>null</code>. + * + * @param entity the entity + * @return ascii representation of the entity id + */ + private String getEntityId(Entity entity) throws SerializerException { + if(entity.getId() == null) { + throw new SerializerException("Entity id is null.", SerializerException.MessageKeys.MISSING_ID); + } + return entity.getId().toASCIIString(); + } + private boolean areKeyPredicateNamesSelected(SelectOption select, EdmEntityType type) { if (select == null || ExpandSelectHelper.isAll(select)) { return true; @@ -319,14 +333,14 @@ public class ODataJsonSerializer extends AbstractODataSerializer { } } if (onlyReference) { - json.writeStringField(Constants.JSON_ID, entity.getId().toASCIIString()); + json.writeStringField(Constants.JSON_ID, getEntityId(entity)); } else { final EdmEntityType resolvedType = resolveEntityType(metadata, entityType, entity.getType()); if (!isODataMetadataNone && !resolvedType.equals(entityType)) { json.writeStringField(Constants.JSON_TYPE, "#" + entity.getType()); } if (!isODataMetadataNone && !areKeyPredicateNamesSelected(select, resolvedType)) { - json.writeStringField(Constants.JSON_ID, entity.getId().toASCIIString()); + json.writeStringField(Constants.JSON_ID, getEntityId(entity)); } writeProperties(metadata, resolvedType, entity.getProperties(), select, json); writeNavigationProperties(metadata, resolvedType, entity, expand, json); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/824c174d/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties index c563a67..3b63c1b 100644 --- a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties +++ b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties @@ -107,6 +107,7 @@ SerializerException.NO_CONTEXT_URL=No context URL has been provided. SerializerException.UNSUPPORTED_PROPERTY_TYPE=The type of the property '%1$s' is not yet supported. SerializerException.INCONSISTENT_PROPERTY_TYPE=An inconsistency has been detected in the type definition of property '%1$s'. SerializerException.MISSING_PROPERTY=The non-nullable property '%1$s' is missing. +SerializerException.MISSING_ID=The entity id value is missing. SerializerException.WRONG_PROPERTY_VALUE=The value '%2$s' is not valid for property '%1$s'. SerializerException.WRONG_PRIMITIVE_VALUE=The value '%2$s' is not valid for the primitive type '%1$s' and the given facets. SerializerException.UNKNOWN_TYPE=Type '%1s' not found in metadata. http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/824c174d/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java ---------------------------------------------------------------------- diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java index 022132c..e4f62c2 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java @@ -719,6 +719,33 @@ public class ODataJsonSerializerTest { resultString); } + + @Test(expected = SerializerException.class) + public void selectMissingId() throws Exception { + final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim"); + final EdmEntityType entityType = edmEntitySet.getEntityType(); + final Entity entity = data.readAll(edmEntitySet).getEntities().get(0); + entity.setId(null); + final SelectItem selectItem1 = ExpandSelectMock.mockSelectItem(edmEntitySet, "PropertyDate"); + final SelectItem selectItem2 = ExpandSelectMock.mockSelectItem(edmEntitySet, "PropertyBoolean"); + final SelectOption select = ExpandSelectMock.mockSelectOption(Arrays.asList( + selectItem1, selectItem2, selectItem2)); + + try { + serializer.entity(metadata, entityType, entity, + EntitySerializerOptions.with() + .contextURL(ContextURL.with().entitySet(edmEntitySet) + .selectList(helper.buildContextURLSelectList(entityType, null, select)) + .suffix(Suffix.ENTITY).build()) + .select(select) + .build()).getContent(); + Assert.fail("Expected exception not thrown!"); + } catch (final SerializerException e) { + Assert.assertEquals(SerializerException.MessageKeys.MISSING_ID, e.getMessageKey()); + throw e; + } + } + @Test public void expand() throws Exception { final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESTwoPrim");
