package com.comerica.zk.fn; import java.lang.reflect.Method; import java.util.Properties; import org.apache.log4j.Logger; import org.zkoss.poi.ss.formula.eval.ErrorEval; import org.zkoss.poi.ss.formula.eval.NumberEval; import org.zkoss.poi.ss.formula.eval.StringEval; import org.zkoss.poi.ss.formula.eval.ValueEval; import org.zkoss.xel.Function; import com.comerica.zk.COSheet; import com.comerica.zk.datasource.Datasource; import com.comerica.zk.datasource.DatasourceException; import com.comerica.zk.datasource.DatasourceProvider; public class Ds implements Function { private static final Logger LOGGER = Logger.getLogger(Ds.class); private DatasourceProvider datasourceProvider; private COSheet cosheet; public Ds(COSheet cosheet) throws DatasourceException{ datasourceProvider = instantiateDatasourceProvider(); this.cosheet = cosheet; } @Override public Object invoke(Object obj, Object... args) throws Exception { LOGGER.info("invoke(Object paramObject, Object... paramArrayOfObject)"); if (getCosheet().isCanRetrieveData()) { String dsName = (String)args[0]; try { return new NumberEval(getDs(dsName)); } catch (DatasourceException e) { return ErrorEval.VALUE_INVALID; } } else { return ErrorEval.NA; } } public double getDs(String datasourceName) throws DatasourceException { LOGGER.info("getDS has been called with datasource: " + datasourceName); Datasource datasource = datasourceProvider.getNamedDatasourceForCurrentUser(datasourceName); double total = datasource.getTotal(); return total; } private DatasourceProvider instantiateDatasourceProvider() throws DatasourceException { LOGGER.info("instantiateDatasourceProvider()"); DatasourceProvider provider = null; try{ Properties properties = new Properties(); properties.load(Ds.class.getClassLoader().getResourceAsStream("datasource.properties")); String className = properties.getProperty("provider.implementation"); provider = (DatasourceProvider) Class.forName(className).newInstance(); }catch(Exception e){ LOGGER.error("Error instantiating DatasourceProvider : " + e.toString()); throw new DatasourceException("Error instantiating DatasourceProvider", e); } return provider; } public COSheet getCosheet() { return cosheet; } public void setCosheet(COSheet cosheet) { this.cosheet = cosheet; } @Override public Class[] getParameterTypes() { LOGGER.info("getParameterTypes()"); return new Class[]{String.class}; } @Override public Class getReturnType() { return ValueEval.class; } @Override public Method toMethod() { return null; } }