From e20d45697c937fbb8ae3eb3b43bffb43e211237f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20K=C3=BChne?= Date: Sun, 6 Oct 2002 13:14:16 +0000 Subject: [PATCH] finally managed to tell beanutils what I want, checks now have their 'natural' api --- .../tools/checkstyle/CheckConfiguration.java | 100 ++++++++++++++++-- .../tools/checkstyle/ConfigurationLoader.java | 1 + .../checkstyle/checks/FileLengthCheck.java | 16 +-- .../tools/checkstyle/checks/HeaderCheck.java | 30 +++--- 4 files changed, 107 insertions(+), 40 deletions(-) diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/CheckConfiguration.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/CheckConfiguration.java index 21e096b34..fd74e22d0 100644 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/CheckConfiguration.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/CheckConfiguration.java @@ -18,17 +18,34 @@ //////////////////////////////////////////////////////////////////////////////// package com.puppycrawl.tools.checkstyle; -import com.puppycrawl.tools.checkstyle.api.Check; - -import java.util.Set; -import java.util.HashSet; -import java.util.Map; -import java.util.HashMap; -import java.util.StringTokenizer; -import java.util.Iterator; import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; -import org.apache.commons.beanutils.PropertyUtils; +import com.puppycrawl.tools.checkstyle.api.Check; +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.beanutils.ConvertUtils; +import org.apache.commons.beanutils.converters.BooleanConverter; +import org.apache.commons.beanutils.converters.BooleanArrayConverter; +import org.apache.commons.beanutils.converters.ByteConverter; +import org.apache.commons.beanutils.converters.ByteArrayConverter; +import org.apache.commons.beanutils.converters.CharacterConverter; +import org.apache.commons.beanutils.converters.CharacterArrayConverter; +import org.apache.commons.beanutils.converters.DoubleConverter; +import org.apache.commons.beanutils.converters.DoubleArrayConverter; +import org.apache.commons.beanutils.converters.FloatConverter; +import org.apache.commons.beanutils.converters.FloatArrayConverter; +import org.apache.commons.beanutils.converters.IntegerConverter; +import org.apache.commons.beanutils.converters.IntegerArrayConverter; +import org.apache.commons.beanutils.converters.LongConverter; +import org.apache.commons.beanutils.converters.LongArrayConverter; +import org.apache.commons.beanutils.converters.ShortConverter; +import org.apache.commons.beanutils.converters.ShortArrayConverter; +import org.apache.commons.beanutils.converters.StringArrayConverter; /** * Represents the configuration for a check. @@ -38,6 +55,69 @@ import org.apache.commons.beanutils.PropertyUtils; */ class CheckConfiguration { + static + { + initConverters(); + } + + /** + * Setup the jakarta-commons-beanutils type converters so they throw + * a ConversionException instead of using the default value. + */ + private static void initConverters() + { + // TODO: is there a smarter way to tell beanutils not to use defaults? + + boolean booleanArray[] = new boolean[0]; + byte byteArray[] = new byte[0]; + char charArray[] = new char[0]; + double doubleArray[] = new double[0]; + float floatArray[] = new float[0]; + int intArray[] = new int[0]; + long longArray[] = new long[0]; + short shortArray[] = new short[0]; + + ConvertUtils.register(new BooleanConverter(), Boolean.TYPE); + ConvertUtils.register(new BooleanConverter(), Boolean.class); + ConvertUtils.register(new BooleanArrayConverter(), + booleanArray.getClass()); + ConvertUtils.register(new ByteConverter(), Byte.TYPE); + ConvertUtils.register(new ByteConverter(), Byte.class); + ConvertUtils.register(new ByteArrayConverter(byteArray), + byteArray.getClass()); + ConvertUtils.register(new CharacterConverter(), Character.TYPE); + ConvertUtils.register(new CharacterConverter(), Character.class); + ConvertUtils.register(new CharacterArrayConverter(), + charArray.getClass()); + ConvertUtils.register(new DoubleConverter(), Double.TYPE); + ConvertUtils.register(new DoubleConverter(), Double.class); + ConvertUtils.register(new DoubleArrayConverter(doubleArray), + doubleArray.getClass()); + ConvertUtils.register(new FloatConverter(), Float.TYPE); + ConvertUtils.register(new FloatConverter(), Float.class); + ConvertUtils.register(new FloatArrayConverter(), + floatArray.getClass()); + ConvertUtils.register(new IntegerConverter(), Integer.TYPE); + ConvertUtils.register(new IntegerConverter(), Integer.class); + ConvertUtils.register(new IntegerArrayConverter(), + intArray.getClass()); + ConvertUtils.register(new LongConverter(), Long.TYPE); + ConvertUtils.register(new LongConverter(), Long.class); + ConvertUtils.register(new LongArrayConverter(), longArray.getClass()); + ConvertUtils.register(new ShortConverter(), Short.TYPE); + ConvertUtils.register(new ShortConverter(), Short.class); + ConvertUtils.register(new ShortArrayConverter(), + shortArray.getClass()); + ConvertUtils.register(new StringArrayConverter(), + String[].class ); + ConvertUtils.register(new IntegerArrayConverter(), + Integer[].class ); + + // BigDecimal, BigInteger, Class, Date, String, Time, TimeStamp + // do not use defaults in the default configuration of ConvertUtils + + } + /** the classname for the check */ private String mClassname; /** the tokens the check is interested in */ @@ -116,7 +196,7 @@ class CheckConfiguration while (keyIt.hasNext()) { final String key = (String) keyIt.next(); final String value = (String) mProperties.get(key); - PropertyUtils.setSimpleProperty(check, key, value); + BeanUtils.copyProperty(check, key, value); } return check; } diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java index 3c5abe949..53ae7432c 100644 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.util.ArrayList; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; + import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/FileLengthCheck.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/FileLengthCheck.java index a61edd12c..81b46037b 100644 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/FileLengthCheck.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/FileLengthCheck.java @@ -20,9 +20,6 @@ package com.puppycrawl.tools.checkstyle.checks; import com.puppycrawl.tools.checkstyle.api.Check; -import org.apache.commons.beanutils.ConversionException; - -// TODO: tests! /** * Checks for long source files. @@ -60,18 +57,9 @@ public class FileLengthCheck extends Check /** * @param aLength the maximum length of a Java source file */ - // TODO: Should be an int argument. - // It seems like I don't know how to use beanutils, I thought - // that parsing this stuff is the core job of beanutils - public void setMax(String aLength) + public void setMax(int aLength) { - try { - mMaxFileLength = Integer.parseInt(aLength); - } - catch (NumberFormatException ex) { - throw new ConversionException("Can't parse '" - + aLength + "' as maximal file length", ex); - } + mMaxFileLength = aLength; } } diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/HeaderCheck.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/HeaderCheck.java index df466d2e4..4a2dc0bb2 100644 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/HeaderCheck.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/checks/HeaderCheck.java @@ -23,8 +23,7 @@ import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; import java.util.ArrayList; -import java.util.StringTokenizer; -import java.util.TreeSet; +import java.util.Arrays; import com.puppycrawl.tools.checkstyle.api.Check; import org.apache.commons.beanutils.ConversionException; @@ -41,11 +40,13 @@ import org.apache.commons.beanutils.ConversionException; */ public class HeaderCheck extends Check { + private static int[] EMPTY_INT_ARRAY = new int[0]; + /** the lines of the header file */ private String[] mHeaderLines = null; - /** the header lines to ignore in the check */ - private TreeSet mIgnoreLines = new TreeSet(); + /** the header lines to ignore in the check, sorted */ + private int[] mIgnoreLines = EMPTY_INT_ARRAY; /** @see com.puppycrawl.tools.checkstyle.api.Check */ public int[] getDefaultTokens() @@ -85,14 +86,13 @@ public class HeaderCheck extends Check */ private boolean isIgnoreLine(int aLineNo) { - return mIgnoreLines.contains(new Integer(aLineNo)); + return (Arrays.binarySearch(mIgnoreLines, aLineNo) >= 0); } /** * Checks if a code line matches the required header line. * @param lineNumber the linenumber to check against the header * @return true if and only if the line matches the required header line - * TODO: override this in RegexpHeaderCheck */ protected boolean isMatch(int lineNumber) { @@ -136,19 +136,17 @@ public class HeaderCheck extends Check /** * Set the lines numbers to ignore in the header check. * @param aList comma separated list of line numbers to ignore in header. - * TODO: This should really be of type int[] - * and beanutils should do the parsing for us! */ - public void setIgnoreLines(String aList) + public void setIgnoreLines(int[] aList) { - mIgnoreLines.clear(); - if (aList != null) { - final StringTokenizer tokens = new StringTokenizer(aList, ","); - while (tokens.hasMoreTokens()) { - final String ignoreLine = tokens.nextToken(); - mIgnoreLines.add(new Integer(ignoreLine)); - } + if (aList == null || aList.length == 0) { + mIgnoreLines = EMPTY_INT_ARRAY; + return; } + + mIgnoreLines = new int[aList.length]; + System.arraycopy(aList, 0, mIgnoreLines, 0, aList.length); + Arrays.sort(mIgnoreLines); } protected String[] getHeaderLines()