package com.alvazan.orm.logging;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alvazan.orm.api.z8spi.meta.DboDatabaseMeta;
import com.alvazan.orm.api.z8spi.meta.DboTableMeta;
public class IterLogProxy implements Iterable<byte[]> {
private static final Logger log = LoggerFactory.getLogger(IterLogProxy.class);
private String prefix;
private DboDatabaseMeta databaseInfo;
private String colFamily;
private Iterable<byte[]> rowKeys;
public IterLogProxy(String prefix, DboDatabaseMeta databaseInfo,
String colFamily, Iterable<byte[]> rowKeys) {
this.prefix = prefix;
this.databaseInfo = databaseInfo;
this.colFamily = colFamily;
this.rowKeys = rowKeys;
}
@Override
public Iterator<byte[]> iterator() {
return new IteratorLogProxy(prefix, databaseInfo, colFamily, rowKeys.iterator());
}
private static class IteratorLogProxy implements Iterator<byte[]> {
private String prefix;
private String colFamily;
private Iterator<byte[]> rowKeys;
private List<String> realKeys = new ArrayList<String>();
private DboTableMeta meta;
private boolean alreadyLogged = false;
public IteratorLogProxy(String prefix, DboDatabaseMeta databaseInfo,
String colFamily, Iterator<byte[]> rowKeys) {
this.prefix = prefix;
this.colFamily = colFamily;
this.rowKeys = rowKeys;
meta = databaseInfo.getMeta(colFamily);
}
@Override
public boolean hasNext() {
boolean hasNext = rowKeys.hasNext();
if(log.isInfoEnabled() && !hasNext && !alreadyLogged && realKeys.size() > 0) {
//we are finished and can now log the keys about to be looked up
log.info(prefix+" CF="+colFamily+" finding keys="+realKeys);
alreadyLogged = true;
}
return hasNext;
}
@Override
public byte[] next() {
byte[] k = rowKeys.next();
if(meta != null && log.isInfoEnabled()) {
try {
Object obj = meta.getIdColumnMeta().convertFromStorage2(k);
String str = meta.getIdColumnMeta().convertTypeToString(obj);
realKeys.add(str);
} catch(Exception e) {
if(log.isTraceEnabled())
log.trace("Exception occurred", e);
realKeys.add("[exception, turn on trace logging]");
}
}
return k;
}
@Override
public void remove() {
throw new UnsupportedOperationException("not supported and probably never will be");
}
}
}