-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
db56937
commit 6446299
Showing
18 changed files
with
345 additions
and
74 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
using System; | ||
|
||
namespace PerplexUmbraco.Forms.Code | ||
{ | ||
public static class ArrayExtensions | ||
{ | ||
public static void ForEach(this Array array, Action<Array, int[]> action) | ||
{ | ||
if (array.LongLength == 0) return; | ||
ArrayTraverse walker = new ArrayTraverse(array); | ||
do action(array, walker.Position); | ||
while (walker.Step()); | ||
} | ||
} | ||
|
||
internal class ArrayTraverse | ||
{ | ||
public int[] Position; | ||
private int[] maxLengths; | ||
|
||
public ArrayTraverse(Array array) | ||
{ | ||
maxLengths = new int[array.Rank]; | ||
for (int i = 0; i < array.Rank; ++i) | ||
{ | ||
maxLengths[i] = array.GetLength(i) - 1; | ||
} | ||
Position = new int[array.Rank]; | ||
} | ||
|
||
public bool Step() | ||
{ | ||
for (int i = 0; i < Position.Length; ++i) | ||
{ | ||
if (Position[i] < maxLengths[i]) | ||
{ | ||
Position[i]++; | ||
for (int j = 0; j < i; j++) | ||
{ | ||
Position[j] = 0; | ||
} | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
using System; | ||
|
||
using Umbraco.Core; | ||
using Umbraco.Core.Logging; | ||
|
||
namespace PerplexUmbraco.Forms.Code | ||
{ | ||
public class CacheService : ICacheService | ||
{ | ||
public void SetRequestCache(string cacheKey, object cacheObject) | ||
{ | ||
if (cacheObject != null) | ||
{ | ||
ApplicationContext.Current.ApplicationCache.RequestCache.GetCacheItem(cacheKey, () => cacheObject); | ||
return; | ||
} | ||
|
||
LogHelper.Warn<CacheService>($"Failed to cache null object with key: {cacheKey}"); | ||
} | ||
|
||
public T GetRequestCache<T>(string cacheKey) | ||
{ | ||
var cachedObject = ApplicationContext.Current.ApplicationCache.RequestCache.GetCacheItem(cacheKey); | ||
|
||
if (cachedObject == null) | ||
{ | ||
return default(T); | ||
} | ||
|
||
return (T)cachedObject; | ||
} | ||
|
||
public void SetRuntimeCache(string cacheKey, object cacheObject, TimeSpan duration) | ||
{ | ||
SetRuntimeCache(cacheKey, cacheObject, duration, false); | ||
} | ||
|
||
public void SetRuntimeCache(string cacheKey, object cacheObject, TimeSpan duration, bool isSliding) | ||
{ | ||
if (cacheObject != null) | ||
{ | ||
ApplicationContext.Current.ApplicationCache.RuntimeCache.InsertCacheItem(cacheKey, cacheObject.Copy, duration, isSliding); | ||
return; | ||
} | ||
|
||
LogHelper.Warn<CacheService>($"Failed to cache null object with key: {cacheKey}"); | ||
} | ||
|
||
public void ClearRuntimeCacheByKey(string cacheKey) | ||
{ | ||
ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheItem(cacheKey); | ||
} | ||
|
||
public void ClearRuntimeCacheByPrefix(string prefix) | ||
{ | ||
ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(prefix); | ||
} | ||
|
||
public T GetRuntimeCache<T>(string cacheKey) | ||
{ | ||
var cachedObject = ApplicationContext.Current.ApplicationCache.RuntimeCache.GetCacheItem(cacheKey); | ||
|
||
if (cachedObject == null) | ||
{ | ||
return default(T); | ||
} | ||
|
||
return ((T)cachedObject).Copy(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 1 addition & 5 deletions
6
Perplex.Umbraco.Forms/Code/Configuration/PerplexBaseFileConfig.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
14 changes: 14 additions & 0 deletions
14
Perplex.Umbraco.Forms/Code/Configuration/PerplexCacheConfig.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
using System.Xml.Serialization; | ||
|
||
namespace PerplexUmbraco.Forms.Code.Configuration | ||
{ | ||
[XmlType("PerplexCacheConfig")] | ||
public class PerplexCacheConfig | ||
{ | ||
[XmlElement("CacheDurationInMinutes")] | ||
public int CacheDurationInMinutes { get; set; } | ||
|
||
[XmlElement("EnableCache")] | ||
public bool EnableCache { get; set; } | ||
} | ||
} |
7 changes: 1 addition & 6 deletions
7
Perplex.Umbraco.Forms/Code/Configuration/PerplexFileUploadConfig.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 1 addition & 6 deletions
7
Perplex.Umbraco.Forms/Code/Configuration/PerplexImageUploadConfig.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 1 addition & 6 deletions
7
Perplex.Umbraco.Forms/Code/Configuration/PerplexRecaptchaConfig.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
using System; | ||
|
||
namespace PerplexUmbraco.Forms.Code | ||
{ | ||
public interface ICacheService | ||
{ | ||
T GetRequestCache<T>(string cacheKey); | ||
void SetRequestCache(string cacheKey, object cacheObject); | ||
T GetRuntimeCache<T>(string cacheKey); | ||
void SetRuntimeCache(string cacheKey, object cacheObject, TimeSpan duration); | ||
void SetRuntimeCache(string cacheKey, object cacheObject, TimeSpan duration, bool isSliding); | ||
void ClearRuntimeCacheByKey(string cacheKey); | ||
void ClearRuntimeCacheByPrefix(string prefix); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Reflection; | ||
|
||
using Newtonsoft.Json; | ||
using Newtonsoft.Json.Serialization; | ||
|
||
namespace PerplexUmbraco.Forms.Code | ||
{ | ||
public static class ObjectExtensions | ||
{ | ||
private static readonly MethodInfo CloneMethod = typeof(Object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance); | ||
|
||
public static bool IsPrimitive(this Type type) | ||
{ | ||
if (type == typeof(String)) return true; | ||
return (type.IsValueType & type.IsPrimitive); | ||
} | ||
|
||
public static Object Copy(this Object originalObject) | ||
{ | ||
return InternalCopy(originalObject, new Dictionary<Object, Object>(new ReferenceEqualityComparer())); | ||
} | ||
|
||
public static T Copy<T>(this T original) | ||
{ | ||
return (T)Copy((Object)original); | ||
} | ||
|
||
public static bool IsNullOrWhiteSpaceString(this object item) | ||
{ | ||
return string.IsNullOrWhiteSpace(item?.ToString()); | ||
} | ||
|
||
public static string ToJson(this object o, bool camelCase = false) | ||
{ | ||
var settings = new JsonSerializerSettings(); | ||
if (camelCase) | ||
{ | ||
settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); | ||
} | ||
|
||
return JsonConvert.SerializeObject(o, settings); | ||
} | ||
|
||
private static Object InternalCopy(Object originalObject, IDictionary<Object, Object> visited) | ||
{ | ||
if (originalObject == null) return null; | ||
var typeToReflect = originalObject.GetType(); | ||
if (IsPrimitive(typeToReflect)) return originalObject; | ||
if (visited.ContainsKey(originalObject)) return visited[originalObject]; | ||
if (typeof(Delegate).IsAssignableFrom(typeToReflect)) return null; | ||
var cloneObject = CloneMethod.Invoke(originalObject, null); | ||
if (typeToReflect.IsArray) | ||
{ | ||
var arrayType = typeToReflect.GetElementType(); | ||
if (IsPrimitive(arrayType) == false) | ||
{ | ||
Array clonedArray = (Array)cloneObject; | ||
clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)); | ||
} | ||
|
||
} | ||
visited.Add(originalObject, cloneObject); | ||
CopyFields(originalObject, visited, cloneObject, typeToReflect); | ||
RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect); | ||
return cloneObject; | ||
} | ||
|
||
private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary<object, object> visited, object cloneObject, Type typeToReflect) | ||
{ | ||
if (typeToReflect.BaseType != null) | ||
{ | ||
RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType); | ||
CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate); | ||
} | ||
} | ||
|
||
private static void CopyFields(object originalObject, IDictionary<object, object> visited, object cloneObject, Type typeToReflect, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, Func<FieldInfo, bool> filter = null) | ||
{ | ||
foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) | ||
{ | ||
if (filter != null && filter(fieldInfo) == false) continue; | ||
if (IsPrimitive(fieldInfo.FieldType)) continue; | ||
var originalFieldValue = fieldInfo.GetValue(originalObject); | ||
var clonedFieldValue = InternalCopy(originalFieldValue, visited); | ||
fieldInfo.SetValue(cloneObject, clonedFieldValue); | ||
} | ||
} | ||
} | ||
|
||
public class ReferenceEqualityComparer : EqualityComparer<Object> | ||
{ | ||
public override bool Equals(object x, object y) | ||
{ | ||
return ReferenceEquals(x, y); | ||
} | ||
public override int GetHashCode(object obj) | ||
{ | ||
if (obj == null) return 0; | ||
return obj.GetHashCode(); | ||
} | ||
} | ||
} |
Oops, something went wrong.