[OLINGO-1148]Cannot set Nullable property to null value on entity Update in JPA
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.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 @@
}
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 @@
}
}
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 @@
(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 @@
@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 @@
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 @@
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);
}
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.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 @@
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);
+ }
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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);
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 @@
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 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 void setMCharArray(final Character[] mCharArray) {
this.mCharArray = mCharArray;
}
-
+
private JPARelatedTypeMock mRelatedEntity;
private List<JPARelatedTypeMock> mRelatedEntities = new ArrayList<JPATypeMock.JPARelatedTypeMock>();
@@ -181,15 +184,23 @@
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 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 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 @@
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;
}
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 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 @@
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 @@
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 @@
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)) {
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 @@
private String materialName;
@Column(name = "PRICE")
- private double price;
+ private Double price;
@Column(name = "MEASUREMENT_UNIT")
private String measurementUnit;
@@ -106,11 +106,11 @@
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;
}
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_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