private void write()

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);
        }
    }