Repository: olingo-odata2 Updated Branches: refs/heads/master 7d86e45bc -> bb2517adb
[OLINGO-1148]Cannot set Nullable property to null value on entity Update in JPA Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/bb2517ad Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/bb2517ad Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/bb2517ad Branch: refs/heads/master Commit: bb2517adba6294260c6215e5bc9085264792b1f9 Parents: 7d86e45 Author: ramya vasanth <ramya.vasa...@sap.com> Authored: Wed Jul 26 11:20:26 2017 +0530 Committer: ramya vasanth <ramya.vasa...@sap.com> Committed: Wed Jul 26 11:20:26 2017 +0530 ---------------------------------------------------------------------- .../processor/core/access/data/JPAEntity.java | 64 ++++++++---- .../core/access/data/JPAEntityTest.java | 104 +++++++++++++++++++ .../processor/core/mock/data/EdmMockUtilV2.java | 39 ++++++- .../processor/core/mock/data/JPATypeMock.java | 59 +++++++++-- .../core/mock/data/ODataEntryMockUtil.java | 60 ++++++++++- .../jpa/processor/ref/model/Material.java | 6 +- .../resources/SQL_Insert_Material.properties | 4 +- 7 files changed, 297 insertions(+), 39 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/bb2517ad/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java index 70e1285..d3fd2da 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java @@ -26,6 +26,7 @@ import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -215,10 +216,11 @@ public class JPAEntity { } protected void setProperty(final Method method, final Object entity, final Object entityPropertyValue, - final EdmSimpleType type) throws - IllegalAccessException, IllegalArgumentException, InvocationTargetException, ODataJPARuntimeException { + final EdmSimpleType type, boolean isNullable) throws + IllegalAccessException, IllegalArgumentException, InvocationTargetException, ODataJPARuntimeException, + EdmException { - setProperty(method, entity, entityPropertyValue, type, null); + setProperty(method, entity, entityPropertyValue, type, null, isNullable); } protected void setEmbeddableKeyProperty(final HashMap<String, String> embeddableKeys, @@ -360,12 +362,15 @@ public class JPAEntity { } } accessModifier = accessModifiersWrite.get(propertyName); + EdmProperty edmProperty = (EdmProperty)oDataEntityType.getProperty(propertyName); + boolean isNullable = edmProperty.getFacets() == null ? (keyNames.contains(propertyName)? false : true) + : edmProperty.getFacets().isNullable() == null ? true : edmProperty.getFacets().isNullable(); if (isVirtual) { setProperty(accessModifier, jpaEntity, oDataEntryProperties.get(propertyName), (EdmSimpleType) edmTyped - .getType(), propertyName); + .getType(), isNullable); } else { setProperty(accessModifier, jpaEntity, oDataEntryProperties.get(propertyName), (EdmSimpleType) edmTyped - .getType()); + .getType(), isNullable); } break; case COMPLEX: @@ -453,12 +458,15 @@ public class JPAEntity { (HashMap<String, Object>) propertyValue.get(edmPropertyName), propertyName); } else { EdmSimpleType simpleType = (EdmSimpleType) type; + EdmProperty edmProperty = (EdmProperty)edmComplexType.getProperty(edmPropertyName); + boolean isNullable = edmProperty.getFacets() == null ? true + : edmProperty.getFacets().isNullable() == null ? true : edmProperty.getFacets().isNullable(); if (propertyName != null) { setProperty(accessModifier, embeddableObject, propertyValue.get(edmPropertyName), - simpleType, edmPropertyName); + simpleType, isNullable); } else { setProperty(accessModifier, embeddableObject, propertyValue.get(edmPropertyName), - simpleType); + simpleType, isNullable); } } } @@ -467,9 +475,10 @@ public class JPAEntity { @SuppressWarnings({ "unchecked", "rawtypes" }) protected void setProperty(final Method method, final Object entity, final Object entityPropertyValue, - final EdmSimpleType type, String propertyName) throws - IllegalAccessException, IllegalArgumentException, InvocationTargetException, ODataJPARuntimeException { - if (entityPropertyValue != null) { + final EdmSimpleType type, String propertyName, boolean isNullable) throws + IllegalAccessException, IllegalArgumentException, InvocationTargetException, ODataJPARuntimeException, + EdmException { + if (entityPropertyValue != null || isNullable) { if (propertyName != null) { method.invoke(entity, propertyName, entityPropertyValue); return; @@ -479,19 +488,22 @@ public class JPAEntity { if (parameterType.equals(String.class)) { method.invoke(entity, entityPropertyValue); } else if (parameterType.equals(char[].class)) { - char[] characters = ((String) entityPropertyValue).toCharArray(); + char[] characters = entityPropertyValue != null ? ((String) entityPropertyValue).toCharArray() : null; method.invoke(entity, characters); } else if (parameterType.equals(char.class)) { - char c = ((String) entityPropertyValue).charAt(0); + char c = entityPropertyValue != null ? ((String) entityPropertyValue).charAt(0) : '\u0000'; method.invoke(entity, c); } else if (parameterType.equals(Character[].class)) { - Character[] characters = JPAEntityParser.toCharacterArray((String) entityPropertyValue); + Character[] characters = entityPropertyValue != null ? + JPAEntityParser.toCharacterArray((String) entityPropertyValue) : null; method.invoke(entity, (Object) characters); } else if (parameterType.equals(Character.class)) { - Character c = Character.valueOf(((String) entityPropertyValue).charAt(0)); + Character c = entityPropertyValue != null ? + Character.valueOf(((String) entityPropertyValue).charAt(0)) : null; method.invoke(entity, c); } else if (parameterType.isEnum()) { - Enum e = Enum.valueOf((Class<Enum>) parameterType, (String) entityPropertyValue); + Enum e = entityPropertyValue != null ? + Enum.valueOf((Class<Enum>) parameterType, (String) entityPropertyValue) : null; method.invoke(entity, e); } } else if (parameterType.equals(Blob.class)) { @@ -499,26 +511,32 @@ public class JPAEntity { throw ODataJPARuntimeException .throwException(ODataJPARuntimeException.ERROR_JPA_BLOB_NULL, null); } else { - method.invoke(entity, onJPAWriteContent.getJPABlob((byte[]) entityPropertyValue)); + method.invoke(entity, entityPropertyValue != null ? + onJPAWriteContent.getJPABlob((byte[]) entityPropertyValue) : null); } } else if (parameterType.equals(Clob.class)) { if (onJPAWriteContent == null) { throw ODataJPARuntimeException .throwException(ODataJPARuntimeException.ERROR_JPA_CLOB_NULL, null); } else { - method.invoke(entity, onJPAWriteContent.getJPAClob(((String) entityPropertyValue).toCharArray())); + method.invoke(entity, entityPropertyValue != null ? + onJPAWriteContent.getJPAClob(((String) entityPropertyValue).toCharArray()) : null); } } else if (parameterType.equals(Timestamp.class)) { - Timestamp ts = new Timestamp(((Calendar) entityPropertyValue).getTimeInMillis()); + Timestamp ts = entityPropertyValue != null ? + new Timestamp(((Calendar) entityPropertyValue).getTimeInMillis()) : null; method.invoke(entity, ts); } else if (parameterType.equals(java.util.Date.class)) { - method.invoke(entity, ((Calendar) entityPropertyValue).getTime()); + Date d = entityPropertyValue != null ? ((Calendar) entityPropertyValue).getTime(): null; + method.invoke(entity, d); } else if (parameterType.equals(java.sql.Date.class)) { - long timeInMs = ((Calendar) entityPropertyValue).getTimeInMillis(); - method.invoke(entity, new java.sql.Date(timeInMs)); + java.sql.Date d = entityPropertyValue != null ? + new java.sql.Date(((Calendar) entityPropertyValue).getTimeInMillis()) : null; + method.invoke(entity, d); } else if (parameterType.equals(java.sql.Time.class)) { - long timeInMs = ((Calendar) entityPropertyValue).getTimeInMillis(); - method.invoke(entity, new java.sql.Time(timeInMs)); + java.sql.Time t = entityPropertyValue != null ? + new java.sql.Time(((Calendar) entityPropertyValue).getTimeInMillis()) : null; + method.invoke(entity, t); } else { method.invoke(entity, entityPropertyValue); } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/bb2517ad/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java index e904564..befee61 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java @@ -42,6 +42,7 @@ import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock.JPARela import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock.JPATypeEmbeddableMock; import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock.JPATypeEmbeddableMock2; import org.apache.olingo.odata2.jpa.processor.core.mock.data.ODataEntryMockUtil; +import org.junit.Assert; import org.junit.Test; public class JPAEntityTest { @@ -257,4 +258,107 @@ public class JPAEntityTest { ODataJPAContext jpaContext = ODataJPAContextMock.mockODataJPAContext(context); return jpaContext; } + + @Test + public void testUpdateODataEntryWithNullValue() { + try { + EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, false); + EdmEntityType edmEntityType = edmEntitySet.getEntityType(); + + jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, mockODataJPAContext()); + JPATypeMock jpaTypeMock = new JPATypeMock(); + jpaEntity.setJPAEntity(jpaTypeMock); + jpaEntity.update(ODataEntryMockUtil.mockODataEntryWithNullValue(JPATypeMock.ENTITY_NAME)); + } catch (ODataJPARuntimeException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } catch (EdmException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } catch (ODataException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + JPATypeMock jpaTypeMock = (JPATypeMock) jpaEntity.getJPAEntity(); + assertEquals(jpaTypeMock.getMInt(), 0);// Key should not be changed + assertEquals(jpaTypeMock.getMString(), null); + assertEquals(jpaTypeMock.getMDateTime(), null); + assertEquals(jpaTypeMock.getMBlob(), null); + assertEquals(jpaTypeMock.getMCArray(), null); + assertEquals(jpaTypeMock.getMChar(), null); + Assert.assertArrayEquals(jpaTypeMock.getMCharArray(), null); + assertEquals(jpaTypeMock.getMClob(), null); + } + + @Test + public void testCreateODataEntryWithComplexTypeWithNullValues() { + try { + EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, true); + EdmEntityType edmEntityType = edmEntitySet.getEntityType(); + + jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, mockODataJPAContext()); + jpaEntity.create(ODataEntryMockUtil.mockODataEntryWithComplexTypeWithNullValue(JPATypeMock.ENTITY_NAME)); + } catch (ODataJPARuntimeException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } catch (EdmException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } catch (ODataException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + JPATypeMock jpaTypeMock = (JPATypeMock) jpaEntity.getJPAEntity(); + assertEquals(jpaTypeMock.getMInt(), ODataEntryMockUtil.VALUE_MINT); + assertEquals(jpaTypeMock.getMString(), "Mock"); + JPATypeEmbeddableMock jpaEmbeddableMock = jpaTypeMock.getComplexType(); + assertNotNull(jpaEmbeddableMock); + + assertEquals(jpaEmbeddableMock.getMShort(), null); + assertEquals(jpaEmbeddableMock.getMDate(), null); + assertEquals(jpaEmbeddableMock.getMDate1(), null); + assertEquals(jpaEmbeddableMock.getMTime(), null); + assertEquals(jpaEmbeddableMock.getMTimestamp(), null); + JPATypeEmbeddableMock2 jpaEmbeddableMock2 = jpaEmbeddableMock.getMEmbeddable(); + assertNotNull(jpaEmbeddableMock2); + assertEquals(jpaEmbeddableMock2.getMFloat(), null); + assertEquals(jpaEmbeddableMock2.getMUUID(), null); + } + + @Test + public void testCreateODataEntryWithComplexTypeWithMoreProperties() { + try { + EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, true); + EdmEntityType edmEntityType = edmEntitySet.getEntityType(); + + jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, mockODataJPAContext()); + jpaEntity.create(ODataEntryMockUtil.mockODataEntryWithComplexType(JPATypeMock.ENTITY_NAME)); + } catch (ODataJPARuntimeException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } catch (EdmException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } catch (ODataException e) { + fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + + ODataJPATestConstants.EXCEPTION_MSG_PART_2); + } + JPATypeMock jpaTypeMock = (JPATypeMock) jpaEntity.getJPAEntity(); + assertEquals(jpaTypeMock.getMInt(), ODataEntryMockUtil.VALUE_MINT); + assertEquals(jpaTypeMock.getMString(), ODataEntryMockUtil.VALUE_MSTRING); + assertTrue(jpaTypeMock.getMDateTime().equals(ODataEntryMockUtil.VALUE_DATE_TIME)); + JPATypeEmbeddableMock jpaEmbeddableMock = jpaTypeMock.getComplexType(); + assertNotNull(jpaEmbeddableMock); + + assertEquals(jpaEmbeddableMock.getMShort(), ODataEntryMockUtil.VALUE_SHORT); + assertEquals(jpaEmbeddableMock.getMDate().getDate(), ODataEntryMockUtil.VALUE_DATE.getDate()); + assertEquals(jpaEmbeddableMock.getMDate().getTime(), ODataEntryMockUtil.VALUE_DATE.getTime()); + assertEquals(jpaEmbeddableMock.getMDate1(), ODataEntryMockUtil.VALUE_DATE1); + assertEquals(jpaEmbeddableMock.getMTime(), ODataEntryMockUtil.VALUE_TIME); + assertEquals(jpaEmbeddableMock.getMTimestamp(), ODataEntryMockUtil.VALUE_TIMESTAMP); + JPATypeEmbeddableMock2 jpaEmbeddableMock2 = jpaEmbeddableMock.getMEmbeddable(); + assertNotNull(jpaEmbeddableMock2); + assertEquals(jpaEmbeddableMock2.getMFloat(), ODataEntryMockUtil.VALUE_MFLOAT, 1); + assertEquals(jpaEmbeddableMock2.getMUUID(), ODataEntryMockUtil.VALUE_UUID); + } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/bb2517ad/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/EdmMockUtilV2.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/EdmMockUtilV2.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/EdmMockUtilV2.java index a5e32db..dcf3ab9 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/EdmMockUtilV2.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/EdmMockUtilV2.java @@ -20,6 +20,8 @@ package org.apache.olingo.odata2.jpa.processor.core.mock.data; import java.sql.Blob; import java.sql.Clob; +import java.sql.Time; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; import java.util.List; @@ -108,6 +110,7 @@ public class EdmMockUtilV2 { EasyMock.expect(entityType.getProperty(JPATypeMock.NAVIGATION_PROPERTY_X)).andReturn( mockEdmNavigationProperty(JPATypeMock.NAVIGATION_PROPERTY_X, EdmMultiplicity.ONE)).anyTimes(); EasyMock.expect(entityType.getProperty(JPATypeMock.NAVIGATION_PROPERTY_XS)).andReturn(null).anyTimes(); + } else if (entityName.equals(JPARelatedTypeMock.ENTITY_NAME)) { EasyMock.expect(entityType.getProperty(JPARelatedTypeMock.PROPERTY_NAME_MLONG)).andReturn( mockEdmProperty(entityName, JPARelatedTypeMock.PROPERTY_NAME_MLONG)).anyTimes(); @@ -171,6 +174,10 @@ public class EdmMockUtilV2 { propertyNames.add(JPARelatedTypeMock.PROPERTY_NAME_MDOUBLE); } else if (entityName.equals(JPATypeEmbeddableMock.ENTITY_NAME)) { propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT); + propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE); + propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1); + propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIME); + propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP); propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MEMBEDDABLE); } else if (entityName.equals(JPATypeEmbeddableMock2.ENTITY_NAME)) { propertyNames.add(JPATypeMock.JPATypeEmbeddableMock2.PROPERTY_NAME_MFLOAT); @@ -268,10 +275,15 @@ public class EdmMockUtilV2 { propertyName.equals(JPARelatedTypeMock.PROPERTY_NAME_MLONG) || propertyName.equals(JPARelatedTypeMock.PROPERTY_NAME_MBYTE) || propertyName.equals(JPARelatedTypeMock.PROPERTY_NAME_MDOUBLE) || - propertyName.equals(JPARelatedTypeMock.PROPERTY_NAME_MBYTEARRAY)) { + propertyName.equals(JPARelatedTypeMock.PROPERTY_NAME_MBYTEARRAY) || + propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE) || + propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1) || + propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIME) || + propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP)) { EdmSimpleType edmType = EasyMock.createMock(EdmSimpleType.class); EasyMock.expect(edmProperty.getType()).andReturn(edmType).anyTimes(); + EasyMock.expect(edmProperty.getFacets()).andReturn(null).anyTimes(); EasyMock.expect(edmType.getKind()).andReturn(EdmTypeKind.SIMPLE).anyTimes(); if (propertyName.equals(JPATypeMock.PROPERTY_NAME_MSTRING) || propertyName.equals(JPATypeMock.PROPERTY_NAME_ENUM) || @@ -300,6 +312,7 @@ public class EdmMockUtilV2 { EasyMock.expect(edmProperty.getName()).andReturn(propertyName).anyTimes(); EasyMock.expect(edmProperty.getMapping()).andReturn((EdmMapping) mockEdmMapping(null, propertyName, null)) .anyTimes(); + EasyMock.expect(edmProperty.getFacets()).andReturn(null).anyTimes(); } @@ -324,6 +337,14 @@ public class EdmMockUtilV2 { if (complexTypeName.equals(JPATypeEmbeddableMock.ENTITY_NAME)) { EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT)).andReturn( mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT)).anyTimes(); + EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE)).andReturn( + mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MDATE)).anyTimes(); + EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1)).andReturn( + mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1)).anyTimes(); + EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MTIME)).andReturn( + mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MTIME)).anyTimes(); + EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP)).andReturn( + mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP)).anyTimes(); EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MEMBEDDABLE)).andReturn( mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MEMBEDDABLE)).anyTimes(); } else if (complexTypeName.equals(JPATypeEmbeddableMock2.ENTITY_NAME)) { @@ -397,10 +418,22 @@ public class EdmMockUtilV2 { mapping.setJPAType(byte[].class); ((Mapping) mapping).setInternalName(JPARelatedTypeMock.PROPERTY_NAME_MBYTEARRAY); } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT)) { - mapping.setJPAType(Short.TYPE); + mapping.setJPAType(Short.class); ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT); + } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE)) { + mapping.setJPAType(java.util.Date.class); + ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE); + } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1)) { + mapping.setJPAType(java.sql.Date.class); + ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1); + } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIME)) { + mapping.setJPAType(Time.class); + ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIME); + } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP)) { + mapping.setJPAType(Timestamp.class); + ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP); } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock2.PROPERTY_NAME_MFLOAT)) { - mapping.setJPAType(Float.TYPE); + mapping.setJPAType(Float.class); ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock2.PROPERTY_NAME_MFLOAT); } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock2.PROPERTY_NAME_MUUID)) { mapping.setJPAType(UUID.class); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/bb2517ad/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java index 3d7ddcc..60b1c91 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java @@ -20,8 +20,11 @@ package org.apache.olingo.odata2.jpa.processor.core.mock.data; import java.sql.Blob; import java.sql.Clob; +import java.sql.Time; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; +import java.util.Date; import java.util.List; import java.util.UUID; @@ -43,7 +46,7 @@ public class JPATypeMock { public static final String PROPERTY_NAME_MKEY = "key"; public static final String PROPERTY_NAME_MCOMPLEXTYPE = "complexType"; public static final String PROPERTY_NAME_ENUM = "mSomeEnum"; - + public static final String NAVIGATION_PROPERTY_X = "mRelatedEntity"; public static final String NAVIGATION_PROPERTY_XS = "mRelatedEntities"; @@ -99,7 +102,7 @@ public class JPATypeMock { public void setMCharArray(final Character[] mCharArray) { this.mCharArray = mCharArray; } - + private JPARelatedTypeMock mRelatedEntity; private List<JPARelatedTypeMock> mRelatedEntities = new ArrayList<JPATypeMock.JPARelatedTypeMock>(); @@ -181,15 +184,23 @@ public class JPATypeMock { public static final String ENTITY_NAME = "JPATypeEmbeddableMock"; public static final String PROPERTY_NAME_MSHORT = "mShort"; public static final String PROPERTY_NAME_MEMBEDDABLE = "mEmbeddable"; + public static final String PROPERTY_NAME_MDATE = "mDate"; + public static final String PROPERTY_NAME_MDATE1 = "mDate1"; + public static final String PROPERTY_NAME_MTIMESTAMP = "mTimestamp"; + public static final String PROPERTY_NAME_MTIME = "mTime"; - private short mShort; + private Short mShort; private JPATypeEmbeddableMock2 mEmbeddable; + private Date mDate; + private java.sql.Date mDate1; + private Timestamp mTimestamp; + private Time mTime; - public short getMShort() { + public Short getMShort() { return mShort; } - public void setMShort(final short mShort) { + public void setMShort(final Short mShort) { this.mShort = mShort; } @@ -200,6 +211,38 @@ public class JPATypeMock { public void setMEmbeddable(final JPATypeEmbeddableMock2 mEmbeddable) { this.mEmbeddable = mEmbeddable; } + + public Timestamp getMTimestamp() { + return mTimestamp; + } + + public void setMTimestamp(final Timestamp mTimestamp) { + this.mTimestamp = mTimestamp; + } + + public Time getMTime() { + return mTime; + } + + public void setMTime(final Time mTime) { + this.mTime = mTime; + } + + public void setMDate(final Date mDate) { + this.mDate = mDate; + } + + public Date getMDate() { + return mDate; + } + + public void setMDate1(final java.sql.Date mDate1) { + this.mDate1 = mDate1; + } + + public java.sql.Date getMDate1() { + return mDate1; + } } @@ -211,7 +254,7 @@ public class JPATypeMock { public static final String PROPERTY_NAME_MFLOAT = "mFloat"; private UUID mUUID; - private float mFloat; + private Float mFloat; public UUID getMUUID() { return mUUID; @@ -221,11 +264,11 @@ public class JPATypeMock { this.mUUID = mUUID; } - public float getMFloat() { + public Float getMFloat() { return mFloat; } - public void setMFloat(final float mFloat) { + public void setMFloat(final Float mFloat) { this.mFloat = mFloat; } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/bb2517ad/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/ODataEntryMockUtil.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/ODataEntryMockUtil.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/ODataEntryMockUtil.java index e5a081c..a199329 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/ODataEntryMockUtil.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/ODataEntryMockUtil.java @@ -18,6 +18,8 @@ ******************************************************************************/ package org.apache.olingo.odata2.jpa.processor.core.mock.data; +import java.sql.Time; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; @@ -51,8 +53,12 @@ public class ODataEntryMockUtil { public static final byte[] VALUE_MBYTEARRAY = new byte[] { 0XA, 0XB }; public static final float VALUE_MFLOAT = 2.00F; public static final UUID VALUE_UUID = UUID.fromString("38400000-8cf0-11bd-b23e-10b96e4ef00d"); - public static final short VALUE_SHORT = 2; + public static final Short VALUE_SHORT = 2; public static final JPATypeMock.JPATypeMockEnum VALUE_ENUM = JPATypeMock.JPATypeMockEnum.VALUE; + public static java.util.Date VALUE_DATE = null; + public static java.sql.Date VALUE_DATE1 = null; + public static Time VALUE_TIME = null; + public static Timestamp VALUE_TIMESTAMP = null; public static ODataEntry mockODataEntry(final String entityName) { ODataEntry oDataEntry = EasyMock.createMock(ODataEntry.class); @@ -62,6 +68,26 @@ public class ODataEntryMockUtil { EasyMock.replay(oDataEntry); return oDataEntry; } + + public static ODataEntry mockODataEntryWithNullValue(final String entityName) { + ODataEntry oDataEntry = EasyMock.createMock(ODataEntry.class); + Map<String, Object> propertiesMap = mockODataEntryProperties(entityName); + propertiesMap.put(JPATypeMock.PROPERTY_NAME_MINT, null); + propertiesMap.put(JPATypeMock.PROPERTY_NAME_MCHAR, null); + propertiesMap.put(JPATypeMock.PROPERTY_NAME_CLOB, null); + propertiesMap.put(JPATypeMock.PROPERTY_NAME_ENUM, null); + propertiesMap.put(JPATypeMock.PROPERTY_NAME_MBLOB, null); + propertiesMap.put(JPATypeMock.PROPERTY_NAME_MCARRAY, null); + propertiesMap.put(JPATypeMock.PROPERTY_NAME_MC, null); + propertiesMap.put(JPATypeMock.PROPERTY_NAME_MCHARARRAY, null); + propertiesMap.put(JPATypeMock.PROPERTY_NAME_MDATETIME, null); + propertiesMap.put(JPATypeMock.PROPERTY_NAME_MSTRING, null); + EasyMock.expect(oDataEntry.getProperties()).andReturn(propertiesMap).anyTimes(); + + enhanceMockODataEntry(oDataEntry, false, new ArrayList<String>()); + EasyMock.replay(oDataEntry); + return oDataEntry; + } public static ODataEntry mockODataEntryWithComplexType(final String entityName) { ODataEntry oDataEntry = EasyMock.createMock(ODataEntry.class); @@ -72,6 +98,30 @@ public class ODataEntryMockUtil { EasyMock.replay(oDataEntry); return oDataEntry; } + + @SuppressWarnings("unchecked") + public static ODataEntry mockODataEntryWithComplexTypeWithNullValue(final String entityName) { + ODataEntry oDataEntry = EasyMock.createMock(ODataEntry.class); + Map<String, Object> propertiesMap = mockODataEntryPropertiesWithComplexType(entityName); + propertiesMap.put(JPATypeMock.PROPERTY_NAME_MCARRAY, null); + Map<String, Object> complexPropertiesMap = (Map<String, Object>) propertiesMap.get + (JPATypeMock.PROPERTY_NAME_MCOMPLEXTYPE); + complexPropertiesMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT, null); + complexPropertiesMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE, null); + complexPropertiesMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1, null); + complexPropertiesMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MTIME, null); + complexPropertiesMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP, null); + Map<String, Object> embeddableMap = (Map<String, Object>) complexPropertiesMap. + get(JPATypeEmbeddableMock.PROPERTY_NAME_MEMBEDDABLE); + embeddableMap.put(JPATypeEmbeddableMock2.PROPERTY_NAME_MUUID, null); + embeddableMap.put(JPATypeEmbeddableMock2.PROPERTY_NAME_MFLOAT, null); + EasyMock.expect(oDataEntry.getProperties()).andReturn(propertiesMap) + .anyTimes(); + + enhanceMockODataEntry(oDataEntry, false, new ArrayList<String>()); + EasyMock.replay(oDataEntry); + return oDataEntry; + } public static Map<String, Object> mockODataEntryProperties(final String entityName) { Map<String, Object> propertyMap = new HashMap<String, Object>(); @@ -100,6 +150,14 @@ public class ODataEntryMockUtil { propertyMap.put(JPARelatedTypeMock.PROPERTY_NAME_MBYTEARRAY, VALUE_MBYTEARRAY); } else if (entityName.equals(JPATypeEmbeddableMock.ENTITY_NAME)) { propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT, VALUE_SHORT); + VALUE_DATE = Calendar.getInstance(TimeZone.getDefault()).getTime(); + VALUE_DATE1 = new java.sql.Date(Calendar.getInstance(TimeZone.getDefault()).getTimeInMillis()); + VALUE_TIME = new java.sql.Time(Calendar.getInstance(TimeZone.getDefault()).getTimeInMillis()); + VALUE_TIMESTAMP = new Timestamp(Calendar.getInstance(TimeZone.getDefault()).getTimeInMillis()); + propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE, Calendar.getInstance(TimeZone.getDefault())); + propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1, Calendar.getInstance(TimeZone.getDefault())); + propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MTIME, Calendar.getInstance(TimeZone.getDefault())); + propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP, Calendar.getInstance(TimeZone.getDefault())); propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MEMBEDDABLE, mockODataEntryProperties(JPATypeEmbeddableMock2.ENTITY_NAME)); } else if (entityName.equals(JPATypeEmbeddableMock2.ENTITY_NAME)) { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/bb2517ad/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java index 5ec7647..a0397b6 100644 --- a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java +++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java @@ -56,7 +56,7 @@ public class Material { private String materialName; @Column(name = "PRICE") - private double price; + private Double price; @Column(name = "MEASUREMENT_UNIT") private String measurementUnit; @@ -106,11 +106,11 @@ public class Material { this.materialName = materialName; } - public double getPrice() { + public Double getPrice() { return price; } - public void setPrice(final double price) { + public void setPrice(final Double price) { this.price = price; } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/bb2517ad/odata2-jpa-processor/jpa-web/src/main/resources/SQL_Insert_Material.properties ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-web/src/main/resources/SQL_Insert_Material.properties b/odata2-jpa-processor/jpa-web/src/main/resources/SQL_Insert_Material.properties index 5ee054c..b353545 100644 --- a/odata2-jpa-processor/jpa-web/src/main/resources/SQL_Insert_Material.properties +++ b/odata2-jpa-processor/jpa-web/src/main/resources/SQL_Insert_Material.properties @@ -33,4 +33,6 @@ material_query_13 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CO material_query_14 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(124, 'TESTCHAR', 'E1', 3, 121.1, 'Piece'); material_query_15 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(125, '%TESTCHAR%', 'E1', 3, 121.1, 'Piece'); material_query_16 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(126, 'TEST%_%5CCHAR', 'E1', 3, 121.1, 'Piece'); -material_query_17 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(127, 'TEST%_\\CCHAR', 'E1', 3, 121.1, 'Piece'); \ No newline at end of file +material_query_17 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(127, 'TEST%_\\CCHAR', 'E1', 3, 121.1, 'Piece'); +material_query_17 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(128, null, 'S1', 2, 121.1, 'Piece'); +material_query_17 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(129, null, 'E1', 3, null, 'Piece'); \ No newline at end of file