You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2024/09/12 12:28:14 UTC

(commons-beanutils) branch master updated: Do not implement Serializable

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-beanutils.git


The following commit(s) were added to refs/heads/master by this push:
     new 0a09d54a Do not implement Serializable
0a09d54a is described below

commit 0a09d54a64e1f5d607f62051ed303dd3e8ce2387
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Sep 12 08:28:08 2024 -0400

    Do not implement Serializable
---
 .../apache/commons/beanutils2/DynaProperty.java    | 107 ---------------------
 .../commons/beanutils2/BeanComparatorTestCase.java |   2 +-
 .../commons/beanutils2/LazyDynaListTestCase.java   |  43 ++-------
 .../commons/beanutils2/PropertyUtilsTestCase.java  |  28 +++---
 .../commons/beanutils2/WrapDynaBeanTestCase.java   |   7 +-
 .../commons/beanutils2/bugs/Jira273TestCase.java   |  12 +--
 .../commons/beanutils2/bugs/Jira298TestCase.java   |   2 +-
 .../expression/DefaultResolverTestCase.java        |   4 +-
 .../beanutils2/sql/DynaResultSetTestCase.java      |   2 +-
 .../commons/beanutils2/sql/TestResultSet.java      |  67 ++++++-------
 .../beanutils2/sql/TestResultSetMetaData.java      |  54 +++++++----
 11 files changed, 94 insertions(+), 234 deletions(-)

diff --git a/src/main/java/org/apache/commons/beanutils2/DynaProperty.java b/src/main/java/org/apache/commons/beanutils2/DynaProperty.java
index 0ad30442..4a375d98 100644
--- a/src/main/java/org/apache/commons/beanutils2/DynaProperty.java
+++ b/src/main/java/org/apache/commons/beanutils2/DynaProperty.java
@@ -17,10 +17,6 @@
 
 package org.apache.commons.beanutils2;
 
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.StreamCorruptedException;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -214,58 +210,6 @@ public class DynaProperty {
 
     }
 
