Search in sources :

Example 1 with ExportImportEntityContext

use of io.jmix.core.accesscontext.ExportImportEntityContext in project jmix by jmix-framework.

the class EntityImportPlanJsonBuilderImpl method buildFromJsonObject.

protected EntityImportPlan buildFromJsonObject(JsonObject jsonObject, MetaClass metaClass) {
    EntityImportPlanBuilder importPlanBuilder = entityImportPlans.builder(metaClass.getJavaClass());
    ExportImportEntityContext importContext = new ExportImportEntityContext(metaClass);
    accessManager.applyRegisteredConstraints(importContext);
    for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
        String propertyName = entry.getKey();
        MetaProperty metaProperty = metaClass.findProperty(propertyName);
        if (metaProperty == null) {
            continue;
        }
        Range propertyRange = metaProperty.getRange();
        Class<?> propertyType = metaProperty.getJavaType();
        if (propertyRange.isDatatype() || propertyRange.isEnum()) {
            if (importContext.canImported(propertyName)) {
                importPlanBuilder.addLocalProperty(propertyName);
            }
        } else if (propertyRange.isClass()) {
            if (Entity.class.isAssignableFrom(propertyType)) {
                if (metaProperty.getType() == MetaProperty.Type.EMBEDDED) {
                    MetaClass propertyMetaClass = metadata.getClass(propertyType);
                    JsonElement propertyJsonObject = entry.getValue();
                    if (!propertyJsonObject.isJsonObject()) {
                        throw new RuntimeException("JsonObject was expected for property " + propertyName);
                    }
                    if (importContext.canImported(propertyName)) {
                        EntityImportPlan propertyImportPlan = buildFromJsonObject(propertyJsonObject.getAsJsonObject(), propertyMetaClass);
                        importPlanBuilder.addEmbeddedProperty(propertyName, propertyImportPlan);
                    }
                } else {
                    MetaClass propertyMetaClass = metadata.getClass(propertyType);
                    if (metaProperty.getType() == MetaProperty.Type.COMPOSITION) {
                        JsonElement propertyJsonObject = entry.getValue();
                        if (importContext.canImported(propertyName)) {
                            if (propertyJsonObject.isJsonNull()) {
                                // in case of null we must add such import behavior to update the reference with null value later
                                if (metaProperty.getRange().getCardinality() == Range.Cardinality.MANY_TO_ONE) {
                                    importPlanBuilder.addManyToOneProperty(propertyName, ReferenceImportBehaviour.IGNORE_MISSING);
                                } else {
                                    importPlanBuilder.addOneToOneProperty(propertyName, ReferenceImportBehaviour.IGNORE_MISSING);
                                }
                            } else {
                                if (!propertyJsonObject.isJsonObject()) {
                                    throw new RuntimeException("JsonObject was expected for property " + propertyName);
                                }
                                EntityImportPlan propertyImportPlan = buildFromJsonObject(propertyJsonObject.getAsJsonObject(), propertyMetaClass);
                                if (metaProperty.getRange().getCardinality() == Range.Cardinality.MANY_TO_ONE) {
                                    importPlanBuilder.addManyToOneProperty(propertyName, propertyImportPlan);
                                } else {
                                    importPlanBuilder.addOneToOneProperty(propertyName, propertyImportPlan);
                                }
                            }
                        }
                    } else {
                        if (importContext.canImported(propertyName))
                            if (metaProperty.getRange().getCardinality() == Range.Cardinality.MANY_TO_ONE) {
                                importPlanBuilder.addManyToOneProperty(propertyName, ReferenceImportBehaviour.ERROR_ON_MISSING);
                            } else {
                                importPlanBuilder.addOneToOneProperty(propertyName, ReferenceImportBehaviour.ERROR_ON_MISSING);
                            }
                    }
                }
            } else if (Collection.class.isAssignableFrom(propertyType)) {
                MetaClass propertyMetaClass = metaProperty.getRange().asClass();
                switch(metaProperty.getRange().getCardinality()) {
                    case MANY_TO_MANY:
                        {
                            if (importContext.canImported(propertyName))
                                importPlanBuilder.addManyToManyProperty(propertyName, ReferenceImportBehaviour.ERROR_ON_MISSING, CollectionImportPolicy.REMOVE_ABSENT_ITEMS);
                            break;
                        }
                    case ONE_TO_MANY:
                        {
                            if (metaProperty.getType() == MetaProperty.Type.COMPOSITION) {
                                JsonElement compositionJsonArray = entry.getValue();
                                if (!compositionJsonArray.isJsonArray()) {
                                    throw new RuntimeException("JsonArray was expected for property " + propertyName);
                                }
                                EntityImportPlan propertyImportPlan = buildFromJsonArray(compositionJsonArray.getAsJsonArray(), propertyMetaClass);
                                if (importContext.canImported(propertyName))
                                    importPlanBuilder.addOneToManyProperty(propertyName, propertyImportPlan, CollectionImportPolicy.REMOVE_ABSENT_ITEMS);
                            }
                            break;
                        }
                    default:
                        // ignore other options
                        break;
                }
            }
        }
    }
    return importPlanBuilder.build();
}
Also used : ExportImportEntityContext(io.jmix.core.accesscontext.ExportImportEntityContext) Range(io.jmix.core.metamodel.model.Range) MetaClass(io.jmix.core.metamodel.model.MetaClass) JsonElement(com.google.gson.JsonElement) MetaProperty(io.jmix.core.metamodel.model.MetaProperty) Map(java.util.Map)

Aggregations

JsonElement (com.google.gson.JsonElement)1 ExportImportEntityContext (io.jmix.core.accesscontext.ExportImportEntityContext)1 MetaClass (io.jmix.core.metamodel.model.MetaClass)1 MetaProperty (io.jmix.core.metamodel.model.MetaProperty)1 Range (io.jmix.core.metamodel.model.Range)1 Map (java.util.Map)1