in odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java [285:406]
private void write(final Map<String, Object> oDataEntryProperties, final boolean isCreate) throws ODataJPARuntimeException {
try {
EdmStructuralType structuralType = null;
final List<String> keyNames = oDataEntityType.getKeyPropertyNames();
if (isCreate) {
jpaEntity = instantiateJPAEntity();
} else if (jpaEntity == null) {
throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.RESOURCE_NOT_FOUND, null);
}
if (accessModifiersWrite == null) {
accessModifiersWrite = jpaEntityParser.getAccessModifiers(jpaEntity, oDataEntityType, JPAEntityParser.ACCESS_MODIFIER_SET);
}
if (oDataEntityType == null || oDataEntryProperties == null) {
throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL, null);
}
final HashMap<String, String> embeddableKeys = jpaEntityParser.getJPAEmbeddableKeyMap(jpaEntity.getClass()
.getName());
Set<String> propertyNames = null;
if (embeddableKeys != null) {
setEmbeddableKeyProperty(embeddableKeys, oDataEntityType.getKeyProperties(), oDataEntryProperties, jpaEntity);
propertyNames = new HashSet<String>();
propertyNames.addAll(oDataEntryProperties.keySet());
for (String key : embeddableKeys.keySet()) {
propertyNames.remove(key);
}
} else {
propertyNames = oDataEntryProperties.keySet();
}
boolean isVirtual = false;
for (String propertyName : propertyNames) {
EdmTyped edmTyped = oDataEntityType.getProperty(propertyName);
if (edmTyped instanceof EdmProperty) {
isVirtual = ((JPAEdmMappingImpl) ((EdmProperty) edmTyped).getMapping()).isVirtualAccess();
} else {
isVirtual = false;
}
Method accessModifier = null;
switch (edmTyped.getType()
.getKind()) {
case SIMPLE:
if (!isCreate) {
if (keyNames.contains(edmTyped.getName())) {
continue;
}
}
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(), isNullable);
} else {
setProperty(accessModifier, jpaEntity, oDataEntryProperties.get(propertyName),
(EdmSimpleType) edmTyped.getType(), isNullable);
}
break;
case COMPLEX:
structuralType = (EdmStructuralType) edmTyped.getType();
accessModifier = accessModifiersWrite.get(propertyName);
if (isVirtual) {
setComplexProperty(accessModifier, jpaEntity, structuralType,
(HashMap<String, Object>) oDataEntryProperties.get(propertyName), propertyName);
} else {
setComplexProperty(accessModifier, jpaEntity, structuralType,
(HashMap<String, Object>) oDataEntryProperties.get(propertyName));
}
break;
case NAVIGATION:
case ENTITY:
if (isCreate) {
structuralType = (EdmStructuralType) edmTyped.getType();
EdmNavigationProperty navProperty = (EdmNavigationProperty) edmTyped;
EdmEntitySet edmRelatedEntitySet = oDataEntitySet.getRelatedEntitySet(navProperty);
List<ODataEntry> relatedEntries = (List<ODataEntry>) oDataEntryProperties.get(propertyName);
if (relatedJPAEntityMap == null) {
relatedJPAEntityMap = new HashMap<String, List<Object>>();
}
List<Object> relatedJPAEntities = new ArrayList<Object>();
for (ODataEntry oDataEntry : relatedEntries) {
JPAEntity relatedEntity =
new JPAEntity((EdmEntityType) structuralType, edmRelatedEntitySet, oDataJPAContext);
relatedEntity.setParentJPAEntity(this);
relatedEntity.setViaNavigationProperty(navProperty);
relatedEntity.create(oDataEntry);
if (oDataEntry.getProperties()
.size() == 0) {
if (!oDataEntry.getMetadata()
.getUri()
.isEmpty()
&& !relatedJPAEntityLink.contains(navProperty.getName())) {
relatedJPAEntityLink.add(navProperty.getName());
}
} else {
relatedJPAEntities.add(relatedEntity.getJPAEntity());
}
}
if (!relatedJPAEntities.isEmpty()) {
relatedJPAEntityMap.put(navProperty.getName(), relatedJPAEntities);
}
}
default:
}
}
} catch (Exception e) {
if (e instanceof ODataJPARuntimeException) {
throw (ODataJPARuntimeException) e;
}
throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
}
}