001package com.hammurapi.extract; 002 003import java.util.Collections; 004import java.util.Map; 005import java.util.Set; 006 007/** 008 * Constants don't extract any data from sources, but may extract 009 * data from context. 010 * @author Pavel Vlasov. 011 * 012 * @param <V> 013 * @param <C> 014 */ 015public class Constant<T, V, C> extends ExtractorBase<T, V, C> { 016 017 private V value; 018 019 protected Constant() { 020 super(0,null); 021 } 022 023 public V getValue() { 024 return value; 025 } 026 027 public Constant(V value) { 028 super(0,null); 029 this.value = value; 030 } 031 032 protected V extractInternal(C context, Map<C, Map<Extractor<T, ? super V, C>, ? super V>> cache, T... obj) { 033 return value; 034 } 035 036 public Set<Integer> parameterIndices() { 037 return Collections.emptySet(); 038 } 039 040 @Override 041 public int hashCode() { 042 final int prime = 31; 043 int result = 1; 044 result = prime * result + ((value == null) ? 0 : value.hashCode()); 045 return result; 046 } 047 048 @SuppressWarnings("unchecked") 049 @Override 050 public boolean equals(Object obj) { 051 if (this == obj) 052 return true; 053 if (obj == null) 054 return false; 055 if (getClass() != obj.getClass()) 056 return false; 057 Constant other = (Constant) obj; 058 if (value == null) { 059 if (other.value != null) 060 return false; 061 } else if (!value.equals(other.value)) 062 return false; 063 return true; 064 } 065 066 public boolean isContextDependent() { 067 return false; 068 } 069 070 @Override 071 public String toString() { 072 return getClass().getName()+"("+(value==null ? "null" : value + "["+value.getClass()+"]")+")"; 073 } 074 075 @Override 076 public ComparisonResult compareTo(Extractor<T, V, C> other) { 077 if (other instanceof Constant) { 078 Object otherValue = ((Constant) other).value; 079 if (value==null) { 080 return otherValue==null ? ComparisonResult.EQUAL_NM : ComparisonResult.UNEQUAL_NM; 081 } 082 083 // TODO - Number promotion and comparison. 084 085 return value.equals(otherValue) ? ComparisonResult.EQUAL_NM : value instanceof Boolean ? ComparisonResult.OPPOSITE_NM : ComparisonResult.UNEQUAL_NM; 086 } 087 return super.compareTo(other); 088 } 089 090}