http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/AttributesFactory.hpp ---------------------------------------------------------------------- diff --git a/clicache/src/AttributesFactory.hpp b/clicache/src/AttributesFactory.hpp new file mode 100644 index 0000000..608c372 --- /dev/null +++ b/clicache/src/AttributesFactory.hpp @@ -0,0 +1,513 @@ +/* + * 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/AttributesFactory.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" + + +using namespace System; +using namespace System::Collections::Generic; + +namespace Apache +{ + namespace Geode + { + namespace Client + { + namespace native = apache::geode::client; + + /// <summary> + /// Factory class to create instances of <see cref="RegionAttributes" />. + /// </summary> + /// <remarks> + /// An <see cref="AttributesFactory" /> + /// 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="CreateRegionAttributes" /> + /// 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 AttributesFactory sealed + { + public: + + /// <summary> + /// Creates a new <c>AttributesFactory</c> ready to create + /// a <c>RegionAttributes</c> with default settings. + /// </summary> + inline AttributesFactory<TKey, TValue>( ) + { + m_nativeptr = gcnew native_unique_ptr<native::AttributesFactory>(std::make_unique<native::AttributesFactory>()); + } + + /// <summary> + /// Creates a new instance of <c>AttributesFactory</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 AttributesFactory + /// </param> + AttributesFactory<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> + void 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> + void 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> + void 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> + void 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> + void 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> + void 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> + void 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> + void 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> + void SetEntryIdleTimeout( ExpirationAction action, System::UInt32 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> + void SetEntryTimeToLive( ExpirationAction action, System::UInt32 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> + void SetRegionIdleTimeout( ExpirationAction action, System::UInt32 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> + void SetRegionTimeToLive( ExpirationAction action, System::UInt32 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> + void 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> + void 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> + void 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> + void 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> + void 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> + void 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> + void 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> + void 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> + void 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> + void 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> + void 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> + void 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> + void 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>^ CreateRegionAttributes( ); + + private: + native_unique_ptr<native::AttributesFactory>^ m_nativeptr; + }; + } // namespace Client + } // namespace Geode +} // namespace Apache +
http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/AttributesMutator.cpp ---------------------------------------------------------------------- diff --git a/clicache/src/AttributesMutator.cpp b/clicache/src/AttributesMutator.cpp new file mode 100644 index 0000000..9702ae3 --- /dev/null +++ b/clicache/src/AttributesMutator.cpp @@ -0,0 +1,251 @@ +/* + * 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. + */ + +#include "AttributesMutator.hpp" + +#include "impl/ManagedCacheListener.hpp" +#include "impl/ManagedCacheLoader.hpp" +#include "impl/ManagedCacheWriter.hpp" +#include "impl/CacheLoader.hpp" +#include "impl/CacheWriter.hpp" +#include "impl/CacheListener.hpp" + +using namespace System; + +namespace Apache +{ + namespace Geode + { + namespace Client + { + namespace native = apache::geode::client; + + generic<class TKey, class TValue> + System::Int32 AttributesMutator<TKey, TValue>::SetEntryIdleTimeout( System::Int32 idleTimeout ) + { + try + { + return m_nativeptr->get()->setEntryIdleTimeout( idleTimeout ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + ExpirationAction AttributesMutator<TKey, TValue>::SetEntryIdleTimeoutAction( + ExpirationAction action ) + { + try + { + return static_cast<ExpirationAction>( + m_nativeptr->get()->setEntryIdleTimeoutAction( + static_cast<native::ExpirationAction::Action>(action))); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + System::Int32 AttributesMutator<TKey, TValue>::SetEntryTimeToLive( System::Int32 timeToLive ) + { + try + { + return m_nativeptr->get()->setEntryTimeToLive( timeToLive ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + ExpirationAction AttributesMutator<TKey, TValue>::SetEntryTimeToLiveAction( + ExpirationAction action ) + { + try + { + return static_cast<ExpirationAction>( + m_nativeptr->get()->setEntryTimeToLiveAction( + static_cast<native::ExpirationAction::Action>(action))); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + System::Int32 AttributesMutator<TKey, TValue>::SetRegionIdleTimeout( System::Int32 idleTimeout ) + { + try + { + return m_nativeptr->get()->setRegionIdleTimeout( idleTimeout ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + ExpirationAction AttributesMutator<TKey, TValue>::SetRegionIdleTimeoutAction( + ExpirationAction action ) + { + try + { + return static_cast<ExpirationAction>( + m_nativeptr->get()->setRegionIdleTimeoutAction( + static_cast<native::ExpirationAction::Action>(action))); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + System::Int32 AttributesMutator<TKey, TValue>::SetRegionTimeToLive( System::Int32 timeToLive ) + { + try + { + return m_nativeptr->get()->setRegionTimeToLive( timeToLive ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + ExpirationAction AttributesMutator<TKey, TValue>::SetRegionTimeToLiveAction( + ExpirationAction action ) + { + try + { + return static_cast<ExpirationAction>( + m_nativeptr->get()->setRegionTimeToLiveAction( + static_cast<native::ExpirationAction::Action>(action))); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + System::UInt32 AttributesMutator<TKey, TValue>::SetLruEntriesLimit( System::UInt32 entriesLimit ) + { + try + { + return m_nativeptr->get()->setLruEntriesLimit( entriesLimit ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + void AttributesMutator<TKey, TValue>::SetCacheListener( ICacheListener<TKey, TValue>^ cacheListener ) + { + native::CacheListenerPtr listenerptr; + if (cacheListener != nullptr) + { + auto clg = gcnew CacheListenerGeneric<TKey, TValue>(); + clg->SetCacheListener(cacheListener); + listenerptr = std::shared_ptr<native::ManagedCacheListenerGeneric>( new native::ManagedCacheListenerGeneric(cacheListener) ); + ((native::ManagedCacheListenerGeneric*)listenerptr.get())->setptr(clg); + } + try + { + m_nativeptr->get()->setCacheListener( listenerptr ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + void AttributesMutator<TKey, TValue>::SetCacheListener( String^ libPath, + String^ factoryFunctionName ) + { + throw gcnew System::NotSupportedException; + } + + generic<class TKey, class TValue> + void AttributesMutator<TKey, TValue>::SetCacheLoader( ICacheLoader<TKey, TValue>^ cacheLoader ) + { + native::CacheLoaderPtr loaderptr; + if (cacheLoader != nullptr) + { + auto clg = gcnew CacheLoaderGeneric<TKey, TValue>(); + clg->SetCacheLoader(cacheLoader); + loaderptr = std::shared_ptr<native::ManagedCacheLoaderGeneric>( new native::ManagedCacheLoaderGeneric(cacheLoader) ); + ((native::ManagedCacheLoaderGeneric*)loaderptr.get())->setptr(clg); + } + try + { + m_nativeptr->get()->setCacheLoader( loaderptr ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + void AttributesMutator<TKey, TValue>::SetCacheLoader( String^ libPath, + String^ factoryFunctionName ) + { + throw gcnew System::NotSupportedException; + } + + generic<class TKey, class TValue> + void AttributesMutator<TKey, TValue>::SetCacheWriter( ICacheWriter<TKey, TValue>^ cacheWriter ) + { + native::CacheWriterPtr writerptr; + if (cacheWriter != nullptr) + { + auto cwg = gcnew CacheWriterGeneric<TKey, TValue>(); + cwg->SetCacheWriter(cacheWriter); + writerptr = std::shared_ptr<native::ManagedCacheWriterGeneric>( new native::ManagedCacheWriterGeneric(cacheWriter) ); + ((native::ManagedCacheWriterGeneric*)writerptr.get())->setptr(cwg); + } + try + { + m_nativeptr->get()->setCacheWriter( writerptr ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + generic<class TKey, class TValue> + void AttributesMutator<TKey, TValue>::SetCacheWriter( String^ libPath, + String^ factoryFunctionName ) + { + throw gcnew System::NotSupportedException; + } + } // namespace Client + } // namespace Geode +} // namespace Apache http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/AttributesMutator.hpp ---------------------------------------------------------------------- diff --git a/clicache/src/AttributesMutator.hpp b/clicache/src/AttributesMutator.hpp new file mode 100644 index 0000000..db0bd62 --- /dev/null +++ b/clicache/src/AttributesMutator.hpp @@ -0,0 +1,271 @@ +/* + * 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/AttributesMutator.hpp> +#include "end_native.hpp" + +#include "native_shared_ptr.hpp" +#include "ExpirationAction.hpp" +#include "ICacheListener.hpp" +#include "ICacheLoader.hpp" +#include "ICacheWriter.hpp" + + +using namespace System; + +namespace Apache +{ + namespace Geode + { + namespace Client + { + namespace native = apache::geode::client; + + /// <summary> + /// Supports modification of certain region attributes after the region + /// has been created. + /// </summary> + /// <remarks> + /// <para> + /// It is required that the attributes be completely initialized using an + /// <see cref="AttributesFactory" /> before creating the region. + /// AttributesMutator can be applied to adjusting and tuning a subset of + /// attributes that are modifiable at runtime. + /// </para><para> + /// The setter methods all return the previous value of the attribute. + /// </para> + /// </remarks> + /// <seealso cref="Region.AttributesMutator" /> + /// <seealso cref="RegionAttributes" /> + /// <seealso cref="AttributesFactory" /> + generic<class TKey, class TValue> + public ref class AttributesMutator sealed + { + public: + + /// <summary> + /// Sets the idleTimeout duration for region entries. + /// </summary> + /// <param name="idleTimeout"> + /// the idleTimeout in seconds for entries in this region, or 0 for no idle timeout + /// </param> + /// <returns>the previous value</returns> + /// <exception cref="IllegalStateException"> + /// if the new idleTimeout changes entry expiration from + /// disabled to enabled or enabled to disabled. + /// </exception> + System::Int32 SetEntryIdleTimeout( System::Int32 idleTimeout ); + + /// <summary> + /// Sets the idleTimeout action for region entries. + /// </summary> + /// <param name="action"> + /// the idleTimeout action for entries in this region + /// </param> + /// <returns>the previous action</returns> + ExpirationAction SetEntryIdleTimeoutAction( ExpirationAction action ); + + /// <summary> + /// Sets the timeToLive duration for region entries. + /// </summary> + /// <param name="timeToLive"> + /// the timeToLive in seconds for entries in this region, or 0 to disable time-to-live + /// </param> + /// <returns>the previous value</returns> + /// <exception cref="IllegalStateException"> + /// if the new timeToLive changes entry expiration from + /// disabled to enabled or enabled to disabled + /// </exception> + System::Int32 SetEntryTimeToLive( System::Int32 timeToLive ); + + /// <summary> + /// Set the timeToLive action for region entries. + /// </summary> + /// <param name="action"> + /// the timeToLive action for entries in this region + /// </param> + /// <returns>the previous action</returns> + ExpirationAction SetEntryTimeToLiveAction( ExpirationAction action ); + + /// <summary> + /// Sets the idleTimeout duration for the region itself. + /// </summary> + /// <param name="idleTimeout"> + /// the idleTimeout for this region, in seconds, or 0 to disable idle timeout + /// </param> + /// <returns>the previous value</returns> + /// <exception cref="IllegalStateException"> + /// if the new idleTimeout changes region expiration from + /// disabled to enabled or enabled to disabled. + /// </exception> + System::Int32 SetRegionIdleTimeout( System::Int32 idleTimeout ); + + /// <summary> + /// Sets the idleTimeout action for the region itself. + /// </summary> + /// <param name="action"> + /// the idleTimeout action for this region + /// </param> + /// <returns>the previous action</returns> + ExpirationAction SetRegionIdleTimeoutAction( ExpirationAction action ); + + /// <summary> + /// Sets the timeToLive duration for the region itself. + /// </summary> + /// <param name="timeToLive"> + /// the timeToLive for this region, in seconds, or 0 to disable time-to-live + /// </param> + /// <returns>the previous value</returns> + /// <exception cref="IllegalStateException"> + /// if the new timeToLive changes region expiration from + /// disabled to enabled or enabled to disabled. + /// </exception> + System::Int32 SetRegionTimeToLive( System::Int32 timeToLive ); + + /// <summary> + /// Sets the timeToLive action for the region itself. + /// </summary> + /// <param name="action"> + /// the timeToLiv eaction for this region + /// </param> + /// <returns>the previous action</returns> + ExpirationAction SetRegionTimeToLiveAction( ExpirationAction action ); + + /// <summary> + /// Sets the maximum entry count in the region before LRU eviction. + /// </summary> + /// <param name="entriesLimit">the number of entries to allow, or 0 to disable LRU</param> + /// <returns>the previous value</returns> + /// <exception cref="IllegalStateException"> + /// if the new entriesLimit changes LRU from + /// disabled to enabled or enabled to disabled. + /// </exception> + System::UInt32 SetLruEntriesLimit( System::UInt32 entriesLimit ); + + /// <summary> + /// Sets the CacheListener for the region. + /// The previous cache listener (if any) will be replaced with the given <c>cacheListener</c>. + /// </summary> + /// <param name="cacheListener"> + /// user-defined cache listener, or null for no cache listener + /// </param> + void SetCacheListener( ICacheListener<TKey, TValue>^ cacheListener ); + + /// <summary> + /// Sets the library path for the library that will be invoked for the listener of the region. + /// The previous cache listener will be replaced with a listener created + /// using the factory function provided in the given library. + /// </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> + void SetCacheListener( String^ libPath, String^ factoryFunctionName ); + + /// <summary> + /// Sets the CacheLoader for the region. + /// The previous cache loader (if any) will be replaced with the given <c>cacheLoader</c>. + /// </summary> + /// <param name="cacheLoader"> + /// user-defined cache loader, or null for no cache loader + /// </param> + void SetCacheLoader( ICacheLoader<TKey, TValue>^ cacheLoader ); + + /// <summary> + /// Sets the library path for the library that will be invoked for the loader of the region. + /// The previous cache loader will be replaced with a loader created + /// using the factory function provided in the given library. + /// </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> + void SetCacheLoader( String^ libPath, String^ factoryFunctionName ); + + /// <summary> + /// Sets the CacheListener for the region. + /// The previous cache writer (if any) will be replaced with the given <c>cacheWriter</c>. + /// </summary> + /// <param name="cacheWriter"> + /// user-defined cache writer, or null for no cache writer + /// </param> + void SetCacheWriter( ICacheWriter<TKey, TValue>^ cacheWriter ); + + /// <summary> + /// Sets the library path for the library that will be invoked for the writer of the region. + /// The previous cache writer will be replaced with a writer created + /// using the factory function provided in the given library. + /// </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> + void SetCacheWriter( String^ libPath, String^ factoryFunctionName ); + + + internal: + /// <summary> + /// Internal factory function to wrap a native object pointer inside + /// this managed class with null pointer check. + /// </summary> + /// <param name="nativeptr">The native object pointer</param> + /// <returns> + /// The managed wrapper object; null if the native pointer is null. + /// </returns> + inline static AttributesMutator<TKey, TValue>^ Create( native::AttributesMutatorPtr nativeptr ) + { + return __nullptr == nativeptr ? nullptr : + gcnew AttributesMutator<TKey, TValue>( nativeptr ); + } + + + private: + + /// <summary> + /// Private constructor to wrap a native object pointer + /// </summary> + /// <param name="nativeptr">The native object pointer</param> + inline AttributesMutator<TKey, TValue>( native::AttributesMutatorPtr nativeptr ) + { + m_nativeptr = gcnew native_shared_ptr<native::AttributesMutator>(nativeptr); + } + + native_shared_ptr<native::AttributesMutator>^ m_nativeptr; + }; + } // namespace Client + } // namespace Geode +} // namespace Apache + http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/clicache/src/CMakeLists.txt b/clicache/src/CMakeLists.txt new file mode 100644 index 0000000..80b0c1c --- /dev/null +++ b/clicache/src/CMakeLists.txt @@ -0,0 +1,73 @@ +# 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. +cmake_minimum_required(VERSION 3.4) +project(clicache) + +file(GLOB_RECURSE SOURCES "*.cpp") + +file(GLOB_RECURSE PRIVATE_HEADERS "*.hpp") +set_source_files_properties(${PRIVATE_HEADERS} PROPERTIES HEADER_FILE_ONLY TRUE) + +set(RESOURCES Apache.Geode.rc) + +if(NOT "${STRONG_NAME_PUBLIC_KEY}" STREQUAL "") + set(STRONG_NAME_PUBLIC_KEY_ATTRIBUTE ", PublicKey=${STRONG_NAME_PUBLIC_KEY}") +endif() +list(APPEND CONFIGURE_IN_FILES ${CMAKE_CURRENT_SOURCE_DIR}/impl/AssemblyInfo.cpp.in) +list(APPEND CONFIGURE_OUT_FILES ${CMAKE_CURRENT_BINARY_DIR}/impl/AssemblyInfo.cpp) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/impl/AssemblyInfo.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/impl/AssemblyInfo.cpp) + +#set_source_files_properties(${CONFIGURE_IN_FILES} PROPERTIES LANGUAGE NONE) +set_source_files_properties(${CONFIGURE_OUT_FILES} PROPERTIES GENERATED TRUE) + +add_library(Apache.Geode SHARED + ${SOURCES} + ${PRIVATE_HEADERS} ${CONFIGURE_IN_FILES} ${CONFIGURE_OUT_FILES} ${RESOURCES}) +add_dependencies(client-libraries Apache.Geode) + +#TODO get external project library names +target_link_libraries(Apache.Geode + PRIVATE + apache-geode-static + psapi + PUBLIC + c++11 +) + +string(REPLACE "/EHsc" "/EHa" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +string(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /clr /wd4947 /doc") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${SHARED_LINKER_FLAGS_STRONG_KEY}") + +include_directories(${CMAKE_SOURCE_DIR}/clicache/include) +include_directories(${CMAKE_SOURCE_DIR}/clicache/src) +include_directories(${CMAKE_SOURCE_DIR}/cppcache/src) + +set_target_properties(Apache.Geode PROPERTIES + OUTPUT_NAME ${PRODUCT_DLL_NAME} + VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.5.2" + VS_DOTNET_REFERENCES "System;System.Xml") + +add_subdirectory(templates) + +install(TARGETS Apache.Geode + RUNTIME DESTINATION bin + ARCHIVE DESTINATION lib +) + +# For Visual Studio organization +source_group("Header Files" REGULAR_EXPRESSION "\.(hpp|inl)$") +source_group("Configure In Files" FILES ${CONFIGURE_IN_FILES}) +source_group("Configure Out Files" FILES ${CONFIGURE_OUT_FILES}) http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/Cache.cpp ---------------------------------------------------------------------- diff --git a/clicache/src/Cache.cpp b/clicache/src/Cache.cpp new file mode 100644 index 0000000..7438e84 --- /dev/null +++ b/clicache/src/Cache.cpp @@ -0,0 +1,382 @@ +/* + * 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. + */ + +#include "begin_native.hpp" +#include "CacheRegionHelper.hpp" +#include "CacheImpl.hpp" +#include "end_native.hpp" + +#include "Cache.hpp" +#include "ExceptionTypes.hpp" +#include "DistributedSystem.hpp" +#include "PoolFactory.hpp" +#include "Region.hpp" +#include "RegionAttributes.hpp" +#include "QueryService.hpp" +#include "CacheFactory.hpp" +#include "impl/AuthenticatedCache.hpp" +#include "impl/ManagedString.hpp" +#include "impl/SafeConvert.hpp" +#include "impl/PdxTypeRegistry.hpp" +#include "impl/PdxInstanceFactoryImpl.hpp" + +#pragma warning(disable:4091) + +using namespace System; + +namespace Apache +{ + namespace Geode + { + namespace Client + { + namespace native = apache::geode::client; + + String^ Cache::Name::get( ) + { + try + { + return ManagedString::Get( m_nativeptr->get()->getName( ).c_str() ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + bool Cache::IsClosed::get( ) + { + try + { + return m_nativeptr->get()->isClosed( ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + DistributedSystem^ Cache::DistributedSystem::get( ) + { + try + { + return Client::DistributedSystem::Create(&(m_nativeptr->get()->getDistributedSystem())); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + CacheTransactionManager^ Cache::CacheTransactionManager::get( ) + { + // TODO shared_ptr this should be checking the return type for which tx mgr + try + { + auto nativeptr = std::dynamic_pointer_cast<InternalCacheTransactionManager2PC>( + m_nativeptr->get()->getCacheTransactionManager()); + return Apache::Geode::Client::CacheTransactionManager::Create(nativeptr); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + void Cache::Close( ) + { + Close( false ); + } + + void Cache::Close( bool keepalive ) + { + _GF_MG_EXCEPTION_TRY2 + + Apache::Geode::Client::DistributedSystem::acquireDisconnectLock(); + + Apache::Geode::Client::DistributedSystem::disconnectInstance(); + CacheFactory::m_connected = false; + + try + { + m_nativeptr->get()->close( keepalive ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + + // If DS automatically disconnected due to the new bootstrap API, then cleanup the C++/CLI side + //if (!apache::geode::client::DistributedSystem::isConnected()) + { + Apache::Geode::Client::DistributedSystem::UnregisterBuiltinManagedTypes(this); + } + + _GF_MG_EXCEPTION_CATCH_ALL2 + finally + { + CacheRegionHelper::getCacheImpl(m_nativeptr->get())->getPdxTypeRegistry()->clear(); + Serializable::Clear(); + Apache::Geode::Client::DistributedSystem::releaseDisconnectLock(); + Apache::Geode::Client::DistributedSystem::unregisterCliCallback(); + } + } + + void Cache::ReadyForEvents( ) + { + _GF_MG_EXCEPTION_TRY2 + + try + { + m_nativeptr->get()->readyForEvents( ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + + _GF_MG_EXCEPTION_CATCH_ALL2 + } + + generic<class TKey, class TValue> + Client::IRegion<TKey,TValue>^ Cache::GetRegion( String^ path ) + { + _GF_MG_EXCEPTION_TRY2/* due to auto replace */ + + ManagedString mg_path( path ); + try + { + return Client::Region<TKey, TValue>::Create(m_nativeptr->get()->getRegion(mg_path.CharPtr)); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + + _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */ + } + + generic<class TKey, class TValue> + array<Client::IRegion<TKey, TValue>^>^ Cache::RootRegions( ) + { + apache::geode::client::VectorOfRegion vrr; + try + { + m_nativeptr->get()->rootRegions( vrr ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + array<Client::IRegion<TKey, TValue>^>^ rootRegions = + gcnew array<Client::IRegion<TKey, TValue>^>( vrr.size( ) ); + + for( System::Int32 index = 0; index < vrr.size( ); index++ ) + { + apache::geode::client::RegionPtr& nativeptr( vrr[ index ] ); + rootRegions[ index ] = Client::Region<TKey, TValue>::Create( nativeptr ); + } + return rootRegions; + } + + generic<class TKey, class TResult> + Client::QueryService<TKey, TResult>^ Cache::GetQueryService( ) + { + _GF_MG_EXCEPTION_TRY2 + + try + { + return Client::QueryService<TKey, TResult>::Create(m_nativeptr->get()->getQueryService()); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + + _GF_MG_EXCEPTION_CATCH_ALL2 + } + + generic<class TKey, class TResult> + Client::QueryService<TKey, TResult>^ Cache::GetQueryService(String^ poolName ) + { + _GF_MG_EXCEPTION_TRY2 + + ManagedString mg_poolName( poolName ); + try + { + return QueryService<TKey, TResult>::Create(m_nativeptr->get()->getQueryService(mg_poolName.CharPtr)); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + + _GF_MG_EXCEPTION_CATCH_ALL2 + } + + RegionFactory^ Cache::CreateRegionFactory(RegionShortcut preDefinedRegionAttributes) + { + _GF_MG_EXCEPTION_TRY2 + + apache::geode::client::RegionShortcut preDefineRegionAttr = apache::geode::client::CACHING_PROXY; + + switch(preDefinedRegionAttributes) + { + case RegionShortcut::PROXY: + preDefineRegionAttr = apache::geode::client::PROXY; + break; + case RegionShortcut::CACHING_PROXY: + preDefineRegionAttr = apache::geode::client::CACHING_PROXY; + break; + case RegionShortcut::CACHING_PROXY_ENTRY_LRU: + preDefineRegionAttr = apache::geode::client::CACHING_PROXY_ENTRY_LRU; + break; + case RegionShortcut::LOCAL: + preDefineRegionAttr = apache::geode::client::LOCAL; + break; + case RegionShortcut::LOCAL_ENTRY_LRU: + preDefineRegionAttr = apache::geode::client::LOCAL_ENTRY_LRU; + break; + } + + try + { + return RegionFactory::Create(m_nativeptr->get()->createRegionFactory(preDefineRegionAttr)); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + + _GF_MG_EXCEPTION_CATCH_ALL2 + } + + IRegionService^ Cache::CreateAuthenticatedView(Properties<String^, Object^>^ credentials) + { + _GF_MG_EXCEPTION_TRY2 + + try + { + return AuthenticatedCache::Create((m_nativeptr->get()->createAuthenticatedView(credentials->GetNative()))); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + + _GF_MG_EXCEPTION_CATCH_ALL2 + } + + bool Cache::GetPdxIgnoreUnreadFields() + { + _GF_MG_EXCEPTION_TRY2 + + try + { + return m_nativeptr->get()->getPdxIgnoreUnreadFields(); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + + _GF_MG_EXCEPTION_CATCH_ALL2 + } + + bool Cache::GetPdxReadSerialized() + { + _GF_MG_EXCEPTION_TRY2 + + try + { + return m_nativeptr->get()->getPdxReadSerialized(); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + + _GF_MG_EXCEPTION_CATCH_ALL2 + } + + IRegionService^ Cache::CreateAuthenticatedView(Properties<String^, Object^>^ credentials, String^ poolName) + { + ManagedString mg_poolName( poolName ); + + _GF_MG_EXCEPTION_TRY2 + + try + { + return AuthenticatedCache::Create( (m_nativeptr->get()->createAuthenticatedView(credentials->GetNative(), mg_poolName.CharPtr))); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + + _GF_MG_EXCEPTION_CATCH_ALL2 + } + + void Cache::InitializeDeclarativeCache( String^ cacheXml ) + { + ManagedString mg_cacheXml( cacheXml ); + try + { + m_nativeptr->get()->initializeDeclarativeCache( mg_cacheXml.CharPtr ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + IPdxInstanceFactory^ Cache::CreatePdxInstanceFactory(String^ className) + { + + return gcnew Internal::PdxInstanceFactoryImpl(className, (m_nativeptr->get())); + + } + + DataInput^ Cache::CreateDataInput(array<Byte>^ buffer, System::Int32 len) + { + return gcnew DataInput(buffer, len, m_nativeptr->get()); + } + + + DataInput^ Cache::CreateDataInput(array<Byte>^ buffer) + { + return gcnew DataInput(buffer, m_nativeptr->get()); + } + + DataOutput^ Cache::CreateDataOutput() + { + return gcnew DataOutput( m_nativeptr->get()); + } + + PoolFactory^ Cache::GetPoolFactory() + { + return PoolFactory::Create(m_nativeptr->get_shared_ptr()->getPoolManager().createFactory()); + } + + PoolManager^ Cache::GetPoolManager() + { + return gcnew PoolManager(m_nativeptr->get_shared_ptr()->getPoolManager()); + } + } // namespace Client + } // namespace Geode +} // namespace Apache + http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/Cache.hpp ---------------------------------------------------------------------- diff --git a/clicache/src/Cache.hpp b/clicache/src/Cache.hpp new file mode 100644 index 0000000..666e562 --- /dev/null +++ b/clicache/src/Cache.hpp @@ -0,0 +1,302 @@ +/* + * 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 "RegionShortcut.hpp" +#include "IGeodeCache.hpp" +#include "IRegion.hpp" +#include "RegionAttributes.hpp" +#include "PoolManager.hpp" + +using namespace System; + +namespace Apache +{ + namespace Geode + { + namespace Client + { + namespace native = apache::geode::client; + + generic<class TKey, class TResult> + ref class QueryService; + + ref class RegionFactory; + enum class ExpirationAction; + ref class DistributedSystem; + ref class CacheTransactionManager2PC; + //ref class FunctionService; + + /// <summary> + /// Provides a distributed cache. + /// </summary> + /// <remarks> + /// Caches are obtained from Create methods on the + /// <see cref="CacheFactory.Create"/> class. + /// <para> + /// When a cache will no longer be used, call <see cref="Cache.Close" />. + /// Once it <see cref="Cache.IsClosed" /> any attempt to use it + /// will cause a <c>CacheClosedException</c> to be thrown. + /// </para><para> + /// A cache can have multiple root regions, each with a different name. + /// </para> + /// </remarks> + public ref class Cache sealed + : public IGeodeCache + { + public: + + /// <summary> + /// Initializes the cache from an XML file. + /// </summary> + /// <param name="cacheXml">pathname of a <c>cache.xml</c> file</param> + virtual void InitializeDeclarativeCache(String^ cacheXml); + + /// <summary> + /// Returns the name of this cache. + /// </summary> + /// <remarks> + /// This method does not throw + /// <c>CacheClosedException</c> if the cache is closed. + /// </remarks> + /// <returns>the string name of this cache</returns> + virtual property String^ Name + { + String^ get(); + } + + /// <summary> + /// True if this cache has been closed. + /// </summary> + /// <remarks> + /// After a new cache object is created, this method returns false. + /// After <see cref="Close" /> is called on this cache object, this method + /// returns true. + /// </remarks> + /// <returns>true if this cache is closed, otherwise false</returns> + virtual property bool IsClosed + { + bool get(); + } + + /// <summary> + /// Returns the distributed system used to + /// <see cref="CacheFactory.Create" /> this cache. + /// </summary> + /// <remarks> + /// This method does not throw + /// <c>CacheClosedException</c> if the cache is closed. + /// </remarks> + virtual property Apache::Geode::Client::DistributedSystem^ DistributedSystem + { + Apache::Geode::Client::DistributedSystem^ get(); + } + + /// <summary> + /// Returns the cache transaction manager of + /// <see cref="CacheFactory.Create" /> this cache. + /// </summary> + virtual property Apache::Geode::Client::CacheTransactionManager^ CacheTransactionManager + { + Apache::Geode::Client::CacheTransactionManager^ get(); + } + + /// <summary> + /// Terminates this object cache and releases all the local resources. + /// </summary> + /// <remarks> + /// After this cache is closed, any further + /// method call on this cache or any region object will throw + /// <c>CacheClosedException</c>, unless otherwise noted. + /// </remarks> + /// <exception cref="CacheClosedException"> + /// if the cache is already closed. + /// </exception> + virtual void Close(); + + /// <summary> + /// Terminates this object cache and releases all the local resources. + /// </summary> + /// <remarks> + /// After this cache is closed, any further + /// method call on this cache or any region object will throw + /// <c>CacheClosedException</c>, unless otherwise noted. + /// </remarks> + /// <param name="keepalive">whether to keep a durable client's queue alive</param> + /// <exception cref="CacheClosedException"> + /// if the cache is already closed. + /// </exception> + virtual void Close(bool keepalive); + + /// <summary> + /// Send the client-ready message to the server for a durable client. + /// </summary> + /// <remarks> + /// This method should only be called for durable clients and + /// with a cache server version 5.5 onwards. + /// </remarks> + /// <exception cref="IllegalStateException"> + /// if there was a problem sending the message to the server. + /// </exception> + virtual void ReadyForEvents(); + + /// <summary> + /// Returns an existing region given the full path from root, or null + /// if no such region exists. + /// </summary> + /// <remarks> + /// If Pool attached with Region is in multiusersecure mode then don't use return instance of region as no credential are attached with this instance. + /// Get region from RegionService instance of Cache.<see cref="Cache.CreateAuthenticatedView(PropertiesPtr)" />. + /// </remarks> + /// <param name="path">the pathname of the region</param> + /// <returns>the region</returns> + generic<class TKey, class TValue> + virtual IRegion<TKey, TValue>^ GetRegion(String^ path); + + /// <summary> + /// Returns an array of root regions in the cache. This set is a + /// snapshot and is not backed by the cache. + /// </summary> + /// <remarks> + /// It is not supported when Cache is created from Pool. + /// </remarks> + /// <returns>array of regions</returns> + generic<class TKey, class TValue> + virtual array<IRegion<TKey, TValue>^>^ RootRegions(); + + /// <summary> + /// Get a query service object to be able to query the cache. + /// Supported only when cache is created from Pool(pool is in multiuserSecure mode) + /// </summary> + /// <remarks> + /// Currently only works against the java server in native mode, and + /// at least some endpoints must have been defined in some regions + /// before actually firing a query. + /// </remarks> + generic<class TKey, class TResult> + virtual Client::QueryService<TKey, TResult>^ GetQueryService(); + + /// <summary> + /// Get a query service object to be able to query the cache. + /// Use only when Cache has more than one Pool. + /// </summary> + /// <remarks> + /// Currently only works against the java server in native mode, and + /// at least some endpoints must have been defined in some regions + /// before actually firing a query. + /// </remarks> + generic<class TKey, class TResult> + virtual Client::QueryService<TKey, TResult>^ GetQueryService(String^ poolName); + + /// <summary> + /// Returns the instance of <see cref="RegionFactory" /> to create the region + /// </summary> + /// <remarks> + /// Pass the <see cref="RegionShortcut" /> to set the deafult region attributes + /// </remarks> + /// <param name="regionShortcut">the regionShortcut to set the default region attributes</param> + /// <returns>Instance of RegionFactory</returns> + RegionFactory^ CreateRegionFactory(RegionShortcut regionShortcut); + + /// <summary> + /// Returns the instance of <see cref="IRegionService" /> to do the operation on Cache with different Credential. + /// </summary> + /// <remarks> + /// Deafault pool should be in multiuser mode <see cref="CacheFactory.SetMultiuserAuthentication" /> + /// </remarks> + /// <param name="credentials">the user Credentials.</param> + /// <returns>Instance of IRegionService</returns> + IRegionService^ CreateAuthenticatedView(Properties<String^, Object^>^ credentials); + + /// <summary> + /// Returns the instance of <see cref="IRegionService" /> to do the operation on Cache with different Credential. + /// </summary> + /// <remarks> + /// Deafault pool should be in multiuser mode <see cref="CacheFactory.SetMultiuserAuthentication" /> + /// </remarks> + /// <param name="credentials">the user Credentials.</param> + /// <param name="poolName">Pool, which is in multiuser mode.</param> + /// <returns>Instance of IRegionService</returns> + IRegionService^ CreateAuthenticatedView(Properties<String^, Object^>^ credentials, String^ poolName); + + ///<summary> + /// Returns whether Cache saves unread fields for Pdx types. + ///</summary> + virtual bool GetPdxIgnoreUnreadFields(); + + ///<summary> + /// Returns whether { @link PdxInstance} is preferred for PDX types instead of .NET object. + ///</summary> + virtual bool GetPdxReadSerialized(); + + /// <summary> + /// Returns a factory that can create a {@link PdxInstance}. + /// @param className the fully qualified class name that the PdxInstance will become + /// when it is fully deserialized. + /// @return the factory + /// </summary> + virtual IPdxInstanceFactory^ CreatePdxInstanceFactory(String^ className); + + virtual DataInput^ CreateDataInput(array<Byte>^ buffer, System::Int32 len); + virtual DataInput^ CreateDataInput(array<Byte>^ buffer); + + virtual DataOutput^ Cache::CreateDataOutput(); + + virtual PoolFactory^ GetPoolFactory(); + + virtual PoolManager^ GetPoolManager(); + + internal: + + /// <summary> + /// Internal factory function to wrap a native object pointer inside + /// this managed class with null pointer check. + /// </summary> + /// <param name="nativeptr">The native object pointer</param> + /// <returns> + /// The managed wrapper object; null if the native pointer is null. + /// </returns> + inline static Cache^ Create(native::CachePtr nativeptr) + { + return __nullptr == nativeptr ? nullptr : + gcnew Cache( nativeptr ); + } + + std::shared_ptr<native::Cache> GetNative() + { + return m_nativeptr->get_shared_ptr(); + } + + private: + + /// <summary> + /// Private constructor to wrap a native object pointer + /// </summary> + /// <param name="nativeptr">The native object pointer</param> + inline Cache(native::CachePtr nativeptr) + { + m_nativeptr = gcnew native_shared_ptr<native::Cache>(nativeptr); + } + + native_shared_ptr<native::Cache>^ m_nativeptr; + }; + } // namespace Client + } // namespace Geode +} // namespace Apache + http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/CacheFactory.cpp ---------------------------------------------------------------------- diff --git a/clicache/src/CacheFactory.cpp b/clicache/src/CacheFactory.cpp new file mode 100644 index 0000000..2071b20 --- /dev/null +++ b/clicache/src/CacheFactory.cpp @@ -0,0 +1,193 @@ +/* + * 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. + */ + +//#include "geode_includes.hpp" + +#include "ExceptionTypes.hpp" + +#include "CacheFactory.hpp" +#include "Cache.hpp" +#include "DistributedSystem.hpp" +#include "SystemProperties.hpp" +#include "impl/SafeConvert.hpp" +#include "impl/PdxTypeRegistry.hpp" +//#pragma warning(disable:4091) +//#include <msclr/lock.h> +//#pragma warning(disable:4091) +#include "impl/AppDomainContext.hpp" + +using namespace System; + +namespace Apache +{ + namespace Geode + { + namespace Client + { + + namespace native = apache::geode::client; + + CacheFactory^ CacheFactory::CreateCacheFactory() + { + return CacheFactory::CreateCacheFactory(Properties<String^, String^>::Create<String^, String^>()); + } + + CacheFactory^ CacheFactory::CreateCacheFactory(Properties<String^, String^>^ dsProps) + { + _GF_MG_EXCEPTION_TRY2 + + auto nativeCacheFactory = native::CacheFactory::createCacheFactory(dsProps->GetNative()); + if (nativeCacheFactory) + return gcnew CacheFactory( nativeCacheFactory, dsProps ); + + return nullptr; + + _GF_MG_EXCEPTION_CATCH_ALL2 + } + + Cache^ CacheFactory::Create() + { + bool pdxIgnoreUnreadFields = false; + bool pdxReadSerialized = false; + bool appDomainEnable = false; + native::CachePtr nativeCache = nullptr; + _GF_MG_EXCEPTION_TRY2 + //msclr::lock lockInstance(m_singletonSync); + DistributedSystem::acquireDisconnectLock(); + + nativeCache = m_nativeptr->get()->create( ); + + auto cache = Cache::Create( nativeCache ); + // TODO global create SerializerRegistry + if(!m_connected) + { + DistributedSystem::AppDomainInstanceInitialization(cache); + } + + + pdxIgnoreUnreadFields = nativeCache->getPdxIgnoreUnreadFields(); + pdxReadSerialized = nativeCache->getPdxReadSerialized(); + + appDomainEnable = cache->DistributedSystem->SystemProperties->AppDomainEnabled; + Log::SetLogLevel(static_cast<LogLevel>(native::Log::logLevel( ))); + //TODO::split + SafeConvertClassGeneric::SetAppDomainEnabled(appDomainEnable); + + if (appDomainEnable) + { + // Register managed AppDomain context with unmanaged. + native::createAppDomainContext = &Apache::Geode::Client::createAppDomainContext; + } + + Serializable::RegisterTypeGeneric( + native::GeodeTypeIds::PdxType, + gcnew TypeFactoryMethodGeneric(Apache::Geode::Client::Internal::PdxType::CreateDeserializable), + nullptr, cache); + + if(!m_connected) + { + //it registers types in unmanage layer, so should be once only + DistributedSystem::ManagedPostConnect(cache); + DistributedSystem::AppDomainInstancePostInitialization(); + DistributedSystem::connectInstance(); + } + + m_connected = true; + + + + DistributedSystem::registerCliCallback(); + Serializable::RegisterPDXManagedCacheableKey(appDomainEnable, cache); + + return cache; + _GF_MG_EXCEPTION_CATCH_ALL2 + finally { + GC::KeepAlive(m_nativeptr); + Apache::Geode::Client::Internal::PdxTypeRegistry::PdxIgnoreUnreadFields = pdxIgnoreUnreadFields; + Apache::Geode::Client::Internal::PdxTypeRegistry::PdxReadSerialized = pdxReadSerialized; + DistributedSystem::releaseDisconnectLock(); + } + } + + + String^ CacheFactory::Version::get( ) + { + return ManagedString::Get( native::CacheFactory::getVersion( ) ); + } + + String^ CacheFactory::ProductDescription::get( ) + { + return ManagedString::Get( + native::CacheFactory::getProductDescription( ) ); + } + + + CacheFactory^ CacheFactory::SetPdxIgnoreUnreadFields(bool ignore) + { + _GF_MG_EXCEPTION_TRY2 + + try + { + m_nativeptr->get()->setPdxIgnoreUnreadFields( ignore ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + return this; + + _GF_MG_EXCEPTION_CATCH_ALL2 + } + + CacheFactory^ CacheFactory::SetPdxReadSerialized(bool pdxReadSerialized) + { + _GF_MG_EXCEPTION_TRY2 + + try + { + m_nativeptr->get()->setPdxReadSerialized( pdxReadSerialized ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + return this; + + _GF_MG_EXCEPTION_CATCH_ALL2 + } + + CacheFactory^ CacheFactory::Set(String^ name, String^ value) + { + _GF_MG_EXCEPTION_TRY2 + ManagedString mg_name( name ); + ManagedString mg_value( value ); + try + { + m_nativeptr->get()->set( mg_name.CharPtr, mg_value.CharPtr ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + return this; + + _GF_MG_EXCEPTION_CATCH_ALL2 + } // namespace Client + } // namespace Geode +} // namespace Apache + +} http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/CacheFactory.hpp ---------------------------------------------------------------------- diff --git a/clicache/src/CacheFactory.hpp b/clicache/src/CacheFactory.hpp new file mode 100644 index 0000000..fb9f8ba --- /dev/null +++ b/clicache/src/CacheFactory.hpp @@ -0,0 +1,177 @@ +/* + * 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/CacheFactory.hpp> +#include "end_native.hpp" + +#include "native_shared_ptr.hpp" +#include "Properties.hpp" + +using namespace System::Collections::Generic; + +namespace Apache +{ + namespace Geode + { + namespace Client + { + namespace native = apache::geode::client; + + ref class Cache; + ref class CacheAttributes; + ref class DistributedSystem; + + /// <summary> + /// A factory class that must be used to obtain instance of <see cref="Cache" />. + /// </summary> + /// <remarks> + /// To create a new cache instance, use <see cref="CacheFactory.CreateCacheFactory" />. + /// <para> + /// To get an existing unclosed cache instance, use <see cref="CacheFactory.GetInstance" />. + /// </para> + /// </remarks> + public ref class CacheFactory + { + public: + + /// <summary> + /// A factory class that must be used to obtain instance of <see cref="Cache" />. + /// This should be called once. Using this one can set default values of <see cref="Pool" />. + /// </summary> + /// <param name="dsProps">Properties which are applicable at client level.</param> + // static CacheFactory^ CreateCacheFactory(Dictionary<Object^, Object^>^ dsProps); + static CacheFactory^ CreateCacheFactory(Properties<String^, String^>^ dsProps); + + /// <summary> + /// A factory class that must be used to obtain instance of <see cref="Cache" />. + /// This should be called once. Using this one can set default values of <see cref="Pool" />. + /// </summary> + static CacheFactory^ CreateCacheFactory(); + + /// <summary> + /// To create the instance of <see cref="Cache" />. + /// </summary> + Cache^ Create(); + + /// <summary> + /// Set allocators for non default Microsoft CRT versions. + /// </summary> + /* static void SetNewAndDelete() + { + native::setNewAndDelete(&operator new, &operator delete); + } +*/ + /// <summary> + /// Returns the version of the cache implementation. + /// For the 1.0 release of Geode, the string returned is <c>1.0</c>. + /// </summary> + /// <returns>the version of the cache implementation as a <c>String</c></returns> + static property String^ Version + { + static String^ get(); + } + + /// <summary> + /// Returns the product description string including product name and version. + /// </summary> + static property String^ ProductDescription + { + static String^ get(); + } + + ///<summary> + /// Control whether pdx ignores fields that were unread during deserialization. + /// The default is to preserve unread fields be including their data during serialization. + /// But if you configure the cache to ignore unread fields then their data will be lost + /// during serialization. + /// <P>You should only set this attribute to <code>true</code> if you know this member + /// will only be reading cache data. In this use case you do not need to pay the cost + /// of preserving the unread fields since you will never be reserializing pdx data. + ///<summary> + /// <param> ignore <code>true</code> if fields not read during pdx deserialization should be ignored; + /// <code>false</code>, the default, if they should be preserved. + /// </param> + /// <returns> + /// a instance of <c>CacheFactory</c> + /// </returns> + CacheFactory^ SetPdxIgnoreUnreadFields(bool ignore); + + ///<summary> + /// Sets the object preference to PdxInstance type. + /// When a cached object that was serialized as a PDX is read + /// from the cache a {@link PdxInstance} will be returned instead of the actual domain class. + /// The PdxInstance is an interface that provides run time access to + /// the fields of a PDX without deserializing the entire PDX. + /// The PdxInstance implementation is a light weight wrapper + /// that simply refers to the raw bytes of the PDX that are kept + /// in the cache. Using this method applications can choose to + /// access PdxInstance instead of Java object. + /// Note that a PdxInstance is only returned if a serialized PDX is found in the cache. + /// If the cache contains a deserialized PDX, then a domain class instance is returned instead of a PdxInstance. + ///</summary> + /// <param> pdxReadSerialized <code>true</code> to prefer PdxInstance + /// <code>false</code>, the default, if they should be preserved. + /// </param> + /// <returns> + /// a instance of <c>CacheFactory</c> + /// </returns> + CacheFactory^ SetPdxReadSerialized(bool pdxReadSerialized); + + + /// <summary> + /// Sets a geode property that will be used when creating the ClientCache. + /// </summary> + /// <param> + /// name the name of the geode property + /// </param> + /// <param> + /// value the value of the geode property + /// </param> + /// <returns> + /// a instance of <c>CacheFactory</c> + /// </returns> + CacheFactory^ Set(String^ name, String^ value); + + private: + + /// <summary> + /// Private constructor to wrap a native object pointer + /// </summary> + /// <param name="nativeptr">The native object pointer</param> + inline CacheFactory(native::CacheFactoryPtr nativeptr, Properties<String^, String^>^ dsProps) + { + m_nativeptr = gcnew native_shared_ptr<native::CacheFactory>(nativeptr); + m_dsProps = dsProps; + } + + Properties<String^, String^>^ m_dsProps; + + static System::Object^ m_singletonSync = gcnew System::Object(); + + native_shared_ptr<native::CacheFactory>^ m_nativeptr; + + internal: + static bool m_connected = false; + }; + } // namespace Client + } // namespace Geode +} // namespace Apache + http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/CacheListenerAdapter.hpp ---------------------------------------------------------------------- diff --git a/clicache/src/CacheListenerAdapter.hpp b/clicache/src/CacheListenerAdapter.hpp new file mode 100644 index 0000000..aaf3212 --- /dev/null +++ b/clicache/src/CacheListenerAdapter.hpp @@ -0,0 +1,83 @@ +/* + * 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 "ICacheListener.hpp" + + +namespace Apache +{ + namespace Geode + { + namespace Client + { + + /// <summary> + /// Utility class that implements all methods in <c>ICacheListener</c> + /// with empty implementations. Applications can subclass this class + /// and only override the methods for the events of interest. + /// </summary> + generic<class TKey, class TValue> + public ref class CacheListenerAdapter + : public ICacheListener<TKey, TValue> + { + public: + virtual void AfterCreate(EntryEvent<TKey, TValue>^ ev) + { + } + + virtual void AfterUpdate(EntryEvent<TKey, TValue>^ ev) + { + } + + virtual void AfterInvalidate(EntryEvent<TKey, TValue>^ ev) + { + } + + virtual void AfterDestroy(EntryEvent<TKey, TValue>^ ev) + { + } + + virtual void AfterRegionInvalidate(RegionEvent<TKey, TValue>^ ev) + { + } + + virtual void AfterRegionDestroy(RegionEvent<TKey, TValue>^ ev) + { + } + + virtual void AfterRegionLive(RegionEvent<TKey, TValue>^ ev) + { + } + + virtual void AfterRegionClear(RegionEvent<TKey, TValue>^ ev) + { + } + + virtual void Close(Apache::Geode::Client::IRegion<TKey, TValue>^ region) + { + } + virtual void AfterRegionDisconnected(Apache::Geode::Client::IRegion<TKey, TValue>^ region) + { + } + }; + } // namespace Client + } // namespace Geode +} // namespace Apache + http://git-wip-us.apache.org/repos/asf/geode-native/blob/6cbd424f/clicache/src/CacheStatistics.cpp ---------------------------------------------------------------------- diff --git a/clicache/src/CacheStatistics.cpp b/clicache/src/CacheStatistics.cpp new file mode 100644 index 0000000..4259246 --- /dev/null +++ b/clicache/src/CacheStatistics.cpp @@ -0,0 +1,55 @@ +/* + * 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. + */ + +#include "CacheStatistics.hpp" + + +namespace Apache +{ + namespace Geode + { + namespace Client + { + + using namespace System; + + System::UInt32 CacheStatistics::LastModifiedTime::get( ) + { + try + { + return m_nativeptr->get()->getLastModifiedTime( ); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + + System::UInt32 CacheStatistics::LastAccessedTime::get() + { + try + { + return m_nativeptr->get()->getLastAccessedTime(); + } + finally + { + GC::KeepAlive(m_nativeptr); + } + } + } // namespace Client + } // namespace Geode +} // namespace Apache