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