Deze spec specificeert voor een maatwerkproduct welke halffabrikaten relevant zijn, maw alle mogelijke halffabrikaten. De spec bepaalt welke rollen er zijn (zoals bodem, rub, rughouder, etc voor TBX, of profiel lengte, profiel breedte, vulling, etc voor KAD) en welke halffabrikaten per rol mogelijk zijn. De spec bevat via de builders ook de logica om per rol een specifiek Halffab te selecteren, op basis van ingegeven kenmerken. Halffabrikaten kunnen as is geselecteerd worden en dat levert dan een HalffabItem op. Het is echter ook mogelijk dat een Halffab op zijn beurt moet gemaakt worden. In dat geval wordt een MaatwerkHalffabItem gemaakt. De spec heeft bv. ook de kennis om een V1 voor de zijkanten correct te verdelen over de rollen ZijkantL en ZijkantR. De spec constructor maakt voor alle rollen de builders aan. Als er in de context sub-contexten zitten, wordt een maatwerk builder aangemaakt en de context eraan doorgegeven, anders wordt een gewone builder gebruikt. De specifieke productkennis zit in de concrete builder implementaties. 1 TECH.RegisteredObject DOM.PM.enu.Familie 1 1 DOM.PM.enu.Variant 1 1 DOM.PM.Maatwerk.Calc.HF.ISamengesteldHalffabItemBuilder 1 1 De volgorde is bepaald op basis van de Afhankelijkheden tussen de verschillende Builders. DOM.PM.Maatwerk.Calc.HF.IHalffabItemBuilder list 1 %ListOfObjects array 1 DOM.PM.Maatwerk.Calc.HF.impl.HalffabSpecKenmerkenAanpasser 1 1 1 %Status Bouwt de volgorde op waarin de (HFItem)Builders zullen uitgevoerd worden, rekening houdend met de Dependencies tussen Builders. Bijvoorbeeld: TBXBodem is afhankelijk van TBX LadeZijkant, dus LadeZijkant zal vóór Bodem moeten berekend worden. 1 1 0 { #dim Builder As DOM.PM.Maatwerk.Calc.HF.IHalffabItemBuilder = TraverserList.GetAt(1) If (Builder.%Extends("DOM.PM.Maatwerk.Calc.HF.ISamengesteldHalffabItemBuilder") && 'Builder.%Extends("DOM.PM.Maatwerk.Calc.HF.IDynamischSamengesteldHalffabItemBuilder")) { #dim Iterator As TECH.Iterator = Builder.GeefHalffabItemBuildersIterator() While (Iterator.HasNext()) { #dim BuilderVanIterator As DOM.PM.Maatwerk.Calc.HF.IHalffabItemBuilder = Iterator.Next() Do TraverserList.Insert(BuilderVanIterator) } } Else { #dim Rol As %String = Builder.GeefRol() Do ItemBuilders.SetAt(Builder,Rol) Do DependencyGraph.AddNode(##class(TECH.Algo.Graph.Node).%New(Rol,Builder)) } Do TraverserList.RemoveAt(1) } // Dependencies van de Nodes toevoegen Set Iterator=##class(TECH.ListIterator).%New(ItemBuilders) While (Iterator.HasNext()) { Set Builder=Iterator.Next() #dim IteratorDependencies As TECH.Iterator = Builder.GeefAfhankelijkhedenIterator() While (IteratorDependencies.HasNext()) { #dim Dependency As DOM.PM.Maatwerk.Calc.HF.enu.HalffabRol = IteratorDependencies.Next() If (Dependency="") { Do ##class(TECH.ExceptionHandler).Throw(##class(DOM.PM.Maatwerk.Calc.HF.impl.FrameworkException).%New("Ongeldige waarde '' (leeg) in de AfhankelijkVan bij Builder "_Builder.GeefRol())) } #dim AfhankelijkVanBuilder As DOM.PM.Maatwerk.Calc.HF.IHalffabItemBuilder = ItemBuilders.GetAt(Dependency) If '$IsObject(AfhankelijkVanBuilder) { Do ##class(TECH.ExceptionHandler).Throw(##class(DOM.PM.Maatwerk.Calc.HF.impl.FrameworkException).%New("Geen Builder voor de Rol AfhankelijkVan "_Dependency_" bij Builder "_Builder.GeefRol())) } Do DependencyGraph.AddDependencyByNodeName(Builder.GeefRol(),AfhankelijkVanBuilder.GeefRol()) } } Set ..HalffabItemBuilderSequence=DependencyGraph.ConvertToDataQueue(DependencyGraph.GetDependencyQueue()) ]]> DOM.PM.enu.Familie DOM.PM.enu.Variant 1 %Integer TECH.ListIterator 1 DOM.PM.Maatwerk.Calc.HF.HalffabClassNameFactory Berekent voor iedere Builder het HalffabItem en voegt dit toe aan de HalffabItemsBoom (in de Context) De Boom is toegankelijk via Context.HalffabItemsBoom.Wortel Context:DOM.PM.Maatwerk.Calc.HF.HalffabContext,IngegevenKenmerken:DOM.PM.Maatwerk.Calc.Common.IngegevenKenmerken,MaatwerkAanpassing:DOM.PM.Maatwerk.Aanpassing.dto.MaatwerkAanpassing="" Context:DOM.PM.Maatwerk.Calc.HF.HalffabContext,IngegevenKenmerken:DOM.PM.Maatwerk.Calc.Common.IngegevenKenmerken,MaatwerkAanpassing:DOM.PM.Maatwerk.Aanpassing.dto.MaatwerkAanpassing="" 0) { Do Context.HalffabItemsBoom.AddHalffabItem(SpecialsHalffabItems) Do Context.HalffabItemsBoom.Wortel.VoegToe(SpecialsHalffabItems) } ]]> Context:DOM.PM.Maatwerk.Calc.HF.HalffabContext,SamengesteldHalffabItem:DOM.PM.Maatwerk.Calc.HF.SamengesteldHalffabItem 1 Context:DOM.PM.Maatwerk.Calc.HF.HalffabContext,SamengesteldHalffabItem:DOM.PM.Maatwerk.Calc.HF.SamengesteldHalffabItem,GecumuleerdAantal:%Decimal=1 1 Context:DOM.PM.Maatwerk.Calc.HF.HalffabContext,SamengesteldHalffabItem:DOM.PM.Maatwerk.Calc.HF.SamengesteldHalffabItem %ListOfDataTypes DOM.PM.Maatwerk.Calc.HF.ISamengesteldHalffabItemBuilder 1 DOM.PM.Maatwerk.Calc.HF.impl.HalffabSpecKenmerkenAanpasser