| using System; | 
| using System.Threading; | 
| using System.Collections.Generic; | 
|   | 
|   | 
| namespace Top.Api.Security | 
| { | 
|   | 
|     /// <summary> | 
|     /// 计数器 | 
|     /// </summary> | 
|     public class SecurityCounter : SecurityConstants | 
|     { | 
|         private static readonly object Lock = new object(); | 
|         private static readonly IDictionary<string, Counter> AppCounter = new Dictionary<string, Counter>(); | 
|         private static readonly IDictionary<string, IDictionary<string, Counter>> AppUserCounter = new Dictionary<string, IDictionary<string, Counter>>(); | 
|         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<string, Counter> userCounter = GetUserCounter(appkey); | 
|                 if (userCounter == null) | 
|                 { | 
|                     userCounter = new Dictionary<string, Counter>(); | 
|                     AppUserCounter.Add(appkey, userCounter); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         public static Counter GetAppCounter(string appkey) | 
|         { | 
|             Counter appCounter = null; | 
|             AppCounter.TryGetValue(appkey, out appCounter); | 
|             return appCounter; | 
|         } | 
|   | 
|         public static IDictionary<string, Counter> GetUserCounter(string appkey) | 
|         { | 
|             IDictionary<string, Counter> 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<string, Counter> userCounter = GetUserCounter(appkey); | 
|             if (userCounter != null) | 
|             { | 
|                 lock (Lock) | 
|                 { | 
|                     userCounter.Clear(); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         public static IDictionary<string, Counter> CloneUserCounter(string appkey) | 
|         { | 
|             IDictionary<string, Counter> targetDictionary = new Dictionary<string, Counter>(); | 
|             IDictionary<string, Counter> userCounter = GetUserCounter(appkey); | 
|             if (userCounter == null) | 
|             { | 
|                 return targetDictionary; | 
|             } | 
|            | 
|             lock (Lock) | 
|             { | 
|                 foreach (KeyValuePair<string, Counter> 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<string, Counter> 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; | 
|         } | 
|     } | 
| } |