// Path: hibernate4-memcached-core/src/main/java/kr/pe/kwonnam/hibernate4memcached/memcached/CacheNamespace.java
// public class CacheNamespace implements Serializable {
//     /**
//      * name of region
//      */
//     private String name;
// 
//     /**
//      * if this value is true, the memcached adapter should implement namespace pattern
//      * or ignore namespace pattern.
//      * <p/>
//      * see <a href="https://code.google.com/p/memcached/wiki/NewProgrammingTricks#Namespacing">Memcached Namespacing</a>
//      */
//     private boolean namespaceExpirationRequired;
// 
//     public CacheNamespace(String name, boolean namespaceExpirationRequired) {
//         this.name = name;
//         this.namespaceExpirationRequired = namespaceExpirationRequired;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public boolean isNamespaceExpirationRequired() {
//         return namespaceExpirationRequired;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (o == null) {
//             return false;
//         }
//         if (this == o) {
//             return true;
//         }
//         if (getClass() != o.getClass()) {
//             return false;
//         }
// 
//         CacheNamespace otherCacheNamespace = (CacheNamespace) o;
// 
//         return new EqualsBuilder().append(name, otherCacheNamespace.name)
//                 .append(namespaceExpirationRequired, otherCacheNamespace.namespaceExpirationRequired).isEquals();
//     }
// 
//     @Override
//     public int hashCode() {
//         return new HashCodeBuilder().append(name).append(namespaceExpirationRequired).toHashCode();
//     }
// 
//     @Override
//     public String toString() {
//         return new ToStringBuilder(this).append("name", name).append("namespaceExpirationRequired", namespaceExpirationRequired).toString();
//     }
// }
// 
// Path: hibernate4-memcached-core/src/main/java/kr/pe/kwonnam/hibernate4memcached/memcached/MemcachedAdapter.java
// public interface MemcachedAdapter {
//     /**
//      * Lifecycle callback to perform initialization.
//      *
//      * @param properties the defined cfg properties
//      */
//     void init(OverridableReadOnlyProperties properties);
// 
//     /**
//      * Lifecycle callback to perform cleanup.
//      */
//     void destroy();
// 
//     /**
//      * get value from memcached
//      */
//     Object get(CacheNamespace cacheNamespace, String key);
// 
//     /**
//      * set value to memcache with expirySeconds
//      */
//     void set(CacheNamespace cacheNamespace, String key, Object value, int expirySeconds);
// 
//     /**
//      * delete key from memcached
//      */
//     void delete(CacheNamespace cacheNamespace, String key);
// 
//     /**
//      * increase given increment couter and return new value.
//      *
//      * @param cacheNamespace cache namespace
//      * @param key            counter key
//      * @param by             the amount of increment
//      * @param defaultValue   default value when the key missing
//      * @return increased value
//      */
//     long increaseCounter(CacheNamespace cacheNamespace, String key, long by, long defaultValue, int expirySeconds);
// 
//     /**
//      * get current value from increment counter
//      *
//      * @param cacheNamespace cache namespace
//      * @param key            counter key
//      * @param defaultValue   default value when the key missing
//      * @return current value of counter without increment
//      */
//     long getCounter(CacheNamespace cacheNamespace, String key, long defaultValue, int expirySeconds);
// 
//     /**
//      * Evict namespace
//      *
//      * @param cacheNamespace cache namespace
//      */
//     void evictAll(CacheNamespace cacheNamespace);
// }
// 
// Path: hibernate4-memcached-core/src/main/java/kr/pe/kwonnam/hibernate4memcached/timestamper/HibernateCacheTimestamper.java
// public interface HibernateCacheTimestamper {
// 
//     void setSettings(Settings settings);
// 
//     void setProperties(OverridableReadOnlyProperties properties);
// 
//     void setMemcachedAdapter(MemcachedAdapter memcachedAdapter);
// 
//     /** initialize timestamp object */
//     void init();
// 
//     /** get next timestamp */
//     long next();
// }
// 
// Path: hibernate4-memcached-core/src/main/java/kr/pe/kwonnam/hibernate4memcached/util/OverridableReadOnlyProperties.java
// public interface OverridableReadOnlyProperties {
//     String getProperty(String key);
// 
//     String getProperty(String key, String defaultValue);
// 
//     String getRequiredProperty(String key);
// }
// 
// Path: hibernate4-memcached-core/src/main/java/kr/pe/kwonnam/hibernate4memcached/Hibernate4MemcachedRegionFactory.java
// public static final String REGION_EXPIRY_SECONDS_PROPERTY_KEY_PREFIX = "h4m.expiry.seconds";