-    /**
-     * Reads a class using safe encoding to workaround Java 1.3 serialization bug.
-     */
-    private Class<?> readAnyClass(final ObjectInputStream in) throws IOException, ClassNotFoundException {
-        // read back type class safely
-        if (in.readBoolean()) {
-            // it's a type constant
-            switch (in.readInt()) {
-
-                case BOOLEAN_TYPE: return   Boolean.TYPE;
-                case BYTE_TYPE:    return      Byte.TYPE;
-                case CHAR_TYPE:    return Character.TYPE;
-                case DOUBLE_TYPE:  return    Double.TYPE;
-                case FLOAT_TYPE:   return     Float.TYPE;
-                case INT_TYPE:     return   Integer.TYPE;
-                case LONG_TYPE:    return      Long.TYPE;
-                case SHORT_TYPE:   return     Short.TYPE;
-                default:
-                    // something's gone wrong
-                    throw new StreamCorruptedException(
-                        "Invalid primitive type. "
-                        + "Check version of beanutils used to serialize is compatible.");
-
-            }
-
-        }
-        // it's another class
-        return (Class<?>) in.readObject();
-    }
-
-    /**
-     * Deserializes field values for this object safely.
-     * There are issues with serializing primitive class types on certain JVM versions
-     * (including Java 1.3).
-     * This method provides a workaround.
-     *
-     * @param in {@link ObjectInputStream} to read object from
-     * @throws StreamCorruptedException when the stream data values are outside expected range
-     * @throws IOException if the input stream can't be read
-     * @throws ClassNotFoundException When trying to read an object of class that is not on the classpath
-     */
-    private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
-        this.type = readAnyClass(in);
-
-        if (isMapped() || isIndexed()) {
-            this.contentType = readAnyClass(in);
-        }
-
-        // read other values
-        in.defaultReadObject();
-    }
-
     /**
      * Gets a String representation of this Object.
      * @return a String representation of the dyna property
@@ -283,55 +227,4 @@ public class DynaProperty {
         return sb.toString();
     }
 
-    /**
-     * Write a class using safe encoding to workaround Java 1.3 serialization bug.
-     */
-    private void writeAnyClass(final Class<?> clazz, final ObjectOutputStream out) throws IOException {
-        // safely write out any class
-        int primitiveType = 0;
-        if (Boolean.TYPE.equals(clazz)) {
-            primitiveType = BOOLEAN_TYPE;
-        } else if (Byte.TYPE.equals(clazz)) {
-            primitiveType = BYTE_TYPE;
-        } else if (Character.TYPE.equals(clazz)) {
-            primitiveType = CHAR_TYPE;
-        } else if (Double.TYPE.equals(clazz)) {
-            primitiveType = DOUBLE_TYPE;
-        } else if (Float.TYPE.equals(clazz)) {
-            primitiveType = FLOAT_TYPE;
-        } else if (Integer.TYPE.equals(clazz)) {
-            primitiveType = INT_TYPE;
-        } else if (Long.TYPE.equals(clazz)) {
-            primitiveType = LONG_TYPE;
-        } else if (Short.TYPE.equals(clazz)) {
-            primitiveType = SHORT_TYPE;
-        }
-
-        if (primitiveType == 0) {
-            // then it's not a primitive type
-            out.writeBoolean(false);
-            out.writeObject(clazz);
-        } else {
-            // we'll write out a constant instead
-            out.writeBoolean(true);
-            out.writeInt(primitiveType);
-        }
-    }
-
-    /**
-     * Serializes this object to an ObjectOutputStream.
-     *
-     * @param out the target ObjectOutputStream.
-     * @throws IOException thrown when an I/O errors occur writing to the target stream.
-     */
-    private void writeObject(final ObjectOutputStream out) throws IOException {
-        writeAnyClass(this.type, out);
-
-        if (isMapped() || isIndexed()) {
-            writeAnyClass(this.contentType, out);
-        }
-
-        // write out other values
-        out.defaultWriteObject();
-    }
 }
