/* * ome.testing.SqlPropertiesParser * * Copyright 2006 University of Dundee. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.testing; import java.io.InputStream; import java.util.Arrays; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; /** * utility to parse a properties file. See "resources/test_queries.properties" * for an explanation of the format. * * @author Josh Moore      <a * href="mailto:josh.moore@gmx.de">josh.moore@gmx.de</a> * @version 1.0 * @since 1.0 */ public abstract class SqlPropertiesParser { private static Logger log = LoggerFactory.getLogger(SqlPropertiesParser.class); static class MyPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { @Override protected void processProperties( ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException { } public String doIt(String property) { try { return parseStringValue(property, this.mergeProperties(), new HashSet()); } catch (Exception e) { throw new RuntimeException( "Error in evaluating embedded properties.", e); } } } static MyPropertyPlaceholderConfigurer prc = new MyPropertyPlaceholderConfigurer(); protected static void load(Properties props, String filename) { InputStream is = SqlPropertiesParser.class.getClassLoader() .getResourceAsStream(filename); try { props.load(is); } catch (Exception e) { throw new RuntimeException("Failed to parse properties file " + filename, e); } finally { if (null != is) { try { is.close(); } catch (Exception e) { throw new RuntimeException( "Failed to close properties file " + filename, e); } } } } /* last one wins */ public static Map parse(String[] filenames) { // Get strings from files Map result = new HashMap(); Properties props = new Properties(); for (int i = 0; i < filenames.length; i++) { load(props, filenames[i]); } // Put them into a map converting embedded ${...} prc.setProperties(props); prc.postProcessBeanFactory(null); for (Enumeration en = props.propertyNames(); en.hasMoreElements();) { String name = (String) en.nextElement(); result.put(name, prc.doIt(props.getProperty(name))); } // Do extra parsing where necessary for (Iterator it = result.keySet().iterator(); it.hasNext();) { String name = (String) it.next(); String value = (String) result.get(name); if (!value.startsWith("select")) { String[] strValues = value.split("\\s*,\\s*"); Long[] longValues = new Long[strValues.length]; for (int i = 0; i < strValues.length; i++) { longValues[i] = Long.valueOf(strValues[i]); } result.put(name, Arrays.asList(longValues)); } } return result; } }