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

Reply via email to