package com.nexirius.theteam.persistence;
import com.nexirius.framework.datamodel.ArrayModel;
import com.nexirius.framework.datamodel.DataModel;
import com.nexirius.framework.datamodel.DataModelVector;
import com.nexirius.framework.datamodel.DataModelEnumeration;
import com.nexirius.framework.jdbc.DatabaseTableMapping;
import com.nexirius.framework.jdbc.JdbcConnectionHandler;
import com.nexirius.framework.application.ErrorMessageException;
import com.nexirius.theteam.datamodel.MemberModel;
import com.nexirius.theteam.datamodel.PersonModel;
import com.nexirius.theteam.datamodel.PhoneModel;
import com.nexirius.theteam.datamodel.AddressModel;
import com.nexirius.util.XString;
import com.nexirius.util.XFile;
import java.sql.SQLException;
import java.io.IOException;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.File;
public class DataBaseTeamPersistence implements ITeamPersistence {
public DataBaseTeamPersistence() {
init();
}
public static void init() {
String dbFileName = "theteam.mdb";
String dbDirName = System.getProperty("user.dir") + File.separator + "data" + File.separator;
String dbPathName = dbDirName + dbFileName;
XFile dbFile = new XFile(dbPathName);
if (!dbFile.exists()) {
InputStream stream = new BufferedInputStream(dbFile.getClass().getClassLoader().getResourceAsStream(dbFileName));
try {
new XFile(dbDirName).mkdirs();
dbFile.createFrom(stream);
} catch (IOException e) {
throw new ErrorMessageException("Cannot initialize database", e, null);
}
}
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
} catch (InstantiationException e) {
e.printStackTrace(); //TODO
} catch (IllegalAccessException e) {
e.printStackTrace(); //TODO
} catch (ClassNotFoundException e) {
e.printStackTrace(); //TODO
}
XString filename = new XString(dbPathName);
filename.replace("\\", "/");
String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + filename + ";DriverID=22;READONLY=true}";
JdbcConnectionHandler.init(new JdbcConnectionHandler(database, null, null));
DatabaseTableMapping memberMapping = new DatabaseTableMapping("MEMBER", "PK", new String[] {"personId", "type"}, new String[] {"PERSON_ID", "TYPE"});
JdbcConnectionHandler.instance().registerDatabaseTableMapping(MemberModel.class.getName(), memberMapping);
DatabaseTableMapping personMapping = new DatabaseTableMapping("PERSON", "PK", new String[] {"name", "firstname", "birthdate"}, new String[] {"NAME_", "FIRSTNAME", "BIRTHDATE"});
JdbcConnectionHandler.instance().registerDatabaseTableMapping(PersonModel.class.getName(), personMapping);
DatabaseTableMapping addressMapping = new DatabaseTableMapping("ADDRESS", "PK", new String[] {"street", "zip", "city", "state", AddressModel.FIELD_MAIN_ADDRESS}, new String[] {"STREET", "ZIP", "CITY", "STATE", "MAIN"});
addressMapping.setForeignKeyField("FK_MEMBER");
JdbcConnectionHandler.instance().registerDatabaseTableMapping(AddressModel.class.getName(), addressMapping);
DatabaseTableMapping phoneMapping = new DatabaseTableMapping("PHONE", "PK", new String[] {"description", "number"}, new String[] {"DESCRIPTION", "NUMBER_"});
phoneMapping.setForeignKeyField("FK_MEMBER");
JdbcConnectionHandler.instance().registerDatabaseTableMapping(PhoneModel.class.getName(), phoneMapping);
}
public void getAllMembers(ArrayModel members) {
DatabaseTableMapping mapping = JdbcConnectionHandler.instance().getDatabaseTableMapping(MemberModel.class.getName());
DatabaseTableMapping personMapping = JdbcConnectionHandler.instance().getDatabaseTableMapping(PersonModel.class.getName());
DatabaseTableMapping addressMapping = JdbcConnectionHandler.instance().getDatabaseTableMapping(AddressModel.class.getName());
DatabaseTableMapping phoneMapping = JdbcConnectionHandler.instance().getDatabaseTableMapping(PhoneModel.class.getName());
try {
mapping.search(null, new MemberModel(), members);
DataModelEnumeration en = members.getEnumeration();
while (en.hasMore()) {
MemberModel member = (MemberModel) en.next();
PersonModel person = member.getPerson();
person.setInstanceName(member.getPersonId());
personMapping.read(person);
addressMapping.readChildren(member.getAddresses());
phoneMapping.readChildren(member.getPhones());
}
} catch (Exception e) {
e.printStackTrace(); //TODO
}
}
public void update(DataModel model) {
DatabaseTableMapping mapping = JdbcConnectionHandler.instance().getDatabaseTableMapping(model.getClass().getName());
try {
mapping.updateIfDirty(model);
} catch (Exception e) {
e.printStackTrace(); //TODO
}
}
public void updateChildren(DataModel parent, ArrayModel children) {
if (children.getSize() > 0) {
DatabaseTableMapping mapping = JdbcConnectionHandler.instance().getDatabaseTableMapping(children.getDataModel(0).getClass().getName());
try {
mapping.updateChildrenIfDirty(children);
} catch (Exception e) {
e.printStackTrace(); //TODO
}
}
}
public void create(DataModel model) {
DatabaseTableMapping mapping = JdbcConnectionHandler.instance().getDatabaseTableMapping(model.getClass().getName());
try {
mapping.create(model);
} catch (Exception e) {
e.printStackTrace(); //TODO
}
}
public void createChildren(DataModel parent, ArrayModel children) {
if (children.getSize() > 0) {
DataModel model = children.getDataModel(0);
DatabaseTableMapping mapping = JdbcConnectionHandler.instance().getDatabaseTableMapping(model.getClass().getName());
try {
mapping.createChildren(children);
} catch (Exception e) {
e.printStackTrace(); //TODO
}
}
}
public void delete(DataModelVector v) {
DataModelEnumeration en = v.getEnumeration();
while (en.hasMore()) {
DataModel model = en.next();
DatabaseTableMapping mapping = JdbcConnectionHandler.instance().getDatabaseTableMapping(model.getClass().getName());
try {
mapping.delete(model);
} catch (Exception e) {
e.printStackTrace(); //TODO
}
}
}
public void deleteMember(MemberModel member) {
deleteModel(member.getPerson());
delete(member.getAddresses().getChildren());
delete(member.getPhones().getChildren());
deleteModel(member);
}
private void deleteModel(DataModel model) {
DatabaseTableMapping mapping = JdbcConnectionHandler.instance().getDatabaseTableMapping(model.getClass().getName());
try {
mapping.delete(model);
} catch (Exception e) {
e.printStackTrace(); //TODO
}
}
}