import kr.pe.kwonnam.hibernate4memcached.memcached.CacheNamespace;
import kr.pe.kwonnam.hibernate4memcached.memcached.MemcachedAdapter;
import kr.pe.kwonnam.hibernate4memcached.timestamper.HibernateCacheTimestamper;
import kr.pe.kwonnam.hibernate4memcached.util.OverridableReadOnlyProperties;
import org.hibernate.cache.CacheException;
import org.hibernate.cache.spi.CacheDataDescription;
import org.hibernate.cache.spi.GeneralDataRegion;
import org.hibernate.cfg.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static kr.pe.kwonnam.hibernate4memcached.Hibernate4MemcachedRegionFactory.REGION_EXPIRY_SECONDS_PROPERTY_KEY_PREFIX;
package kr.pe.kwonnam.hibernate4memcached.regions;



/**
 * @author KwonNam Son (kwon37xi@gmail.com)
 */
public class GeneralDataMemcachedRegion extends MemcachedRegion implements GeneralDataRegion {
    private Logger log = LoggerFactory.getLogger(GeneralDataMemcachedRegion.class);

    private int expirySeconds;

    public GeneralDataMemcachedRegion(CacheNamespace cacheNamespace, OverridableReadOnlyProperties properties, CacheDataDescription metadata,
// Path: hibernate4-memcached-core/src/main/java/kr/pe/kwonnam/hibernate4memcached/memcached/CacheNamespace.java
// public class CacheNamespace implements Serializable {
//     /**
//      * name of region
//      */
//     private String name;
// 
//     /**
//      * if this value is true, the memcached adapter should implement namespace pattern
//      * or ignore namespace pattern.
//      * <p/>
//      * see <a href="https://code.google.com/p/memcached/wiki/NewProgrammingTricks#Namespacing">Memcached Namespacing</a>
//      */
//     private boolean namespaceExpirationRequired;
// 
//     public CacheNamespace(String name, boolean namespaceExpirationRequired) {
//         this.name = name;
//         this.namespaceExpirationRequired = namespaceExpirationRequired;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public boolean isNamespaceExpirationRequired() {
//         return namespaceExpirationRequired;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (o == null) {
//             return false;
//         }
//         if (this == o) {
//             return true;
//         }
//         if (getClass() != o.getClass()) {
//             return false;
//         }
// 
//         CacheNamespace otherCacheNamespace = (CacheNamespace) o;
// 
//         return new EqualsBuilder().append(name, otherCacheNamespace.name)
//                 .append(namespaceExpirationRequired, otherCacheNamespace.namespaceExpirationRequired).isEquals();
//     }
// 
//     @Override
//     public int hashCode() {
//         return new HashCodeBuilder().append(name).append(namespaceExpirationRequired).toHashCode();
//     }
// 
//     @Override
//     public String toString() {
//         return new ToStringBuilder(this).append("name", name).append("namespaceExpirationRequired", namespaceExpirationRequired).toString();
//     }
// }
// 
// Path: hibernate4-memcached-core/src/main/java/kr/pe/kwonnam/hibernate4memcached/memcached/MemcachedAdapter.java
// public interface MemcachedAdapter {
//     /**
//      * Lifecycle callback to perform initialization.
//      *
//      * @param properties the defined cfg properties
//      */
//     void init(OverridableReadOnlyProperties properties);
// 
//     /**
//      * Lifecycle callback to perform cleanup.
//      */
//     void destroy();
// 
//     /**
//      * get value from memcached
//      */
//     Object get(CacheNamespace cacheNamespace, String key);
// 
//     /**
//      * set value to memcache with expirySeconds
//      */
//     void set(CacheNamespace cacheNamespace, String key, Object value, int expirySeconds);
// 
//     /**
//      * delete key from memcached
//      */
//     void delete(CacheNamespace cacheNamespace, String key);
// 
//     /**
//      * increase given increment couter and return new value.
//      *
//      * @param cacheNamespace cache namespace
//      * @param key            counter key
//      * @param by             the amount of increment
//      * @param defaultValue   default value when the key missing
//      * @return increased value
//      */
//     long increaseCounter(CacheNamespace cacheNamespace, String key, long by, long defaultValue, int expirySeconds);
// 
//     /**
//      * get current value from increment counter
//      *
//      * @param cacheNamespace cache namespace
//      * @param key            counter key
//      * @param defaultValue   default value when the key missing
//      * @return current value of counter without increment
//      */
//     long getCounter(CacheNamespace cacheNamespace, String key, long defaultValue, int expirySeconds);
// 
//     /**
//      * Evict namespace
//      *
//      * @param cacheNamespace cache namespace
//      */
//     void evictAll(CacheNamespace cacheNamespace);
// }
// 
// Path: hibernate4-memcached-core/src/main/java/kr/pe/kwonnam/hibernate4memcached/timestamper/HibernateCacheTimestamper.java
// public interface HibernateCacheTimestamper {
// 
//     void setSettings(Settings settings);
// 
//     void setProperties(OverridableReadOnlyProperties properties);
// 
//     void setMemcachedAdapter(MemcachedAdapter memcachedAdapter);
// 
//     /** initialize timestamp object */
//     void init();
// 
//     /** get next timestamp */
//     long next();
// }
// 
// Path: hibernate4-memcached-core/src/main/java/kr/pe/kwonnam/hibernate4memcached/util/OverridableReadOnlyProperties.java
// public interface OverridableReadOnlyProperties {
//     String getProperty(String key);
// 
//     String getProperty(String key, String defaultValue);
// 
//     String getRequiredProperty(String key);
// }
// 
// Path: hibernate4-memcached-core/src/main/java/kr/pe/kwonnam/hibernate4memcached/Hibernate4MemcachedRegionFactory.java
// public static final String REGION_EXPIRY_SECONDS_PROPERTY_KEY_PREFIX = "h4m.expiry.seconds";


// Path: hibernate4-memcached-core/src/main/java/kr/pe/kwonnam/hibernate4memcached/regions/GeneralDataMemcachedRegion.java
import kr.pe.kwonnam.hibernate4memcached.memcached.CacheNamespace;
import kr.pe.kwonnam.hibernate4memcached.memcached.MemcachedAdapter;
import kr.pe.kwonnam.hibernate4memcached.timestamper.HibernateCacheTimestamper;
import kr.pe.kwonnam.hibernate4memcached.util.OverridableReadOnlyProperties;
import org.hibernate.cache.CacheException;
import org.hibernate.cache.spi.CacheDataDescription;
import org.hibernate.cache.spi.GeneralDataRegion;
import org.hibernate.cfg.Settings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static kr.pe.kwonnam.hibernate4memcached.Hibernate4MemcachedRegionFactory.REGION_EXPIRY_SECONDS_PROPERTY_KEY_PREFIX;

package kr.pe.kwonnam.hibernate4memcached.regions;



/**
 * @author KwonNam Son (kwon37xi@gmail.com)
 */
public class GeneralDataMemcachedRegion extends MemcachedRegion implements GeneralDataRegion {
    private Logger log = LoggerFactory.getLogger(GeneralDataMemcachedRegion.class);

    private int expirySeconds;

    public GeneralDataMemcachedRegion(CacheNamespace cacheNamespace, OverridableReadOnlyProperties properties, CacheDataDescription metadata,
                                      Settings settings, MemcachedAdapter memcachedAdapter, HibernateCacheTimestamper hibernateCacheTimestamper) {