package com.robonobo.common.pageio.buffer; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ByteChannel; import com.robonobo.common.dlugosz.Dlugosz; import com.robonobo.mina.external.buffer.Page; import com.robonobo.mina.external.buffer.PageInfo; /** * Removed the encoding stuff from the Page and PageInfo beans so they are just POJOs * This is only really relevant to mina, so they need not be in the external API * Also, removed robonobo-common dependency on mina-api * @author ray * */ public class PageUtil { // 4 fields private static final int MAX_PAGEINFO_SZ = 4 * Dlugosz.bytesToEncode(Long.MAX_VALUE); public static PageInfo decodePageInfo(ByteChannel chan) throws IOException { PageInfo pi = new PageInfo(); pi.setPageNumber(Dlugosz.readLong(chan)); pi.setLength(Dlugosz.readLong(chan)); pi.setByteOffset(Dlugosz.readLong(chan)); pi.setTimeOffset(Dlugosz.readLong(chan)); return pi; } public static void encodePageInfo(PageInfo pi, ByteBuffer buf) { Dlugosz.encode(pi.getPageNumber(), buf); Dlugosz.encode(pi.getLength(), buf); Dlugosz.encode(pi.getByteOffset(), buf); Dlugosz.encode(pi.getTimeOffset(), buf); } public static int encodedPageSize(Page p) { return Dlugosz.bytesToEncode(p.getPageNumber()) + Dlugosz.bytesToEncode(p.getByteOffset()) + Dlugosz.bytesToEncode(p.getTimeOffset()) + p.getData().limit(); } public static int encodedPageInfoSize(PageInfo pi) { return Dlugosz.bytesToEncode(pi.getPageNumber()) + Dlugosz.bytesToEncode(pi.getByteOffset()) + Dlugosz.bytesToEncode(pi.getTimeOffset()) + Dlugosz.bytesToEncode(pi.getLength()); } public static int maxPageInfoSize() { return MAX_PAGEINFO_SZ; } public static Page decodePage(ByteBuffer buf) throws IOException{ Page p = new Page(); buf.position(0); p.setPageNumber(Dlugosz.readLong(buf)); p.setByteOffset(Dlugosz.readLong(buf)); p.setTimeOffset(Dlugosz.readLong(buf)); p.setData(buf.slice()); return p; } /** * Gets the page, including metadata, as a byte buffer ready for sending * over the network */ public static ByteBuffer pageToByteBuffer(Page p) { int bufLen = encodedPageSize(p); ByteBuffer result = ByteBuffer.allocate(bufLen); Dlugosz.encode(p.getPageNumber(), result); Dlugosz.encode(p.getByteOffset(), result); Dlugosz.encode(p.getTimeOffset(), result); p.getData().flip(); result.put(p.getData()); return result; } }