001: /* Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com
002:
003: This file is part of the db4o open source object database.
004:
005: db4o is free software; you can redistribute it and/or modify it under
006: the terms of version 2 of the GNU General Public License as published
007: by the Free Software Foundation and as clarified by db4objects' GPL
008: interpretation policy, available at
009: http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
010: Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
011: Suite 350, San Mateo, CA 94403, USA.
012:
013: db4o is distributed in the hope that it will be useful, but WITHOUT ANY
014: WARRANTY; without even the implied warranty of MERCHANTABILITY or
015: FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
016: for more details.
017:
018: You should have received a copy of the GNU General Public License along
019: with this program; if not, write to the Free Software Foundation, Inc.,
020: 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
021: package com.db4o.internal.marshall;
022:
023: import com.db4o.*;
024: import com.db4o.internal.*;
025:
026: /**
027: * @exclude
028: */
029: public abstract class AbstractReadContext implements
030: InternalReadContext {
031:
032: protected final Transaction _transaction;
033:
034: protected Buffer _buffer;
035:
036: protected int _activationDepth;
037:
038: protected AbstractReadContext(Transaction transaction) {
039: _transaction = transaction;
040: }
041:
042: protected AbstractReadContext(Transaction transaction, Buffer buffer) {
043: _transaction = transaction;
044: _buffer = buffer;
045: }
046:
047: public Buffer buffer(Buffer buffer) {
048: Buffer temp = _buffer;
049: _buffer = buffer;
050: return temp;
051: }
052:
053: public Buffer buffer() {
054: return _buffer;
055: }
056:
057: public ObjectContainerBase container() {
058: return _transaction.container();
059: }
060:
061: public ObjectContainer objectContainer() {
062: return (ObjectContainer) container();
063: }
064:
065: public Transaction transaction() {
066: return _transaction;
067: }
068:
069: public byte readByte() {
070: return _buffer.readByte();
071: }
072:
073: public void readBytes(byte[] bytes) {
074: _buffer.readBytes(bytes);
075: }
076:
077: public int readInt() {
078: return _buffer.readInt();
079: }
080:
081: public long readLong() {
082: return _buffer.readLong();
083: }
084:
085: public Object read(TypeHandler4 handlerType) {
086: TypeHandler4 handler = correctHandlerVersion(handlerType);
087: if (!isIndirected(handler)) {
088: return handler.read(this );
089: }
090: int indirectedOffSet = readInt();
091: readInt(); // length, not needed
092: int offset = offset();
093: seek(indirectedOffSet);
094: Object obj = handler.read(this );
095: seek(offset);
096: return obj;
097: }
098:
099: public Object readObject() {
100: int id = readInt();
101: int depth = activationDepth() - 1;
102:
103: if (peekPersisted()) {
104: return container().peekPersisted(transaction(), id, depth,
105: false);
106: }
107:
108: Object obj = container().getByID2(transaction(), id);
109:
110: if (obj instanceof Db4oTypeImpl) {
111: depth = ((Db4oTypeImpl) obj).adjustReadDepth(depth);
112: }
113:
114: // this is OK for primitive YapAnys. They will not be added
115: // to the list, since they will not be found in the ID tree.
116: container().stillToActivate(transaction(), obj, depth);
117:
118: return obj;
119: }
120:
121: private boolean peekPersisted() {
122: return false;
123: }
124:
125: public Object readObject(TypeHandler4 handlerType) {
126: TypeHandler4 handler = correctHandlerVersion(handlerType);
127: if (!isIndirected(handler)) {
128: return handler.read(this );
129: }
130: int payLoadOffset = readInt();
131: readInt(); // length - never used
132: if (payLoadOffset == 0) {
133: return null;
134: }
135: int savedOffset = offset();
136: seek(payLoadOffset);
137: Object obj = handler.read(this );
138: seek(savedOffset);
139: return obj;
140: }
141:
142: public int activationDepth() {
143: return _activationDepth;
144: }
145:
146: public void activationDepth(int depth) {
147: _activationDepth = depth;
148: }
149:
150: public int offset() {
151: return _buffer.offset();
152: }
153:
154: public void seek(int offset) {
155: _buffer.seek(offset);
156: }
157:
158: public boolean isIndirected(TypeHandler4 handler) {
159: if (handlerVersion() == 0) {
160: return false;
161: }
162: return handlerRegistry().isVariableLength(handler);
163: }
164:
165: private HandlerRegistry handlerRegistry() {
166: return container().handlers();
167: }
168:
169: public boolean oldHandlerVersion() {
170: return handlerVersion() != MarshallingContext.HANDLER_VERSION;
171: }
172:
173: public TypeHandler4 correctHandlerVersion(TypeHandler4 handler) {
174: if (!oldHandlerVersion()) {
175: return handler;
176: }
177: return container().handlers().correctHandlerVersion(handler,
178: handlerVersion());
179: }
180:
181: public abstract int handlerVersion();
182:
183: }
|