package pt.ist.fenixframework.pstm.ojb;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ojb.broker.Identity;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.broker.PersistenceBrokerException;
import org.apache.ojb.broker.PersistenceBrokerSQLException;
import org.apache.ojb.broker.accesslayer.JdbcAccessImpl;
import org.apache.ojb.broker.metadata.ClassDescriptor;
import org.apache.ojb.broker.util.logging.Logger;
import pt.ist.fenixframework.pstm.AbstractDomainObject;
import pt.ist.fenixframework.pstm.Transaction;
public class FenixJdbcAccessImpl extends JdbcAccessImpl {
public FenixJdbcAccessImpl(PersistenceBroker broker) {
super(broker);
}
// copied and adapted from the superclass
public Object materializeObject(ClassDescriptor cld, Identity oid) throws PersistenceBrokerException {
ResultSet rs = null;
PreparedStatement stmt = null;
try
{
stmt = broker.serviceStatementManager().getSelectByPKStatement(cld);
if (stmt == null)
{
if (logger.isEnabledFor(Logger.ERROR)) {
logger.error("getSelectByPKStatement returned a null statement");
}
throw new PersistenceBrokerException("getSelectByPKStatement returned a null statement");
}
broker.serviceStatementManager().bindSelect(stmt, oid, cld);
rs = stmt.executeQuery();
// data available read object, else return null
if (rs.next())
{
AbstractDomainObject materializedObject = readObjectFromRs(rs);
if (materializedObject != null) {
return materializedObject;
}
// If we got here, then it's because it is not a
// domain object, but an OJB specific object. So,
// fallback to the OJB's default loading mechanism
java.util.Map row = new java.util.HashMap();
cld.getRowReader().readObjectArrayFrom(rs, row);
return cld.getRowReader().readObjectFrom(row);
}
else
{
return null;
}
}
catch (PersistenceBrokerException e)
{
if (logger.isEnabledFor(Logger.ERROR)) {
logger.error(
"PersistenceBrokerException during the execution of materializeObject: "
+ e.getMessage(),
e);
}
throw e;
}
catch (SQLException e)
{
if (logger.isEnabledFor(Logger.ERROR)) {
logger.error(
"SQLException during the execution of materializeObject (for a "
+ cld.getClassOfObject().getName()
+ "): "
+ e.getMessage(),
e);
}
throw new PersistenceBrokerSQLException(e);
}
finally
{
broker.serviceStatementManager().closeResources(stmt, rs);
}
}
public static AbstractDomainObject readObjectFromRs(ResultSet rs) {
// this method tries to load the object from its OID
// see whether the OID column in the resultSet is already filled
try {
long objectOid = rs.getLong("OID");
if (objectOid != 0) {
// if it is, then we may get the object by its OID and skip all the old stuff
AbstractDomainObject materializedObject = AbstractDomainObject.fromOID(objectOid);
materializedObject.readFromResultSet(rs);
return materializedObject;
}
} catch (SQLException sqle) {
// we may have an SQLException if, for example, there is no OID column
// in that case, simply ignore this and continue with the old code
sqle.printStackTrace();
}
// null means that something failed
return null;
}
}