// Path: hybricache/src/main/java/org/hybricache/HybriCacheConfiguration.java
// public enum CacheType{HYBRID, LOCAL, REMOTE};
// 
// Path: hybricache/src/main/java/org/hybricache/key/HybriKeyCache.java
// public class HybriKeyCache extends BaseCache implements Cache {
// 	
// 	protected int keyTrustPeriod;
// 	
// 		
// 	public HybriKeyCache(Ehcache ehCacheNative, HybriCacheConfiguration hybriCacheConfig, RemoteCacheFactory remoteCacheFactory) {
// 		super(ehCacheNative, hybriCacheConfig, remoteCacheFactory);
// 		this.keyTrustPeriod = getHybriCacheConfig().getKeyTrustPeriod();
// 	}
// 		
// 	public void removeBothHybriKeys(Object key){
// 		getEhCache().evict(key);
// 		getRemoteCache().evict(key);
// 	}
// 	
// 	public HybriKey getKeyRemote(Object key) {
// 		HybriKey hybriKey = getRemoteCache().get(key, HybriKey.class);
// 		if (hybriKey == null) {
// 			hybriKey = new HybriKey();
// 		}
// 		return hybriKey;
// 	}
// 	public void putKeyRemote(Object key, HybriKey hybriKey) {
// 		getRemoteCache().put(key, hybriKey);
// 	}
// 	
// 	public HybriKey getKeyLocal(Object key) {
// 		HybriKey hybriKey = getEhCache().get(key, HybriKey.class);
// 		if (hybriKey == null) {
// 			hybriKey = new HybriKey();
// 		}
// 		return hybriKey;
// 	}
// 	public void putKeyLocal(Object key, HybriKey hybriKey) {
// 		getEhCache().put(key, hybriKey);
// 	}
// 	
// 	
// 	public boolean isKeyRecent(HybriKey keyLocal) {
// 		long currentTime = System.currentTimeMillis();
// 		boolean isRecent = keyLocal != null && !keyLocal.isUndefined() 
// 				&& (currentTime - keyLocal.getLastAccessedTime()) < this.keyTrustPeriod;
// 		
// 		System.out.println("TIME DIFF: " + (currentTime - keyLocal.getLastAccessedTime()));
// 		return isRecent;
// 	}
// 	public boolean isKeyValid(HybriKey keyLocal, HybriKey keyRemote) {
// 		return keyLocal != null && keyRemote != null
// 				&& !keyLocal.isUndefined() && !keyRemote.isUndefined()
// 				&& keyLocal.getRevision() == keyRemote.getRevision();
// 	}
// 	
// 	
// 	
// 	
// 	
// 	
// 
// 	@Override
// 	public String getName() {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public Object getNativeCache() {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public ValueWrapper get(Object key) {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public <T> T get(Object key, Class<T> type) {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public <T> T get(Object key, Callable<T> valueLoader) {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public void put(Object key, Object value) {
// 		// TODO Auto-generated method stub
// 		
// 	}
// 
// 	@Override
// 	public ValueWrapper putIfAbsent(Object key, Object value) {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public void evict(Object key) {
// 		// TODO Auto-generated method stub
// 		
// 	}
// 
// 	@Override
// 	public void clear() {
// 		// TODO Auto-generated method stub
// 		
// 	}
// 
// 	public int getKeyTrustPeriod() {
// 		return this.keyTrustPeriod;
// 	}
// 
// 	public void setKeyTrustPeriod(int keyTrustPeriod) {
// 		this.keyTrustPeriod = keyTrustPeriod;
// 	}
// 	
// 	
// 	
// 	
// 	
// 
// }
// 
// Path: hybricache/src/main/java/org/hybricache/remote/RemoteCache.java
// public interface RemoteCache<C> extends Cache {
// 	
// 	public C getCacheTarget();
// 
// }
// 
// Path: hybricache/src/main/java/org/hybricache/remote/RemoteCacheFactory.java
// public interface RemoteCacheFactory {
// 	
// 	@SuppressWarnings("rawtypes")
// 	public RemoteCache getInstance(HybriCacheConfiguration conf);
// 
// }


import org.hybricache.HybriCacheConfiguration.CacheType;
import org.hybricache.key.HybriKeyCache;
import org.hybricache.remote.RemoteCache;
import org.hybricache.remote.RemoteCacheFactory;
import org.springframework.cache.ehcache.EhCacheCache;
import net.sf.ehcache.Ehcache;

/**
 * 
 */
package org.hybricache;



/**
 * The BaseCache class
 *
 * @author Batir Akhmerov
 * Created on Feb 4, 2017
 */ 
public class BaseCache {
	
