public void Send(MessageContext messageContext)
        {
            var snapshot = new Dictionary<string, object>();
            if (CurrentContexts.IsValueCreated)
            {
                if (CurrentContexts.Value.Any())
                {
                    foreach (var context in CurrentContexts.Value)
                    {
                        snapshot[context.Key] = JObject.Parse(JsonConvert.SerializeObject(context.Value));
                    }
                }
            }

            if (CurrentScopes.IsValueCreated)
            {
                if (CurrentScopes.Value.Any())
                {
                    var scopeEntries = new JArray(CurrentScopes.Value.Select(JObject.Parse).ToList());
                    snapshot[Constants.Passports.KeyScopes] = scopeEntries.OrderBy(x => (DateTimeOffset)x[Constants.PassportScope.Entry.Timestamp])
                        .ToList();
                }
            }

            PassportStorageService.Store(messageContext, snapshot);
        }
        public virtual StandardResponse<bool> Stamp(MessageContext messageContext
                                                    , bool includeContext = false
                                                    , bool includeScopes = false
            )
        {
            if (PassportStorageService == null)
                return false.GenerateStandardResponse();

            try
            {
                var contexts = new PassportsContext();
                var scopes = new List<string>();

                if (includeContext)
                {
                    foreach (var context in Contexts)
                    {
                        contexts[context.Key] = context.Value;
                    }

                    var extendedContexts = ExtendedContexts();
                    if (extendedContexts != null)
                    {
                        foreach (var extendedContext in extendedContexts)
                        {
                            contexts[extendedContext.Key] = extendedContext.Value;
                        }
                    }
                }

                if (includeScopes)
                {
                    scopes.AddRange(Scopes.Serialize());
                }

                SendInBackground(messageContext, contexts.ToArray(), scopes.ToArray());
            }
            catch (Exception e)
            {
                System.Diagnostics.Trace.WriteLine("Failed SendInBackground: {0}", e.Message);
                return false.GenerateStandardResponse();
            }

            return true.GenerateStandardResponse();
        }
        private static MessageContext MessageContext(IPassport passport
                                                            , PassportLevel level
                                                            , string messageTemplate
                                                            , object[] messageTemplateParameters
                                                            , string user
                                                            , string memberName
                                                            , string sourceFilePath
                                                            , int sourceLineNumber
                                                            , bool logCaller = false
                                                            , int scopeDepth = -1
                                                            )
        {
            var scope = passport.Scope;

            var messageContext = new MessageContext
            {
                Session = passport.SessionId,
                Passport = passport.PassportId,
                Member = scope != null ? scope.Name ?? string.Empty : string.Empty,
                CallContext = scope != null ? scope.Id.ToString() : string.Empty,
                ParentContext = scope != null ? (scope.Parent != null ? scope.Parent.Id.ToString() : string.Empty) : string.Empty,
                Level = level,
                MessageTemplate = messageTemplate,
                MessageTemplateParameters = messageTemplateParameters,
                User = user,
                MemberName = memberName,
                SourceFilePath = sourceFilePath,
                SourceLineNumber = sourceLineNumber,
                LogCaller = logCaller,
                ScopeDepth = scopeDepth
            };

            Console.WriteLine("{0} {1}"
                                    , messageContext.Timestamp.ToString("HH:mm:ss.FFFFFFF")
                                    , messageContext.Id
                                    //, messageContext.Session
                                    //, messageContext.Passport
                                    //, messageContext.MessageTemplate
                                    );
            return messageContext;
        }
        public StandardResponse<bool> StampException(MessageContext messageContext, Exception e)
        {
            if (PassportStorageService == null || e == null)
                return false.GenerateStandardResponse();

            try
            {
                var contexts = new PassportsContext();
                var scopes = new List<string>();

                foreach (var context in Contexts)
                {
                    contexts[context.Key] = context.Value;
                }
                
                var extendedContexts = ExtendedContexts();
                if (extendedContexts != null)
                {
                    foreach (var extendedContext in extendedContexts)
                    {
                        contexts[extendedContext.Key] = extendedContext.Value;
                    }
                }

                contexts[Constants.Contexts.Exception] = new ExceptionContext(e);

                scopes.AddRange(Scopes.Serialize());

                SendInBackground(messageContext, contexts.ToArray(), scopes.ToArray());
            }
            catch (Exception ex)
            {
                System.Diagnostics.Trace.WriteLine("Failed SendInBackground: {0}", ex.Message);
                return false.GenerateStandardResponse();
            }

            return true.GenerateStandardResponse();
        }
 protected void SendInBackground(MessageContext messageContext
                                     , KeyValuePair<string, IContext>[] contexts
                                     , string[] scopes)
 {
     ThreadPool.QueueUserWorkItem(c =>
     {
         CurrentContexts.Value = contexts;
         CurrentScopes.Value = scopes;
         Send(messageContext);
     });
 }
        public void Store(MessageContext messageContext, IDictionary<string, object> snapshot)
        {
            var currentContext = _logger.With(Constants.KeyPassportTimestamp, messageContext.Timestamp)
                                        .With("E_0_" + Constants.Passports.KeyMember, messageContext.Member)                        
                                        .With("E_1_" + Constants.Passports.KeyCurrentCallContext, messageContext.CallContext)
                                        .With("E_3_" + Constants.Passports.KeyPassport, messageContext.Passport)
                                        
             ;

            if (!string.IsNullOrWhiteSpace(messageContext.ParentContext))
            {
                currentContext = currentContext.With("E_2_" + Constants.Passports.KeyParentCallContext,messageContext.ParentContext);
            }

            if (messageContext.LogCaller)
            {
                currentContext = currentContext.With("Z_1_"+Constants.Passports.KeyCallerFilePath, messageContext.SourceFilePath)
                    .With("Z_2_"+Constants.Passports.KeyCallerLineNumber, messageContext.SourceLineNumber)
                    ;
            }

            if (messageContext.Session != null)
            {
                currentContext = currentContext.With("E_4_" + Constants.Passports.KeySession, messageContext.Session);
            }

            if (!string.IsNullOrWhiteSpace(messageContext.User))
            {
                currentContext = currentContext.With("E_5_" + Constants.Passports.KeyUser, messageContext.User);
            }

            if (snapshot != null
                && snapshot.Keys.Any())
            {
                var contextCount = 0;
                foreach (var key in snapshot.Keys.Where(x => x != Constants.Passports.KeyScopes))
                {
                    var value = snapshot[key];
                    currentContext = currentContext.With(string.Format("C_{0}_{1}",contextCount++, key), value);
                }

                if (snapshot.ContainsKey(Constants.Passports.KeyScopes))
                {
                    try
                    {
                        var entries = (IList<JToken>) snapshot[Constants.Passports.KeyScopes];
                        if (entries != null && entries.Any())
                        {
                            if (messageContext.ScopeDepth == 0)
                            {
                                var lastEntry = entries.LastOrDefault();
                                if (lastEntry != null)
                                {
                                    currentContext = BuildScopeEntry(currentContext, lastEntry, 0);
                                }
                            }
                            else
                            {
                                var calculatedDepth = messageContext.ScopeDepth == -1
                                    ? int.MaxValue
                                    : messageContext.ScopeDepth;

                                var entryCounter = 0;

                                currentContext = entries.Reverse()
                                                        .Where(entry => entryCounter < calculatedDepth)
                                                        .Aggregate(currentContext, (current, entry) => BuildScopeEntry(current, entry, entryCounter++));
                            }
                        }
                    }
                    catch 
                    {
                        
                    }
                }
            }

            var extendedMessageTemplate = "{" + "E_0_" + Constants.Passports.KeyMember  +"} " + messageContext.MessageTemplate;
            object[] extendedMessageTemplateParameters = null;
            if (messageContext.MessageTemplateParameters != null)
            {
                extendedMessageTemplateParameters = new object[messageContext.MessageTemplateParameters.Length + 1];
                Array.Copy(messageContext.MessageTemplateParameters, 0, extendedMessageTemplateParameters, 1, messageContext.MessageTemplateParameters.Length);
            }
            else
            {
                extendedMessageTemplateParameters = new object[1];
            }
            extendedMessageTemplateParameters[0] = messageContext.Member;

            if ( messageContext.Level == PassportLevel.Debug)
            {
                currentContext.Debug(extendedMessageTemplate, extendedMessageTemplateParameters);
            }
            else if (messageContext.Level == PassportLevel.Info)
            {
                currentContext.Information(extendedMessageTemplate, extendedMessageTemplateParameters);
            }
            else if (messageContext.Level == PassportLevel.Warn)
            {
                currentContext.Warning(extendedMessageTemplate, extendedMessageTemplateParameters);
            }
            else if (messageContext.Level == PassportLevel.Error)
            {
                currentContext.Error(extendedMessageTemplate, extendedMessageTemplateParameters);
            }
            else if (messageContext.Level == PassportLevel.Exception)
            {
                currentContext.Fatal(extendedMessageTemplate, extendedMessageTemplateParameters);
            }
        }
 public void Store(MessageContext messageContext, System.Collections.Generic.IDictionary<string, object> snapshot)
 {
 }