001: // You can redistribute this software and/or modify it under the terms of
002: // the Ozone Library License version 1 published by ozone-db.org.
003: //
004: // The original code and portions created by SMB are
005: // Copyright (C) 1997-@year@ by SMB GmbH. All rights reserved.
006: //
007: // $Id: DxObjectInputStream.java,v 1.1 2001/12/18 10:31:30 per_nyfelt Exp $
008:
009: package org.ozoneDB.DxLib;
010:
011: import java.io.*;
012: import java.util.*;
013:
014: /**
015: * Dieser Stream ist ein Ersatz fuer den Java-ObjectInputStream. In
016: * gewissen Situationen ist er weniger speicherintensiv. Es koennen
017: * allerdings nur Objekte gelesen werden, die das
018: * Externalizable-Interface implementieren.
019: *
020: *
021: * @author <a href="http://www.softwarebuero.de/">SMB</a>
022: * @version $Revision: 1.1 $Date: 2001/12/18 10:31:30 $
023: */
024: public class DxObjectInputStream extends DataInputStream implements
025: ObjectInput {
026: protected Hashtable table;
027: protected Hashtable classes;
028:
029: public DxObjectInputStream(InputStream in) {
030: super (in);
031: table = new Hashtable();
032: classes = new Hashtable();
033: }
034:
035: public DxObjectInputStream(InputStream in, int bufferSize) {
036: super (new BufferedInputStream(in, bufferSize));
037: table = new Hashtable();
038: classes = new Hashtable();
039: }
040:
041: public void reset() {
042: table.clear();
043: classes.clear();
044: //System.out.println ("ObjInputStream.reset()");
045: }
046:
047: public String readClassName() throws IOException {
048: String cName = readUTF();
049:
050: // _R_ und _N_ wird kein Index zugeordnet
051: if (cName.equals(">") || cName.equals("_")) {
052: return cName;
053: }
054:
055: // klassennamen-referenz aufloesen
056: if (cName.equals("+")) {
057: Integer index = new Integer(readShort());
058: cName = (String) classes.get(index);
059: } else {
060: classes.put(new Integer(classes.size()), cName);
061: }
062:
063: return cName;
064: }
065:
066: public Object readObject() throws IOException {
067: try {
068: // classenanmen lesen
069: String cName = readClassName();
070: //System.out.println ("readObject(): className: " + cName);
071: Object newObj = null;
072:
073: if (cName.equals("_")) {
074: // null - referenz wurde gespeichert
075: //System.out.println ("readObject(): null");
076: return null;
077: } else if (cName.equals(">")) {
078: // ist Referenz, wurde also schon geladen, entspr. Wert aus table lesen
079: Integer hc = new Integer(readInt());
080: newObj = table.get(hc);
081: //System.out.println ("readObject(): hashCode ref " + hc + " from " + table.size());
082: if (newObj == null) {
083: throw new IOException(
084: "Object not found in referenz table !!");
085: }
086: } else {
087: // neues objekt erzeugen
088: newObj = Class.forName(cName).newInstance();
089: // hashcode lesen
090: Integer hc = new Integer(readInt());
091: //System.out.println ("readObject(): class " + cName + " hashCode " + hc);
092: // objekt registrieren
093: table.put(hc, newObj);
094: // objektdaten lesen
095: if (newObj instanceof Externalizable) {
096: ((Externalizable) newObj).readExternal(this );
097: } else {
098: throw new IOException(
099: "Object doesn't implement Externalizable");
100: }
101: }
102: return newObj;
103: } catch (IOException e) {
104: throw e;
105: } catch (Exception e) {
106: throw new IOException(e.toString());
107: }
108: }
109: }
|