public static void AddLogEntry(Repository repository, ApplicationLogEntry entry)
        {
            var date          = DateTime.UtcNow;
            var configuration = ApplicationConfiguration.GetApplicationConfiguration(repository);

            if (configuration.MinimumLogLevel > entry.Level)
            {
                return;
            }

            lock (SyncRoot)
            {
                string path   = String.Format("{0}/{1}/{2}/{3}", Constants.ApplicationLogFolderName, date.Year, date.Month, date.Day);
                var    client = repository.Configuration.GetDocumentStore <IFolderCapableDocumentStore>();

                var folder = client.GetFolder(repository.Configuration.ContainerTitle, path) ??
                             client.CreateFolder(repository.Configuration.ContainerTitle, path);

                var dsApplicationLogs = repository.ListEntities(new EntityFilterCriteria
                {
                    Path               = folder.FullPath,
                    Namespace          = Constants.ApplicationLogV1Namespace,
                    NamespaceMatchType = NamespaceMatchType.Equals,
                });

                Entity dsApplicationLog = dsApplicationLogs.FirstOrDefault();
                if (dsApplicationLog == null)
                {
                    var data = DocumentStoreHelper.SerializeObjectToJson(new ApplicationLog());
                    dsApplicationLog = client.CreateEntity(repository.Configuration.ContainerTitle, folder.FullPath, null, Constants.ApplicationLogV1Namespace, data);
                }

                var entityPartClient      = repository.Configuration.GetDocumentStore <IEntityPartCapableDocumentStore>();
                var dsApplicationLogParts = entityPartClient.ListEntityParts(repository.Configuration.ContainerTitle, dsApplicationLog.Id);

                var dsCurrentHourApplicationLogPart = dsApplicationLogParts.FirstOrDefault(alp => alp.Name == date.Hour.ToString(CultureInfo.InvariantCulture));
                if (dsCurrentHourApplicationLogPart == null)
                {
                    var part = new ApplicationLogPart();
                    part.Entries.Add(entry);

                    var data = DocumentStoreHelper.SerializeObjectToJson(part);
                    entityPartClient.CreateEntityPart(repository.Configuration.ContainerTitle,
                                                      dsApplicationLog.Id,
                                                      date.Hour.ToString(
                                                          CultureInfo.InvariantCulture), "", data);
                }
                else
                {
                    var part =
                        DocumentStoreHelper.DeserializeObjectFromJson <ApplicationLogPart>(dsCurrentHourApplicationLogPart.Data);
                    var data = DocumentStoreHelper.SerializeObjectToJson(part);
                    part.Entries.Add(entry);
                    entityPartClient.UpdateEntityPartData(repository.Configuration.ContainerTitle, dsApplicationLog.Id,
                                                          date.Hour.ToString(CultureInfo.InvariantCulture), null, data);
                }
            }
        }
        public static ApplicationConfiguration GetApplicationConfiguration(Repository repository)
        {
            if (s_syncRoot == null)
            {
                s_syncRoot = new object();
            }

            //Double-check locking pattern
            var applicationConfigurationEntity =
                repository.Single(new EntityFilterCriteria
            {
                Path      = "",
                Namespace = Constants.ApplicationConfigurationV1Namespace
            });

            if (applicationConfigurationEntity == null)
            {
                lock (s_syncRoot)
                {
                    applicationConfigurationEntity =
                        repository.Single(new EntityFilterCriteria
                    {
                        Path      = "",
                        Namespace = Constants.ApplicationConfigurationV1Namespace
                    });
                    if (applicationConfigurationEntity == null)
                    {
                        var data = DocumentStoreHelper.SerializeObjectToJson(new ApplicationConfiguration
                        {
                            MinimumLogLevel = LogLevel.Error,
                        });

                        applicationConfigurationEntity =
                            repository.Configuration.DocumentStore.CreateEntity(repository.Configuration.ContainerTitle, null,
                                                                                Constants.ApplicationConfigurationV1Namespace, data);
                    }
                }
            }

            return(DocumentStoreHelper.DeserializeObjectFromJson <ApplicationConfiguration>(applicationConfigurationEntity.Data));
        }