org.force66.beantester.tests.ValuePropertyTest.java Source code

Java tutorial

Introduction

Here is the source code for org.force66.beantester.tests.ValuePropertyTest.java

Source

/*
 * This software is licensed under the Apache License, Version 2.0
 * (the "License") agreement; you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.force66.beantester.tests;

import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;

import org.apache.commons.lang3.Validate;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.force66.beantester.utils.BeanTesterException;

/**
 * Tests an individual bean accessor and mutators for a specific property given a test value.
 * @author D. Ashmore
 *
 */
public class ValuePropertyTest implements BeanPropertyTest {

    @Override
    public boolean testProperty(Object bean, PropertyDescriptor descriptor, Object value) {
        Validate.notNull(bean, "Null bean not allowed");
        Validate.notNull(descriptor, "Null PropertyDescriptor not allowed");

        boolean answer = true;
        if (descriptor.getPropertyType().isPrimitive() && value == null) {
            return answer; // Null test doesn't apply
        }

        boolean fieldExists = FieldUtils.getField(bean.getClass(), descriptor.getName(), true) != null;

        try {
            if (descriptor.getWriteMethod() != null) {
                descriptor.getWriteMethod().invoke(bean, new Object[] { value });
                answer = testReadValue(bean, descriptor, value);
            } else if (fieldExists) {
                /*
                 * Accessor exists, but no mutator.  Test the accessor by forcing the test value into the field
                 * backing that accessor.
                 */
                FieldUtils.writeField(bean, descriptor.getName(), value, true);
                answer = testReadValue(bean, descriptor, value);
            }
            if (descriptor.getReadMethod() != null) {
                /*
                 * If an accessor exists, but has no corresponding mutator or field, all we can do
                 * is execute it to make sure it doesn't except.
                 */
                descriptor.getReadMethod().invoke(bean);
            }

        } catch (Exception e) {
            throw new BeanTesterException("Failed executing assignment test for accessor/mutator", e)
                    .addContextValue("property", descriptor)
                    .addContextValue("value class", value == null ? null : value.getClass().getName())
                    .addContextValue("value", value);
        }
        return answer;
    }

    private boolean testReadValue(Object bean, PropertyDescriptor descriptor, Object value)
            throws IllegalAccessException, InvocationTargetException {
        boolean answer = true;
        if (descriptor.getReadMethod() != null) {
            if (value == null) {
                answer = descriptor.getReadMethod().invoke(bean) == null;
            } else {
                answer = value.equals(descriptor.getReadMethod().invoke(bean));
            }

        }
        return answer;
    }

}