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 }