// Path: src/main/java/com/trivago/triava/tcache/expiry/Constants.java
// public class Constants
// {
// 	public final static long EXPIRY_ZERO = 0;
// 	public final static long EXPIRY_NOCHANGE = -1; 
// 	public final static long EXPIRY_MAX = Long.MAX_VALUE;
// }
// 
// Path: src/main/java/com/trivago/triava/tcache/expiry/TCacheExpiryPolicy.java
// public interface TCacheExpiryPolicy
// {
// 	public long getExpiryForCreation();
// 	public long getExpiryForAccess();
// 	public long getExpiryForUpdate();
// }
// 
// Path: src/main/java/com/trivago/triava/tcache/util/SecondsOrMillis.java
// public class SecondsOrMillis
// {
// 	// Max millis is 1073741824 = 12,4 days. Any value below can be represented by itself
// 	final static int MILLIS_MAX = 0x40000000;
// 	
// 	/**
// 	 * Converts millis to internal value
// 	 * 
// 	 * @param millis Millis
// 	 * @return Internal value
// 	 */
// 	public static int fromMillisToInternal(long millis)
// 	{
// 		if (millis < 0)
// 			throw new IllegalArgumentException("millis must be not negative: " + millis);
// 		
// 		if (millis < MILLIS_MAX)
// 			return (int)millis;
// 		
// 		long seconds = -(millis / 1000);
// 		return seconds < Integer.MIN_VALUE ? Integer.MIN_VALUE : (int)seconds;
// 	}
// 
// 	/**
// 	 * Converts internal value to millis
// 	 * 
// 	 * @param internal The internal value
// 	 * @return Millisecond value
// 	 */
// 	public static long fromInternalToMillis(int internal)
// 	{
// 		if (internal >= 0)
// 			return internal;
// 		else if (internal == Integer.MIN_VALUE)
// 			return Long.MAX_VALUE;
// 		return ((long)-internal) * 1000L;
// 	}
// }
// 
// Path: src/main/java/com/trivago/triava/tcache/util/Serializing.java
// public class Serializing
// {
// 	public static byte[] toBytearray(Object obj) throws IOException
// 	{
// 		ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 		ObjectOutput out = null;
// 		try
// 		{
// 		  out = new ObjectOutputStream(bos);   
// 		  out.writeObject(obj);
// 		  return bos.toByteArray();
// 		}
// 		finally
// 		{
// 		  try
// 		  {
// 		    if (out != null)
// 		    {
// 		      out.close();
// 		    }
// 		  }
// 		  catch (IOException ex) {}
// 
// 		  try
// 		  {
// 		    bos.close();
// 		  }
// 		  catch (IOException ex) {}
// 		}
// 	}
// 	
// 	public static Object fromBytearray(byte[] serialized) throws IOException, ClassNotFoundException
// 	{
// 		ByteArrayInputStream bis = new ByteArrayInputStream(serialized);
// 		ObjectInput in = null;
// 		try {
// 		  in = new ObjectInputStream(bis);
// 		  return in.readObject(); 
// 		}
// 		finally
// 		{
// 		  try
// 		  {
// 		    bis.close();
// 		  }
// 		  catch (IOException ex) {}
// 		  
// 		  try
// 		  {
// 		    if (in != null)
// 		    {
// 		      in.close();
// 		    }
// 		  }
// 		  catch (IOException ex) {} 
// 		}
// 	}
// 
// 
// }


