public void Execute(ICRMEvent context)
        {
            var subject = context.Subject.ToEntity <mwo_PluginStepRegistration>();

            if (!subject.mwo_Managed == true)
            {
                return;
            }

            var  msg = context.MessageName.ToUpperInvariant();
            Guid pluginStepId;
            var  hasId = Guid.TryParse(subject.mwo_PluginStepId, out pluginStepId);

            if (msg == CRMMessages.Delete && hasId)
            {
                DoDelete(context, pluginStepId, subject);
            }
            else if (msg == CRMMessages.Update && hasId)
            {
                DoUpdate(context, pluginStepId, subject);
                if (context.Target.Contains(mwo_PluginStepRegistration.Fields.StateCode))
                {
                    DoManageStage(context, pluginStepId, subject);
                }
            }
            else if ((msg == CRMMessages.Update || msg == CRMMessages.Create) && !hasId)
            {
                DoCreate(context, subject);
            }
            else
            {
                Tracer.Trace($"Nothing to do for {msg} and {(hasId ? "has Id" : "does not have Id")}");
            }
        }
        private void DoDelete(ICRMEvent context, Guid pluginStepId, mwo_PluginStepRegistration subject)
        {
            subject.mwo_ImageType = mwo_ImageType.None;
            DoManageImage(context, pluginStepId, subject);

            StepManager.Delete(pluginStepId);
            Tracer.Trace($"Deleted PluginStep: {pluginStepId}");
        }
 private void DoManageStage(ICRMEvent context, Guid pluginStepId, mwo_PluginStepRegistration subject)
 {
     if (subject.StateCode == mwo_PluginStepRegistrationState.Active)
     {
         StepManager.Activate(pluginStepId);
         Tracer.Trace($"Activated PluginStep: {pluginStepId}");
     }
     else
     {
         StepManager.Deactivate(pluginStepId);
         Tracer.Trace($"Deactivated PluginStep: {pluginStepId}");
     }
 }
 private void DoManageImage(ICRMEvent context, Guid pluginStepId, mwo_PluginStepRegistration subject)
 {
     if (subject.mwo_ImageType != null && subject.mwo_ImageType != mwo_ImageType.None)
     {
         ImageManager.Upsert(MapImageType(subject.mwo_ImageType), subject.mwo_ImageName, new EntityReference(SdkMessageProcessingStep.EntityLogicalName, pluginStepId), subject.mwo_ImageAttributes);
         Tracer.Trace($"Upserted image: {subject.mwo_ImageName}");
     }
     else
     {
         ImageManager.Delete(new EntityReference(SdkMessageProcessingStep.EntityLogicalName, pluginStepId));
         Tracer.Trace($"Deleted image: {subject.mwo_ImageName}");
     }
 }
        private void DoUpdate(ICRMEvent context, Guid pluginStepId, mwo_PluginStepRegistration subject)
        {
            StepManager.Update(
                pluginStepId,
                subject.mwo_EventHandler,
                MapPluginType(subject.mwo_EventHandlerType),
                subject.mwo_Name,
                subject.mwo_SDKMessage,
                subject.mwo_PrimaryEntity,
                subject.mwo_SecondaryEntity,
                subject.mwo_StepConfiguration,
                subject.mwo_Asynchronous == true,
                MapStage(subject.mwo_PluginStepStage),
                subject.mwo_FilteringAttributes,
                subject.mwo_Description);

            Tracer.Trace($"Updated PluginStep: {pluginStepId}");

            DoManageImage(context, pluginStepId, subject);
        }
        private void DoCreate(ICRMEvent context, mwo_PluginStepRegistration subject)
        {
            var res = StepManager.Register(
                subject.mwo_EventHandler,
                MapPluginType(subject.mwo_EventHandlerType),
                subject.mwo_Name,
                subject.mwo_SDKMessage,
                subject.mwo_PrimaryEntity,
                subject.mwo_SecondaryEntity,
                subject.mwo_StepConfiguration,
                subject.mwo_Asynchronous == true,
                MapStage(subject.mwo_PluginStepStage),
                subject.mwo_FilteringAttributes,
                subject.mwo_Description);

            Tracer.Trace($"Created new PluginStep: {res}");
            subject.mwo_PluginStepId = res.ToString();

            DoManageImage(context, res, subject);
        }