001package com.hammurapi.extract; 002 003import java.util.Collections; 004import java.util.Map; 005import java.util.Set; 006import java.util.concurrent.TimeUnit; 007 008/** 009 * This predicate evaluates to true for <code>timeInterval</code> after construction. 010 * Then it evaluates to false. 011 * @author Pavel Vlasov 012 * 013 * @param <T> 014 * @param <C> 015 */ 016public class TimeIntervalPredicate<T,C> implements Predicate<T,C> { 017 018 private boolean nanos; 019 long end; 020 021 public TimeIntervalPredicate(TimeUnit timeUnit, long interval) { 022 nanos = TimeUnit.MILLISECONDS.compareTo(timeUnit)>0; 023 long start = nanos ? System.nanoTime() : System.currentTimeMillis(); 024 end = start + (nanos ? TimeUnit.NANOSECONDS : TimeUnit.MILLISECONDS).convert(interval, timeUnit); 025 } 026 027 @Override 028 public Boolean extract( 029 C context, 030 Map<C, Map<Extractor<T, ? super Boolean, C>, ? super Boolean>> cache, 031 T... obj) { 032 return (nanos ? System.nanoTime() : System.currentTimeMillis()) < end; 033 } 034 035 @Override 036 public Set<Integer> parameterIndices() { 037 return Collections.emptySet(); 038 } 039 040 @Override 041 public boolean isContextDependent() { 042 return false; 043 } 044 045 @Override 046 public ComparisonResult compareTo(Extractor<T, Boolean, C> other) { 047 if (equals(other)) { 048 return ComparisonResult.EQUAL_NM; 049 } 050 return ComparisonResult.NOT_EQUAL_NM; 051 } 052 053 @Override 054 public double getCost() { 055 return 0; 056 } 057 058 @Override 059 public int hashCode() { 060 final int prime = 31; 061 int result = 1; 062 result = prime * result + (int) (end ^ (end >>> 32)); 063 result = prime * result + (nanos ? 1231 : 1237); 064 return result; 065 } 066 067 @Override 068 public boolean equals(Object obj) { 069 if (this == obj) 070 return true; 071 if (obj == null) 072 return false; 073 if (getClass() != obj.getClass()) 074 return false; 075 TimeIntervalPredicate other = (TimeIntervalPredicate) obj; 076 if (end != other.end) 077 return false; 078 if (nanos != other.nanos) 079 return false; 080 return true; 081 } 082 083}