diff --git a/src/test/java/org/apache/commons/beanutils2/BeanComparatorTestCase.java b/src/test/java/org/apache/commons/beanutils2/BeanComparatorTestCase.java
index 0d334b3b..4aff5640 100644
--- a/src/test/java/org/apache/commons/beanutils2/BeanComparatorTestCase.java
+++ b/src/test/java/org/apache/commons/beanutils2/BeanComparatorTestCase.java
@@ -110,7 +110,7 @@ public class BeanComparatorTestCase {
     @Test
     public void testCompareOnMissingProperty() {
         final BeanComparator<AlphaBean, String> beanComparator = new BeanComparator<>("bogusName");
-        Exception e = assertThrows(RuntimeException.class, () -> beanComparator.compare(alphaBean2, alphaBean1));
+        final Exception e = assertThrows(RuntimeException.class, () -> beanComparator.compare(alphaBean2, alphaBean1));
         assertTrue(e.toString().contains("Unknown property"), () -> "Wrong exception was thrown: " + e);
     }
 
diff --git a/src/test/java/org/apache/commons/beanutils2/LazyDynaListTestCase.java b/src/test/java/org/apache/commons/beanutils2/LazyDynaListTestCase.java
index 44d22408..7d1e5535 100644
--- a/src/test/java/org/apache/commons/beanutils2/LazyDynaListTestCase.java
+++ b/src/test/java/org/apache/commons/beanutils2/LazyDynaListTestCase.java
@@ -25,6 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.NotSerializableException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.util.ArrayList;
@@ -38,9 +39,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 /**
- * <p>
- * Test Case for the {@code LazyDynaList}class.
- * </p>
+ * Tests {@link LazyDynaList}.
  */
 public class LazyDynaListTestCase {
 
@@ -419,13 +418,7 @@ public class LazyDynaListTestCase {
         assertEquals("value1", bean.get(BASIC_PROP1), "post-set check");
 
         // Serialize/Deserialize
-        final LazyDynaList result = (LazyDynaList) serializeDeserialize(target, "DynaBean");
-        target = null;
-        bean = null;
-
-        // Confirm property value
-        bean = (BasicDynaBean) result.get(0);
-        assertEquals("value1", bean.get(BASIC_PROP1), "post-serialize check");
+        assertThrows(NotSerializableException.class, () -> serializeDeserialize(target, "DynaBean"));
 
     }
 
@@ -445,13 +438,7 @@ public class LazyDynaListTestCase {
         assertEquals("value1", bean.get(BASIC_PROP1), "post-set check");
 
         // Serialize/Deserialize
-        final LazyDynaList result = (LazyDynaList) serializeDeserialize(target, "DynaBean");
-        target = null;
-        bean = null;
-
-        // Confirm property value
-        bean = (LazyDynaBean) result.get(0);
-        assertEquals("value1", bean.get(BASIC_PROP1), "post-serialize check");
+        assertThrows(NotSerializableException.class, () -> serializeDeserialize(target, "DynaBean"));
 
     }
 
@@ -471,14 +458,7 @@ public class LazyDynaListTestCase {
         assertEquals("value1", bean.get(BASIC_PROP1), "post-set check");
 
         // Serialize/Deserialize
-        final LazyDynaList result = (LazyDynaList) serializeDeserialize(target, "Map");
-        target = null;
-        bean = null;
-
-        // Confirm property value
-        bean = (LazyDynaMap) result.get(0);
-        assertEquals("value1", bean.get(BASIC_PROP1), "post-serialize check");
-
+        assertThrows(NotSerializableException.class, () -> serializeDeserialize(target, "Map"));
     }
 
     /**
@@ -486,7 +466,6 @@ public class LazyDynaListTestCase {
      */
     @Test
     public void testSerializationPojo() throws Exception {
-
         // Create LazyArrayList for DynaBeans
         LazyDynaList target = new LazyDynaList(pojoDynaClass);
         WrapDynaBean bean = (WrapDynaBean) target.get(0);
@@ -497,17 +476,7 @@ public class LazyDynaListTestCase {
         assertEquals("value1", bean.get("stringProperty"), "post-set check");
 
         // Serialize/Deserialize
-        final LazyDynaList result = (LazyDynaList) serializeDeserialize(target, "POJO");
-        target = null;
-        bean = null;
-
-        // Test BEANUTILS-300
-        result.add(null);
-
-        // Confirm property value
-        bean = (WrapDynaBean) result.get(0);
-        assertEquals("value1", bean.get("stringProperty"), "post-serialize check");
-
+        assertThrows(NotSerializableException.class, () -> serializeDeserialize(target, "POJO"));
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/beanutils2/PropertyUtilsTestCase.java b/src/test/java/org/apache/commons/beanutils2/PropertyUtilsTestCase.java
index 7aad797a..28869a98 100644
--- a/src/test/java/org/apache/commons/beanutils2/PropertyUtilsTestCase.java
+++ b/src/test/java/org/apache/commons/beanutils2/PropertyUtilsTestCase.java
@@ -1109,14 +1109,15 @@ public class PropertyUtilsTestCase {
         for (final String propertie : properties) {
 
             // Identify the property descriptor for this property
-            if (propertie.equals("intIndexed")) {
+            switch (propertie) {
+            case "intIndexed":
                 continue;
-            }
-            if (propertie.equals("stringIndexed")) {
+            case "stringIndexed":
                 continue;
-            }
-            if (propertie.equals("writeOnlyProperty")) {
+            case "writeOnlyProperty":
                 continue;
+            default:
+                break;
             }
             int n = -1;
             for (int j = 0; j < pd.length; j++) {
@@ -1369,20 +1370,19 @@ public class PropertyUtilsTestCase {
         for (final String property : properties) {
 
             // Identify the property descriptor for this property
-            if (property.equals("intIndexed")) {
+            switch (property) {
+            case "intIndexed":
                 continue;
-            }
-            if (property.equals("listIndexed")) {
+            case "listIndexed":
                 continue;
-            }
-            if (property.equals("nested")) {
+            case "nested":
                 continue; // This property is read only
-            }
-            if (property.equals("readOnlyProperty")) {
+            case "readOnlyProperty":
                 continue;
-            }
-            if (property.equals("stringIndexed")) {
+            case "stringIndexed":
                 continue;
+            default:
+                break;
             }
             int n = -1;
             for (int j = 0; j < pd.length; j++) {
diff --git a/src/test/java/org/apache/commons/beanutils2/WrapDynaBeanTestCase.java b/src/test/java/org/apache/commons/beanutils2/WrapDynaBeanTestCase.java
index 6c0d35cd..a15f8c52 100644
--- a/src/test/java/org/apache/commons/beanutils2/WrapDynaBeanTestCase.java
+++ b/src/test/java/org/apache/commons/beanutils2/WrapDynaBeanTestCase.java
@@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.NotSerializableException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 
@@ -225,18 +226,14 @@ public class WrapDynaBeanTestCase extends BasicDynaBeanTestCase {
     @Override
     @Test
     public void testNotSerializableException() throws Exception {
-
         // Create a bean and set a value
         final WrapDynaBean origBean = new WrapDynaBean(new TestBean());
         final Integer newValue = Integer.valueOf(789);
         assertEquals(Integer.valueOf(123), origBean.get("intProperty"), "origBean default");
         origBean.set("intProperty", newValue);
         assertEquals(newValue, origBean.get("intProperty"), "origBean new value");
-
         // Serialize/Deserialize & test value
-        final WrapDynaBean bean = (WrapDynaBean) serializeDeserialize(origBean, "First Test");
-        assertEquals(newValue, bean.get("intProperty"), "bean value");
-
+        assertThrows(NotSerializableException.class, () -> serializeDeserialize(origBean, "First Test"));
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/beanutils2/bugs/Jira273TestCase.java b/src/test/java/org/apache/commons/beanutils2/bugs/Jira273TestCase.java
index 167814a2..fc26533c 100644
--- a/src/test/java/org/apache/commons/beanutils2/bugs/Jira273TestCase.java
+++ b/src/test/java/org/apache/commons/beanutils2/bugs/Jira273TestCase.java
@@ -59,7 +59,7 @@ public class Jira273TestCase {
     @Test
     public void testIssue_BEANUTILS_273_AnonymousNotOverridden() throws Exception {
         final Object bean = Jira273BeanFactory.createAnonymousNotOverridden();
-        Object result = PropertyUtils.getProperty(bean, "beanValue");
+        final Object result = PropertyUtils.getProperty(bean, "beanValue");
         assertEquals("PublicBeanWithMethod", result);
     }
 
@@ -69,7 +69,7 @@ public class Jira273TestCase {
     @Test
     public void testIssue_BEANUTILS_273_AnonymousOverridden() throws Exception {
         final Object bean = Jira273BeanFactory.createAnonymousOverridden();
-        Object result = PropertyUtils.getProperty(bean, "beanValue");
+        final Object result = PropertyUtils.getProperty(bean, "beanValue");
         assertEquals("AnonymousOverridden", result);
     }
 
@@ -79,7 +79,7 @@ public class Jira273TestCase {
     @Test
     public void testIssue_BEANUTILS_273_PrivatePrivatePublicNotOverridden() throws Exception {
         final Object bean = Jira273BeanFactory.createPrivatePrivatePublicNotOverridden();
-        Object result = PropertyUtils.getProperty(bean, "beanValue");
+        final Object result = PropertyUtils.getProperty(bean, "beanValue");
         assertEquals("PublicBeanWithMethod", result);
     }
 
@@ -89,7 +89,7 @@ public class Jira273TestCase {
     @Test
     public void testIssue_BEANUTILS_273_PrivatePrivatePublicOverridden() throws Exception {
         final Object bean = Jira273BeanFactory.createPrivatePrivatePublicOverridden();
-        Object result = PropertyUtils.getProperty(bean, "beanValue");
+        final Object result = PropertyUtils.getProperty(bean, "beanValue");
         assertEquals("PrivatePrivatePublicOverridden", result);
     }
 
@@ -99,7 +99,7 @@ public class Jira273TestCase {
     @Test
     public void testIssue_BEANUTILS_273_PrivatePublicNotOverridden() throws Exception {
         final Object bean = Jira273BeanFactory.createPrivatePublicNotOverridden();
-        Object result = PropertyUtils.getProperty(bean, "beanValue");
+        final Object result = PropertyUtils.getProperty(bean, "beanValue");
         assertEquals("PublicBeanWithMethod", result);
     }
 
@@ -109,7 +109,7 @@ public class Jira273TestCase {
     @Test
     public void testIssue_BEANUTILS_273_PrivatePublicOverridden() throws Exception {
         final Object bean = Jira273BeanFactory.createPrivatePublicOverridden();
-        Object result = PropertyUtils.getProperty(bean, "beanValue");
+        final Object result = PropertyUtils.getProperty(bean, "beanValue");
         assertEquals("PrivatePublicOverridden", result);
     }
 }
diff --git a/src/test/java/org/apache/commons/beanutils2/bugs/Jira298TestCase.java b/src/test/java/org/apache/commons/beanutils2/bugs/Jira298TestCase.java
index 804bf737..13e188e2 100644
--- a/src/test/java/org/apache/commons/beanutils2/bugs/Jira298TestCase.java
+++ b/src/test/java/org/apache/commons/beanutils2/bugs/Jira298TestCase.java
@@ -73,7 +73,7 @@ public class Jira298TestCase {
     @Test
     public void testIssue_BEANUTILS_298_PropertyUtils_getProperty() throws Exception {
         final Object bean = Jira298BeanFactory.createImplX();
-        Object result = PropertyUtils.getProperty(bean, "name");
+        final Object result = PropertyUtils.getProperty(bean, "name");
         assertEquals("BaseX name value", result);
     }
 
diff --git a/src/test/java/org/apache/commons/beanutils2/expression/DefaultResolverTestCase.java b/src/test/java/org/apache/commons/beanutils2/expression/DefaultResolverTestCase.java
index a264927a..95245e31 100644
--- a/src/test/java/org/apache/commons/beanutils2/expression/DefaultResolverTestCase.java
+++ b/src/test/java/org/apache/commons/beanutils2/expression/DefaultResolverTestCase.java
@@ -103,7 +103,7 @@ public class DefaultResolverTestCase {
 
         // Non-numeric
         label = "Malformed";
-        IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> resolver.getIndex("foo[BAR]"));
+        final IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> resolver.getIndex("foo[BAR]"));
         assertEquals("Invalid index value 'BAR'", e.getMessage(), label + " Error Message");
     }
 
@@ -134,7 +134,7 @@ public class DefaultResolverTestCase {
 
         // Malformed
         label = "Malformed";
-        IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> resolver.getKey("foo(bar"));
+        final IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> resolver.getKey("foo(bar"));
         assertEquals("Missing End Delimiter", e.getMessage(), label + " Error Message");
     }
 
diff --git a/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTestCase.java b/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTestCase.java
index 90ef6f78..120b1b0e 100644
--- a/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTestCase.java
+++ b/src/test/java/org/apache/commons/beanutils2/sql/DynaResultSetTestCase.java
@@ -150,7 +150,7 @@ public class DynaResultSetTestCase {
      */
     @Test
     public void testIteratorResultsNormalCase() throws Exception {
-        ResultSetDynaClass dynaClass = new ResultSetDynaClass(TestResultSet.createProxy(), false);
+        final ResultSetDynaClass dynaClass = new ResultSetDynaClass(TestResultSet.createProxy(), false);
 
         // Grab the third row
         final Iterator<DynaBean> rows = dynaClass.iterator();
diff --git a/src/test/java/org/apache/commons/beanutils2/sql/TestResultSet.java b/src/test/java/org/apache/commons/beanutils2/sql/TestResultSet.java
index f6127a52..b23fcd05 100644
--- a/src/test/java/org/apache/commons/beanutils2/sql/TestResultSet.java
+++ b/src/test/java/org/apache/commons/beanutils2/sql/TestResultSet.java
@@ -314,47 +314,38 @@ public class TestResultSet implements InvocationHandler {
         if (row > 5) {
             throw new SQLException("No current row");
         }
-        if ("bigDecimalProperty".equals(columnName)) {
+        switch (columnName) {
+        case "bigDecimalProperty":
             return new BigDecimal(123.45);
-        }
-        if ("booleanProperty".equals(columnName)) {
+        case "booleanProperty":
             if (row % 2 == 0) {
                 return Boolean.TRUE;
             }
             return Boolean.FALSE;
-        }
-        if ("byteProperty".equals(columnName)) {
+        case "byteProperty":
             return Byte.valueOf((byte) row);
-        }
-        if ("dateProperty".equals(columnName)) {
+        case "dateProperty":
             return new Date(timestampMillis);
-        }
-        if ("doubleProperty".equals(columnName)) {
+        case "doubleProperty":
             return Double.valueOf(321.0);
-        }
-        if ("floatProperty".equals(columnName)) {
+        case "floatProperty":
             return Float.valueOf((float) 123.0);
-        }
-        if ("intProperty".equals(columnName)) {
+        case "intProperty":
             return Integer.valueOf(100 + row);
-        }
-        if ("longProperty".equals(columnName)) {
+        case "longProperty":
             return Long.valueOf(200 + row);
-        }
-        if ("nullProperty".equals(columnName)) {
+        case "nullProperty":
             return null;
-        }
-        if ("shortProperty".equals(columnName)) {
+        case "shortProperty":
             return Short.valueOf((short) (300 + row));
-        }
-        if ("stringProperty".equals(columnName)) {
+        case "stringProperty":
             return "This is a string";
-        }
-        if ("timeProperty".equals(columnName)) {
+        case "timeProperty":
             return new Time(timestampMillis);
-        }
-        if ("timestampProperty".equals(columnName)) {
+        case "timestampProperty":
             return new Timestamp(timestampMillis);
+        default:
+            break;
         }
         throw new SQLException("Unknown column name " + columnName);
     }
@@ -471,30 +462,26 @@ public class TestResultSet implements InvocationHandler {
     @Override
     public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
         final String methodName = method.getName();
-        if ("close".equals(methodName)) {
+        switch (methodName) {
+        case "close":
             return null;
-        }
-        if ("getMetaData".equals(methodName)) {
+        case "getMetaData":
             return getMetaData();
-        }
-        if ("getObject".equals(methodName)) {
+        case "getObject":
             return getObject(columnName(args[0]));
-        }
-        if ("getDate".equals(methodName)) {
+        case "getDate":
             return getDate(columnName(args[0]));
-        }
-        if ("getTime".equals(methodName)) {
+        case "getTime":
             return getTime(columnName(args[0]));
-        }
-        if ("getTimestamp".equals(methodName)) {
+        case "getTimestamp":
             return getTimestamp(columnName(args[0]));
-        }
-        if ("next".equals(methodName)) {
+        case "next":
             return next() ? Boolean.TRUE : Boolean.FALSE;
-        }
-        if ("updateObject".equals(methodName)) {
+        case "updateObject":
             updateObject((String) args[0], args[1]);
             return null;
+        default:
+            break;
         }
 
         throw new UnsupportedOperationException(methodName + " not implemented");
diff --git a/src/test/java/org/apache/commons/beanutils2/sql/TestResultSetMetaData.java b/src/test/java/org/apache/commons/beanutils2/sql/TestResultSetMetaData.java
index 26609f25..bd868b20 100644
--- a/src/test/java/org/apache/commons/beanutils2/sql/TestResultSetMetaData.java
+++ b/src/test/java/org/apache/commons/beanutils2/sql/TestResultSetMetaData.java
@@ -91,35 +91,49 @@ public class TestResultSetMetaData implements InvocationHandler {
     public Integer getColumnType(final int columnIndex) throws SQLException {
         final String columnName = getColumnName(columnIndex);
         int sqlType = Types.OTHER;
-        if (columnName.equals("bigDecimalProperty")) {
+        switch (columnName) {
+        case "bigDecimalProperty":
             sqlType = Types.DECIMAL;
 // Types.BOOLEAN only introduced in JDK 1.4
 //        } else if (columnName.equals("booleanProperty")) {
 //            sqlType = Types.BOOLEAN;
-        } else if (columnName.equals("byteProperty")) {
+            break;
+        case "byteProperty":
             sqlType = Types.TINYINT;
-        } else if (columnName.equals("dateProperty")) {
+            break;
+        case "dateProperty":
             sqlType = Types.DATE;
-        } else if (columnName.equals("doubleProperty")) {
+            break;
+        case "doubleProperty":
             sqlType = Types.DOUBLE;
-        } else if (columnName.equals("floatProperty")) {
+            break;
+        case "floatProperty":
             sqlType = Types.FLOAT;
-        } else if (columnName.equals("intProperty")) {
+            break;
+        case "intProperty":
             sqlType = Types.INTEGER;
-        } else if (columnName.equals("longProperty")) {
+            break;
+        case "longProperty":
             sqlType = Types.BIGINT;
-        } else if (columnName.equals("nullProperty")) {
+            break;
+        case "nullProperty":
             sqlType = Types.VARCHAR;
-        } else if (columnName.equals("shortProperty")) {
+            break;
+        case "shortProperty":
             sqlType = Types.SMALLINT;
-        } else if (columnName.equals("stringProperty")) {
+            break;
+        case "stringProperty":
             sqlType = Types.VARCHAR;
-        } else if (columnName.equals("timeProperty")) {
+            break;
+        case "timeProperty":
             sqlType = Types.TIME;
-        } else if (columnName.equals("timestampProperty")) {
+            break;
+        case "timestampProperty":
             sqlType = Types.TIMESTAMP;
-        } else {
+            break;
+        default:
             sqlType = Types.OTHER;
+            break;
         }
         return Integer.valueOf(sqlType);
     }
@@ -156,17 +170,17 @@ public class TestResultSetMetaData implements InvocationHandler {
     @Override
     public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
         final String methodName = method.getName();
-        if ("getColumnClassName".equals(methodName)) {
+        switch (methodName) {
+        case "getColumnClassName":
             return getColumnClassName(((Integer) args[0]).intValue());
-        }
-        if ("getColumnCount".equals(methodName)) {
+        case "getColumnCount":
             return Integer.valueOf(getColumnCount());
-        }
-        if ("getColumnName".equals(methodName)) {
+        case "getColumnName":
             return getColumnName(((Integer) args[0]).intValue());
-        }
-        if ("getColumnType".equals(methodName)) {
+        case "getColumnType":
             return getColumnType(((Integer) args[0]).intValue());
+        default:
+            break;
         }
 
         throw new UnsupportedOperationException(methodName + " not implemented");