01: // Spatial Index Library
02: //
03: // Copyright (C) 2002 Navel Ltd.
04: //
05: // This library is free software; you can redistribute it and/or
06: // modify it under the terms of the GNU Lesser General Public
07: // License as published by the Free Software Foundation; either
08: // version 2.1 of the License, or (at your option) any later version.
09: //
10: // This library is distributed in the hope that it will be useful,
11: // but WITHOUT ANY WARRANTY; without even the implied warranty of
12: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: // Lesser General Public License for more details.
14: //
15: // You should have received a copy of the GNU Lesser General Public
16: // License along with this library; if not, write to the Free Software
17: // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18: //
19: // Contact information:
20: // Mailing address:
21: // Marios Hadjieleftheriou
22: // University of California, Riverside
23: // Department of Computer Science
24: // Surge Building, Room 310
25: // Riverside, CA 92521
26: //
27: // Email:
28: // marioh@cs.ucr.edu
29: package org.geotools.caching.spatialindex.storagemanager;
30:
31: import java.util.*;
32:
33: public class MemoryStorageManager implements IStorageManager {
34: private ArrayList m_buffer = new ArrayList();
35: private Stack m_emptyPages = new Stack();
36:
37: public void flush() {
38: }
39:
40: public byte[] loadByteArray(final int id) {
41: Entry e = null;
42:
43: try {
44: e = (Entry) m_buffer.get(id);
45: } catch (IndexOutOfBoundsException ex) {
46: throw new InvalidPageException(id);
47: }
48:
49: byte[] ret = new byte[e.m_pData.length];
50: System.arraycopy(e.m_pData, 0, ret, 0, e.m_pData.length);
51:
52: return ret;
53: }
54:
55: public int storeByteArray(final int id, final byte[] data) {
56: int ret = id;
57: Entry e = new Entry(data);
58:
59: if (id == NewPage) {
60: if (m_emptyPages.empty()) {
61: m_buffer.add(e);
62: ret = m_buffer.size() - 1;
63: } else {
64: ret = ((Integer) m_emptyPages.pop()).intValue();
65: m_buffer.set(ret, e);
66: }
67: } else {
68: if ((id < 0) || (id >= m_buffer.size())) {
69: throw new InvalidPageException(id);
70: }
71:
72: m_buffer.set(id, e);
73: }
74:
75: return ret;
76: }
77:
78: public void deleteByteArray(final int id) {
79: Entry e = null;
80:
81: try {
82: e = (Entry) m_buffer.get(id);
83: } catch (IndexOutOfBoundsException ex) {
84: throw new InvalidPageException(id);
85: }
86:
87: m_buffer.set(id, null);
88: m_emptyPages.push(new Integer(id));
89: }
90:
91: class Entry {
92: byte[] m_pData;
93:
94: Entry(final byte[] d) {
95: m_pData = new byte[d.length];
96: System.arraycopy(d, 0, m_pData, 0, d.length);
97: }
98: } // Entry
99: }
|