package com.robonobo.common.pageio.buffer;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.robonobo.mina.external.buffer.PageInfo;
import com.robonobo.mina.external.buffer.StreamPosition;
public class SimplePageInfoStore implements PageInfoStore {
private Map<String, Map<Long, PageInfo>> piMap = new HashMap<String, Map<Long,PageInfo>>();
private Map<String, Long> bytesRecvd = new HashMap<String, Long>();
private Map<String, Long> lastContigPage = new HashMap<String, Long>();
private Map<String, Long> pagesRecvd = new HashMap<String, Long>();
private Map<String, Long> totalPages = new HashMap<String, Long>();
public SimplePageInfoStore() {
}
public int getNumPageInfos(String streamId) {
return piMap.get(streamId).size();
}
public PageInfo getPageInfo(String streamId, long pageNum) {
return piMap.get(streamId).get(pageNum);
}
public boolean haveGotPage(String streamId, long pageNum) {
return piMap.get(streamId).containsKey(pageNum);
}
public void init(String streamId) {
piMap.put(streamId, new HashMap<Long, PageInfo>());
bytesRecvd.put(streamId, 0L);
lastContigPage.put(streamId, -1L);
pagesRecvd.put(streamId, 0L);
totalPages.put(streamId, -1L);
}
public void putPageInfo(String streamId, PageInfo pi) throws IOException {
piMap.get(streamId).put(pi.getPageNumber(), pi);
pagesRecvd.put(streamId, pagesRecvd.get(streamId)+1);
bytesRecvd.put(streamId, bytesRecvd.get(streamId)+pi.getLength());
long lcp = lastContigPage.get(streamId);
while(haveGotPage(streamId, lcp+1)) {
lcp++;
}
lastContigPage.put(streamId, lcp);
}
public long getBytesReceived(String streamId) {
return bytesRecvd.get(streamId);
}
public long getLastContiguousPage(String streamId) {
return lastContigPage.get(streamId);
}
public StreamPosition getStreamPosition(String streamId) {
int pageMap = 0;
long lastContig = getLastContiguousPage(streamId);
// Start loop at 2 as we know we don't have 1 (or else it would be lastContig)
for(int i=2;i<=32;i++) {
if(haveGotPage(streamId, lastContig+i))
pageMap |= (1 << (i-1));
}
return new StreamPosition(lastContig, pageMap);
}
public long getPagesReceived(String streamId) {
return pagesRecvd.get(streamId);
}
public long getTotalPages(String streamId) {
return totalPages.get(streamId);
}
public void setTotalPages(String streamId, long tp) {
totalPages.put(streamId, tp);
}
public Map<Long, PageInfo> getAllPageInfo(String sid) {
return piMap.get(sid);
}
public void putAllPageInfo(String streamId, List<PageInfo> pis) throws IOException {
for (PageInfo pi : pis) {
putPageInfo(streamId, pi);
}
}
}