transformation MXML2KDM (mxml:mxml, event:event){

 

    key event::EventModel {name};

  key kdm::ExtensionFamily {name};

  key kdm::Stereotype {name};

  key event::EventResource{name};

  key event::Event {name, kind, taggedValue};

  key kdm::TagDefinition {tag};

  key event::EventRelationship {from, to};

  key code::CodeModel {name};

  key code::Package {name}; 

  key code::CodeElement {name, stereotype};

 

 

  top relation eventLog2eventModel {

   

    xModelName : String;

   

    checkonly domain mxml log:mxml::WorkflowLog {

      name = xModelName

    };

 

    enforce domain event eventModel:event::EventModel{

      name = xModelName,

      extensionFamily = runtimeModelExtension : kdm::ExtensionFamily {

        name = 'EventLogExtensionFamily',

        stereotype = stProcess : kdm::Stereotype {

          name = 'Process',

          tag = tagProcess : kdm::TagDefinition {tag = 'Process'}

        },

        stereotype = stProcessInstance : kdm::Stereotype {

          name = 'ProcessInstance',

          tag = tagProcessInstance : kdm::TagDefinition {tag = 'ProcessInstance'}

        },

        stereotype = stOriginator : kdm::Stereotype {

          name = 'Originator',

          tag = tagOriginator : kdm::TagDefinition {tag = 'Originator'}

        },

        stereotype = stTimestamp : kdm::Stereotype {

          name = 'Timestamp',

          tag = tagTimestamp : kdm::TagDefinition {tag = 'Timestamp'}

        }      

      }

    };

   

  }

 

 

  top relation process2eventResource {

   

    xEventModelName : String;

    xProcessName : String;

 

    checkonly domain mxml pro:mxml::Process {

      name = xProcessName,

      workflowLog = wlog:mxml::WorkflowLog{

        name = xEventModelName

      }    

    };

 

    enforce domain event eventModel:event::EventModel{

      name = xEventModelName,

      eventElement = eRes:event::EventResource {

        name = xProcessName,

        stereotype = stProcess : kdm::Stereotype {

          name = 'Process',

          tag = tagProcess : kdm::TagDefinition {tag = 'Process'}

        }      

      }

    };

 

    when {

      eventLog2eventModel(wlog, eventModel);

    }

  }

 

 

  top relation processInstance2eventResource {

    xEventModelName : String;

    xProcessName : String;

    xProcessInstanceName : String;

    checkonly domain mxml proInst:mxml::ProcessInstance {

      name = xProcessInstanceName,

      process = pro:mxml::Process {

        name = xProcessName,

        workflowLog = wlog:mxml::WorkflowLog{

          name = xEventModelName

        }

      }    

    };

    enforce domain event eventModel:event::EventModel{

      name = xEventModelName,

      eventElement = eRes:event::EventResource {

        name = xProcessName,

        eventElement = eRes2:event::EventResource {

          name = xProcessInstanceName,

          stereotype = st : kdm::Stereotype {

           name = 'ProcessInstance',

           tag = tagProcessInstance : kdm::TagDefinition {tag = 'ProcessInstance'}

          }

        }

       

      }

    };

    when {

      process2eventResource(pro, eventModel);

    }

  }

 

 

  top relation auditTrailEntry2Event {

   

    xEventName : String;

    xEventType : String;

    xOriginatorName : String;

    xDate : String;

    xProcessInstanceName : String;

    xProcessName : String;

    xModelName : String;

   

    checkonly domain mxml ate : mxml::AuditTrailEntry {

      workflowModelElement = wme : mxml::WorkflowModelElement {

        name = xEventName

      },

      eventType = type : mxml::EventType {

        type = xEventType

      },

      originator = originator : mxml::Originator {

        name = xOriginatorName

      },

      timestamp = timestamp : mxml::Timestamp {

        date = xDate        

      },

      processInstance = pi : mxml::ProcessInstance {

        name = xProcessInstanceName,

        process = p : mxml::Process {

          name = xProcessName,

          workflowLog = wl : mxml::WorkflowLog {

           name = xModelName

          }

        }

      }

    };

   

    enforce domain event eventModel:event::EventModel{

      name = xModelName,

      eventElement = eRes:event::EventResource {

        name = xProcessName,

        eventElement = eRes2:event::EventResource {

          name = xProcessInstanceName,

          eventElement = event : event::Event {

           name = xEventName,

           kind = xEventType,

           taggedValue = originatorTag : kdm::TaggedValue {

             tag = ot : kdm::TagDefinition {tag = 'Originator'},

             value = xOriginatorName

           },

           taggedValue = timestampTag : kdm::TaggedValue {

             tag = dt : kdm::TagDefinition {tag = 'Timestamp'},

             value = xDate

           },

           eventRelation = nextEventRelation : event::EventRelationship {

             from = event

            }

          }

        }

       

      }

    };

    when {

      processInstance2eventResource(pi, eventModel);

    }

   

  }

 

  query queryNextAuditTrailEntryName (p:mxml::Process, pi:mxml::ProcessInstance, e: mxml::AuditTrailEntry) : String {

    --oclExpression

    'nextActivity'

  }  

 

 

  top relation auditTrailEntry2CodeElement {

    xModelName : String;

    xEventName : String;

    xProcessName : String;

   

    checkonly domain mxml proInst:mxml::ProcessInstance {

      process = pro:mxml::Process {

        name = xProcessName,

        workflowLog = wlog:mxml::WorkflowLog{

          name = xModelName

        }

      },

      auditTrailEntries = ate:mxml::AuditTrailEntry {

        workflowModelElement = wme : mxml::WorkflowModelElement {

          name = xEventName

        }

      }

    }; 

 

    enforce domain event eventModel:code::CodeModel{

      name = 'implementation',

      codeElement = pakage : code::Package{

        name = xProcessName,

        codeElement = codeElement : code::CodeElement {

          name = xEventName,

          stereotype = st : kdm::Stereotype {

           name = xProcessName

          }                   

        }

      }

    };

  }

 

 

}