コード例 #1
0
        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"));
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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");
        }
コード例 #4
0
        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);
        }
コード例 #5
0
ファイル: ManifestImplTest.cs プロジェクト: snakecharmer/CDM
        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);
        }
コード例 #6
0
ファイル: ManifestImplTest.cs プロジェクト: snakecharmer/CDM
        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);
        }
コード例 #7
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);
        }
コード例 #8
0
ファイル: ManifestImplTest.cs プロジェクト: snakecharmer/CDM
        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);
        }
コード例 #9
0
        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"));
        }
コード例 #10
0
        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);
        }
コード例 #11
0
ファイル: PersistenceLayer.cs プロジェクト: ppothnis/CDM-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);
        }
コード例 #12
0
ファイル: PersistenceLayer.cs プロジェクト: snakecharmer/CDM
        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);
        }