Artículo
· 12 jun, 2020 Lectura de 3 min

Recorrer las actividades de un Business Process

¡Hola a todos! hoy veremos un truco para recorrer las actividades que forman parte de un Business Process. En función de lo que estemos desarrollando, es posible que en ocasiones necesitemos hacer introspección como por ejemplo, obtener las anotaciones que hemos incluido dentro de las actividades de un Business Process.

Recorrer las actividades de un Business Process es algo que parece ineficiente si se realiza en tiempo de ejecución, por eso vamos a revisar la siguiente utilidad para recorrer el Business Process en tiempo de compilación y generar el código que nos interese.

Este fragmento de código podemos reutilizarlo en diversas ocasiones para iterar sobre un BP simplemente añadiéndolo como una clase secundaria sobre la que herede proceso de negocio BPL - Business Process Language.

Class isc.ens.ProcessUtils
{

/// Lista de nodos que pueden ser una actividad de un BP
/// Obtenido usando:
/// SELECT  parent, ID,  Name, Type
/// FROM %Dictionary.CompiledProperty
/// WHERE Parent %STARTSWITH 'Ens.BPL' AND Name='Activities'
Parameter ActivityNodes = {$lb("Ens.BPL.Case", "Ens.BPL.CaseNode", "Ens.BPL.Catch", "Ens.BPL.CatchAll", "Ens.BPL.CompensationHandler", "Ens.BPL.Default", "Ens.BPL.Flow", "Ens.BPL.ForEach", "Ens.BPL.Message", "Ens.BPL.Request", "Ens.BPL.Response", "Ens.BPL.Scope", "Ens.BPL.Sequence", "Ens.BPL.Until", "Ens.BPL.While")};

/// Obtener la anotación de una actividad a partir de su nombre
ClassMethod GetAnnotation(name) As %String [ CodeMode = objectgenerator ]
{
    set sc = $$$OK
    try {
        #; no ejecutar este método en la clase base
        quit:%compiledclass.Name="isc.ens.ProcessUtils"  
        quit:##class(%Dictionary.CompiledXData).%ExistsId(%class.Name_"||BPLERROR")

        #; encontrar el bloque XDATA llamado BPL
        if ##class(%Dictionary.CompiledXData).%ExistsId(%class.Name_"||BPL") {
            set index = %compiledclass.XDatas.FindObjectId(%class.Name_"||BPL")

            #; obtener XDATA como stream
            set stream = %compiledclass.XDatas.GetAt(index).Data
            do stream.Rewind()

            set parser=##class(Ens.BPL.Parser).%New()

            #; parsear stream and y obtener la raíz del árbol de parseo,
            #; Ens.BPL.Process
            #dim process As Ens.BPL.Process
            set sc = parser.ParseStream(stream,.process)
            quit:$$$ISERR(sc)

            #dim activities As Ens.BPL.ActivityList
            set activities = process.Sequence.Activities

            // colocar aquí código para ejecutar antes de iterar sobre las actividades
            do ..ParseActivities(activities)

            // colocar aquí código para ejecutar después de iterar sobre las actividades
            do %code.WriteLine(" quit """"")
        }
    } catch ex {
        set sc = ex.AsStatus()
    }
    quit sc
}

// iterar sobre todas las actividades
ClassMethod ParseActivities(activities As Ens.BPL.ActivityList)
{
    for i=1:1:activities.Count() {
        #dim activity As Ens.BPL.Activity
        set activity = activities.GetAt(i)
        set class = activity.%ClassName(1)
        if $lf(..#ActivityNodes, class) {
            do ..ParseActivities(activity.Activities)
        } elseif (class="Ens.BPL.If") {
            do ..ParseActivities(activity.True)
            do ..ParseActivities(activity.False)
        } elseif (class ="Ens.BPL.Switch"){
            do ..ParseActivities(activity.Cases)
        } else {
            set annotationText = $$$quote(activity.Annotation)

            // código que se ejecutará para cada actividad
            do:activity.Annotation'="" %code.WriteLine(" quit:name=""" _ activity.Name _ """ " _ annotationText)
        }
    }
}

}
Comentarios (0)1
Inicie sesión o regístrese para continuar