package com.alvazan.orm.layer0.base;
import java.util.Iterator;
import com.alvazan.orm.api.z8spi.conv.Precondition;
import com.alvazan.orm.api.z8spi.iter.StringLocal;
import com.alvazan.orm.impl.meta.data.MetaClass;
import com.alvazan.orm.impl.meta.data.MetaIdField;
public class IterableKey<T> implements Iterable<byte[]> {
private MetaIdField<T> meta;
private Iterable<? extends Object> keys;
public IterableKey(MetaClass<T> meta, Iterable<? extends Object> keys) {
Precondition.check(meta,"meta");
Precondition.check(keys,"keys");
this.meta = meta.getIdField();
this.keys = keys;
}
@Override
public Iterator<byte[]> iterator() {
return new IteratorProxy<T>(meta, keys.iterator());
}
@Override
public String toString() {
String tabs = StringLocal.getAndAdd();
String retVal = "IterableKey(getNextKey)["+
tabs+"idMeta="+meta+
tabs+"iterable="+keys+
tabs+"]";
StringLocal.set(tabs.length());
return retVal;
}
private static class IteratorProxy<T> implements Iterator<byte[]> {
private Iterator<? extends Object> iterator;
private MetaIdField<T> idMeta;
public IteratorProxy(MetaIdField<T> meta,
Iterator<? extends Object> iterator) {
this.idMeta = meta;
this.iterator = iterator;
}
@Override
public String toString() {
String tabs = StringLocal.getAndAdd();
String retVal = "IteratorProxy(getNextKey)["+
tabs+"idMeta="+idMeta+
tabs+"iterator="+iterator+
tabs+"]";
StringLocal.set(tabs.length());
return retVal;
}
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public byte[] next() {
Object next = iterator.next();
byte[] nonVirtKey = idMeta.convertIdToNonVirtKey(next);
if(nonVirtKey == null)
throw new IllegalArgumentException("You supplied a null key to your list when calling findAll method. We can't lookup null as a key");
//NOTE: Next iterator CONVERTS to virtual key so do not do it here!!!!
return nonVirtKey;
}
@Override
public void remove() {
throw new UnsupportedOperationException("not supported");
}
}
}