import java.io.Serializable;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import javax.cache.CacheException;
import com.trivago.triava.tcache.expiry.Constants;
import com.trivago.triava.tcache.expiry.TCacheExpiryPolicy;
import com.trivago.triava.tcache.util.SecondsOrMillis;
import com.trivago.triava.tcache.util.Serializing;

	@Override
	public long getCreationTime()
	{
		return Cache.baseTimeMillis + SecondsOrMillis.fromInternalToMillis(inputDate);
	}

	@Override
	public boolean isInvalid()
	{
		return isInvalid(false);
	}

	private boolean isInvalid(boolean debug)
	{	
		if (data == null)
		{
			return true; // Holder was released, e.g. via expiration
		}

		// -1- Check completeness
		boolean incomplete = (flags & STATE_MASK) != STATE_COMPLETE;
		if (incomplete)
		{
			if (debug) System.out.println("Dropped because holder is not complete: flags=" + flags + ": " + data);
			return true;
		}
		
		// -2- Check cache time
		long millisNow = currentTimeMillisEstimate();
// Path: src/main/java/com/trivago/triava/tcache/expiry/Constants.java
// public class Constants
// {
// 	public final static long EXPIRY_ZERO = 0;
// 	public final static long EXPIRY_NOCHANGE = -1; 
// 	public final static long EXPIRY_MAX = Long.MAX_VALUE;
// }
// 
// Path: src/main/java/com/trivago/triava/tcache/expiry/TCacheExpiryPolicy.java
// public interface TCacheExpiryPolicy
// {
// 	public long getExpiryForCreation();
// 	public long getExpiryForAccess();
// 	public long getExpiryForUpdate();
// }
// 
// Path: src/main/java/com/trivago/triava/tcache/util/SecondsOrMillis.java
// public class SecondsOrMillis
// {
// 	// Max millis is 1073741824 = 12,4 days. Any value below can be represented by itself
// 	final static int MILLIS_MAX = 0x40000000;
// 	
// 	/**
// 	 * Converts millis to internal value
// 	 * 
// 	 * @param millis Millis
// 	 * @return Internal value
// 	 */
// 	public static int fromMillisToInternal(long millis)
// 	{
// 		if (millis < 0)
// 			throw new IllegalArgumentException("millis must be not negative: " + millis);
// 		
// 		if (millis < MILLIS_MAX)
// 			return (int)millis;
// 		
// 		long seconds = -(millis / 1000);
// 		return seconds < Integer.MIN_VALUE ? Integer.MIN_VALUE : (int)seconds;
// 	}
// 
// 	/**
// 	 * Converts internal value to millis
// 	 * 
// 	 * @param internal The internal value
// 	 * @return Millisecond value
// 	 */
// 	public static long fromInternalToMillis(int internal)
// 	{
// 		if (internal >= 0)
// 			return internal;
// 		else if (internal == Integer.MIN_VALUE)
// 			return Long.MAX_VALUE;
// 		return ((long)-internal) * 1000L;
// 	}
// }
// 
// Path: src/main/java/com/trivago/triava/tcache/util/Serializing.java
// public class Serializing
// {
// 	public static byte[] toBytearray(Object obj) throws IOException
// 	{
// 		ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 		ObjectOutput out = null;
// 		try
// 		{
// 		  out = new ObjectOutputStream(bos);   
// 		  out.writeObject(obj);
// 		  return bos.toByteArray();
// 		}
// 		finally
// 		{
// 		  try
// 		  {
// 		    if (out != null)
// 		    {
// 		      out.close();
// 		    }
// 		  }
// 		  catch (IOException ex) {}
// 
// 		  try
// 		  {
// 		    bos.close();
// 		  }
// 		  catch (IOException ex) {}
// 		}
// 	}
// 	
// 	public static Object fromBytearray(byte[] serialized) throws IOException, ClassNotFoundException
// 	{
// 		ByteArrayInputStream bis = new ByteArrayInputStream(serialized);
// 		ObjectInput in = null;
// 		try {
// 		  in = new ObjectInputStream(bis);
// 		  return in.readObject(); 
// 		}
// 		finally
// 		{
// 		  try
// 		  {
// 		    bis.close();
// 		  }
// 		  catch (IOException ex) {}
// 		  
// 		  try
// 		  {
// 		    if (in != null)
// 		    {
// 		      in.close();
// 		    }
// 		  }
// 		  catch (IOException ex) {} 
// 		}
// 	}
// 
// 
// }


// Path: src/main/java/com/trivago/triava/tcache/AccessTimeObjectHolder.java
import java.io.Serializable;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import javax.cache.CacheException;
import com.trivago.triava.tcache.expiry.Constants;
import com.trivago.triava.tcache.expiry.TCacheExpiryPolicy;
import com.trivago.triava.tcache.util.SecondsOrMillis;
import com.trivago.triava.tcache.util.Serializing;


	@Override
	public long getCreationTime()
	{
		return Cache.baseTimeMillis + SecondsOrMillis.fromInternalToMillis(inputDate);
	}

	@Override
	public boolean isInvalid()
	{
		return isInvalid(false);
	}

	private boolean isInvalid(boolean debug)
	{	
		if (data == null)
		{
			return true; // Holder was released, e.g. via expiration
		}

		// -1- Check completeness
		boolean incomplete = (flags & STATE_MASK) != STATE_COMPLETE;
		if (incomplete)
		{
			if (debug) System.out.println("Dropped because holder is not complete: flags=" + flags + ": " + data);
			return true;
		}
		
		// -2- Check cache time
		long millisNow = currentTimeMillisEstimate();
		long expDurationMillis = SecondsOrMillis.fromInternalToMillis(maxCacheTime);