| 1 32 33 package com.imagero.uio.buffer; 34 35 import com.imagero.uio.RandomAccessRO; 36 37 import java.io.IOException; 38 import java.util.Enumeration; 39 40 43 public abstract class AbstractBufferManager implements BufferManager { 44 protected static int defaultBufferSize = 1024 * 50; 45 46 47 public static int getDefaultBufferSize() { 48 return RAFBufferManager.defaultBufferSize; 49 } 50 51 public static void setDefaultBufferSize(int defaultBufferSize) { 52 MutableRAFBufferManager.defaultBufferSize = defaultBufferSize; 53 } 54 55 MemoryAccessManager accessManager; 56 57 long offset; 58 long length; 59 int bufferSize; 60 RandomAccessRO ro; 61 62 public AbstractBufferManager() { 63 accessManager = createAccessManager(); 64 } 65 66 protected MemoryAccessManager createAccessManager() { 67 return MemoryAccessManager.createMemoryAccessManager(); 68 } 69 70 75 public int getCount() { 76 return accessManager.getCount(); 77 } 78 79 public void clear() { 80 accessManager.clear(); 81 } 82 83 public void clear(long start, long end) throws IOException { 84 int bs = getStart(start); 86 int eb = getEnd(end); 88 clearImpl(bs, eb); 89 } 90 91 protected void clearImpl(int bs, int eb) throws IOException { 92 for (int i = bs; i <= eb; i++) { 93 Integer key = new Integer(i); 94 Buffer b = accessManager.get(key); 95 if (b.isDirty() && b instanceof MutableBuffer) { 96 MutableBuffer buffer = (MutableBuffer) b; 97 buffer.flush(); 98 } 99 accessManager.drop(key); 100 } 101 } 102 103 108 protected int getEnd(long pos) { 109 int eb = getIndex(pos); 110 long pe = getDataStart(eb); 111 int length = getDataLength(eb); 112 if (pe + length > pos) { 113 eb--; 114 } 115 return eb; 116 } 117 118 123 protected int getStart(long pos) { 124 int bs = getIndex(pos); 125 long ps = getDataStart(bs); 126 if (ps < pos) { 127 bs++; 128 } 129 return bs; 130 } 131 132 public int getMaxCache() { 133 return accessManager.getMaxBufferCount(); 134 } 135 136 public void setMaxCache(int max) { 137 accessManager.setMaxBufferCount(max); 138 } 139 140 public void flush() throws IOException { 141 Enumeration enum = accessManager.keys(); 142 while (enum.hasMoreElements()) { 143 Buffer b = accessManager.get(enum.nextElement()); 144 if (b.isDirty() && b instanceof MutableBuffer) { 145 MutableBuffer buffer = (MutableBuffer) b; 146 buffer.flush(); 147 } 148 } 149 } 150 151 public void setDirty(int index) { 152 Buffer b = accessManager.get(index); 153 if (b != null && b instanceof MutableBuffer) { 154 MutableBuffer buffer = (MutableBuffer) b; 155 buffer.setDirty(); 156 } 157 } 158 159 public void setDirty(long from, long to) { 160 int start = getIndex(from); 161 int end = getIndex(to); 162 for (int i = start; i <= end; i++) { 163 setDirty(i); 164 } 165 } 166 } 167 | Popular Tags |