public void TestLoadLocalEntitiyWithDataPartition() { var content = TestHelper.GetInputFileContent(testsSubpath, "TestLoadLocalEntityWithDataPartition", "entities.manifest.cdm.json"); var cdmManifest = ManifestPersistence.FromData(new ResolveContext(new CdmCorpusDefinition(), null), "entities", "testNamespace", "/", JsonConvert.DeserializeObject <ManifestContent>(content)); Assert.AreEqual(cdmManifest.Entities.Count, 1); Assert.AreEqual(cdmManifest.Entities[0].ObjectType, CdmObjectType.LocalEntityDeclarationDef); var entity = cdmManifest.Entities[0]; Assert.AreEqual(entity.DataPartitions.Count, 1); var partition = entity.DataPartitions[0]; Assert.AreEqual(partition.Location, "test/location"); Assert.AreEqual(TimeUtils.GetFormattedDateString(partition.LastFileModifiedTime), "2008-09-15T23:53:23.000Z"); Assert.AreEqual(partition.ExhibitsTraits.Count, 1); Assert.AreEqual(partition.SpecializedSchema, "teststring"); var testList = partition.Arguments["test"]; Assert.AreEqual(testList.Count, 2); Assert.AreEqual(testList[0], "something"); Assert.AreEqual(testList[1], "somethingelse"); var keyList = partition.Arguments["KEY"]; Assert.AreEqual(keyList.Count, 1); Assert.AreEqual(keyList[0], "VALUE"); Assert.IsFalse(partition.Arguments.ContainsKey("wrong")); }
public async Task TestLoadLegacyEntityDeclaration() { var content = TestHelper.GetInputFileContent(testsSubpath, "TestLoadLegacyEntityDeclaration", "entities.manifest.cdm.json"); var cdmManifest = ManifestPersistence.FromData(new ResolveContext(new CdmCorpusDefinition(), null), "", "", "", JsonConvert.DeserializeObject <ManifestContent>(content)); // Local entity declaration. Assert.AreEqual("testPath", cdmManifest.Entities[0].EntityPath); // Referenced entity declaration. Assert.AreEqual("Account.cdm.json/Account", cdmManifest.Entities[1].EntityPath); }
public void TestLoadFolderWithSubFolders() { var content = TestHelper.GetInputFileContent(testsSubpath, "TestLoadFolderWithSubFolders", "subManifest.manifest.cdm.json"); var cdmManifest = ManifestPersistence.FromData(new ResolveContext(new CdmCorpusDefinition(), null), "testEntity", "testNamespace", "/", JsonConvert.DeserializeObject <ManifestContent>(content)); Assert.AreEqual(cdmManifest.SubManifests.Count, 1); var subManifest = cdmManifest.SubManifests[0]; Assert.AreEqual(subManifest.GetName(), "sub folder declaration"); Assert.AreEqual(subManifest.Explanation, "test sub explanation"); Assert.AreEqual(subManifest.Definition, "test definition"); }
public async Task TestLoadReferencedEntity() { var content = TestHelper.GetInputFileContent(testsSubpath, "TestLoadReferencedEntity", "entities.manifest.cdm.json"); var cdmManifest = ManifestPersistence.FromData(new ResolveContext(new CdmCorpusDefinition(), null), "testEntity", "testNamespace", "/", JsonConvert.DeserializeObject <ManifestContent>(content)); Assert.AreEqual(cdmManifest.Entities.Count, 1); Assert.AreEqual(cdmManifest.Entities[0].ObjectType, CdmObjectType.ReferencedEntityDeclarationDef); var entity = cdmManifest.Entities[0]; Assert.AreEqual(entity.EntityName, "testEntity"); Assert.AreEqual(entity.Explanation, "test explanation"); Assert.AreEqual(entity.EntityPath, "testNamespace:/testPath"); Assert.AreEqual(entity.ExhibitsTraits.Count, 1); }
public void TestFolioWithEverything() { var content = TestHelper.GetInputFileContent(testsSubpath, "TestFolioWithEverything", "complete.folio.cdm.json"); var cdmManifest = ManifestPersistence.FromData(new ResolveContext(new CdmCorpusDefinition(), null), "docName", "someNamespace", "/", JsonConvert.DeserializeObject <ManifestContent>(content)); Assert.AreEqual(1, cdmManifest.SubManifests.Count); Assert.AreEqual(2, cdmManifest.Entities.Count); Assert.AreEqual("cdmTest", cdmManifest.ManifestName); content = TestHelper.GetInputFileContent(testsSubpath, "TestFolioWithEverything", "noname.folio.cdm.json"); cdmManifest = ManifestPersistence.FromData(new ResolveContext(new CdmCorpusDefinition(), null), "docName.folio.cdm.json", "someNamespace", "/", JsonConvert.DeserializeObject <ManifestContent>(content)); Assert.AreEqual(1, cdmManifest.SubManifests.Count); Assert.AreEqual(2, cdmManifest.Entities.Count); Assert.AreEqual("docName", cdmManifest.ManifestName); }
public void TestLoadFolderWithNoEntityFolders() { var content = TestHelper.GetInputFileContent(testsSubpath, "TestLoadFolderWithNoEntityFolders", "empty.manifest.cdm.json"); var cdmManifest = ManifestPersistence.FromData(new ResolveContext(new CdmCorpusDefinition(), null), "cdmTest", "someNamespace", "/", JsonConvert.DeserializeObject <ManifestContent>(content)); Assert.AreEqual(cdmManifest.Schema, "CdmManifestDefinition.cdm.json"); Assert.AreEqual(cdmManifest.ManifestName, "cdmTest"); Assert.AreEqual(cdmManifest.JsonSchemaSemanticVersion, "0.9.0"); Assert.AreEqual(TimeUtils.GetFormattedDateString((DateTimeOffset)cdmManifest.LastFileModifiedTime), "2008-09-15T23:53:23.000Z"); Assert.AreEqual(cdmManifest.Explanation, "test cdm folder for cdm version 0.9+"); Assert.AreEqual(cdmManifest.Imports.Count, 1); Assert.AreEqual(cdmManifest.Imports[0].CorpusPath, "/primitives.cdm.json"); Assert.AreEqual(cdmManifest.Entities.Count, 0); Assert.AreEqual(cdmManifest.ExhibitsTraits.Count, 1); Assert.AreEqual(cdmManifest.SubManifests.Count, 0); }
public async Task TestLoadLocalEntityNoPartition() { var content = TestHelper.GetInputFileContent(testsSubpath, "TestLoadLocalEntityNoPartition", "entities.manifest.cdm.json"); var cdmManifest = ManifestPersistence.FromData(new ResolveContext(new CdmCorpusDefinition(), null), "", "", "", JsonConvert.DeserializeObject <ManifestContent>(content)); Assert.AreEqual(1, cdmManifest.Entities.Count); Assert.AreEqual(cdmManifest.Entities[0].ObjectType, CdmObjectType.LocalEntityDeclarationDef); var entity = cdmManifest.Entities[0]; Assert.AreEqual("Account", entity.EntityName); Assert.AreEqual("Account explanation", entity.Explanation); Assert.AreEqual("Account.cdm.json/Account", entity.EntityPath); Assert.AreEqual(1, entity.ExhibitsTraits.Count); Assert.AreEqual(0, entity.DataPartitions.Count); Assert.AreEqual(0, entity.DataPartitionPatterns.Count); }
public void TestManifestForCopyData() { var content = TestHelper.GetInputFileContent(testsSubpath, "TestManifestForCopyData", "complete.manifest.cdm.json"); var cdmManifest = ManifestPersistence.FromData(new ResolveContext(new CdmCorpusDefinition(), null), "docName", "someNamespace", "/", JsonConvert.DeserializeObject <ManifestContent>(content)); ManifestContent manifestObject = CdmObjectBase.CopyData(cdmManifest, null, null); Assert.AreEqual(manifestObject.Schema, "CdmManifestDefinition.cdm.json"); Assert.AreEqual(manifestObject.JsonSchemaSemanticVersion, "0.9.0"); Assert.AreEqual(manifestObject.ManifestName, "cdmTest"); Assert.AreEqual(manifestObject.Explanation, "test cdm folder for cdm version 0.9+"); Assert.AreEqual(manifestObject.Imports.Count, 1); Assert.AreEqual(manifestObject.Imports[0].CorpusPath, "/primitives.cdm.json"); Assert.AreEqual(manifestObject.ExhibitsTraits.Count, 1); Assert.AreEqual(manifestObject.Entities.Count, 2); Assert.AreEqual(manifestObject.Entities[0]["entityName"], "testEntity"); Assert.AreEqual(manifestObject.SubManifests.Count, 1); Assert.AreEqual(manifestObject.SubManifests[0].Definition, "test definition"); Assert.AreEqual(manifestObject.LastFileModifiedTime, null); }
public async Task TestLoadLocalEntityNoPartitionAbsoluteNamespaceSet() { var content = TestHelper.GetInputFileContent(testsSubpath, "TestLoadLocalEntityNoPartitionAbsoluteNamespaceSet", "entitiesWithNamespace.manifest.cdm.json"); ManifestContent manifestContent = JsonConvert.DeserializeObject <ManifestContent>(content); var cdmManifest = ManifestPersistence.FromData(new ResolveContext(new CdmCorpusDefinition(), null), "testEntity", "testNamespace", "/", manifestContent); Assert.AreEqual(cdmManifest.Entities.Count, 1); Assert.AreEqual(cdmManifest.Entities[0].ObjectType, CdmObjectType.LocalEntityDeclarationDef); var entity = cdmManifest.Entities[0]; Assert.AreEqual("Account", entity.EntityName); Assert.AreEqual("Account explanation", entity.Explanation); Assert.AreEqual("testNamespace:/Account.cdm.json/Account", entity.EntityPath); Assert.AreEqual(1, entity.ExhibitsTraits.Count); Assert.AreEqual(0, entity.DataPartitions.Count); Assert.AreEqual(0, entity.DataPartitionPatterns.Count); var manifestToData = ManifestPersistence.ToData(cdmManifest, null, null); Assert.AreEqual("testNamespace:/Account.cdm.json/Account", manifestToData.Entities[0].Value <string>("entityPath")); }
public void TestLoadLocalEntitiyWithDataPartitionPattern() { var content = TestHelper.GetInputFileContent(testsSubpath, "TestLoadLocalEntityWithDataPartitionPattern", "entities.manifest.cdm.json"); var cdmManifest = ManifestPersistence.FromData(new ResolveContext(new CdmCorpusDefinition(), null), "entities", "testNamespace", "/", JsonConvert.DeserializeObject <ManifestContent>(content)); Assert.AreEqual(cdmManifest.Entities.Count, 1); Assert.AreEqual(cdmManifest.Entities[0].ObjectType, CdmObjectType.LocalEntityDeclarationDef); var entity = cdmManifest.Entities[0]; Assert.AreEqual(entity.DataPartitionPatterns.Count, 1); var pattern = entity.DataPartitionPatterns[0]; Assert.AreEqual(pattern.Name, "testPattern"); Assert.AreEqual(pattern.Explanation, "test explanation"); Assert.AreEqual(pattern.RootLocation, "test location"); Assert.AreEqual(pattern.RegularExpression.ToString(), "\\s*"); Assert.AreEqual(pattern.Parameters.Count, 2); Assert.AreEqual(pattern.Parameters[0], "testParam1"); Assert.AreEqual(pattern.Parameters[1], "testParam2"); Assert.AreEqual(pattern.SpecializedSchema, "test special schema"); Assert.AreEqual(pattern.ExhibitsTraits.Count, 1); }
public static async Task <CdmDocumentDefinition> LoadDocumentFromPathAsync(CdmFolderDefinition folder, string docName) { // This makes sure date values are consistently parsed exactly as they appear. // Default behavior auto formats date values. JsonConvert.DefaultSettings = () => new JsonSerializerSettings { DateParseHandling = DateParseHandling.None }; CdmDocumentDefinition docContent = null; string jsonData = null; DateTimeOffset? fsModifiedTime = null; CdmCorpusContext ctx = folder.Ctx; string docPath = folder.FolderPath + docName; StorageAdapter adapter = ctx.Corpus.Storage.FetchAdapter(folder.Namespace); try { if (adapter.CanRead()) { jsonData = await adapter.ReadAsync(docPath); fsModifiedTime = await adapter.ComputeLastModifiedTimeAsync(docPath); Logger.Info(nameof(CdmFolderDefinition), ctx, $"read file: {docPath}", "LoadDocumentFromPathAsync"); } } catch (Exception e) { Logger.Error(nameof(CdmFolderDefinition), (ResolveContext)ctx, $"Could not read '{docPath}' from the '{ctx.Corpus.Namespace}' namespace. Reason '{e.Message}'", "LoadDocumentFromPathAsync"); return(null); } try { // Check file extensions, which performs a case-insensitive ordinal string comparison if (docPath.EndsWith(CdmCorpusDefinition.FetchManifestExtension(), StringComparison.OrdinalIgnoreCase) || docPath.EndsWith(CdmCorpusDefinition.FetchFolioExtension(), StringComparison.OrdinalIgnoreCase)) { docContent = ManifestPersistence.FromData(ctx, docName, folder.Namespace, folder.FolderPath, JsonConvert.DeserializeObject <ManifestContent>(jsonData)) as CdmDocumentDefinition; } else if (docPath.EndsWith(CdmCorpusDefinition.FetchModelJsonExtension(), StringComparison.OrdinalIgnoreCase)) { docContent = await ModelJson.ManifestPersistence.FromData(ctx, JsonConvert.DeserializeObject <Model>(jsonData), folder); } else { docContent = DocumentPersistence.FromData(ctx, docName, folder.Namespace, folder.FolderPath, JsonConvert.DeserializeObject <DocumentContent>(jsonData)); } } catch (Exception e) { Logger.Error(nameof(CdmFolderDefinition), (ResolveContext)ctx, $"Could not convert '{docPath}'. Reason '{e.Message}'", "LoadDocumentFromPathAsync"); return(null); } // Add document to the folder, this sets all the folder/path things, caches name to content association and may trigger indexing on content if (docContent != null) { folder.Documents.Add(docContent, docName); docContent._fileSystemModifiedTime = fsModifiedTime; docContent.IsDirty = false; } return(docContent); }
public static async Task <CdmDocumentDefinition> LoadDocumentFromPathAsync(CdmFolderDefinition folder, string docName, CdmDocumentDefinition docContainer) { // This makes sure date values are consistently parsed exactly as they appear. // Default behavior auto formats date values. JsonConvert.DefaultSettings = () => new JsonSerializerSettings { DateParseHandling = DateParseHandling.None }; CdmDocumentDefinition docContent = null; string jsonData = null; DateTimeOffset? fsModifiedTime = null; CdmCorpusContext ctx = folder.Ctx; string docPath = folder.FolderPath + docName; StorageAdapter adapter = ctx.Corpus.Storage.FetchAdapter(folder.Namespace); try { if (adapter.CanRead()) { jsonData = await adapter.ReadAsync(docPath); fsModifiedTime = await adapter.ComputeLastModifiedTimeAsync(docPath); Logger.Info(nameof(CdmFolderDefinition), ctx, $"read file: {docPath}", "LoadDocumentFromPathAsync"); } } catch (Exception e) { Logger.Error(nameof(CdmFolderDefinition), (ResolveContext)ctx, $"Could not read '{docPath}' from the '{folder.Namespace}' namespace. Reason '{e.Message}'", "LoadDocumentFromPathAsync"); return(null); } try { // Check file extensions, which performs a case-insensitive ordinal string comparison if (docPath.EndWithOrdinalIgnoreCase(CdmCorpusDefinition.FetchManifestExtension()) || docPath.EndWithOrdinalIgnoreCase(CdmCorpusDefinition.FetchFolioExtension())) { docContent = ManifestPersistence.FromData(ctx, docName, folder.Namespace, folder.FolderPath, JsonConvert.DeserializeObject <ManifestContent>(jsonData)) as CdmDocumentDefinition; } else if (docPath.EndWithOrdinalIgnoreCase(CdmCorpusDefinition.FetchModelJsonExtension())) { if (!docName.EqualsWithOrdinalIgnoreCase(CdmCorpusDefinition.FetchModelJsonExtension())) { Logger.Error(nameof(PersistenceLayer), (ResolveContext)ctx, $"Failed to load '{docName}', as it's not an acceptable file name. It must be model.json.", "LoadDocumentFromPathAsync"); return(null); } docContent = await ModelJson.ManifestPersistence.FromData(ctx, JsonConvert.DeserializeObject <Model>(jsonData), folder); } else { docContent = DocumentPersistence.FromData(ctx, docName, folder.Namespace, folder.FolderPath, JsonConvert.DeserializeObject <DocumentContent>(jsonData)); } } catch (Exception e) { Logger.Error(nameof(CdmFolderDefinition), (ResolveContext)ctx, $"Could not convert '{docPath}'. Reason '{e.Message}'", "LoadDocumentFromPathAsync"); return(null); } // Add document to the folder, this sets all the folder/path things, caches name to content association and may trigger indexing on content if (docContent != null) { if (docContainer != null) { // there are situations where a previously loaded document must be re-loaded. // the end of that chain of work is here where the old version of the document has been removed from // the corpus and we have created a new document and loaded it from storage and after this call we will probably // add it to the corpus and index it, etc. // it would be really rude to just kill that old object and replace it with this replicant, especially because // the caller has no idea this happened. so... sigh ... instead of returning the new object return the one that // was just killed off but make it contain everything the new document loaded. docContent = docContent.Copy(new ResolveOptions(docContainer), docContainer) as CdmDocumentDefinition; } folder.Documents.Add(docContent, docName); docContent._fileSystemModifiedTime = fsModifiedTime; docContent.IsDirty = false; } return(docContent); }