using System;
using System.Threading;
using System.Collections.Generic;
namespace Top.Api.Security
{
///
/// 计数器
///
public class SecurityCounter : SecurityConstants
{
private static readonly object Lock = new object();
private static readonly IDictionary AppCounter = new Dictionary();
private static readonly IDictionary> AppUserCounter = new Dictionary>();
private string appkey;
private static readonly object InitLock = new object();
public SecurityCounter(string appkey)
{
this.appkey = appkey;
lock (InitLock)
{
Counter appCounter = GetAppCounter(appkey);
if (appCounter == null)
{
appCounter = new Counter();
AppCounter.Add(appkey, appCounter);
}
IDictionary userCounter = GetUserCounter(appkey);
if (userCounter == null)
{
userCounter = new Dictionary();
AppUserCounter.Add(appkey, userCounter);
}
}
}
public static Counter GetAppCounter(string appkey)
{
Counter appCounter = null;
AppCounter.TryGetValue(appkey, out appCounter);
return appCounter;
}
public static IDictionary GetUserCounter(string appkey)
{
IDictionary userCounter = null;
AppUserCounter.TryGetValue(appkey, out userCounter);
return userCounter;
}
public static void AddEncryptCount(string type, Counter counter)
{
if (counter == null)
{
return;
}
if (PHONE.Equals(type))
{
Interlocked.Increment(ref counter.EncryptPhoneNum);
}
else if (NICK.Equals(type))
{
Interlocked.Increment(ref counter.EncryptNickNum);
}
else if (RECEIVER_NAME.Equals(type))
{
Interlocked.Increment(ref counter.EncryptReceiverNameNum);
}
else if (SIMPLE.Equals(type))
{
Interlocked.Increment(ref counter.EncryptSimpleNum);
}
else if (SEARCH.Equals(type))
{
Interlocked.Increment(ref counter.EncryptSearchNum);
}
}
public static void AddDecryptCount(string type, Counter counter)
{
if (counter == null)
{
return;
}
if (PHONE.Equals(type))
{
Interlocked.Increment(ref counter.DecryptPhoneNum);
}
else if (NICK.Equals(type))
{
Interlocked.Increment(ref counter.DecryptNickNum);
}
else if (RECEIVER_NAME.Equals(type))
{
Interlocked.Increment(ref counter.DecryptReceiverNameNum);
}
else if (SIMPLE.Equals(type))
{
Interlocked.Increment(ref counter.DecryptSimpleNum);
}
else if (SEARCH.Equals(type))
{
Interlocked.Increment(ref counter.DecryptSearchNum);
}
}
public static void AddSearchCount(string type, Counter counter)
{
if (counter == null)
{
return;
}
if (PHONE.Equals(type))
{
Interlocked.Increment(ref counter.SearchPhoneNum);
}
else if (NICK.Equals(type))
{
Interlocked.Increment(ref counter.SearchNickNum);
}
else if (RECEIVER_NAME.Equals(type))
{
Interlocked.Increment(ref counter.SearchReceiverNameNum);
}
else if (SIMPLE.Equals(type))
{
Interlocked.Increment(ref counter.SearchSimpleNum);
}
else if (SEARCH.Equals(type))
{
Interlocked.Increment(ref counter.SearchSearchNum);
}
}
public void AddEncryptCount(string type, string session)
{
AddEncryptCount(type, GetCounter(session));
}
public void AddDecryptCount(string type, string session)
{
AddDecryptCount(type, GetCounter(session));
}
public void AddSearchCount(string type, string session)
{
AddSearchCount(type, GetCounter(session));
}
public static void CleanUserCounter(string appkey)
{
IDictionary userCounter = GetUserCounter(appkey);
if (userCounter != null)
{
lock (Lock)
{
userCounter.Clear();
}
}
}
public static IDictionary CloneUserCounter(string appkey)
{
IDictionary targetDictionary = new Dictionary();
IDictionary userCounter = GetUserCounter(appkey);
if (userCounter == null)
{
return targetDictionary;
}
lock (Lock)
{
foreach (KeyValuePair currentPair in userCounter)
{
targetDictionary.Add(currentPair.Key, currentPair.Value);
}
}
return targetDictionary;
}
private Counter GetCounter(string session)
{
Counter counter = null;
if (session == null)
{
counter = GetAppCounter(appkey);
}
else
{
IDictionary userCounter = GetUserCounter(appkey);
if (userCounter == null)
{
return null;
}
lock (Lock)
{
userCounter.TryGetValue(session, out counter);
if (counter == null)
{
counter = new Counter();
userCounter.Add(session, counter);
}
}
}
return counter;
}
}
}