/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2011 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ package com.db4o.internal.references; import com.db4o.*; import com.db4o.foundation.*; import com.db4o.internal.*; /** * @exclude */ public class HashcodeReferenceSystem implements ReferenceSystem { private ObjectReference _hashCodeTree; private ObjectReference _idTree; public void addNewReference(ObjectReference ref){ addReference(ref); } public void addExistingReference(ObjectReference ref){ addReference(ref); } private void addReference(ObjectReference ref){ ref.ref_init(); idAdd(ref); hashCodeAdd(ref); } public void commit() { // do nothing } private void hashCodeAdd(ObjectReference ref){ if (Deploy.debug) { Object obj = ref.getObject(); if (obj != null) { ObjectReference existing = referenceForObject(obj); if (existing != null) { System.out.println("Duplicate alarm hc_Tree"); } } } if(_hashCodeTree == null){ _hashCodeTree = ref; return; } _hashCodeTree = _hashCodeTree.hc_add(ref); } private void idAdd(ObjectReference ref){ if(DTrace.enabled){ DTrace.ID_TREE_ADD.log(ref.getID()); } if (Deploy.debug) { ObjectReference existing = referenceForId(ref.getID()); if (existing != null) { System.out.println("Duplicate alarm id_Tree:" + ref.getID()); } } if(_idTree == null){ _idTree = ref; return; } _idTree = _idTree.id_add(ref); } public ObjectReference referenceForId(int id){ if(DTrace.enabled){ DTrace.GET_YAPOBJECT.log(id); } if(_idTree == null){ return null; } if(! ObjectReference.isValidId(id)){ return null; } return _idTree.id_find(id); } public ObjectReference referenceForObject(Object obj) { if(_hashCodeTree == null){ return null; } return _hashCodeTree.hc_find(obj); } public void removeReference(ObjectReference ref) { if(DTrace.enabled){ DTrace.REFERENCE_REMOVED.log(ref.getID()); } if(_hashCodeTree != null){ _hashCodeTree = _hashCodeTree.hc_remove(ref); } if(_idTree != null){ _idTree = _idTree.id_remove(ref); } } public void rollback() { // do nothing } public void traverseReferences(final Visitor4 visitor) { if(_hashCodeTree == null){ return; } _hashCodeTree.hc_traverse(visitor); } @Override public String toString() { final BooleanByRef found = new BooleanByRef(); final StringBuffer str = new StringBuffer("HashcodeReferenceSystem {"); traverseReferences(new Visitor4() { public void visit(Object obj) { if(found.value){ str.append(", "); } ObjectReference ref = (ObjectReference) obj; str.append(ref.getID()); found.value = true; } }); str.append("}"); return str.toString(); } public void discarded() { // do nothing } }