package com.revolsys.io.page; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.TreeSet; public class MemoryPageManager implements PageManager { private final Set<Page> freePages = new TreeSet<>(); private final List<Page> pages = new ArrayList<>(); private final Set<Page> pagesInUse = new HashSet<>(); int pageSize = 64; @Override public synchronized int getNumPages() { return this.pages.size() - this.freePages.size(); } @Override public synchronized Page getPage(final int index) { final Page page = this.pages.get(index); if (this.freePages.contains(page)) { throw new IllegalArgumentException("Page does not exist " + index); } else if (this.pagesInUse.contains(page)) { throw new IllegalArgumentException("Page is currently being used " + index); } else { page.setOffset(0); this.pagesInUse.add(page); return page; } } @Override public int getPageSize() { return this.pageSize; } @Override public synchronized Page newPage() { Page page; if (this.freePages.isEmpty()) { page = new ByteArrayPage(this, this.pages.size(), this.pageSize); this.pages.add(page); } else { final Iterator<Page> iterator = this.freePages.iterator(); page = iterator.next(); iterator.remove(); } this.pagesInUse.add(page); return page; } @Override public Page newTempPage() { return new ByteArrayPage(this, -1, this.pageSize); } @Override public synchronized void releasePage(final Page page) { this.pagesInUse.remove(page); } @Override public synchronized void removePage(final Page page) { this.freePages.add(page); this.pagesInUse.remove(page); } @Override public void write(final Page page) { } }