in objectModel/Java/objectmodel/src/main/java/com/microsoft/commondatamodel/objectmodel/persistence/modeljson/ManifestPersistence.java [57:226]
public static CompletableFuture<CdmManifestDefinition> fromObject(
final CdmCorpusContext ctx,
final Model obj,
final CdmFolderDefinition folder) {
final List<CdmTraitDefinition> extensionTraitDefList = new ArrayList<>();
final CdmManifestDefinition manifest = ctx.getCorpus().makeObject(CdmObjectType.ManifestDef, obj.getName());
// We need to set up folder path and namespace of a manifest to be able to retrieve that object.
folder.getDocuments().add(manifest);
if (obj.getImports() != null) {
obj.getImports()
.forEach(
element->manifest.getImports().add(ImportPersistence.fromData(ctx, element)));
}
if (manifest.getImports()
.getAllItems()
.parallelStream()
.noneMatch(importPresent ->
Objects.equals(importPresent.getCorpusPath(), FOUNDATIONS))) {
manifest.getImports().add(FOUNDATIONS);
}
manifest.setExplanation(obj.getDescription());
manifest.setLastFileModifiedTime(obj.getModifiedTime());
manifest.setLastChildFileModifiedTime(obj.getLastChildFileModifiedTime());
manifest.setLastFileStatusCheckTime(obj.getLastFileStatusCheckTime());
manifest.setDocumentVersion(obj.getDocumentVersion());
if (obj.getApplication() != null) {
final CdmTraitReference applicationTrait = ctx.getCorpus()
.makeRef(CdmObjectType.TraitRef, "is.managedBy", false);
applicationTrait.setFromProperty(true);
final CdmArgumentDefinition arg = ctx.getCorpus()
.makeObject(CdmObjectType.ArgumentDef, "application");
arg.setValue(obj.getApplication());
applicationTrait.getArguments().add(arg);
manifest.getExhibitsTraits().add(applicationTrait);
}
if (obj.getVersion() != null) {
final CdmTraitReference versionTrait = ctx.getCorpus()
.makeRef(CdmObjectType.TraitRef, "is.modelConversion.modelVersion", false);
final CdmArgumentDefinition arg = ctx.getCorpus().makeObject(CdmObjectType.ArgumentDef, "version");
arg.setValue(obj.getVersion());
versionTrait.getArguments().add(arg);
manifest.getExhibitsTraits().add(versionTrait);
}
if (obj.getCulture() != null) {
final CdmTraitReference cultureTrait = ctx.getCorpus()
.makeRef(CdmObjectType.TraitRef, "is.partition.culture", false);
cultureTrait.setFromProperty(true);
final CdmArgumentDefinition arg = ctx.getCorpus().makeObject(CdmObjectType.ArgumentDef, "culture");
arg.setValue(obj.getCulture());
cultureTrait.getArguments().add(arg);
manifest.getExhibitsTraits().add(cultureTrait);
}
if (obj.isHidden() != null && obj.isHidden()) {
final CdmTraitReference isHiddenTrait = ctx.getCorpus()
.makeRef(CdmObjectType.TraitRef, "is.hidden", true);
isHiddenTrait.setFromProperty(true);
manifest.getExhibitsTraits().add(isHiddenTrait);
}
final Map<String, String> referenceModels = new LinkedHashMap<>();
if (obj.getReferenceModels() != null) {
final CdmTraitReference referenceModelsTrait = ctx.getCorpus()
.makeRef(CdmObjectType.TraitRef, "is.modelConversion.referenceModelMap", false);
final CdmArgumentDefinition arg = ctx.getCorpus()
.makeObject(CdmObjectType.ArgumentDef, "referenceModelMap");
arg.setValue(JMapper.MAP.valueToTree(obj.getReferenceModels()));
referenceModelsTrait.getArguments().add(arg);
manifest.getExhibitsTraits().add(referenceModelsTrait);
obj.getReferenceModels().forEach(referenceModel ->
referenceModels.put(referenceModel.getId(), referenceModel.getLocation())
);
}
final Map<String, String> entityPathByName = new LinkedHashMap<>();
if (obj.getEntities() != null && obj.getEntities().size() > 0) {
for (final Entity element : obj.getEntities()) {
CdmEntityDeclarationDefinition entity = null;
final String type = element.getType();
if ("LocalEntity".equals(type)) {
entity =
LocalEntityDeclarationPersistence.fromData(
ctx,
folder,
(LocalEntity) element,
extensionTraitDefList,
manifest)
.join();
} else if ("ReferenceEntity".equals(type)) {
final ReferenceEntity referenceEntity = (ReferenceEntity) element;
if (!referenceModels.containsKey(referenceEntity.getModelId())) {
Logger.error(ctx, TAG, "fromObject", null, CdmLogCode.ErrPersistModelJsonModelIdNotFound, referenceEntity.getModelId(), referenceEntity.getName());
return CompletableFuture.completedFuture(null);
}
entity = ReferencedEntityDeclarationPersistence
.fromData(
ctx,
referenceEntity,
referenceModels.get(referenceEntity.getModelId())).join();
} else {
Logger.error(ctx, TAG, "fromObject", null, CdmLogCode.ErrPersistModelJsonEntityParsingError);
}
if (entity != null) {
// Make path relative for entities created here.
manifest.getEntities().add(entity);
entityPathByName.put(entity.getEntityName(), entity.getEntityPath());
} else {
Logger.error(ctx, TAG, "fromObject", null, CdmLogCode.ErrPersistModelJsonEntityParsingError);
}
}
}
if (null != obj.getRelationships() && obj.getRelationships().size() > 0) {
obj.getRelationships().forEach(element -> {
final CdmE2ERelationship relationship = RelationshipPersistence
.fromData(ctx, element, entityPathByName).join();
if (null != relationship) {
manifest.getRelationships().add(relationship);
} else {
Logger.warning(ctx, TAG, "fromObject", null, CdmLogCode.WarnPersistModelJsonRelReadFailed);
}
});
}
return Utils.processAnnotationsFromData(ctx, obj, manifest.getExhibitsTraits())
.thenCompose(v -> {
final List<CdmTraitDefinition> localExtensionTraitDefList = new ArrayList<>();
ExtensionHelper.processExtensionFromJson(
ctx,
obj,
manifest.getExhibitsTraits(),
extensionTraitDefList,
localExtensionTraitDefList);
final List<CdmImport> importDocs =
ExtensionHelper.standardImportDetection(
ctx,
extensionTraitDefList,
localExtensionTraitDefList).join();
ExtensionHelper.addImportDocsToManifest(ctx, importDocs, manifest);
ManifestPersistence.createExtensionDocAndAddToFolderAndImports(
ctx,
extensionTraitDefList,
folder);
// We need to set up folder path and namespace of a manifest to be able to retrieve that object.
folder.getDocuments().add(manifest);
return CompletableFuture.completedFuture(manifest);
});
}