KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > ozoneDB > DxLib > DxObjectInputStream


1 // You can redistribute this software and/or modify it under the terms of
2
// the Ozone Library License version 1 published by ozone-db.org.
3
//
4
// The original code and portions created by SMB are
5
// Copyright (C) 1997-@year@ by SMB GmbH. All rights reserved.
6
//
7
// $Id: DxObjectInputStream.java,v 1.1 2001/12/18 10:31:30 per_nyfelt Exp $
8

9 package org.ozoneDB.DxLib;
10
11 import java.io.*;
12 import java.util.*;
13
14 /**
15  * Dieser Stream ist ein Ersatz fuer den Java-ObjectInputStream. In
16  * gewissen Situationen ist er weniger speicherintensiv. Es koennen
17  * allerdings nur Objekte gelesen werden, die das
18  * Externalizable-Interface implementieren.
19  *
20  *
21  * @author <a HREF="http://www.softwarebuero.de/">SMB</a>
22  * @version $Revision: 1.1 $Date: 2001/12/18 10:31:30 $
23  */

24 public class DxObjectInputStream extends DataInputStream implements ObjectInput {
25     protected Hashtable table;
26     protected Hashtable classes;
27
28
29     public DxObjectInputStream( InputStream in ) {
30         super( in );
31         table = new Hashtable();
32         classes = new Hashtable();
33     }
34
35
36     public DxObjectInputStream( InputStream in, int bufferSize ) {
37         super( new BufferedInputStream( in, bufferSize ) );
38         table = new Hashtable();
39         classes = new Hashtable();
40     }
41
42
43     public void reset() {
44         table.clear();
45         classes.clear();
46     //System.out.println ("ObjInputStream.reset()");
47
}
48
49
50     public String JavaDoc readClassName() throws IOException {
51         String JavaDoc cName = readUTF();
52
53         // _R_ und _N_ wird kein Index zugeordnet
54
if (cName.equals( ">" ) || cName.equals( "_" )) {
55             return cName;
56         }
57
58         // klassennamen-referenz aufloesen
59
if (cName.equals( "+" )) {
60             Integer JavaDoc index = new Integer JavaDoc( readShort() );
61             cName = (String JavaDoc)classes.get( index );
62         } else {
63             classes.put( new Integer JavaDoc( classes.size() ), cName );
64         }
65
66         return cName;
67     }
68
69
70     public Object JavaDoc readObject() throws IOException {
71         try {
72             // classenanmen lesen
73
String JavaDoc cName = readClassName();
74             //System.out.println ("readObject(): className: " + cName);
75
Object JavaDoc newObj = null;
76
77             if (cName.equals( "_" )) {
78                 // null - referenz wurde gespeichert
79
//System.out.println ("readObject(): null");
80
return null;
81             } else if (cName.equals( ">" )) {
82                 // ist Referenz, wurde also schon geladen, entspr. Wert aus table lesen
83
Integer JavaDoc hc = new Integer JavaDoc( readInt() );
84                 newObj = table.get( hc );
85                 //System.out.println ("readObject(): hashCode ref " + hc + " from " + table.size());
86
if (newObj == null) {
87                     throw new IOException( "Object not found in referenz table !!" );
88                 }
89             } else {
90                 // neues objekt erzeugen
91

92                 //newObj = Class.forName( cName ).newInstance();
93
// todo: uncommented until verified that it works
94
// todo: maybe we should use ClassManager here instead ot Thread.currentThread...?
95
newObj = Thread.currentThread().getContextClassLoader().loadClass( cName ).newInstance();
96
97                 // hashcode lesen
98
Integer JavaDoc hc = new Integer JavaDoc( readInt() );
99                 //System.out.println ("readObject(): class " + cName + " hashCode " + hc);
100
// objekt registrieren
101
table.put( hc, newObj );
102                 // objektdaten lesen
103
if (newObj instanceof Externalizable) {
104                     ((Externalizable)newObj).readExternal( this );
105                 } else {
106                     throw new IOException( "Object doesn't implement Externalizable" );
107                 }
108             }
109             return newObj;
110         } catch (IOException e) {
111             throw e;
112         } catch (Exception JavaDoc e) {
113             throw new IOException( e.toString() );
114         }
115     }
116 }
117
Popular Tags