package com.fourinone;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.lang.reflect.Array;
import java.util.Comparator;
public class CoolHashMap extends LinkedHashMap implements Map,CoolHashBase{
private int maxCapacity=ConfigContext.getHASHCAPACITY();
public static CoolKeySet<String> newKeySet(){
return new CoolHashMap().new CoolKeySet<String>();
}
public static CoolKeySet<String> newKeySet(int initialCapacity){
return new CoolHashMap().new CoolKeySet<String>(initialCapacity);
}
/*static CoolKeySet<String> newKeySet(Collection c){
return new CoolHashMap().new CoolKeySet(c);
}*/
private class DataMapEntry implements Map.Entry,Comparable<Map.Entry>{
private String k;
private Object v;
DataMapEntry(String k, Object v){
this.k=k;
this.v=v;
}
@Override
public boolean equals(Object o){
if(o instanceof Map.Entry){
Map.Entry entry =(Map.Entry)o;
if((entry.getKey()==null?k==null:entry.getKey().equals(k))&&(entry.getValue()==null?v==null:entry.getValue().equals(v)))
return true;
}
return false;
}
@Override
public String getKey(){
return k;
}
@Override
public Object getValue(){
return v;
}
@Override
public int hashCode(){
return (k==null?0:k.hashCode())^(v==null?0:v.hashCode());
}
@Override
public Object setValue(Object value){
this.v = value;
return v;
}
public String toString(){
return String.valueOf(k)+"="+String.valueOf(v);
}
public int compareTo(Map.Entry o){
return getKey().compareTo((String)o.getKey());
}
}
public final class CoolKeySet<E> extends LinkedHashSet<E> implements Set<E>{
private CoolKeySet(){
super();
}
private CoolKeySet(int initialCapacity){
super(initialCapacity);
}
private CoolKeySet(Collection<? extends E> c){
super(c);
}
private CoolKeySet(int initialCapacity, float loadFactor){
super(initialCapacity,loadFactor);
}
@Override
public boolean add(E e){
return chex.checkKey((String)e)&&checkMaxCapacity()?addKey(e):false;
}
boolean addKey(E e){
return super.add(e);
}
@Override
public boolean addAll(Collection<? extends E> c){
if(!(c instanceof CoolKeySet)){
LogUtil.fail("[addAll]", "[IllegalArgumentException]", "add failed, the Collection c is not instance of CoolKeySet");
return false;
}
return addCollection(c);
}
boolean addCollection(Collection<? extends E> c){
return checkMaxCapacity()?super.addAll(c):false;
}
private boolean checkMaxCapacity(){
if(size()+1>maxCapacity){
LogUtil.fail("[Exceed Error] ", "[CoolHashMapException]", "add failed, the size of the CoolKeySet exceed maxCapacity!");
return false;
}
return true;
}
public CoolKeySet<E> and(CoolKeySet<E> other){
retainAll(other);
return this;
}
public CoolKeySet<E> or(CoolKeySet<E> other){
addCollection(other);
return this;
}
public CoolKeySet<E> except(CoolKeySet<E> other){
removeAll(other);
return this;
}
public String[] sort(){
String[] arr = toArray(new String[0]);
Arrays.sort(arr);
return arr;
}
public String[] sort(Comparator<String> comp){
String[] arr = toArray(new String[0]);
Arrays.sort(arr,comp);
return arr;
}
public CoolKeySet<E> getSuperKeys(int superIndex){
String[] ks=toArray(new String[0]);
for(int i=0;i<ks.length;i++)
ks[i]=getSuperKey(ks[i], superIndex);
CoolKeySet cks=new CoolKeySet<String>();
cks.addCollection(Arrays.asList(ks));
return cks;
}
}
public CoolKeySet<String> getKeys(){
CoolKeySet<String> cks = newKeySet();
cks.addCollection(keySet());
return cks;
}
Collection getValues(){
return super.values();
}
@Override
public Collection values(){
return values(null);
}
public <T> Collection<T> values(Class<T> classType){
ArrayList<T> vls = new ArrayList<T>();
for(Iterator<byte[]> i=(Iterator<byte[]>)getValues().iterator();i.hasNext();)
vls.add(ct.getTargetObject(i.next(),classType));
return vls;
}
public <T> T[] getValues(Class<T> classType){
T[] vls = (T[])Array.newInstance(classType,size());
int j=0;
for(Iterator<byte[]> i=(Iterator<byte[]>)getValues().iterator();i.hasNext();){
vls[j++]=ct.getTargetObject(i.next(),classType);
}
return vls;
}
@Override
public boolean containsValue(Object value){
return super.containsValue(ct.getTargetBytes(value));
}
@Override
public Set<Map.Entry> entrySet(){
Set<Map.Entry> es = new LinkedHashSet<Map.Entry>(size());
Set<Map.Entry> meset = getEntrySet();
for(Entry me:meset)
es.add(new DataMapEntry((String)me.getKey(),get(me.getKey())));
return es;
}
Set<Map.Entry> getEntrySet(){
return super.entrySet();
}
@Override
public boolean equals(Object o){
if(o instanceof CoolHashMap){
CoolHashMap odm =(CoolHashMap)o;
if(size()==odm.size()){
Object[] meset = getEntrySet().toArray();
Object[] odmmeset = odm.getEntrySet().toArray();
for(int i=0;i<meset.length;i++){
Map.Entry me = (Map.Entry)meset[i];
Map.Entry odmme = (Map.Entry)odmmeset[i];
if(!(me.getKey().equals(odmme.getKey())&&Arrays.equals((byte[])me.getValue(),(byte[])odmme.getValue())))
return false;
}
return true;
}
}
return false;
}
@Override
public Object get(Object key){
if(chex.checkKey((String)key)==false)
return null;
byte[] vbs=(byte[])getValue(key);
return vbs!=null?ct.getTargetObject(vbs):vbs;
}
Object getValue(Object key){
return super.get(key);
}
public <T> T get(String key, Class<T> classType){
return ct.getTargetObject((byte[])getValue(key),classType);
}
@Override
public Object put(Object key, Object value){
return putValue(key, value, true);
}
public Object putPoint(String keyPoint, String key){
return chex.checkKey(key)?putValue(keyPoint,ct.getBytes(key)):null;
}
Object putValue(Object key, Object value){
return putValue(key, value, false);
}
private Object putValue(Object key, Object value, boolean t){
if(key!=null&&value!=null){
value = t?ct.getTargetBytes(value):value;
value=(!t||chex.checkKeyValue(key,value))?super.put(key,value):null;
}else LogUtil.fail("[NullPointerException]", "[put]", "put failed, key or value cant be null!");
return value;
}
@Override
public void putAll(Map m){
if(m instanceof CoolHashMap)
super.putAll(m);
else LogUtil.fail("[putAll]", "[IllegalArgumentException]", "add failed, the Map m is not instance of CoolHashMap!");
}
@Override
public Object remove(Object key){
if(chex.checkKey((String)key)==false)
return null;
return super.remove(key);
}
public CoolHashMap and(CoolHashMap cm){
keySet().retainAll(cm.keySet());
return this;
}
public CoolHashMap or(CoolHashMap cm){
putAll(cm);
return this;
}
public CoolHashMap except(CoolHashMap cm){
keySet().removeAll(cm.keySet());
return this;
}
public String toString(){
return entrySet().toString();
}
String forString(){
return getEntrySet().toString();
}
protected boolean removeEldestEntry(Map.Entry eldest){
return size()>maxCapacity;
}
public Map.Entry[] sort(){
Map.Entry[] arr=entrySet().toArray(new Map.Entry[0]);
Arrays.sort(arr);
return arr;
}
public Map.Entry[] sort(Comparator<Map.Entry> comp){
Map.Entry[] arr=entrySet().toArray(new Map.Entry[0]);
Arrays.sort(arr,comp);
return arr;
}
public static String getSuperKey(String key, int superIndex){
if(key!=null&&key.length()>0&&superIndex>=0){
StringBuilder keyStr = new StringBuilder(key);
int f=0,c=-1;
while(c<superIndex){
int x = keyStr.indexOf("\u002E",f+1);
if(x!=-1){
c++;
f=x;
}
else{
f=keyStr.length();
break;
}
}
return keyStr.substring(0,f);
}
return key;
}
public static void main(String[] args){
}
}