blob: 0e35fd1f0a80f056ed77d9ab117331b5863ae1f9 [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.
*/
#pragma once
#include "geode_defs.hpp"
#include "begin_native.hpp"
#include <geode/RegionAttributesFactory.hpp>
#include "end_native.hpp"
#include "ExpirationAction.hpp"
#include "DiskPolicyType.hpp"
#include "ICacheLoader.hpp"
#include "ICacheWriter.hpp"
#include "ICacheListener.hpp"
#include "IPartitionResolver.hpp"
#include "IFixedPartitionResolver.hpp"
#include "IPersistenceManager.hpp"
#include "RegionAttributes.hpp"
#include "RegionAttributes.hpp"
#include "native_unique_ptr.hpp"
namespace Apache
{
namespace Geode
{
namespace Client
{
using namespace System;
using namespace System::Collections::Generic;
namespace native = apache::geode::client;
/// <summary>
/// Factory class to create instances of <see cref="RegionAttributes" />.
/// </summary>
/// <remarks>
/// An <see cref="RegionAttributesFactory" />
/// instance maintains state for creating <see cref="RegionAttributes" /> instances.
/// The setter methods are used to change the settings that will be used for
/// creating the next attributes instance with the <see cref="Create" />
/// method. If you create a factory with the default constructor, then the
/// factory is set up to create attributes with all default settings. You can
/// also create a factory by providing a preset <see cref="RegionAttributes" />.
/// <para>
/// Once a <see cref="RegionAttributes" /> is created, it can only be modified
/// after it has been used to create a <see cref="Region" />, and then only by
/// using an <see cref="AttributesMutator" /> obtained from the region.
/// </para><para>
/// <h3>Attributes</h3>
/// <h4>Callbacks</h4>
/// <dl>
/// <dt><see cref="ICacheLoader" /> [<em>default:</em> null]</dt>
/// <dd>User-implemented plug-in for loading data on cache misses.<br />
/// see <see cref="SetCacheLoader" />,
/// <see cref="RegionAttributes.CacheLoader" /></dd>
///
/// <dt><see cref="ICacheWriter" /> [<em>default:</em> null]</dt>
/// <dd>User-implemented plug-in for intercepting cache modifications, e.g.
/// for writing to an external data source.<br />
/// see <see cref="SetCacheWriter" />,
/// <see cref="RegionAttributes.CacheWriter" /></dd>
///
/// <dt><see cref="ICacheListener" /> [<em>default:</em> null]</dt>
/// <dd>User-implemented plug-in for receiving and handling cache-related events.<br />
/// see <see cref="SetCacheListener" />,
/// <see cref="RegionAttributes.CacheListener" /></dd>
///
/// <dt><see cref="IPartitionResolver" /> [<em>default:</em> null]</dt>
/// <dd>User-implemented plug-in for custom partitioning.<br />
/// see <see cref="SetPartitionResolver" />,
/// <see cref="RegionAttributes.PartitionResolver" /></dd>
/// </dl>
/// <h4>Expiration</h4>
/// <dl>
/// <dt>RegionTimeToLive [<em>default:</em> no expiration]</dt>
/// <dd>Expiration configuration for the entire region based on the
/// lastModifiedTime ( <see cref="CacheStatistics.LastModifiedTime" /> ).<br />
/// see <see cref="SetRegionTimeToLive" />,
/// <see cref="RegionAttributes.RegionTimeToLive" />,
/// <see cref="AttributesMutator.SetRegionTimeToLive" /></dd>
///
/// <dt>RegionIdleTimeout [<em>default:</em> no expiration]</dt>
/// <dd>Expiration configuration for the entire region based on the
/// lastAccessedTime ( <see cref="CacheStatistics.LastAccessedTime" /> ).<br />
/// see <see cref="SetRegionIdleTimeout" />,
/// <see cref="RegionAttributes.RegionIdleTimeout" />,
/// <see cref="AttributesMutator.SetRegionIdleTimeout" /></dd>
///
/// <dt>EntryTimeToLive [<em>default:</em> no expiration]</dt>
/// <dd>Expiration configuration for individual entries based on the
/// lastModifiedTime ( <see cref="CacheStatistics.LastModifiedTime" /> ).<br />
/// see <see cref="SetEntryTimeToLive" />,
/// <see cref="RegionAttributes.EntryTimeToLive" />,
/// <see cref="AttributesMutator.SetEntryTimeToLive" /></dd>
///
/// <dt>EntryIdleTimeout [<em>default:</em> no expiration]</dt>
/// <dd>Expiration configuration for individual entries based on the
/// lastAccessedTime ( <see cref="CacheStatistics.LastAccessedTime" /> ).<br />
/// see <see cref="SetEntryIdleTimeout" />,
/// <see cref="RegionAttributes.EntryIdleTimeout" />,
/// <see cref="AttributesMutator.SetEntryIdleTimeout" /></dd>
/// </dl>
/// <h4>Storage</h4>
/// <dl>
/// <dt>InitialCapacity [<em>default:</em> <tt>16</tt>]</dt>
/// <dd>The initial capacity of the map used for storing the entries.<br />
/// see <see cref="SetInitialCapacity" />,
/// <see cref="RegionAttributes.InitialCapacity" /></dd>
///
/// <dt>LoadFactor [<em>default:</em> <tt>0.75</tt>]</dt>
/// <dd>The load factor of the map used for storing the entries.<br />
/// see <see cref="SetLoadFactor" />,
/// <see cref="RegionAttributes.LoadFactor" /></dd>
///
/// <dt>ConcurrencyLevel [<em>default:</em> <tt>16</tt>]</dt>
/// <dd>The allowed concurrency among updates to values in the region
/// is guided by the <tt>concurrencyLevel</tt>, which is used as a hint
/// for internal sizing. The actual concurrency will vary.
/// Ideally, you should choose a value to accommodate as many
/// threads as will ever concurrently modify values in the region. Using a
/// significantly higher value than you need can waste space and time,
/// and a significantly lower value can lead to thread contention. But
/// overestimates and underestimates within an order of magnitude do
/// not usually have much noticeable impact. A value of one is
/// appropriate when it is known that only one thread will modify
/// and all others will only read.<br />
/// see <see cref="SetConcurrencyLevel" />,
/// <see cref="RegionAttributes.ConcurrencyLevel" /></dd>
///
/// </dl>
/// </para>
/// </remarks>
/// <seealso cref="RegionAttributes" />
/// <seealso cref="AttributesMutator" />
/// <seealso cref="Region.CreateSubRegion" />
generic<class TKey, class TValue>
public ref class RegionAttributesFactory sealed
{
public:
/// <summary>
/// Creates a new <c>RegionAttributesFactory</c> ready to create
/// a <c>RegionAttributes</c> with default settings.
/// </summary>
inline RegionAttributesFactory<TKey, TValue>( )
{
m_nativeptr = gcnew native_unique_ptr<native::RegionAttributesFactory>(std::make_unique<native::RegionAttributesFactory>());
}
/// <summary>
/// Creates a new instance of <c>RegionAttributesFactory</c> ready to create
/// a <c>RegionAttributes</c> with the same settings as those in the
/// specified <c>RegionAttributes</c>.
/// </summary>
/// <param name="regionAttributes">
/// attributes used to initialize this RegionAttributesFactory
/// </param>
RegionAttributesFactory<TKey, TValue>(RegionAttributes<TKey, TValue>^ regionAttributes);
// CALLBACKS
/// <summary>
/// Sets the cache loader for the <c>RegionAttributes</c> being created.
/// </summary>
/// <param name="cacheLoader">
/// a user-defined cache loader, or null for no cache loader
/// </param>
//generic<class TKey, class TValue>
RegionAttributesFactory<TKey, TValue>^ SetCacheLoader( ICacheLoader<TKey, TValue>^ cacheLoader );
/// <summary>
/// Sets the cache writer for the <c>RegionAttributes</c> being created.
/// </summary>
/// <param name="cacheWriter">
/// user-defined cache writer, or null for no cache writer
/// </param>
//generic<class TKey, class TValue>
RegionAttributesFactory<TKey, TValue>^ SetCacheWriter( ICacheWriter<TKey, TValue>^ cacheWriter );
/// <summary>
/// Sets the CacheListener for the <c>RegionAttributes</c> being created.
/// </summary>
/// <param name="cacheListener">
/// user-defined cache listener, or null for no cache listener
/// </param>
//generic<class TKey, class TValue>
RegionAttributesFactory<TKey, TValue>^ SetCacheListener( ICacheListener<TKey, TValue>^ cacheListener );
/// <summary>
/// Sets the PartitionResolver for the <c>RegionAttributes</c> being created.
/// </summary>
/// <param name="partitionresolver">
/// user-defined partition resolver, or null for no partition resolver
/// </param>
//generic<class TKey, class TValue>
RegionAttributesFactory<TKey, TValue>^ SetPartitionResolver( IPartitionResolver<TKey, TValue>^ partitionresolver );
/// <summary>
/// Sets the library path for the library that will be invoked for the loader of the region.
/// </summary>
/// <param name="libPath">
/// library pathname containing the factory function.
/// </param>
/// <param name="factoryFunctionName">
/// Name of factory function that creates a <c>CacheLoader</c>
/// for a native library, or the name of the method in the form
/// {Namespace}.{Class Name}.{Method Name} that creates an
/// <c>ICacheLoader</c> for a managed library.
/// </param>
//generic<class TKey, class TValue>
RegionAttributesFactory<TKey, TValue>^ SetCacheLoader( String^ libPath, String^ factoryFunctionName );
/// <summary>
/// Sets the library path for the library that will be invoked for the writer of the region.
/// </summary>
/// <param name="libPath">
/// library pathname containing the factory function.
/// </param>
/// <param name="factoryFunctionName">
/// Name of factory function that creates a <c>CacheWriter</c>
/// for a native library, or the name of the method in the form
/// {Namespace}.{Class Name}.{Method Name} that creates an
/// <c>ICacheWriter</c> for a managed library.
/// </param>
//generic<class TKey, class TValue>
RegionAttributesFactory<TKey, TValue>^ SetCacheWriter( String^ libPath, String^ factoryFunctionName );
/// <summary>
/// Sets the library path for the library that will be invoked for the listener of the region.
/// </summary>
/// <param name="libPath">
/// library pathname containing the factory function.
/// </param>
/// <param name="factoryFunctionName">
/// Name of factory function that creates a <c>CacheListener</c>
/// for a native library, or the name of the method in the form
/// {Namespace}.{Class Name}.{Method Name} that creates an
/// <c>ICacheListener</c> for a managed library.
/// </param>
//generic<class TKey, class TValue>
RegionAttributesFactory<TKey, TValue>^ SetCacheListener( String^ libPath, String^ factoryFunctionName );
/// <summary>
/// Sets the library path for the library that will be invoked for the partition resolver of the region.
/// </summary>
/// <param name="libPath">
/// library pathname containing the factory function.
/// </param>
/// <param name="factoryFunctionName">
/// Name of factory function that creates a <c>PartitionResolver</c>
/// for a native library, or the name of the method in the form
/// {Namespace}.{Class Name}.{Method Name} that creates an
/// <c>IPartitionResolver</c> for a managed library.
/// </param>
//generic<class TKey, class TValue>
RegionAttributesFactory<TKey, TValue>^ SetPartitionResolver( String^ libPath, String^ factoryFunctionName );
// EXPIRATION ATTRIBUTES
/// <summary>
/// Sets the idleTimeout expiration attributes for region entries for the next
/// <c>RegionAttributes</c> created.
/// </summary>
/// <param name="action">
/// The expiration action for which to set the timeout.
/// </param>
/// <param name="idleTimeout">
/// the idleTimeout in seconds for entries in this region.
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetEntryIdleTimeout( ExpirationAction action, TimeSpan idleTimeout );
/// <summary>
/// Sets the timeToLive expiration attributes for region entries for the next
/// <c>RegionAttributes</c> created.
/// </summary>
/// <param name="action">
/// The expiration action for which to set the timeout.
/// </param>
/// <param name="timeToLive">
/// the timeToLive in seconds for entries in this region.
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetEntryTimeToLive( ExpirationAction action, TimeSpan timeToLive );
/// <summary>
/// Sets the idleTimeout expiration attributes for the region itself for the
/// next <c>RegionAttributes</c> created.
/// </summary>
/// <param name="action">
/// The expiration action for which to set the timeout.
/// </param>
/// <param name="idleTimeout">
/// the idleTimeout in seconds for the region as a whole.
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetRegionIdleTimeout( ExpirationAction action, TimeSpan idleTimeout );
/// <summary>
/// Sets the timeToLive expiration attributes for the region itself for the
/// next <c>RegionAttributes</c> created.
/// </summary>
/// <param name="action">
/// The expiration action for which to set the timeout.
/// </param>
/// <param name="timeToLive">
/// the timeToLive in seconds for the region as a whole.
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetRegionTimeToLive( ExpirationAction action, TimeSpan timeToLive );
// PERSISTENCE
/// <summary>
/// Sets the PersistenceManager object that will be invoked for the persistence of the region.
/// </summary>
/// <param name="persistenceManager">
/// Persistence Manager object
/// </param>
//generic<class TKey, class TValue>
RegionAttributesFactory<TKey, TValue>^ SetPersistenceManager(IPersistenceManager<TKey, TValue>^ persistenceManager);
/// <summary>
/// Sets the PersistenceManager object that will be invoked for the persistence of the region.
/// </summary>
/// <param name="persistenceManager">
/// Persistence Manager object
/// </param>
/// <param name="config">
/// The configuration properties to use for the PersistenceManager.
/// </param>
//generic<class TKey, class TValue>
RegionAttributesFactory<TKey, TValue>^ SetPersistenceManager(IPersistenceManager<TKey, TValue>^ persistenceManager, Properties<String^, String^>^ config);
/// <summary>
/// Sets the library path for the library that will be invoked for the persistence of the region.
/// If the region is being created from a client on a server, or on a server directly, then
/// This must be used to set the PersistenceManager.
/// </summary>
/// <param name="libPath">The path of the PersistenceManager shared library.</param>
/// <param name="factoryFunctionName">
/// The name of the factory function to create an instance of PersistenceManager object.
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetPersistenceManager( String^ libPath, String^ factoryFunctionName );
/// <summary>
/// Sets the library path for the library that will be invoked for the persistence of the region.
/// If the region is being created from a client on a server, or on a server directly, then
/// This must be used to set the PersistenceManager.
/// </summary>
/// <param name="libPath">The path of the PersistenceManager shared library.</param>
/// <param name="factoryFunctionName">
/// The name of the factory function to create an instance of PersistenceManager object.
/// </param>
/// <param name="config">
/// The configuration properties to use for the PersistenceManager.
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetPersistenceManager( String^ libPath, String^ factoryFunctionName,
/*Dictionary<Object^, Object^>*/Properties<String^, String^>^ config );
// STORAGE ATTRIBUTES
/// <summary>
/// Set the pool name for a Thin Client region.
/// </summary>
/// <remarks>
/// The pool with the name specified must be already created.
/// </remarks>
/// <param name="poolName">
/// The name of the pool to attach to this region.
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetPoolName( String^ poolName );
// MAP ATTRIBUTES
/// <summary>
/// Sets the entry initial capacity for the <c>RegionAttributes</c>
/// being created. This value is used in initializing the map that
/// holds the entries.
/// </summary>
/// <param name="initialCapacity">the initial capacity of the entry map</param>
/// <exception cref="IllegalArgumentException">
/// if initialCapacity is nonpositive
/// </exception>
RegionAttributesFactory<TKey, TValue>^ SetInitialCapacity( System::Int32 initialCapacity );
/// <summary>
/// Sets the entry load factor for the next <c>RegionAttributes</c>
/// created. This value is
/// used in initializing the map that holds the entries.
/// </summary>
/// <param name="loadFactor">the load factor of the entry map</param>
/// <exception cref="IllegalArgumentException">
/// if loadFactor is nonpositive
/// </exception>
RegionAttributesFactory<TKey, TValue>^ SetLoadFactor( Single loadFactor );
/// <summary>
/// Sets the concurrency level of the next <c>RegionAttributes</c>
/// created. This value is used in initializing the map that holds the entries.
/// </summary>
/// <param name="concurrencyLevel">
/// the concurrency level of the entry map
/// </param>
/// <exception cref="IllegalArgumentException">
/// if concurrencyLevel is nonpositive
/// </exception>
RegionAttributesFactory<TKey, TValue>^ SetConcurrencyLevel( System::Int32 concurrencyLevel );
/// <summary>
/// Sets a limit on the number of entries that will be held in the cache.
/// If a new entry is added while at the limit, the cache will evict the
/// least recently used entry.
/// </summary>
/// <param name="entriesLimit">
/// The limit of the number of entries before eviction starts.
/// Defaults to 0, meaning no LRU actions will used.
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetLruEntriesLimit( System::UInt32 entriesLimit );
/// <summary>
/// Sets the disk policy type for the next <c>RegionAttributes</c> created.
/// </summary>
/// <param name="diskPolicy">
/// the disk policy to use for the region
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetDiskPolicy( DiskPolicyType diskPolicy );
/// <summary>
/// Set caching enabled flag for this region.
/// </summary>
/// <remarks>
/// <para>
/// If set to false, then no data is stored in the local process,
/// but events and distributions will still occur, and the region
/// can still be used to put and remove, etc...
/// </para><para>
/// The default if not set is 'true', 'false' is illegal for regions
/// of <c>ScopeType.Local</c> scope.
/// </para>
/// </remarks>
/// <param name="cachingEnabled">
/// if true, cache data for this region in this process.
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetCachingEnabled( bool cachingEnabled );
/// <summary>
/// Set cloning enabled flag for this region.
/// </summary>
/// <remarks>
/// <para>
/// If set to false, then there is no cloning will take place in case of delta.
/// Delta will be applied on the old value which will change old value in-place.
/// </para><para>
/// The default if not set is 'false'
/// of <c>ScopeType.Local</c> scope.
/// </para>
/// </remarks>
/// <param name="cloningEnabled">
/// if true, clone old value before applying delta so that in-place change would not occour..
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetCloningEnabled( bool cloningEnabled );
/// <summary>
/// Sets concurrency checks enabled flag for this region.
/// </summary>
/// <remarks>
/// <para>
/// If set to false, then the version checks will not occur.
/// </para><para>
/// The default if not set is 'true'
/// </para>
/// </remarks>
/// <param name="concurrencyChecksEnabled">
/// if true, version checks for region entries will occur.
/// </param>
RegionAttributesFactory<TKey, TValue>^ SetConcurrencyChecksEnabled( bool concurrencyChecksEnabled );
// FACTORY METHOD
/// <summary>
/// Creates a <c>RegionAttributes</c> with the current settings.
/// </summary>
/// <returns>the newly created <c>RegionAttributes</c></returns>
/// <exception cref="IllegalStateException">
/// if the current settings violate the
/// compatibility rules.
/// </exception>
RegionAttributes<TKey, TValue>^ Create( );
private:
native_unique_ptr<native::RegionAttributesFactory>^ m_nativeptr;
};
} // namespace Client
} // namespace Geode
} // namespace Apache