package edu.brown.hstore.util;
import org.apache.log4j.Logger;
import org.voltdb.VoltProcedure;
import org.voltdb.catalog.Procedure;
import edu.brown.hstore.PartitionExecutor;
import edu.brown.logging.LoggerUtil;
import edu.brown.logging.LoggerUtil.LoggerBoolean;
import edu.brown.pools.TypedPoolableObjectFactory;
/**
* Create a new instance of the corresponding VoltProcedure that is tied
* to just one PartitionExecutor for the given Procedure catalog object
*/
public class VoltProcedureFactory extends TypedPoolableObjectFactory<VoltProcedure> {
private static final Logger LOG = Logger.getLogger(VoltProcedureFactory.class);
private static final LoggerBoolean debug = new LoggerBoolean();
private static final LoggerBoolean trace = new LoggerBoolean();
static {
LoggerUtil.attachObserver(LOG, debug, trace);
}
private final PartitionExecutor executor;
private final Procedure catalog_proc;
private final boolean has_java;
private final Class<? extends VoltProcedure> proc_class;
@SuppressWarnings("unchecked")
public VoltProcedureFactory(PartitionExecutor executor, Procedure catalog_proc) {
super(executor.getHStoreConf().site.pool_profiling);
this.executor = executor;
this.catalog_proc = catalog_proc;
this.has_java = this.catalog_proc.getHasjava();
// Only try to load the Java class file for the SP if it has one
Class<? extends VoltProcedure> p_class = null;
if (catalog_proc.getHasjava()) {
final String className = catalog_proc.getClassname();
try {
p_class = (Class<? extends VoltProcedure>)Class.forName(className);
} catch (final ClassNotFoundException e) {
LOG.fatal("Failed to load procedure class '" + className + "'", e);
throw new RuntimeException(e);
}
}
this.proc_class = p_class;
}
@Override
public VoltProcedure makeObjectImpl() throws Exception {
VoltProcedure volt_proc = null;
try {
if (this.has_java) {
volt_proc = (VoltProcedure)this.proc_class.newInstance();
} else {
volt_proc = new VoltProcedure.StmtProcedure();
}
volt_proc.init(this.executor,
this.catalog_proc,
this.executor.getBackendTarget());
} catch (Exception e) {
LOG.error("Failed to created VoltProcedure instance for " + catalog_proc.getName() , e);
throw e;
}
return (volt_proc);
}
}