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: DxDiskHashNodeLeaf.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:
013: /**
014: * Knoten als blatt des baumes. Enthaelt keine verzweigungen aber eventuell
015: * mehrere key-data-paare.
016: */
017: public class DxDiskHashNodeLeaf extends DxDiskHashNode implements
018: Externalizable {
019:
020: final static long serialVersionUID = 1;
021:
022: protected DxDiskHashMap grandParent;
023:
024: protected DxKeyData element;
025:
026: public DxDiskHashNodeLeaf(DxDiskHashMap _grandParent) {
027: grandParent = _grandParent;
028: }
029:
030: public void empty() {
031: element = null;
032: }
033:
034: public DxKeyData element() {
035: return element;
036: }
037:
038: public boolean addForKey(Object data, Object key) {
039: //es ist noch kein element drin
040: if (element == null) {
041: element = grandParent.newKeyData();
042: element.set(key, data);
043: return true;
044: } else {
045: //es sind schon elemente da
046: DxKeyData elem = element;
047: while (elem != null) {
048: if (elem.key.equals(key)) {
049: break;
050: }
051: elem = elem.next;
052: }
053: //key ist noch nicht drin
054: if (elem == null) {
055: DxKeyData newElement = grandParent.newKeyData();
056: newElement.set(key, data);
057: newElement.next = element;
058: element = newElement;
059: return true;
060: } else {
061: //key ist schon da :(
062: return false;
063: }
064: }
065: }
066:
067: public Object elementForKey(Object key, int hashCode) {
068: DxKeyData elem = element;
069: while (elem != null) {
070: if (elem.key.equals(key)) {
071: return elem.data;
072: }
073: elem = elem.next;
074: }
075: return null;
076: }
077:
078: public Object removeForKey(Object key) {
079: DxKeyData elem = element;
080: while (elem != null) {
081: if (elem.key.equals(key)) {
082: break;
083: }
084: elem = elem.next;
085: }
086:
087: Object answer = null;
088: if (elem != null) {
089: answer = elem.data;
090: //daten vom ersten element der liste hier eintragen
091: elem.data = element.data;
092: elem.key = element.key;
093: //erstes element loeschen; evtl gibt es nur noch das eine
094: element = element.next;
095: }
096: return answer;
097: }
098:
099: public void writeExternal(ObjectOutput out) throws IOException {
100: byte c = 0;
101: for (DxKeyData elem = element; elem != null; elem = elem.next) {
102: c++;
103: }
104: out.writeByte(c);
105:
106: DxKeyData elem = element;
107: while (elem != null) {
108: out.writeObject(elem.key);
109: out.writeObject(elem.data);
110: elem = elem.next;
111: }
112: }
113:
114: public void readExternal(ObjectInput in) throws IOException,
115: ClassNotFoundException {
116: byte c = in.readByte();
117:
118: element = grandParent.newKeyData();
119: element.set(in.readObject(), in.readObject());
120:
121: DxKeyData elem = element;
122: for (int i = 1; i < c; i++) {
123: elem.next = grandParent.newKeyData();
124: elem.next.set(in.readObject(), in.readObject());
125: elem = elem.next;
126: }
127: }
128: }
|