X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.jxl%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fserver%2Fjxl%2Fdao%2FJxlDaoSupport.java;h=7b4110d8e487e31428398d37ccc7791f4dca5092;hb=c5bb48d71ad5d71e389137e5fb95f96d9005a942;hp=0960b6c42ccff392b17c3c325f95d51e55d94052;hpb=a0b170f2c02850bb8e82b1b13c34a4fde9a6dcca;p=lgpl%2Fargeo-commons.git diff --git a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java index 0960b6c42..7b4110d8e 100644 --- a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java +++ b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java @@ -6,6 +6,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TreeMap; import jxl.Cell; import jxl.FormulaCell; @@ -13,17 +14,23 @@ import jxl.JXLException; import jxl.Sheet; import jxl.Workbook; +import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.server.ArgeoServerException; +import org.argeo.server.dao.LightDaoSupport; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.generic.GenericBeanFactoryAccessor; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; -public class JxlDaoSupport implements ApplicationContextAware { +public class JxlDaoSupport implements LightDaoSupport, ApplicationContextAware, + InitializingBean { private final static Log log = LogFactory.getLog(JxlDaoSupport.class); private ClassLoader classLoader = getClass().getClassLoader(); @@ -35,25 +42,45 @@ public class JxlDaoSupport implements ApplicationContextAware { private List scannedPackages = new ArrayList(); - public void load(InputStream in) { - try { - // used to resolve inner references - Map> tempRefs = new HashMap>(); + private List workbooks = new ArrayList(); - List references = new ArrayList(); + public void afterPropertiesSet() throws Exception { + init(); + } - Workbook workbook = Workbook.getWorkbook(in); + public void init() { + // used to resolve inner references + Map> tempRefs = new HashMap>(); - for (Sheet sheet : workbook.getSheets()) { - loadSheet(sheet, references, tempRefs); - } + List references = new ArrayList(); - for (Reference ref : references) { - injectReference(ref, tempRefs); + for (Resource res : workbooks) { + InputStream in = null; + try { + in = res.getInputStream(); + load(in, references, tempRefs); + } catch (Exception e) { + throw new ArgeoServerException("Cannot load stream", e); + } finally { + IOUtils.closeQuietly(in); } - if (log.isDebugEnabled()) - log.debug(references.size() + " references linked"); + } + // Inject references + for (Reference ref : references) { + injectReference(ref, tempRefs); + } + if (log.isDebugEnabled()) + log.debug(references.size() + " references linked"); + } + + public void load(InputStream in, List references, + Map> tempRefs) { + try { + Workbook workbook = Workbook.getWorkbook(in); + for (Sheet sheet : workbook.getSheets()) { + loadSheet(sheet, references, tempRefs); + } } catch (Exception e) { throw new ArgeoServerException("Cannot load workbook", e); } @@ -67,7 +94,7 @@ public class JxlDaoSupport implements ApplicationContextAware { Cell[] firstRow = sheet.getRow(0); Class clss = findClassToInstantiate(sheet); - model.put(clss, new HashMap()); + model.put(clss, new TreeMap()); tempRefs.put(sheet.getName(), new ArrayList()); @@ -108,6 +135,10 @@ public class JxlDaoSupport implements ApplicationContextAware { if (cell instanceof FormulaCell) { String formula = ((FormulaCell) cell).getFormula(); int index = formula.indexOf('!'); + if (index < 0) + throw new ArgeoServerException("Cannot interpret formula " + + formula); + ; String targetSheet = formula.substring(0, index); // assume no double letters!! String targetRowStr = formula.substring(index + 2); @@ -184,10 +215,12 @@ public class JxlDaoSupport implements ApplicationContextAware { scannedPkgs: for (String pkg : scannedPackages) { try { - clss = classLoader.loadClass(pkg + "." + className); + clss = classLoader.loadClass(pkg.trim() + "." + className); break scannedPkgs; } catch (ClassNotFoundException e) { // silent + if (log.isTraceEnabled()) + log.trace(e.getMessage()); } } @@ -203,10 +236,36 @@ public class JxlDaoSupport implements ApplicationContextAware { return (T) model.get(findClass(clss)).get(key); } + /** + * Slow. + * + * @return the first found + */ + public T getByField(Class clss, String field, Object value) { + List all = list(clss, null); + T res = null; + for (T obj : all) { + if (new BeanWrapperImpl(obj).getPropertyValue(field).equals(value)) { + res = obj; + break; + } + } + return res; + } + @SuppressWarnings("unchecked") public List list(Class clss, Object filter) { - return new ArrayList((Collection) model.get(findClass(clss)) - .values()); + List res = new ArrayList(); + + Class classToUse = findClass(clss); + if (classToUse != null) + res.addAll((Collection) model.get(classToUse).values()); + + if (applicationContext != null) + res.addAll(new GenericBeanFactoryAccessor(applicationContext) + .getBeansOfType(clss).values()); + + return res; } @SuppressWarnings("unchecked") @@ -218,8 +277,7 @@ public class JxlDaoSupport implements ApplicationContextAware { if (parent.isAssignableFrom(clss)) return clss;// return the first found } - throw new ArgeoServerException("No implementing class found for " - + parent); + return null; } public void setApplicationContext(ApplicationContext applicationContext) @@ -243,6 +301,18 @@ public class JxlDaoSupport implements ApplicationContextAware { return scannedPackages; } + public void setWorkbooks(List workbooks) { + this.workbooks = workbooks; + } + + public List getWorkbooks() { + return workbooks; + } + + public void setClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + public static class Reference { private Object object; private String property;