public FileResult GetProcessDomain(string processName, string instanceName, DateTime?instanceDate)
        {
            using (var activity = new RFEngineActivity(Context, EngineConfig))
            {
                RFGraphProcessorDomain domain = null;
                var engineConfig  = activity.GetEngineConfig();
                var graphInstance = new RFGraphInstance
                {
                    Name      = string.IsNullOrWhiteSpace(instanceName) ? null : instanceName,
                    ValueDate = instanceDate.HasValue ? new RFDate(instanceDate.Value.Date) : RFDate.NullDate
                };

                foreach (var graph in engineConfig.Graphs.Values)
                {
                    var process = graph.Processes.Values.FirstOrDefault(p => RFGraphDefinition.GetFullName(graph.GraphName, p.Name) == processName);
                    if (process != null)
                    {
                        var processor = process.Processor();
                        domain = processor.CreateDomain();
                        if (domain != null)
                        {
                            foreach (var propertyInfo in domain.GetType().GetProperties())
                            {
                                var          ioBehaviourAttribute = (propertyInfo.GetCustomAttributes(typeof(RFIOBehaviourAttribute), true).FirstOrDefault() as RFIOBehaviourAttribute);
                                RFCatalogKey ioKey = null;
                                if (ioBehaviourAttribute != null)
                                {
                                    var ioBehaviour = ioBehaviourAttribute.IOBehaviour;
                                    var ioMapping   = process.IOMappings.FirstOrDefault(m => m.PropertyName == propertyInfo.Name);
                                    if (ioMapping != null)
                                    {
                                        ioKey = ioMapping.Key.CreateForInstance(graphInstance);
                                        var options = RFGraphInstance.ImplyOptions(ioMapping);
                                        var entry   = Context.LoadEntry(ioKey, options) as RFDocument;
                                        if (entry != null)
                                        {
                                            propertyInfo.SetValue(domain, entry.Content);
                                        }
                                    }
                                }
                            }
                        }
                        break;
                    }
                }

                if (domain != null)
                {
                    var xmlString = RFXMLSerializer.PrettySerializeContract(domain);
                    return(File(
                               Encoding.UTF8.GetBytes(xmlString),
                               "text/xml",
                               String.Format("{0}_{1}_{2}.xml", processName, instanceName ?? String.Empty, instanceDate.Value.ToString("yyyy-MM-dd"))
                               ));
                }
            }
            return(null);
        }
        public JsonResult GetTasks(string instanceName, DateTime?instanceDate)
        {
            try
            {
                using (var activity = new RFEngineActivity(Context, EngineConfig))
                {
                    var engineConfig  = activity.GetEngineConfig();
                    var graphInstance = new RFGraphInstance
                    {
                        Name      = string.IsNullOrWhiteSpace(instanceName) ? RFGraphInstance.DEFAULT_INSTANCE : instanceName,
                        ValueDate = instanceDate.HasValue ? new RFDate(instanceDate.Value.Date) : RFDate.NullDate
                    };
                    var engineStats = activity.GetEngineStats(graphInstance);
                    var errors      = _systemContext.DispatchStore.GetErrorQueue(0);

                    var tasks = new List <object>();

                    foreach (var t in EngineConfig.Tasks)
                    {
                        var stat        = engineStats?.GetStat(t.ProcessName);
                        var dispatchKey = new RFParamProcessInstruction(t.ProcessName, null).DispatchKey();
                        var error       = dispatchKey.NotBlank() ? errors.Where(e => e.DispatchKey == dispatchKey).FirstOrDefault() : null;
                        var schedule    = t.SchedulerConfig(Context);

                        tasks.Add(new
                        {
                            t.TaskName,
                            t.Description,
                            t.GraphName,
                            Schedule  = String.Join(", ", new string[] { t.Trigger, schedule?.SchedulerScheduleString, schedule?.SchedulerRangeString }.Where(s => s.NotBlank())),
                            IsEnabled = schedule?.IsEnabled ?? true,
                            t.IsSystem,
                            Status       = error?.DispatchState.ToString() ?? "OK",
                            Message      = error?.Message,
                            LastRun      = stat?.LastRun ?? error?.LastStart,
                            LastDuration = stat?.LastDuration,
                            IsGraph      = false,
                            FullName     = t.ProcessName
                        });
                    }

                    foreach (var g in EngineConfig.Graphs.Where(g => g.Value.GraphTasks.Any()))
                    {
                        var graphStats = activity.GetGraphStats(g.Value.GraphName, graphInstance);
                        foreach (var t in g.Value.GraphTasks)
                        {
                            var processName = RFGraphDefinition.GetFullName(t.GraphName, t.ProcessName);
                            var stat        = graphStats?.GetStat(t.ProcessName);
                            var dispatchKey = new RFGraphProcessInstruction(graphInstance, processName)?.DispatchKey();
                            var error       = dispatchKey.NotBlank() ? errors.Where(e => e.DispatchKey == dispatchKey).FirstOrDefault() : null;
                            var schedule    = t.SchedulerConfig(Context);

                            tasks.Add(new
                            {
                                t.TaskName,
                                t.Description,
                                t.GraphName,
                                Schedule = String.Join(", ", new string[] { t.Trigger, schedule?.SchedulerScheduleString, schedule?.SchedulerRangeString }.Where(s => s.NotBlank())),
                                //t.SchedulerRange,
                                //t.SchedulerSchedule,
                                //t.Trigger,
                                IsEnabled = schedule?.IsEnabled ?? true,
                                t.IsSystem,
                                Status   = error?.DispatchState.ToString() ?? ((stat?.CalculationOK ?? false) ? "OK" : String.Empty),
                                Message  = error?.Message ?? stat?.Message,
                                LastRun  = stat?.LastRun ?? error?.LastStart,
                                IsGraph  = true,
                                FullName = processName
                            });
                        }
                    }

                    return(Json(tasks));
                }
            }
            catch (Exception ex)
            {
                return(Json(JsonError.Throw("GetTasks", ex)));
            }
        }
        public JsonResult GetProcesses(string instanceName, DateTime?instanceDate)
        {
            using (var activity = new RFEngineActivity(Context, EngineConfig))
            {
                var engineConfig  = activity.GetEngineConfig();
                var graphInstance = new RFGraphInstance
                {
                    Name      = string.IsNullOrWhiteSpace(instanceName) ? RFGraphInstance.DEFAULT_INSTANCE : instanceName,
                    ValueDate = instanceDate.HasValue ? new RFDate(instanceDate.Value.Date) : RFDate.NullDate
                };
                var stats = activity.GetEngineStats(graphInstance);

                var allProcesses = new List <object>();
                foreach (var process in engineConfig.Processes.Values)
                {
                    var processor = process.Processor();
                    var stat      = stats.GetStat(process.Name);
                    allProcesses.Add(new
                    {
                        Graph        = "(none)",
                        Name         = process.Name,
                        FullName     = process.Name,
                        Description  = process.Description,
                        Type         = processor.GetType().FullName,
                        RequiresIdle = false,
                        IsGraph      = false,
                        LastRun      = stat != null ? (DateTimeOffset?)stat.LastRun : null,
                        LastDuration = stat != null ? (long?)stat.LastDuration : null,
                    });
                }

                foreach (var graph in engineConfig.Graphs.Values)
                {
                    foreach (var process in graph.Processes.Values)
                    {
                        var fullName  = RFGraphDefinition.GetFullName(graph.GraphName, process.Name);
                        var stat      = stats.GetStat(fullName);
                        var processor = process.Processor();
                        var domain    = processor.CreateDomain();
                        var io        = new List <object>();
                        if (domain != null)
                        {
                            foreach (var propertyInfo in domain.GetType().GetProperties())
                            {
                                var          ioBehaviourAttribute = (propertyInfo.GetCustomAttributes(typeof(RFIOBehaviourAttribute), true).FirstOrDefault() as RFIOBehaviourAttribute);
                                string       direction            = "-";
                                string       dateType             = "-";
                                RFCatalogKey ioKey = null;
                                if (ioBehaviourAttribute != null)
                                {
                                    var ioBehaviour = ioBehaviourAttribute.IOBehaviour;
                                    direction = ioBehaviour.ToString();

                                    var ioMapping = process.IOMappings.FirstOrDefault(m => m.PropertyName == propertyInfo.Name);
                                    if (ioMapping != null)
                                    {
                                        ioKey = ioMapping.Key.CreateForInstance(graphInstance);
                                        var options = RFGraphInstance.ImplyOptions(ioMapping);
                                        dateType = options.DateBehaviour.ToString();
                                    }
                                }

                                io.Add(new
                                {
                                    Field     = propertyInfo.Name,
                                    Direction = direction,
                                    DateType  = dateType,
                                    DataType  = propertyInfo.PropertyType.Name,
                                    KeyType   = ioKey != null ? ioKey.GetType().Name : null,
                                    ShortKey  = ioKey != null ? ioKey.FriendlyString() : null,
                                    FullKey   = ioKey != null ? RFXMLSerializer.SerializeContract(ioKey) : null
                                });
                            }
                        }
                        allProcesses.Add(new
                        {
                            Graph        = graph.GraphName,
                            Name         = process.Name,
                            FullName     = fullName,
                            IsGraph      = true,
                            Description  = process.Description,
                            Type         = processor.GetType().FullName,
                            IO           = io,
                            LastRun      = stat != null ? (DateTimeOffset?)stat.LastRun : null,
                            LastDuration = stat != null ? (long?)stat.LastDuration : null
                        });
                    }
                }

                return(Json(allProcesses));
            }
        }