import com.gemstone.gemfire.cache.CacheFactory;
import com.gemstone.gemfire.cache.CacheStatistics;
import com.gemstone.gemfire.cache.Declarable;
import com.gemstone.gemfire.cache.Region;

import com.gemstone.gemfire.cache.execute.Function;
import com.gemstone.gemfire.cache.execute.FunctionContext;
import com.gemstone.gemfire.cache.execute.RegionFunctionContext;

import com.gemstone.gemfire.cache.partition.PartitionRegionHelper;

import java.util.Iterator;
import java.util.Properties;

public class CheckLastAccessedTimeFunction implements Function, Declarable {
  
  public void execute(FunctionContext context) {
    // Get local dataset
    RegionFunctionContext rfc = (RegionFunctionContext) context;
    Region region = PartitionRegionHelper.getLocalDataForContext(rfc);
    
    // Check last accessed time
    checkDumpLastAccessedTime(region);

    // Return result
    context.getResultSender().lastResult(true);
  }
  
  private void checkDumpLastAccessedTime(Region region) {
    System.out.println("CheckLastAccessedTimeFunction: Checking last accessed time for " + region.size() + " entries");
    int numRemoved = 0;
    long currentTime = System.currentTimeMillis();
    for (Iterator i = region.entrySet().iterator(); i.hasNext();) {
      Region.Entry entry = (Region.Entry) i.next();
      if (shouldRemove(entry, currentTime)) {
        i.remove();
        numRemoved++;
      }
    }
    System.out.println("CheckLastAccessedTimeFunction: Removed " + numRemoved + " entries");
  }
  
  private boolean shouldRemove(Region.Entry entry, long currentTime) {
    CacheStatistics statistics = entry.getStatistics();
    return statistics.getLastAccessedTime() < currentTime;
  }
  
  public String getId() {
    return getClass().getSimpleName();
  }

  public boolean optimizeForWrite() {
    return true;
  }

  public boolean hasResult() {
    return true;
  }

  public boolean isHA() {
    return false;
  }

  public void init(Properties properties) {
  }
}
