/// <summary> /// finds any relative corpus paths that are held within this document and makes them relative to the new folder instead /// </summary> internal bool LocalizeCorpusPaths(CdmFolderDefinition newFolder) { bool allWentWell = true; bool wasBlocking = this.Ctx.Corpus.blockDeclaredPathChanges; this.Ctx.Corpus.blockDeclaredPathChanges = true; // shout into the void Logger.Info(nameof(CdmDocumentDefinition), (ResolveContext)this.Ctx, $"Localizing corpus paths in document '{this.Name}'", nameof(LocalizeCorpusPaths)); // find anything in the document that is a corpus path this.Visit("", new VisitCallback { Invoke = (iObject, path) => { // i don't like that document needs to know a little about these objects // in theory, we could create a virtual function on cdmObject that localizes properties // but then every object would need to know about the documents and paths and such ... // also, i already wrote this code. switch (iObject.ObjectType) { case CdmObjectType.Import: { CdmImport typeObj = iObject as CdmImport; typeObj.CorpusPath = LocalizeCorpusPath(typeObj.CorpusPath, newFolder, ref allWentWell) ?? typeObj.CorpusPath; break; } case CdmObjectType.LocalEntityDeclarationDef: case CdmObjectType.ReferencedEntityDeclarationDef: { CdmEntityDeclarationDefinition typeObj = iObject as CdmEntityDeclarationDefinition; typeObj.EntityPath = LocalizeCorpusPath(typeObj.EntityPath, newFolder, ref allWentWell) ?? typeObj.EntityPath; break; } case CdmObjectType.DataPartitionDef: { CdmDataPartitionDefinition typeObj = iObject as CdmDataPartitionDefinition; typeObj.Location = LocalizeCorpusPath(typeObj.Location, newFolder, ref allWentWell) ?? typeObj.Location; typeObj.SpecializedSchema = LocalizeCorpusPath(typeObj.SpecializedSchema, newFolder, ref allWentWell) ?? typeObj.SpecializedSchema; break; } case CdmObjectType.DataPartitionPatternDef: { CdmDataPartitionPatternDefinition typeObj = iObject as CdmDataPartitionPatternDefinition; typeObj.RootLocation = LocalizeCorpusPath(typeObj.RootLocation, newFolder, ref allWentWell) ?? typeObj.RootLocation; typeObj.SpecializedSchema = LocalizeCorpusPath(typeObj.SpecializedSchema, newFolder, ref allWentWell) ?? typeObj.SpecializedSchema; break; } case CdmObjectType.E2ERelationshipDef: { CdmE2ERelationship typeObj = iObject as CdmE2ERelationship; typeObj.ToEntity = LocalizeCorpusPath(typeObj.ToEntity, newFolder, ref allWentWell) ?? typeObj.ToEntity; typeObj.FromEntity = LocalizeCorpusPath(typeObj.FromEntity, newFolder, ref allWentWell) ?? typeObj.FromEntity; break; } case CdmObjectType.ManifestDeclarationDef: { CdmManifestDeclarationDefinition typeObj = iObject as CdmManifestDeclarationDefinition; typeObj.Definition = LocalizeCorpusPath(typeObj.Definition, newFolder, ref allWentWell) ?? typeObj.Definition; break; } } return(false); } }, null); this.Ctx.Corpus.blockDeclaredPathChanges = wasBlocking; return(allWentWell); }