using System;
using System.Collections.Generic;
using Umbraco.Core.Sync;
namespace Umbraco.Web
{
///
/// An that works by messaging servers via web services.
///
///
/// This binds to appropriate umbraco events in order to trigger the FlushBatch() calls
///
internal class BatchedWebServiceServerMessenger : Core.Sync.BatchedWebServiceServerMessenger
{
internal BatchedWebServiceServerMessenger()
: base()
{
UmbracoModule.EndRequest += UmbracoModule_EndRequest;
}
internal BatchedWebServiceServerMessenger(string login, string password)
: base(login, password)
{
UmbracoModule.EndRequest += UmbracoModule_EndRequest;
}
internal BatchedWebServiceServerMessenger(string login, string password, bool useDistributedCalls)
: base(login, password, useDistributedCalls)
{
UmbracoModule.EndRequest += UmbracoModule_EndRequest;
}
public BatchedWebServiceServerMessenger(Func> getLoginAndPassword)
: base(getLoginAndPassword)
{
UmbracoModule.EndRequest += UmbracoModule_EndRequest;
}
protected override ICollection GetBatch(bool ensureHttpContext)
{
var httpContext = UmbracoContext.Current == null ? null : UmbracoContext.Current.HttpContext;
if (httpContext == null)
{
if (ensureHttpContext)
throw new NotSupportedException("Cannot execute without a valid/current UmbracoContext with an HttpContext assigned.");
return null;
}
var key = typeof(BatchedWebServiceServerMessenger).Name;
// no thread-safety here because it'll run in only 1 thread (request) at a time
var batch = (ICollection)httpContext.Items[key];
if (batch == null && ensureHttpContext)
httpContext.Items[key] = batch = new List();
return batch;
}
void UmbracoModule_EndRequest(object sender, EventArgs e)
{
FlushBatch();
}
protected override void ProcessBatch(RefreshInstructionEnvelope[] batch)
{
Message(batch);
}
}
}