/**
* Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com
* Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
*/
package org.ralasafe.db.impl;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.ralasafe.EntityExistException;
import org.ralasafe.db.ComplexTable;
import org.ralasafe.db.ComplexTableDBHelper;
import org.ralasafe.db.ComplexTableSaver;
import org.ralasafe.db.DBLevelException;
import org.ralasafe.db.MultiValueTableAdapter;
import org.ralasafe.db.SingleValueTableAdapter;
import org.ralasafe.db.Table;
import org.ralasafe.util.Util;
public class ComplexTableSaverImpl implements ComplexTableSaver {
private ComplexTable complexTable;
private SingleValueTableAdapter[] singleValueAdapters;
private MultiValueTableAdapter[] multiValueAdapters;
private TableSaverImpl mainTableSaver;
private TableSaverImpl[] singleValueTableSavers;
private TableSaverImpl[] multiValueTableSavers;
private static Log logger=LogFactory.getLog( ComplexTableSaverImpl.class );
public ComplexTable getComplexTable() {
return complexTable;
}
public void setComplexTable( ComplexTable complexTable ) {
this.complexTable=complexTable;
Table mainTable=complexTable.getMainTable();
mainTableSaver=new TableSaverImpl();
mainTableSaver.setTable( mainTable );
Table[] singleValueTables=complexTable.getSingleValueTables();
singleValueTableSavers=getTableSavers( singleValueTables );
Table[] multiValueTables=complexTable.getMultiValueTables();
multiValueTableSavers=getTableSavers( multiValueTables );
}
public SingleValueTableAdapter[] getSingleValueAdapters() {
return singleValueAdapters;
}
public void setSingleValueAdapters( SingleValueTableAdapter[] singleValueAdapters ) {
this.singleValueAdapters=singleValueAdapters;
}
public MultiValueTableAdapter[] getMultiValueAdapters() {
return multiValueAdapters;
}
public void setMultiValueAdapters( MultiValueTableAdapter[] multiValueAdapters ) {
this.multiValueAdapters=multiValueAdapters;
}
private TableSaverImpl[] getTableSavers( Table[] tables ) {
TableSaverImpl[] savers=null;
if( tables!=null ) {
savers=new TableSaverImpl[tables.length];
for( int i=0; i<tables.length; i++ ) {
TableSaverImpl impl=new TableSaverImpl();
impl.setTable( tables[i] );
savers[i]=impl;
}
}
return savers;
}
public void save( Object o ) throws DBLevelException, EntityExistException {
ComplexTableDBHelper helper=new ComplexTableDBHelper();
helper.setComplexTable( complexTable );
try {
//get connections
helper.getConnections();
helper.beginTransaction();
mainTableSaver.save( helper.getMainTableConn(), o );
saveSingleValues( helper.getSingleValueTableConns(), singleValueTableSavers, o );
saveMultiValues( helper.getMultiValueTableConns(), multiValueTableSavers, o );
helper.commit();
} catch( DBLevelException e ) {
try {
helper.rollback();
} catch( SQLException sqle ) {
logger.error( "", sqle );
throw new DBLevelException( sqle );
}
throw e;
} catch( EntityExistException e ) {
try {
helper.rollback();
} catch( SQLException sqle ) {
logger.error( "", sqle );
throw new DBLevelException( sqle );
}
throw e;
} catch( SQLException e ) {
logger.error( "", e );
try {
helper.rollback();
} catch( SQLException sqle ) {
logger.error( "", sqle );
throw new DBLevelException( sqle );
}
throw new DBLevelException( e );
} finally {
helper.closeConnections();
}
}
private void saveMultiValues( Connection[] conns,
TableSaverImpl[] savers, Object o ) {
if( Util.isEmpty( savers ) )
return;
for( int i=0; i<savers.length; i++ ) {
MultiValueTableAdapter adapter=multiValueAdapters[i];
Object[] extractValues=adapter.extract( o );
savers[i].batchSave( conns[i], extractValues );
}
}
private void saveSingleValues( Connection[] conns,
TableSaverImpl[] savers, Object o ) throws DBLevelException, EntityExistException {
if( Util.isEmpty( savers ) )
return;
for( int i=0; i<savers.length; i++ ) {
Object extractValue=singleValueAdapters[i].extract( o );
savers[i].save( conns[i], extractValue );
}
}
}