Source code for Phonebook.java
package PhoneApp.Data;
import com.odi.*;
import com.odi.util.*;
import com.odi.util.query.*;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;
import java.util.Collection;
public class Phonebook extends DataObject {
public Phonebook() {
session = Session.create(null, null);
session.join();
try {
db = Database.open(database, ObjectStore.UPDATE);
} catch (DatabaseNotFoundException e) {
db=Database.create(database, ObjectStore.ALL_READ | ObjectStore.ALL_WRITE);
}
Transaction t = Transaction.begin(ObjectStore.UPDATE);
try {
entries = (OSHashMap) db.getRoot("entries");
} catch (DatabaseRootNotFoundException e) {
db.createRoot("entries", entries = new OSHashMap());
}
t.commit(ObjectStore.RETAIN_READONLY);
}
public void close() {
db.close();
session.terminate();
}
public void addEntry(String firstName, String lastName, String phoneNumber,
String street, int streetNumber, String apartmentNumber,
String postalCode) {
PhonebookEntry entry = new PhonebookEntry(
firstName, lastName, phoneNumber,
street, streetNumber, apartmentNumber, postalCode
);
if ( entry.isValid() ) {
Transaction t = Transaction.begin(ObjectStore.UPDATE);
if (entries.get(phoneNumber) != null) {
t.abort(ObjectStore.RETAIN_READONLY);
System.out.println("Entry already exists.");
} else {
System.out.println("Added " + entry.toString());
entries.put(phoneNumber, entry);
t.commit(ObjectStore.RETAIN_READONLY);
}
} else {
debug("Phonebook::addEntry()","Invalid entry");
debug("Phonebook::addEntry()",entry.toString());
}
}
public boolean deleteEntry(String key) {
boolean success = true;
Transaction t = Transaction.begin(ObjectStore.UPDATE);
PhonebookEntry entry = (PhonebookEntry) entries.get(key);
if ( entry == null ) {
System.out.println("Unable to find data associated with " + key);
success = false;
} else {
entries.remove(key);
ObjectStore.destroy(entry);
}
t.commit(ObjectStore.RETAIN_HOLLOW);
return success;
}
public boolean updateEntry(String key, String fieldName, String fieldValue) {
boolean success = true;
Transaction t = Transaction.begin(ObjectStore.UPDATE);
PhonebookEntry entry = (PhonebookEntry) entries.get(key);
if ( entry == null ) {
System.out.println("Unable to find data associated with " + key);
success = false;
} else {
if ( fieldName.equals("firstName") ) { entry.setFirstName(fieldValue); }
else if ( fieldName.equals("lastName") ) { entry.setLastName(fieldValue); }
else if ( fieldName.equals("street") ) { entry.setStreet(fieldValue); }
else if ( fieldName.equals("phoneNumber") ) { entry.setPhoneNumber(fieldValue); }
else if ( fieldName.equals("apartmentNumber") ) { entry.setApartmentNumber(fieldValue); }
else if ( fieldName.equals("postalCode") ) { entry.setPostalCode(fieldValue); }
}
t.commit(ObjectStore.RETAIN_HOLLOW);
return success;
}
public String[] queryEntries(String fieldName, String fieldValue) {
String[] results;
if ( fieldName.length() > 0 && fieldValue.length() > 0 && fieldExists(fieldName) ) {
FreeVariables dynamicVariables = new FreeVariables();
dynamicVariables.put("fieldValue", String.class);
Query query = new Query(PhonebookEntry.class, fieldName + " == fieldValue", dynamicVariables);
FreeVariableBindings binding = new FreeVariableBindings();
binding.put("fieldValue", fieldValue);
Transaction t = Transaction.begin(ObjectStore.UPDATE);
Collection queryResults = query.select( entries.values(), binding);
results = new String[queryResults.size()];
Iterator resultIterator = queryResults.iterator();
int count = 0;
while(resultIterator.hasNext()) {
results[count] = ((PhonebookEntry)resultIterator.next()).toString();
count++;
}
t.commit(ObjectStore.RETAIN_READONLY);
} else {
System.out.println("Invalid input. fieldName and fieldValue must exist and be properly formed.");
results = new String[1];
}
return results;
}
public String[] getEntryReport(int reportType) {
String results[];
if ( (reportType != KEY_REPORT) && (reportType != DETAILED_REPORT) ) {
System.out.println("Error: Unable to identify requested type of report (" + reportType + ").");
results = new String[1];
return results;
}
Transaction t = Transaction.begin(ObjectStore.UPDATE);
Set keys = entries.keySet();
results = new String[keys.size()];
Iterator keyIterator = keys.iterator();
int count = 0;
while(keyIterator.hasNext()) {
if ( reportType == DETAILED_REPORT ) {
PhonebookEntry entry = (PhonebookEntry)entries.get(keyIterator.next());
results[count] = entry.toString();
} else if ( reportType == KEY_REPORT ) {
results[count] = (String)keyIterator.next();
}
count++;
}
t.commit(ObjectStore.RETAIN_HOLLOW);
return results;
}
public String[] getQueryableFields() {
return queryFields;
}
public boolean fieldExists(String fieldName) {
boolean fieldExists = false;
for (int i=0; i< queryFields.length; i++) {
if ( fieldName.equals(queryFields[i]) ){
fieldExists = true;
break;
}
}
return fieldExists;
}
Session session = null;
Database db = null;
String database = "phones.odb";
OSHashMap entries = null;
public static final int KEY_REPORT = 1;
public static final int DETAILED_REPORT = 2;
private String[] queryFields = {
"firstName", "lastName", "phoneNumber",
"street", "apartmentNumber", "postalCode"
};
}