1 package org.sourceforge.jemm.database.persistent.berkeley; 2 3 import java.util.Iterator; 4 5 import com.sleepycat.je.DatabaseException; 6 import com.sleepycat.persist.EntityStore; 7 import com.sleepycat.persist.PrimaryIndex; 8 9 import org.sourceforge.jemm.database.components.StorageEngineException; 10 import org.sourceforge.jemm.database.components.se.StorageEngineObjectIF; 11 import org.sourceforge.jemm.database.components.types.StoredObject; 12 import org.sourceforge.jemm.database.persistent.berkeley.objects.BDbStoredData; 13 import org.sourceforge.jemm.types.ID; 14 15 public class BDbStorageEngineObjectImpl implements StorageEngineObjectIF { 16 public static final String ID_KEY = "object"; 17 18 private final PrimaryIndex<Long, BDbStoredData> pIdx; 19 private final IDManager idManager; 20 21 public BDbStorageEngineObjectImpl(EntityStore store, IDManager idManager) { 22 try { 23 pIdx = store.getPrimaryIndex(Long.class, BDbStoredData.class); 24 this.idManager = idManager; 25 } catch (DatabaseException de) { 26 throw new StorageEngineException("Error intitalising index on StoredObject storage",de); 27 } 28 } 29 30 @Override 31 public boolean checkObjectExists(ID objectId) { 32 try { 33 return pIdx.contains(objectId.getIDValue()); 34 } catch (DatabaseException de) { 35 throw new StorageEngineException("Internal error calling checkObjectExists(" + objectId + ")",de); 36 } 37 } 38 39 @Override 40 public int count() { 41 try { 42 return (int) pIdx.count(); 43 } catch (DatabaseException de) { 44 throw new StorageEngineException("Internal error calling count()",de); 45 } 46 } 47 @Override 48 public ID generateId() { 49 return idManager.getNextId(); 50 } 51 52 53 @Override 54 public StoredObject getObject(ID id) { 55 try { 56 BDbStoredData so = pIdx.get(id.getIDValue()); 57 return so.convert(); 58 } catch (DatabaseException de) { 59 throw new StorageEngineException("Internal error calling getObject(" + id + ")",de); 60 } 61 } 62 63 @Override 64 public Iterator<ID> idIterator() { 65 try { 66 return new EnityCursorIterator<Long, ID>(pIdx.keys()) { 67 @Override 68 protected ID convert(Long internalValue) { 69 return new ID(internalValue); 70 } 71 72 }; 73 } catch (DatabaseException de) { 74 throw new StorageEngineException("error whilst calling idIterator()",de); 75 } 76 } 77 78 @Override 79 public void removeObject(ID id) { 80 try { 81 pIdx.delete(id.getIDValue()); 82 } catch (DatabaseException de) { 83 throw new StorageEngineException("Internal error calling removeObject(" + id + ")",de); 84 } 85 } 86 87 88 @Override 89 public void save(StoredObject so) { 90 91 BDbStoredData sd = new BDbStoredData(so.getObjectId().getIDValue(),so); 92 93 try { 94 pIdx.putNoReturn(sd); 95 } catch (DatabaseException de) { 96 throw new StorageEngineException("Internal error calling save on id " + so.getObjectId(),de); 97 } 98 } 99 100 @Override 101 public void updateObject(StoredObject so) { 102 save(so); 103 } 104 }