public static CompletableFuture fromObject()

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