Author: sletellier Date: 2011-11-18 12:25:39 +0100 (Fri, 18 Nov 2011) New Revision: 2228 Url: http://nuiton.org/repositories/revision/nuiton-utils/2228 Log: - #1811 add methods to escape CSV data Modified: trunk/nuiton-utils/src/main/java/org/nuiton/util/ApplicationConfig.java trunk/nuiton-utils/src/main/java/org/nuiton/util/StringUtil.java Modified: trunk/nuiton-utils/src/main/java/org/nuiton/util/ApplicationConfig.java =================================================================== --- trunk/nuiton-utils/src/main/java/org/nuiton/util/ApplicationConfig.java 2011-11-15 11:08:33 UTC (rev 2227) +++ trunk/nuiton-utils/src/main/java/org/nuiton/util/ApplicationConfig.java 2011-11-18 11:25:39 UTC (rev 2228) @@ -499,6 +499,18 @@ } /** + * Load all default options of enum pass in param (enum must extend {@link OptionDef}) + * + * @param optionClasses to load + * @param <O> type of enum extend {@link OptionDef} + */ + public <O extends OptionDef> void loadAllDefaultOptions(Class<O>[] optionClasses) { + for (Class<O> optionClass : optionClasses) { + loadDefaultOptions(optionClass); + } + } + + /** * Load default options of enum pass in param (enum must extend {@link OptionDef}) * * @param optionClass to load @@ -515,6 +527,18 @@ } /** + * Load all actions of enum pass in param (enum must extend {@link ActionDef}) + * + * @param actionClasses to load + * @param <A> type of enum extend {@link ActionDef} + */ + public <A extends ActionDef> void loadAllActions(Class<A>[] actionClasses) { + for (Class<A> optionClass : actionClasses) { + loadActions(optionClass); + } + } + + /** * Load actions of enum pass in param (enum must extend {@link ActionDef}) * * @param actionClass to load Modified: trunk/nuiton-utils/src/main/java/org/nuiton/util/StringUtil.java =================================================================== --- trunk/nuiton-utils/src/main/java/org/nuiton/util/StringUtil.java 2011-11-15 11:08:33 UTC (rev 2227) +++ trunk/nuiton-utils/src/main/java/org/nuiton/util/StringUtil.java 2011-11-18 11:25:39 UTC (rev 2228) @@ -83,6 +83,30 @@ } /** + * Add cotes if needed to escape special csv chars (',', '\n', '\t', ',', ';') + * + * @param value to escape + * @param csvSeparator separator used for csv + * @return escaped if needed value + */ + public static String escapeCsvValue(String value, String csvSeparator) { + + boolean valueNeedQuotes = + value.contains("\n") + || value.contains("\t") + || value.contains(",") + || value.contains(";") + || value.contains(csvSeparator); + + if (valueNeedQuotes) { + // escape '"' char to prevent + value = value.replaceAll("\"", "\"\""); + value = "\"" + value + "\""; + } + return value; + } + + /** * Contract to use in {@link StringUtil#join(Iterable , ToString, String, boolean) } * method. This will provide a toString method to convert an object in a * string. @@ -101,6 +125,39 @@ } /** + * Used to build csv file using {@link StringUtil#join(Iterable , ToString, String, boolean) } + * method. This will provide a toString method to convert an object in a + * string and escape csv values if needed. + * + * @param <O> type of object manipulated + */ + public static class ToCSV<O> implements StringUtil.ToString<O> { + + protected String csvSeparator; + + public ToCSV(String csvSeparator) { + this.csvSeparator = csvSeparator; + } + + @Override + public String toString(O o) { + String value = getStringValue(o); + return escapeCsvValue(value, csvSeparator); + } + + /** + * Use {@link Object#toString()} method by default + * Must be {@link @Override} to use other methods to get string value. + * + * @param o to convert + * @return String value + */ + public String getStringValue(O o) { + return o.toString(); + } + } + + /** * Used to concat an {@code iterable} of Object separated * by {@code separator} using the toString() method of each object. * You can specify if the string must be trimmed or not.