	protected EhCacheCache ehCache;
	protected HybriCacheConfiguration hybriCacheConfig;
	@SuppressWarnings("rawtypes")
	protected RemoteCache remoteCache;
	

// Path: hybricache/src/main/java/org/hybricache/HybriCacheConfiguration.java
// public enum CacheType{HYBRID, LOCAL, REMOTE};
// 
// Path: hybricache/src/main/java/org/hybricache/key/HybriKeyCache.java
// public class HybriKeyCache extends BaseCache implements Cache {
// 	
// 	protected int keyTrustPeriod;
// 	
// 		
// 	public HybriKeyCache(Ehcache ehCacheNative, HybriCacheConfiguration hybriCacheConfig, RemoteCacheFactory remoteCacheFactory) {
// 		super(ehCacheNative, hybriCacheConfig, remoteCacheFactory);
// 		this.keyTrustPeriod = getHybriCacheConfig().getKeyTrustPeriod();
// 	}
// 		
// 	public void removeBothHybriKeys(Object key){
// 		getEhCache().evict(key);
// 		getRemoteCache().evict(key);
// 	}
// 	
// 	public HybriKey getKeyRemote(Object key) {
// 		HybriKey hybriKey = getRemoteCache().get(key, HybriKey.class);
// 		if (hybriKey == null) {
// 			hybriKey = new HybriKey();
// 		}
// 		return hybriKey;
// 	}
// 	public void putKeyRemote(Object key, HybriKey hybriKey) {
// 		getRemoteCache().put(key, hybriKey);
// 	}
// 	
// 	public HybriKey getKeyLocal(Object key) {
// 		HybriKey hybriKey = getEhCache().get(key, HybriKey.class);
// 		if (hybriKey == null) {
// 			hybriKey = new HybriKey();
// 		}
// 		return hybriKey;
// 	}
// 	public void putKeyLocal(Object key, HybriKey hybriKey) {
// 		getEhCache().put(key, hybriKey);
// 	}
// 	
// 	
// 	public boolean isKeyRecent(HybriKey keyLocal) {
// 		long currentTime = System.currentTimeMillis();
// 		boolean isRecent = keyLocal != null && !keyLocal.isUndefined() 
// 				&& (currentTime - keyLocal.getLastAccessedTime()) < this.keyTrustPeriod;
// 		
// 		System.out.println("TIME DIFF: " + (currentTime - keyLocal.getLastAccessedTime()));
// 		return isRecent;
// 	}
// 	public boolean isKeyValid(HybriKey keyLocal, HybriKey keyRemote) {
// 		return keyLocal != null && keyRemote != null
// 				&& !keyLocal.isUndefined() && !keyRemote.isUndefined()
// 				&& keyLocal.getRevision() == keyRemote.getRevision();
// 	}
// 	
// 	
// 	
// 	
// 	
// 	
// 
// 	@Override
// 	public String getName() {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public Object getNativeCache() {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public ValueWrapper get(Object key) {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public <T> T get(Object key, Class<T> type) {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public <T> T get(Object key, Callable<T> valueLoader) {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public void put(Object key, Object value) {
// 		// TODO Auto-generated method stub
// 		
// 	}
// 
// 	@Override
// 	public ValueWrapper putIfAbsent(Object key, Object value) {
// 		// TODO Auto-generated method stub
// 		return null;
// 	}
// 
// 	@Override
// 	public void evict(Object key) {
// 		// TODO Auto-generated method stub
// 		
// 	}
// 
// 	@Override
// 	public void clear() {
// 		// TODO Auto-generated method stub
// 		
// 	}
// 
// 	public int getKeyTrustPeriod() {
// 		return this.keyTrustPeriod;
// 	}
// 
// 	public void setKeyTrustPeriod(int keyTrustPeriod) {
// 		this.keyTrustPeriod = keyTrustPeriod;
// 	}
// 	
// 	
// 	
// 	
// 	
// 
// }
// 
// Path: hybricache/src/main/java/org/hybricache/remote/RemoteCache.java
// public interface RemoteCache<C> extends Cache {
// 	
// 	public C getCacheTarget();
// 
// }
// 
// Path: hybricache/src/main/java/org/hybricache/remote/RemoteCacheFactory.java
// public interface RemoteCacheFactory {
// 	
// 	@SuppressWarnings("rawtypes")
// 	public RemoteCache getInstance(HybriCacheConfiguration conf);
// 
// }


// Path: hybricache/src/main/java/org/hybricache/BaseCache.java
import org.hybricache.HybriCacheConfiguration.CacheType;
import org.hybricache.key.HybriKeyCache;
import org.hybricache.remote.RemoteCache;
import org.hybricache.remote.RemoteCacheFactory;
import org.springframework.cache.ehcache.EhCacheCache;
import net.sf.ehcache.Ehcache;

/**
 * 
 */
package org.hybricache;



/**
 * The BaseCache class
 *
 * @author Batir Akhmerov
 * Created on Feb 4, 2017
 */ 
public class BaseCache {
	
	protected EhCacheCache ehCache;
	protected HybriCacheConfiguration hybriCacheConfig;
	@SuppressWarnings("rawtypes")
	protected RemoteCache remoteCache;
	

	private HybriKeyCache hybriKeyCache;
