diff --git a/migration-examples/layout/index.html b/migration-examples/layout/index.html index a7082ef6..31a3b21b 100644 --- a/migration-examples/layout/index.html +++ b/migration-examples/layout/index.html @@ -954,11 +954,11 @@ baseRows.push([ baseTemplateId, baseTemplateName, basePageId, basePageName, - pageWidthMm, pageHeightMm, - String(areaGroupIndex), - flowName, String(flowToNextPage), + "Base", "", + flowName, String(flowToNextPage), String(areaGroupIndex), `${draft.position.x}mm`, `${draft.position.y}mm`, `${draft.position.w}mm`, `${draft.position.h}mm`, - "Base", "", "", + pageWidthMm, pageHeightMm, + "", ]); }); @@ -997,7 +997,7 @@ const rows = currentCsvRows.map(row => [...row]); const typeIdx = ensureCsvColumn(headers, rows, "type"); - const targetIdIdx = ensureCsvColumn(headers, rows, "targetId"); + const targetIdIdx = ensureCsvColumn(headers, rows, "baseTemplateTargetId"); const flowNameIdx = ensureCsvColumn(headers, rows, "interactiveFlowName"); const { baseRows, overridesByPageIndex } = computeBaseTemplateData(currentData, currentViewModel, currentAnalysis); @@ -1027,10 +1027,10 @@ baseRows.forEach(baseRow => { const byLogicalName = { templateId: baseRow[0], templateName: baseRow[1], pageId: baseRow[2], pageName: baseRow[3], - pageWidth: baseRow[4], pageHeight: baseRow[5], areaIndex: baseRow[6], - interactiveFlowName: baseRow[7], flowToNextPage: baseRow[8], + type: baseRow[4], baseTemplateTargetId: baseRow[5], + interactiveFlowName: baseRow[6], flowToNextPage: baseRow[7], areaIndex: baseRow[8], x: baseRow[9], y: baseRow[10], width: baseRow[11], height: baseRow[12], - type: baseRow[13], targetId: baseRow[14], contentPreview: baseRow[15], + pageWidth: baseRow[13], pageHeight: baseRow[14], contentPreview: baseRow[15], }; const row = headers.map(h => byLogicalName[normalizeHeaderName(h)] ?? ""); rows.push(row); diff --git a/migration-examples/src/main/groovy/com/quadient/migration/example/common/mapping/LayoutExport.groovy b/migration-examples/src/main/groovy/com/quadient/migration/example/common/mapping/LayoutExport.groovy index 01d686a2..12289238 100644 --- a/migration-examples/src/main/groovy/com/quadient/migration/example/common/mapping/LayoutExport.groovy +++ b/migration-examples/src/main/groovy/com/quadient/migration/example/common/mapping/LayoutExport.groovy @@ -44,17 +44,17 @@ static void run(Migration migration, Path path) { Mapping.displayHeader("templateName", true), Mapping.displayHeader("pageId", false), Mapping.displayHeader("pageName", true), - Mapping.displayHeader("pageWidth", true), - Mapping.displayHeader("pageHeight", true), - Mapping.displayHeader("areaIndex", true), + Mapping.displayHeader("type", false), + Mapping.displayHeader("baseTemplateTargetId", false), Mapping.displayHeader("interactiveFlowName", false), Mapping.displayHeader("flowToNextPage", false), + Mapping.displayHeader("areaIndex", true), Mapping.displayHeader("x", true), Mapping.displayHeader("y", true), Mapping.displayHeader("width", true), Mapping.displayHeader("height", true), - Mapping.displayHeader("type", false), - Mapping.displayHeader("targetId", false), + Mapping.displayHeader("pageWidth", true), + Mapping.displayHeader("pageHeight", true), Mapping.displayHeader("contentPreview", true), ] writer.writeLine(headers.join(",")) @@ -107,19 +107,18 @@ static String buildArea(Migration migration, Number idx, Area area, DocumentObje builder.append(Csv.serialize(template?.name) + ",") builder.append(Csv.serialize(page?.id) + ",") builder.append(Csv.serialize(page?.name) + ",") - def pageOptions = page?.options instanceof PageOptions ? page.options as PageOptions : null - builder.append(Csv.serialize(pageOptions?.width) + ",") - builder.append(Csv.serialize(pageOptions?.height) + ",") - builder.append(Csv.serialize(idx) + ",") + builder.append("Standard,") + builder.append(Csv.serialize(page?.baseTemplate ?: template?.baseTemplate) + ",") builder.append(Csv.serialize(area.interactiveFlowName) + ",") builder.append(Csv.serialize(area.flowToNextPage) + ",") + builder.append(Csv.serialize(idx) + ",") builder.append(Csv.serialize(area.position.x) + ",") builder.append(Csv.serialize(area.position.y) + ",") builder.append(Csv.serialize(area.position.width) + ",") builder.append(Csv.serialize(area.position.height) + ",") - - builder.append("Standard,") - builder.append(Csv.serialize(page?.baseTemplate ?: template?.baseTemplate) + ",") + def pageOptions = page?.options instanceof PageOptions ? page.options as PageOptions : null + builder.append(Csv.serialize(pageOptions?.width) + ",") + builder.append(Csv.serialize(pageOptions?.height) + ",") builder.append(Csv.serialize(migration.previewProvider.buildDocumentContentListPreview(area.content))) @@ -132,18 +131,17 @@ static String buildBaseTemplateArea(BaseTemplate baseTemplate, String pageId, Ba builder.append(Csv.serialize(baseTemplate.name) + ",") builder.append(Csv.serialize(pageId) + ",") builder.append(Csv.serialize(page.name) + ",") - builder.append(Csv.serialize(page.pageWidth) + ",") - builder.append(Csv.serialize(page.pageHeight) + ",") - builder.append(Csv.serialize(idx) + ",") + builder.append("Base,") + builder.append(Csv.serialize(null) + ",") builder.append(Csv.serialize(area.interactiveFlowName) + ",") builder.append(Csv.serialize(area.flowToNextPage) + ",") + builder.append(Csv.serialize(idx) + ",") builder.append(Csv.serialize(area.position?.x) + ",") builder.append(Csv.serialize(area.position?.y) + ",") builder.append(Csv.serialize(area.position?.width) + ",") builder.append(Csv.serialize(area.position?.height) + ",") - - builder.append("Base,") - builder.append(Csv.serialize(null) + ",") + builder.append(Csv.serialize(page.pageWidth) + ",") + builder.append(Csv.serialize(page.pageHeight) + ",") builder.append(Csv.serialize(null)) diff --git a/migration-examples/src/main/groovy/com/quadient/migration/example/common/mapping/LayoutImport.groovy b/migration-examples/src/main/groovy/com/quadient/migration/example/common/mapping/LayoutImport.groovy index d6b0352f..4cc4568e 100644 --- a/migration-examples/src/main/groovy/com/quadient/migration/example/common/mapping/LayoutImport.groovy +++ b/migration-examples/src/main/groovy/com/quadient/migration/example/common/mapping/LayoutImport.groovy @@ -70,13 +70,13 @@ static void run(Migration migration, Path path) { def flowToNextPage = Csv.deserialize(values.get("flowToNextPage"), Boolean.class) areaMapping.flowToNextPage[areaIndex] = flowToNextPage ?: false - def targetId = Csv.deserialize(values.get("targetId"), String.class) - if (targetId) { + def baseTemplateTargetId = Csv.deserialize(values.get("baseTemplateTargetId"), String.class) + if (baseTemplateTargetId) { if (pageId && !docObjectsToTargetIds.containsKey(pageId)) { - docObjectsToTargetIds[pageId] = targetId + docObjectsToTargetIds[pageId] = baseTemplateTargetId } if (templateId && !docObjectsToTargetIds.containsKey(templateId)) { - docObjectsToTargetIds[templateId] = targetId + docObjectsToTargetIds[templateId] = baseTemplateTargetId } } } diff --git a/migration-examples/src/test/groovy/LayoutExportTest.groovy b/migration-examples/src/test/groovy/LayoutExportTest.groovy index b0156e8c..04a86599 100644 --- a/migration-examples/src/test/groovy/LayoutExportTest.groovy +++ b/migration-examples/src/test/groovy/LayoutExportTest.groovy @@ -48,12 +48,12 @@ class LayoutExportTest { LayoutExport.run(migration, mappingFile) def expected = """\ - templateId,templateName (read-only),pageId,pageName (read-only),pageWidth (read-only),pageHeight (read-only),areaIndex (read-only),interactiveFlowName,flowToNextPage,x (read-only),y (read-only),width (read-only),height (read-only),type,targetId,contentPreview (read-only) - full tmpl,,full page,,,,0,test flow2,false,0mm,0mm,0mm,0mm,Standard,, - full tmpl,,full page,,,,1,test flow3,true,0mm,0mm,0mm,0mm,Standard,, - full tmpl,,full page,,,,2,,false,0mm,0mm,0mm,0mm,Standard,, - full tmpl,,full page,,,,3,test flow5,false,0mm,0mm,0mm,0mm,Standard,, - ,,unreferenced page,,,,0,test flow,true,0mm,0mm,0mm,0mm,Standard,, + templateId,templateName (read-only),pageId,pageName (read-only),type,baseTemplateTargetId,interactiveFlowName,flowToNextPage,areaIndex (read-only),x (read-only),y (read-only),width (read-only),height (read-only),pageWidth (read-only),pageHeight (read-only),contentPreview (read-only) + full tmpl,,full page,,Standard,,test flow2,false,0,0mm,0mm,0mm,0mm,,, + full tmpl,,full page,,Standard,,test flow3,true,1,0mm,0mm,0mm,0mm,,, + full tmpl,,full page,,Standard,,,false,2,0mm,0mm,0mm,0mm,,, + full tmpl,,full page,,Standard,,test flow5,false,3,0mm,0mm,0mm,0mm,,, + ,,unreferenced page,,Standard,,test flow,true,0,0mm,0mm,0mm,0mm,,, """.stripIndent() Assertions.assertEquals(expected, mappingFile.toFile().text.replaceAll("\\r\\n|\\r", "\n")) } @@ -71,10 +71,10 @@ class LayoutExportTest { LayoutExport.run(migration, mappingFile) def expected = """\ - templateId,templateName (read-only),pageId,pageName (read-only),pageWidth (read-only),pageHeight (read-only),areaIndex (read-only),interactiveFlowName,flowToNextPage,x (read-only),y (read-only),width (read-only),height (read-only),type,targetId,contentPreview (read-only) - tmpl with areas,,,,,,0,Address Content,false,0mm,0mm,0mm,0mm,Standard,, - tmpl with areas,,,,,,1,,true,0mm,0mm,0mm,0mm,Standard,, - tmpl with areas,,,,,,2,Footer,false,0mm,0mm,0mm,0mm,Standard,, + templateId,templateName (read-only),pageId,pageName (read-only),type,baseTemplateTargetId,interactiveFlowName,flowToNextPage,areaIndex (read-only),x (read-only),y (read-only),width (read-only),height (read-only),pageWidth (read-only),pageHeight (read-only),contentPreview (read-only) + tmpl with areas,,,,Standard,,Address Content,false,0,0mm,0mm,0mm,0mm,,, + tmpl with areas,,,,Standard,,,true,1,0mm,0mm,0mm,0mm,,, + tmpl with areas,,,,Standard,,Footer,false,2,0mm,0mm,0mm,0mm,,, """.stripIndent() Assertions.assertEquals(expected, mappingFile.toFile().text.replaceAll("\\r\\n|\\r", "\n")) } @@ -97,8 +97,8 @@ class LayoutExportTest { LayoutExport.run(migration, mappingFile) def expected = """\ - templateId,templateName (read-only),pageId,pageName (read-only),pageWidth (read-only),pageHeight (read-only),areaIndex (read-only),interactiveFlowName,flowToNextPage,x (read-only),y (read-only),width (read-only),height (read-only),type,targetId,contentPreview (read-only) - tmpl with base,,page with own base,,,,0,test flow,false,0mm,0mm,0mm,0mm,Standard,\$G1, + templateId,templateName (read-only),pageId,pageName (read-only),type,baseTemplateTargetId,interactiveFlowName,flowToNextPage,areaIndex (read-only),x (read-only),y (read-only),width (read-only),height (read-only),pageWidth (read-only),pageHeight (read-only),contentPreview (read-only) + tmpl with base,,page with own base,,Standard,\$G1,test flow,false,0,0mm,0mm,0mm,0mm,,, """.stripIndent() Assertions.assertEquals(expected, mappingFile.toFile().text.replaceAll("\\r\\n|\\r", "\n")) } @@ -123,10 +123,10 @@ class LayoutExportTest { LayoutExport.run(migration, mappingFile) def expected = """\ - templateId,templateName (read-only),pageId,pageName (read-only),pageWidth (read-only),pageHeight (read-only),areaIndex (read-only),interactiveFlowName,flowToNextPage,x (read-only),y (read-only),width (read-only),height (read-only),type,targetId,contentPreview (read-only) - bt-1,Base template 1,page-1,Page 1,210mm,297mm,0,address,false,1cm,1cm,190mm,20mm,Base,, - bt-1,Base template 1,page-1,Page 1,210mm,297mm,1,Area 2,true,1cm,30mm,190mm,50mm,Base,, - bt-1,Base template 1,page-2,Page 2,210mm,99mm,0,Area 1,false,0mm,0mm,210mm,99mm,Base,, + templateId,templateName (read-only),pageId,pageName (read-only),type,baseTemplateTargetId,interactiveFlowName,flowToNextPage,areaIndex (read-only),x (read-only),y (read-only),width (read-only),height (read-only),pageWidth (read-only),pageHeight (read-only),contentPreview (read-only) + bt-1,Base template 1,page-1,Page 1,Base,,address,false,0,1cm,1cm,190mm,20mm,210mm,297mm, + bt-1,Base template 1,page-1,Page 1,Base,,Area 2,true,1,1cm,30mm,190mm,50mm,210mm,297mm, + bt-1,Base template 1,page-2,Page 2,Base,,Area 1,false,0,0mm,0mm,210mm,99mm,210mm,99mm, """.stripIndent() Assertions.assertEquals(expected, mappingFile.toFile().text.replaceAll("\\r\\n|\\r", "\n")) } @@ -154,8 +154,8 @@ class LayoutExportTest { LayoutExport.run(migration, mappingFile) def expected = """\ - templateId,templateName (read-only),pageId,pageName (read-only),pageWidth (read-only),pageHeight (read-only),areaIndex (read-only),interactiveFlowName,flowToNextPage,x (read-only),y (read-only),width (read-only),height (read-only),type,targetId,contentPreview (read-only) - ,,page with preview,,,,0,test flow,false,0mm,0mm,0mm,0mm,Standard,,docRef: Block One;imageRef: Image One;docRef: Block Two;(+2 more) + templateId,templateName (read-only),pageId,pageName (read-only),type,baseTemplateTargetId,interactiveFlowName,flowToNextPage,areaIndex (read-only),x (read-only),y (read-only),width (read-only),height (read-only),pageWidth (read-only),pageHeight (read-only),contentPreview (read-only) + ,,page with preview,,Standard,,test flow,false,0,0mm,0mm,0mm,0mm,,,docRef: Block One;imageRef: Image One;docRef: Block Two;(+2 more) """.stripIndent() Assertions.assertEquals(expected, mappingFile.toFile().text.replaceAll("\\r\\n|\\r", "\n")) } diff --git a/migration-examples/src/test/groovy/LayoutImportTest.groovy b/migration-examples/src/test/groovy/LayoutImportTest.groovy index 837bb358..66abc78f 100644 --- a/migration-examples/src/test/groovy/LayoutImportTest.groovy +++ b/migration-examples/src/test/groovy/LayoutImportTest.groovy @@ -142,7 +142,7 @@ class LayoutImportTest { givenPageExists("page1", ["flow1", "flow2"], [false, false]) def input = """\ - templateId,templateName,pageId,pageName,areaIndex,interactiveFlowName,flowToNextPage,x,y,width,height,type,targetId,contentPreview + templateId,templateName,pageId,pageName,areaIndex,interactiveFlowName,flowToNextPage,x,y,width,height,type,baseTemplateTargetId,contentPreview tmpl1,,page1,,0,flow1,false,0.0mm,0.0mm,0.0mm,0.0mm,Standard,\$G1, tmpl1,,page1,,1,flow2,false,0.0mm,0.0mm,0.0mm,0.0mm,Standard,\$G1, """.stripIndent() @@ -173,7 +173,7 @@ class LayoutImportTest { when(migration.mappingRepository.getBaseTemplateMapping("G1")).thenReturn(new MappingItem.BaseTemplate(null, null, [])) def input = """\ - templateId,templateName,pageId,pageName,pageWidth,pageHeight,areaIndex,interactiveFlowName,flowToNextPage,x,y,width,height,type,targetId,contentPreview + templateId,templateName,pageId,pageName,pageWidth,pageHeight,areaIndex,interactiveFlowName,flowToNextPage,x,y,width,height,type,baseTemplateTargetId,contentPreview tmpl1,,page1,,,,0,flow1,false,0.0mm,0.0mm,0.0mm,0.0mm,Standard,\$G1, G1,Base template 1,G1-P1,Page group 1,210mm,297mm,1,G1-P1.Area2,true,1cm,30mm,190mm,50mm,Base,, G1,Base template 1,G1-P1,Page group 1,210mm,297mm,0,G1-P1.Area1,false,1cm,1cm,190mm,20mm,Base,, @@ -205,7 +205,7 @@ class LayoutImportTest { when(migration.mappingRepository.getBaseTemplateMapping("G1")).thenReturn(new MappingItem.BaseTemplate(null, null, [])) def input = """\ - templateId,templateName,pageId,pageName,pageWidth,pageHeight,areaIndex,interactiveFlowName,flowToNextPage,x,y,width,height,type,targetId,contentPreview + templateId,templateName,pageId,pageName,pageWidth,pageHeight,areaIndex,interactiveFlowName,flowToNextPage,x,y,width,height,type,baseTemplateTargetId,contentPreview G1,,G1-P1,Page group 1,210mm,297mm,0,G1-P1.Area1,false,1cm,1cm,190mm,20mm,Base,, """.stripIndent() mappingFile.toFile().write(input) diff --git a/migration-library/src/main/kotlin/com/quadient/migration/service/DeployPhaseUtils.kt b/migration-library/src/main/kotlin/com/quadient/migration/service/DeployPhaseUtils.kt index 84f17300..97f721fb 100644 --- a/migration-library/src/main/kotlin/com/quadient/migration/service/DeployPhaseUtils.kt +++ b/migration-library/src/main/kotlin/com/quadient/migration/service/DeployPhaseUtils.kt @@ -1,22 +1,16 @@ package com.quadient.migration.service -import com.quadient.migration.api.ProjectConfig import com.quadient.migration.api.dto.migrationmodel.Attachment import com.quadient.migration.api.dto.migrationmodel.AttachmentRef -import com.quadient.migration.api.dto.migrationmodel.BaseTemplate -import com.quadient.migration.api.dto.migrationmodel.BaseTemplateRef -import com.quadient.migration.api.dto.migrationmodel.BaseTemplateLocation import com.quadient.migration.api.dto.migrationmodel.DisplayRule import com.quadient.migration.api.dto.migrationmodel.DocumentContent import com.quadient.migration.api.dto.migrationmodel.Image import com.quadient.migration.api.dto.migrationmodel.ImageRef -import com.quadient.migration.api.dto.migrationmodel.LiteralBaseTemplatePath import com.quadient.migration.api.dto.migrationmodel.ResourceRef import com.quadient.migration.api.repository.Repository import com.quadient.migration.shared.IcmPath import com.quadient.migration.shared.ImageType import com.quadient.migration.shared.isNullOrBlank -import com.quadient.migration.shared.toIcmPath import org.slf4j.LoggerFactory import java.lang.invoke.MethodHandles @@ -63,33 +57,6 @@ fun resolveTargetDir(defaultTargetFolder: IcmPath? = null, specificTargetFolder: } } -fun getBaseTemplateFullPath( - config: ProjectConfig, - documentObjectBaseTemplate: BaseTemplateLocation?, - resourcePathProvider: ResourcePathProvider, - findBaseTemplate: (String) -> BaseTemplate, -): IcmPath { - val literalPath = when (documentObjectBaseTemplate) { - is LiteralBaseTemplatePath -> documentObjectBaseTemplate.path - - is BaseTemplateRef -> { - val baseTemplate = findBaseTemplate(documentObjectBaseTemplate.id) - val baseTemplatePath = resourcePathProvider.getBaseTemplatePath(baseTemplate) - logger.info( - "Base template '$baseTemplatePath' will not be used because referencing base templates by id is not yet supported during deployment. The project config default base template will be used instead." - ) - config.baseTemplatePath - } - - null -> config.baseTemplatePath - } - - val path = literalPath.toIcmPath() - if (path.isAbsolute()) return path - - return resourcePathProvider.getBaseTemplatePath(literalPath) -} - fun DisplayRule.resolveTarget(findRule: (String) -> DisplayRule): DisplayRule { val targetId = this.targetId ?: return this diff --git a/migration-library/src/main/kotlin/com/quadient/migration/service/ResourcePathProvider.kt b/migration-library/src/main/kotlin/com/quadient/migration/service/ResourcePathProvider.kt index 32346f26..a3c8cbdd 100644 --- a/migration-library/src/main/kotlin/com/quadient/migration/service/ResourcePathProvider.kt +++ b/migration-library/src/main/kotlin/com/quadient/migration/service/ResourcePathProvider.kt @@ -3,15 +3,23 @@ package com.quadient.migration.service import com.quadient.migration.api.ProjectConfig import com.quadient.migration.api.dto.migrationmodel.Attachment import com.quadient.migration.api.dto.migrationmodel.BaseTemplate +import com.quadient.migration.api.dto.migrationmodel.BaseTemplateLocation +import com.quadient.migration.api.dto.migrationmodel.BaseTemplateRef import com.quadient.migration.api.dto.migrationmodel.DisplayRule import com.quadient.migration.api.dto.migrationmodel.DocumentObject import com.quadient.migration.api.dto.migrationmodel.Image +import com.quadient.migration.api.dto.migrationmodel.LiteralBaseTemplatePath import com.quadient.migration.service.inspirebuilder.appendExtensionIfMissing import com.quadient.migration.shared.AttachmentType import com.quadient.migration.shared.DocumentObjectType import com.quadient.migration.shared.IcmPath import com.quadient.migration.shared.ImageType import com.quadient.migration.shared.orDefault +import com.quadient.migration.shared.toIcmPath +import org.slf4j.LoggerFactory +import java.lang.invoke.MethodHandles + +private val logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()) interface ResourcePathProvider { fun getDocumentObjectPath(nameOrId: String, type: DocumentObjectType, targetFolder: IcmPath?): IcmPath @@ -54,6 +62,32 @@ interface ResourcePathProvider { fun getFontRootFolder(): IcmPath } +fun ResourcePathProvider.getBaseTemplateFullPath( + config: ProjectConfig, + documentObjectBaseTemplate: BaseTemplateLocation?, + findBaseTemplate: (String) -> BaseTemplate, +): IcmPath { + val literalPath = when (documentObjectBaseTemplate) { + is LiteralBaseTemplatePath -> documentObjectBaseTemplate.path + + is BaseTemplateRef -> { + val baseTemplate = findBaseTemplate(documentObjectBaseTemplate.id) + val baseTemplatePath = getBaseTemplatePath(baseTemplate) + val message = + "Base template '$baseTemplatePath' cannot be used because referencing base templates by id is not yet supported during deployment." + logger.error(message) + error(message) + } + + null -> config.baseTemplatePath + } + + val path = literalPath.toIcmPath() + if (path.isAbsolute()) return path + + return getBaseTemplatePath(literalPath) +} + class DesignerResourcePathProvider(private val projectConfig: ProjectConfig) : ResourcePathProvider { override fun getDocumentObjectPath(nameOrId: String, type: DocumentObjectType, targetFolder: IcmPath?): IcmPath { val fileName = "$nameOrId.wfd" diff --git a/migration-library/src/main/kotlin/com/quadient/migration/service/deploy/EvolveDeployClient.kt b/migration-library/src/main/kotlin/com/quadient/migration/service/deploy/EvolveDeployClient.kt index 85025091..e0146880 100644 --- a/migration-library/src/main/kotlin/com/quadient/migration/service/deploy/EvolveDeployClient.kt +++ b/migration-library/src/main/kotlin/com/quadient/migration/service/deploy/EvolveDeployClient.kt @@ -19,8 +19,8 @@ import com.quadient.migration.api.repository.VariableStructureRepository import com.quadient.migration.service.Storage import com.quadient.migration.service.deploy.utility.MetadataValidatorImpl import com.quadient.migration.service.deploy.utility.PostProcessImpl -import com.quadient.migration.service.getBaseTemplateFullPath import com.quadient.migration.service.ResourcePathProvider +import com.quadient.migration.service.getBaseTemplateFullPath import com.quadient.migration.service.deploy.utility.ConflictDetectorImpl import com.quadient.migration.service.deploy.utility.DeployOrderImpl import com.quadient.migration.service.deploy.utility.ProgressReporterImpl @@ -98,8 +98,8 @@ class EvolveDeployClient( val ipsMemLocation = "memory://${UUID.randomUUID()}" try { val runCommandType = obj.type.toRunCommandType() - val baseTemplatePath = getBaseTemplateFullPath( - projectConfig, obj.baseTemplate, resourcePathProvider + val baseTemplatePath = resourcePathProvider.getBaseTemplateFullPath( + projectConfig, obj.baseTemplate ) { baseTemplateRepository.findOrFail(it) } val deployResult = ipsService.deployJld( baseTemplate = baseTemplatePath, @@ -220,8 +220,8 @@ class EvolveDeployClient( } val resolvedFolder = resolveTargetDir(projectConfig.defaultTargetFolder, rule.targetFolder?.toIcmPath()) - val baseTemplatePath = getBaseTemplateFullPath( - projectConfig, rule.baseTemplate, resourcePathProvider + val baseTemplatePath = resourcePathProvider.getBaseTemplateFullPath( + projectConfig, rule.baseTemplate ) { baseTemplateRepository.findOrFail(it) } val result = caClient.createRuleDraft(rule.nameOrId(), resolvedFolder, baseTemplatePath, data) if (result !is HttpResult.Success) return result.toOperationResult() diff --git a/migration-library/src/main/kotlin/com/quadient/migration/service/deploy/InteractiveDeployClient.kt b/migration-library/src/main/kotlin/com/quadient/migration/service/deploy/InteractiveDeployClient.kt index 28f4805a..b52330b2 100644 --- a/migration-library/src/main/kotlin/com/quadient/migration/service/deploy/InteractiveDeployClient.kt +++ b/migration-library/src/main/kotlin/com/quadient/migration/service/deploy/InteractiveDeployClient.kt @@ -34,8 +34,8 @@ import com.quadient.migration.service.deploy.utility.MetadataValidatorImpl import com.quadient.migration.service.deploy.utility.PostProcessImpl import com.quadient.migration.service.deploy.utility.ResourceType import com.quadient.migration.service.deploy.utility.ResultTracker -import com.quadient.migration.service.getBaseTemplateFullPath import com.quadient.migration.service.ResourcePathProvider +import com.quadient.migration.service.getBaseTemplateFullPath import com.quadient.migration.service.deploy.utility.ConflictDetectorImpl import com.quadient.migration.service.deploy.utility.DeployOrderImpl import com.quadient.migration.service.deploy.utility.ProgressReporterImpl @@ -159,8 +159,8 @@ open class InteractiveDeployClient( override fun uploadDocumentObject(obj: DocumentObject, targetPath: IcmPath, wfdXml: String): OperationResult { val runCommandType = obj.type.toRunCommandType() return ipsService.deployJld( - baseTemplate = getBaseTemplateFullPath( - projectConfig, obj.baseTemplate, resourcePathProvider + baseTemplate = resourcePathProvider.getBaseTemplateFullPath( + projectConfig, obj.baseTemplate ) { baseTemplateRepository.findOrFail(it) }, type = runCommandType, moduleName = "DocumentLayout", @@ -285,8 +285,8 @@ open class InteractiveDeployClient( continue } - val baseTemplatePath = getBaseTemplateFullPath( - projectConfig, rule.baseTemplate, resourcePathProvider + val baseTemplatePath = resourcePathProvider.getBaseTemplateFullPath( + projectConfig, rule.baseTemplate ) { baseTemplateRepository.findOrFail(it) }.toMapInteractive(projectConfig.interactiveTenant) val jrd = Jrd.fromDisplayRule(rule, baseTemplatePath, variableStructure, findVar) diff --git a/migration-library/src/main/kotlin/com/quadient/migration/service/inspirebuilder/InteractiveDocumentObjectBuilder.kt b/migration-library/src/main/kotlin/com/quadient/migration/service/inspirebuilder/InteractiveDocumentObjectBuilder.kt index 8ba119c4..01da4100 100644 --- a/migration-library/src/main/kotlin/com/quadient/migration/service/inspirebuilder/InteractiveDocumentObjectBuilder.kt +++ b/migration-library/src/main/kotlin/com/quadient/migration/service/inspirebuilder/InteractiveDocumentObjectBuilder.kt @@ -96,8 +96,8 @@ class InteractiveDocumentObjectBuilder( } - val baseTemplatePath = getBaseTemplateFullPath( - projectConfig, documentObject.baseTemplate, resourcePathProvider + val baseTemplatePath = resourcePathProvider.getBaseTemplateFullPath( + projectConfig, documentObject.baseTemplate ) { baseTemplateRepository.findOrFail(it) } val currentBaseTemplateData = icmDataCache.getOrLoadBaseTemplateData(baseTemplatePath) ?: error("Unable to deploy document object ${documentObject.id}. Base template '$baseTemplatePath' does not exist.") diff --git a/migration-library/src/test/kotlin/com/quadient/migration/service/DeployPhaseUtilsTest.kt b/migration-library/src/test/kotlin/com/quadient/migration/service/DeployPhaseUtilsTest.kt index e30d2458..3ddd9f52 100644 --- a/migration-library/src/test/kotlin/com/quadient/migration/service/DeployPhaseUtilsTest.kt +++ b/migration-library/src/test/kotlin/com/quadient/migration/service/DeployPhaseUtilsTest.kt @@ -19,7 +19,7 @@ class DeployPhaseUtilsTest { @Test fun `project config base template is used and normalized`() { - val result = getBaseTemplateFullPath(projectConfig, null, resourcePathProvider, findBaseTemplate).toString() + val result = resourcePathProvider.getBaseTemplateFullPath(projectConfig, null, findBaseTemplate).toString() result.shouldBeEqualTo("icm://Interactive/StandardPackage/BaseTemplates/BaseTemplate.wfd") } @@ -27,8 +27,8 @@ class DeployPhaseUtilsTest { @Test fun `specific base template path is preferred over the project config one`() { val baseTemplatePath = "icm://Interactive/Vital/BaseTemplates/MyBaseTemplate.wfd" - val result = getBaseTemplateFullPath( - projectConfig, LiteralBaseTemplatePath(baseTemplatePath), resourcePathProvider, findBaseTemplate + val result = resourcePathProvider.getBaseTemplateFullPath( + projectConfig, LiteralBaseTemplatePath(baseTemplatePath), findBaseTemplate ).toString() result.shouldBeEqualTo(baseTemplatePath) @@ -36,8 +36,8 @@ class DeployPhaseUtilsTest { @Test fun `path not starting with icm is handled as relative`() { - val result = getBaseTemplateFullPath( - projectConfig, LiteralBaseTemplatePath("/projectA/AddressBT.wfd"), resourcePathProvider, findBaseTemplate + val result = resourcePathProvider.getBaseTemplateFullPath( + projectConfig, LiteralBaseTemplatePath("/projectA/AddressBT.wfd"), findBaseTemplate ).toString() result.shouldBeEqualTo("icm://Interactive/${projectConfig.interactiveTenant}/BaseTemplates/projectA/AddressBT.wfd") @@ -46,33 +46,38 @@ class DeployPhaseUtilsTest { @Test fun `only base template name in project config is correctly translated to full path`() { val config = aProjectConfig("myBT.wfd", interactiveTenant = "StandardPackage") - val result = getBaseTemplateFullPath( - config, null, InteractiveResourcePathProvider(config), findBaseTemplate + val result = InteractiveResourcePathProvider(config).getBaseTemplateFullPath( + config, null, findBaseTemplate ).toString() result.shouldBeEqualTo("icm://Interactive/StandardPackage/BaseTemplates/myBT.wfd") } @Test - fun `base template referenced by id is looked up and resolved via resource path provider, but project config default is used instead`() { + fun `base template referenced by id fails because it is not yet supported`() { val baseTemplate = BaseTemplate( id = "bt-1", name = "AddressBaseTemplate", customFields = CustomFieldMap(), ) - val result = getBaseTemplateFullPath( - projectConfig, BaseTemplateRef(baseTemplate.id), resourcePathProvider - ) { id -> if (id == baseTemplate.id) baseTemplate else error("Unexpected id '$id'") }.toString() - - result.shouldBeEqualTo("icm://Interactive/StandardPackage/BaseTemplates/BaseTemplate.wfd") + try { + resourcePathProvider.getBaseTemplateFullPath( + projectConfig, BaseTemplateRef(baseTemplate.id) + ) { id -> if (id == baseTemplate.id) baseTemplate else error("Unexpected id '$id'") } + error("Expected an exception to be thrown") + } catch (e: IllegalStateException) { + e.message.shouldBeEqualTo( + "Base template 'icm://Interactive/StandardPackage/BaseTemplates/AddressBaseTemplate.wfd' cannot be used because referencing base templates by id is not yet supported during deployment." + ) + } } @Test fun `base template referenced by id fails if it cannot be found`() { try { - getBaseTemplateFullPath( - projectConfig, BaseTemplateRef("missing"), resourcePathProvider + resourcePathProvider.getBaseTemplateFullPath( + projectConfig, BaseTemplateRef("missing") ) { error("Record 'missing' not found") } error("Expected an exception to be thrown") } catch (e: IllegalStateException) { diff --git a/migration-library/src/test/kotlin/com/quadient/migration/service/inspirebuilder/InteractiveDocumentObjectBuilderTest.kt b/migration-library/src/test/kotlin/com/quadient/migration/service/inspirebuilder/InteractiveDocumentObjectBuilderTest.kt index b98ae8f1..aed6c918 100644 --- a/migration-library/src/test/kotlin/com/quadient/migration/service/inspirebuilder/InteractiveDocumentObjectBuilderTest.kt +++ b/migration-library/src/test/kotlin/com/quadient/migration/service/inspirebuilder/InteractiveDocumentObjectBuilderTest.kt @@ -937,7 +937,7 @@ class InteractiveDocumentObjectBuilderTest { } every { - ipsService.wfd2xml(getBaseTemplateFullPath(config, null, resourcePathProvider) { baseTemplateRepository.findOrFail(it) }) + ipsService.wfd2xml(resourcePathProvider.getBaseTemplateFullPath(config, null) { baseTemplateRepository.findOrFail(it) }) } returns """ @@ -1659,7 +1659,7 @@ class InteractiveDocumentObjectBuilderTest { val emailDoc = EmailObjectBuilder("E_1").string("Email content").build().mock() val template = DocumentObjectBuilder("T_1", Template).documentObjectRef(emailDoc).build() - every { ipsService.wfd2xml(getBaseTemplateFullPath(config, null, resourcePathProvider) { baseTemplateRepository.findOrFail(it) }) } returns """ + every { ipsService.wfd2xml(resourcePathProvider.getBaseTemplateFullPath(config, null) { baseTemplateRepository.findOrFail(it) }) } returns """ @@ -1718,7 +1718,7 @@ class InteractiveDocumentObjectBuilderTest { val smsDoc = SmsObjectBuilder("S_1").string("SMS content").build().mock() val template = DocumentObjectBuilder("T_1", Template).documentObjectRef(smsDoc).build() - every { ipsService.wfd2xml(getBaseTemplateFullPath(config, null, resourcePathProvider) { baseTemplateRepository.findOrFail(it) }) } returns """ + every { ipsService.wfd2xml(resourcePathProvider.getBaseTemplateFullPath(config, null) { baseTemplateRepository.findOrFail(it) }) } returns """ @@ -1774,7 +1774,7 @@ class InteractiveDocumentObjectBuilderTest { .build().mock() val template = DocumentObjectBuilder("T_1", Template).documentObjectRef(emailDoc).build() - every { ipsService.wfd2xml(getBaseTemplateFullPath(config, null, resourcePathProvider) { baseTemplateRepository.findOrFail(it) }) } returns """ + every { ipsService.wfd2xml(resourcePathProvider.getBaseTemplateFullPath(config, null) { baseTemplateRepository.findOrFail(it) }) } returns """ @@ -1850,7 +1850,7 @@ class InteractiveDocumentObjectBuilderTest { .build().mock() val template = DocumentObjectBuilder("T_1", Template).documentObjectRef(smsDoc).build() - every { ipsService.wfd2xml(getBaseTemplateFullPath(config, null, resourcePathProvider) { baseTemplateRepository.findOrFail(it) }) } returns """ + every { ipsService.wfd2xml(resourcePathProvider.getBaseTemplateFullPath(config, null) { baseTemplateRepository.findOrFail(it) }) } returns """