public InternalRule(FileImportRule rule)
        {
            RuleName        = rule.RuleName;
            HostName        = rule.HostName;
            Instance        = rule.Instance;
            Disabled        = rule.Disabled;
            DebugEnabled    = rule.DebugEnabled;
            DebugProperties = new NamedValueSet(rule.DebugProperties);
            MonitorPeriod   = rule.MonitorPeriod != null?TimeSpan.Parse(rule.MonitorPeriod) : TimeSpan.FromMinutes(5);

            CheckConstraint = rule.CheckConstraintExpr != null?Expr.Create(rule.CheckConstraintExpr) : Expr.Const(true);

            EffectiveDateExpr = rule.EffectiveDateExpr != null?Expr.Create(rule.EffectiveDateExpr) : Expr.FuncToday();

            ImportDelayExpr = rule.ImportDelayExpr != null?Expr.Create(rule.ImportDelayExpr) : Expr.Const(TimeSpan.Zero);

            ImportCondition = rule.ImportConditionExpr != null?Expr.Create(rule.ImportConditionExpr) : Expr.Const(true);

            DateUpdateExpr = rule.DateUpdateExpr != null?Expr.Create(rule.DateUpdateExpr) : Expr.FuncToday();

            SourceSystem         = rule.SourceSystem;
            SourceLocation       = rule.SourceLocation;
            TargetLocation       = rule.TargetLocation;
            Properties           = new NamedValueSet(rule.OtherProperties);
            AsAtDateOffset       = rule.AsAtDateOffset;
            CopyFilePatterns     = rule.CopyFilePatterns;
            FileContentType      = rule.FileContentType;
            OnlyCopyUpdatedFiles = rule.OnlyCopyUpdatedFiles;
            RemoveOldTargetFiles = rule.RemoveOldTargetFiles;
            LastMonitored        = DateTimeOffset.MinValue;
        }
        public void TestFileImportServer()
        {
            // start the server, connect a client1, and shutdown
            using (ILogger logger = new TraceLogger(true))
            {
                const EnvId env    = EnvId.Utt_UnitTest;
                var         logRef = Reference <ILogger> .Create(logger);

                var random = new Random(Environment.TickCount);
                int port   = random.Next(8000, 8099);
                using (var server = new CoreServer(logRef, env.ToString(), NodeType.Router, port, WcfConst.NetTcp))
                {
                    // start server
                    server.Start();
                    // connect client
                    using (ICoreClient client = new CoreClientFactory(logRef).SetEnv(env.ToString()).Create())
                    {
                        // create test import rule
                        var rule = new FileImportRule
                        {
                            RuleName         = "UnitTest",
                            SourceLocation   = @"C:\windows\system32",
                            TargetLocation   = @"c:\temp",
                            CopyFilePatterns = "notep*.exe"
                        };
                        var name = rule.RuleName;
                        // start the file import server
                        //DateTimeOffset waitCompleted;
                        var target = new FileImportServer {
                            Client = Reference <ICoreClient> .Create(client)
                        };
                        client.SaveObject(rule, "UnitTest", null, true, TimeSpan.MaxValue);
                        using (target)//logger, env
                        {
                            target.Start();
                            Thread.Sleep(TimeSpan.FromSeconds(5));
                            //waitCompleted = DateTimeOffset.Now;
                            target.Stop();
                        }
                        {
                            var results1 = client.LoadItem <FileImportRule>(name);
                            Assert.IsNotNull(results1);
                            //List<ImportRuleResult> results = client.LoadObjects<ImportRuleResult>(Expr.ALL);//IRuleObject ImportRuleResult
                            //Assert.AreEqual(1, results.Count);
                            //ImportRuleResult result = results[0];
                            //Assert.AreEqual("UnitTest", result.RuleName);
                            //Assert.AreEqual("Completed", result.ImportResult);
                            //Assert.AreEqual(1, result.FileNames.Length);
                            //Assert.AreEqual("notepad.exe", result.FileNames[0].ToLower());
                        }
                        //{
                        //    List<ImportFileResult> results = client.LoadObjects<ImportFileResult>(Expr.ALL);
                        //    Assert.AreEqual(1, results.Count);
                        //    ImportFileResult result = results[0];
                        //    Assert.AreEqual("UnitTest", result.RuleName);
                        //    Assert.AreEqual("Completed", result.ImportResult);
                        //    Assert.AreEqual("notepad.exe", result.FileName.ToLower());
                        //}
                    }
                    // explicit shutdown
                    // - not necessary in a "using" block but run it anyway
                    server.Stop();
                }
            }
        }
        private void ProcessRuleUpdate(CacheChangeData update)
        {
            // update the rules
            if (update != null)
            {
                switch (update.Change)
                {
                case CacheChange.CacheCleared:
                    _ruleStore.Clear();
                    break;

                case CacheChange.ItemExpired:
                case CacheChange.ItemRemoved:
                {
                    FileImportRule oldImportRule = (FileImportRule)update.OldItem.Data;
                    _ruleStore.Remove(oldImportRule.PrivateKey.ToLower());
                    Logger.LogDebug("Rule {0}: Removed.", oldImportRule.RuleName);
                }
                break;

                case CacheChange.ItemCreated:
                {
                    var newImportRule = (FileImportRule)update.NewItem.Data;
                    _ruleStore[newImportRule.PrivateKey.ToLower()] = new InternalRule(newImportRule);
                    Logger.LogDebug("Rule {0}: Created.", newImportRule.RuleName);
                }
                break;

                case CacheChange.ItemUpdated:
                {
                    //var oldImportRule = (FileImportRule)update.OldItem.Data;
                    var newImportRule = (FileImportRule)update.NewItem.Data;
                    //InternalRule oldRule = _RuleStore.GetValue(newImportRulePrivateKey.ToLower(), null);
                    var newRule = new InternalRule(newImportRule);
                    _ruleStore[newImportRule.PrivateKey.ToLower()] = newRule;
                    Logger.LogDebug("Rule {0}: Updated.", newImportRule.RuleName);
                }
                break;
                }
            }
            long requestsDispatched = Interlocked.Decrement(ref _updateRequestsDispatched);

            if (requestsDispatched > 0)
            {
                // more requests following - just exit
                return;
            }
            // process the rules
            DateTimeOffset currentTime = DateTimeOffset.Now;

            foreach (InternalRule rule in _ruleStore.Values)
            {
                try
                {
                    if (rule.LastMonitored + rule.MonitorPeriod < currentTime)
                    {
                        // update LastMonitored first to prevent infinite looping
                        // when there are repeated expression evaluation exceptions
                        rule.LastMonitored = currentTime;
                        ProcessRule(IntClient.Target, rule, currentTime);
                    }
                }
                catch (Exception ruleExcp)
                {
                    Logger.LogError("Rule {0}: EXCEPTION! {1}'", rule.RuleName, ruleExcp);
                }
            }
        }