SampleDatabase.java [plain text]
package collections.ship.sentity;
import java.io.File;
import java.io.FileNotFoundException;
import com.sleepycat.bind.serial.ClassCatalog;
import com.sleepycat.bind.serial.StoredClassCatalog;
import com.sleepycat.bind.serial.TupleSerialKeyCreator;
import com.sleepycat.bind.tuple.TupleInput;
import com.sleepycat.bind.tuple.TupleOutput;
import com.sleepycat.db.Database;
import com.sleepycat.db.DatabaseConfig;
import com.sleepycat.db.DatabaseException;
import com.sleepycat.db.DatabaseType;
import com.sleepycat.db.Environment;
import com.sleepycat.db.EnvironmentConfig;
import com.sleepycat.db.ForeignKeyDeleteAction;
import com.sleepycat.db.SecondaryConfig;
import com.sleepycat.db.SecondaryDatabase;
public class SampleDatabase {
private static final String CLASS_CATALOG = "java_class_catalog";
private static final String SUPPLIER_STORE = "supplier_store";
private static final String PART_STORE = "part_store";
private static final String SHIPMENT_STORE = "shipment_store";
private static final String SHIPMENT_PART_INDEX = "shipment_part_index";
private static final String SHIPMENT_SUPPLIER_INDEX =
"shipment_supplier_index";
private static final String SUPPLIER_CITY_INDEX = "supplier_city_index";
private Environment env;
private Database partDb;
private Database supplierDb;
private Database shipmentDb;
private SecondaryDatabase supplierByCityDb;
private SecondaryDatabase shipmentByPartDb;
private SecondaryDatabase shipmentBySupplierDb;
private StoredClassCatalog javaCatalog;
public SampleDatabase(String homeDirectory)
throws DatabaseException, FileNotFoundException {
System.out.println("Opening environment in: " + homeDirectory);
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setTransactional(true);
envConfig.setAllowCreate(true);
envConfig.setInitializeCache(true);
envConfig.setInitializeLocking(true);
env = new Environment(new File(homeDirectory), envConfig);
DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setTransactional(true);
dbConfig.setAllowCreate(true);
dbConfig.setType(DatabaseType.BTREE);
Database catalogDb = env.openDatabase(null, CLASS_CATALOG, null,
dbConfig);
javaCatalog = new StoredClassCatalog(catalogDb);
partDb = env.openDatabase(null, PART_STORE, null, dbConfig);
supplierDb = env.openDatabase(null, SUPPLIER_STORE, null, dbConfig);
shipmentDb = env.openDatabase(null, SHIPMENT_STORE, null, dbConfig);
SecondaryConfig secConfig = new SecondaryConfig();
secConfig.setTransactional(true);
secConfig.setAllowCreate(true);
secConfig.setType(DatabaseType.BTREE);
secConfig.setSortedDuplicates(true);
secConfig.setKeyCreator(new SupplierByCityKeyCreator(javaCatalog,
Supplier.class));
supplierByCityDb = env.openSecondaryDatabase(null, SUPPLIER_CITY_INDEX,
null, supplierDb,
secConfig);
secConfig.setForeignKeyDatabase(partDb);
secConfig.setForeignKeyDeleteAction(ForeignKeyDeleteAction.CASCADE);
secConfig.setKeyCreator(new ShipmentByPartKeyCreator(javaCatalog,
Shipment.class));
shipmentByPartDb = env.openSecondaryDatabase(null, SHIPMENT_PART_INDEX,
null, shipmentDb,
secConfig);
secConfig.setForeignKeyDatabase(supplierDb);
secConfig.setForeignKeyDeleteAction(ForeignKeyDeleteAction.CASCADE);
secConfig.setKeyCreator(new ShipmentBySupplierKeyCreator(javaCatalog,
Shipment.class));
shipmentBySupplierDb = env.openSecondaryDatabase(null,
SHIPMENT_SUPPLIER_INDEX,
null, shipmentDb,
secConfig);
}
public final Environment getEnvironment() {
return env;
}
public final StoredClassCatalog getClassCatalog() {
return javaCatalog;
}
public final Database getPartDatabase() {
return partDb;
}
public final Database getSupplierDatabase() {
return supplierDb;
}
public final Database getShipmentDatabase() {
return shipmentDb;
}
public final SecondaryDatabase getShipmentByPartDatabase() {
return shipmentByPartDb;
}
public final SecondaryDatabase getShipmentBySupplierDatabase() {
return shipmentBySupplierDb;
}
public final SecondaryDatabase getSupplierByCityDatabase() {
return supplierByCityDb;
}
public void close()
throws DatabaseException {
supplierByCityDb.close();
shipmentByPartDb.close();
shipmentBySupplierDb.close();
partDb.close();
supplierDb.close();
shipmentDb.close();
javaCatalog.close();
env.close();
}
private static class SupplierByCityKeyCreator
extends TupleSerialKeyCreator {
private SupplierByCityKeyCreator(ClassCatalog catalog,
Class valueClass) {
super(catalog, valueClass);
}
public boolean createSecondaryKey(TupleInput primaryKeyInput,
Object valueInput,
TupleOutput indexKeyOutput) {
Supplier supplier = (Supplier) valueInput;
String city = supplier.getCity();
if (city != null) {
indexKeyOutput.writeString(supplier.getCity());
return true;
} else {
return false;
}
}
}
private static class ShipmentByPartKeyCreator
extends TupleSerialKeyCreator {
private ShipmentByPartKeyCreator(ClassCatalog catalog,
Class valueClass) {
super(catalog, valueClass);
}
public boolean createSecondaryKey(TupleInput primaryKeyInput,
Object valueInput,
TupleOutput indexKeyOutput) {
String partNumber = primaryKeyInput.readString();
indexKeyOutput.writeString(partNumber);
return true;
}
}
private static class ShipmentBySupplierKeyCreator
extends TupleSerialKeyCreator {
private ShipmentBySupplierKeyCreator(ClassCatalog catalog,
Class valueClass) {
super(catalog, valueClass);
}
public boolean createSecondaryKey(TupleInput primaryKeyInput,
Object valueInput,
TupleOutput indexKeyOutput) {
primaryKeyInput.readString(); String supplierNumber = primaryKeyInput.readString();
indexKeyOutput.writeString(supplierNumber);
return true;
}
}
}