blob: 6a79f46ba54cbbb5c87b24ab5ab12c595e44f5a7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Collections;
using System.Runtime.Serialization;
namespace Apache.Geode.Client.UnitTests
{
using NUnit.Framework;
using Apache.Geode.Client;
/// <summary>
/// Interface class for wrappers of geode cacheable types.
/// </summary>
/// <remarks>
/// This interface has various useful functions like setting value randomly,
/// and finding checksum.
/// </remarks>
public abstract class CacheableWrapper
{
#region Protected members
protected object m_cacheableObject = null;
protected uint m_typeId;
#endregion
public virtual object Cacheable
{
get
{
return m_cacheableObject;
}
}
public uint TypeId
{
get
{
return m_typeId;
}
set
{
m_typeId = value;
}
}
public abstract void InitRandomValue(int maxSize);
public abstract uint GetChecksum(object cacheableObject);
public virtual int GetHashCodeN(object cacheableObject)
{
return cacheableObject.GetHashCode();
}
public virtual uint GetChecksum()
{
return GetChecksum(m_cacheableObject);
}
public virtual int GetHashCodeN()
{
return GetHashCodeN(m_cacheableObject);
}
}
/// <summary>
/// Interface class for wrappers of geode cacheable key types.
/// </summary>
/// <remarks>
/// This interface has various useful functions like setting value randomly,
/// and finding checksum, initializing key etc.
/// </remarks>
public abstract class CacheableKeyWrapper : CacheableWrapper
{
public override object Cacheable
{
get
{
return m_cacheableObject;
}
}
public virtual object CacheableKey
{
get
{
return (object)m_cacheableObject;
}
}
public abstract int MaxKeys
{
get;
}
public abstract void InitKey(int keyIndex, int maxSize);
}
public delegate CacheableWrapper CacheableWrapperDelegate();
public delegate CacheableKeyWrapper CacheableKeyWrapperDelegate();
/// <summary>
/// Factory class to create <c>CacheableWrapper</c> objects.
/// </summary>
public static class CacheableWrapperFactory
{
#region Private members
private static Dictionary<UInt32, CacheableKeyWrapperDelegate>
m_registeredKeyTypeIdMap =
new Dictionary<UInt32, CacheableKeyWrapperDelegate>();
private static Dictionary<UInt32, Delegate>
m_registeredValueTypeIdMap = new Dictionary<UInt32, Delegate>();
private static Dictionary<UInt32, Type>
m_typeIdNameMap = new Dictionary<UInt32, Type>();
private static Dictionary<Type, UInt32>
m_dotnetTypeVsCKWDelegate =
new Dictionary<Type, UInt32>();
#endregion
#region Public methods
public static CacheableWrapper CreateInstance(UInt32 typeId)
{
Delegate wrapperDelegate;
lock (((ICollection)m_registeredValueTypeIdMap).SyncRoot)
{
if (m_registeredValueTypeIdMap.TryGetValue(typeId,
out wrapperDelegate))
{
CacheableWrapper wrapper =
(CacheableWrapper)wrapperDelegate.DynamicInvoke(null);
wrapper.TypeId = typeId;
return wrapper;
}
}
return null;
}
public static CacheableWrapper CreateInstance(Object obj)
{
UInt32 typeId;
lock (((ICollection)m_registeredValueTypeIdMap).SyncRoot)
{
if (m_dotnetTypeVsCKWDelegate.TryGetValue(obj.GetType(),
out typeId))
{
return CreateInstance(typeId);
}
}
return null;
}
public static CacheableKeyWrapper CreateKeyInstance(UInt32 typeId)
{
CacheableKeyWrapperDelegate wrapperDelegate;
lock (((ICollection)m_registeredKeyTypeIdMap).SyncRoot)
{
if (m_registeredKeyTypeIdMap.TryGetValue(typeId,
out wrapperDelegate))
{
CacheableKeyWrapper wrapper = wrapperDelegate();
wrapper.TypeId = typeId;
return wrapper;
}
}
return null;
}
public static CacheableKeyWrapper CreateKeyInstance(object obj)
{
uint typeId;
lock (((ICollection)m_dotnetTypeVsCKWDelegate).SyncRoot)
{
if (m_dotnetTypeVsCKWDelegate.TryGetValue(obj.GetType(),
out typeId))
{
return CreateKeyInstance(typeId);
}
}
return null;
}
public static void RegisterType(UInt32 typeId,
Type type, CacheableWrapperDelegate wrapperDelegate)
{
m_registeredValueTypeIdMap[typeId] = wrapperDelegate;
m_typeIdNameMap[typeId] = type;
}
public static void RegisterType(UInt32 typeId,
Type type, CacheableWrapperDelegate wrapperDelegate, Type dotnetType)
{
m_registeredValueTypeIdMap[typeId] = wrapperDelegate;
m_typeIdNameMap[typeId] = type;
m_dotnetTypeVsCKWDelegate[dotnetType] = typeId;
}
public static void RegisterKeyType(UInt32 typeId,
Type type, CacheableKeyWrapperDelegate wrapperDelegate)
{
m_registeredKeyTypeIdMap[typeId] = wrapperDelegate;
m_registeredValueTypeIdMap[typeId] = wrapperDelegate;
m_typeIdNameMap[typeId] = type;
}
public static void RegisterKeyType(UInt32 typeId,
Type type, CacheableKeyWrapperDelegate wrapperDelegate, Type dotnetType)
{
m_registeredKeyTypeIdMap[typeId] = wrapperDelegate;
m_registeredValueTypeIdMap[typeId] = wrapperDelegate;
m_typeIdNameMap[typeId] = type;
m_dotnetTypeVsCKWDelegate[dotnetType] = typeId;
}
public static void ClearStaticVaraiables()
{
m_registeredKeyTypeIdMap.Clear();
m_registeredValueTypeIdMap.Clear();
m_typeIdNameMap.Clear();
m_dotnetTypeVsCKWDelegate.Clear();
}
public static Type GetTypeForId(UInt32 typeId)
{
Type type;
lock (((ICollection)m_typeIdNameMap).SyncRoot)
{
if (m_typeIdNameMap.TryGetValue(typeId, out type))
{
return type;
}
}
return null;
}
public static ICollection<UInt32> GetRegisteredKeyTypeIds()
{
return m_registeredKeyTypeIdMap.Keys;
}
public static ICollection<UInt32> GetRegisteredValueTypeIds()
{
return m_registeredValueTypeIdMap.Keys;
}
#endregion
}
}