All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.commons.beanutils.BeanPropertyValueChangeClosure Maven / Gradle / Ivy

Go to download

This artifact provides a single jar that contains all classes required to use remote EJB and JMS, including all dependencies. It is intended for use by those not using maven, maven users should just import the EJB and JMS BOM's instead (shaded JAR's cause lots of problems with maven, as it is very easy to inadvertently end up with different versions on classes on the class path).

There is a newer version: 34.0.0.Final
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); 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.apache.commons.beanutils;

import org.apache.commons.collections.Closure;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.lang.reflect.InvocationTargetException;


/**
 * 

Closure that sets a property.

*

* An implementation of org.apache.commons.collections.Closure that updates * a specified property on the object provided with a specified value. * The BeanPropertyValueChangeClosure constructor takes two parameters which determine * what property will be updated and with what value. *

*
* *
public BeanPropertyValueChangeClosure( String propertyName, Object propertyValue )
*
*
*
* Will create a Closure that will update an object by setting the property * specified by propertyName to the value specified by propertyValue. *
*
* *

* Note: Property names can be a simple, nested, indexed, or mapped property as defined by * org.apache.commons.beanutils.PropertyUtils. If any object in the property path * specified by propertyName is null then the outcome is based on the * value of the ignoreNull attribute. * *

* A typical usage might look like: *

 * // create the closure
 * BeanPropertyValueChangeClosure closure =
 *    new BeanPropertyValueChangeClosure( "activeEmployee", Boolean.TRUE );
 *
 * // update the Collection
 * CollectionUtils.forAllDo( peopleCollection, closure );
 * 
*

* * This would take a Collection of person objects and update the * activeEmployee property of each object in the Collection to * true. Assuming... *

    *
  • * The top level object in the peopleCollection is an object which represents a * person. *
  • *
  • * The person object has a setActiveEmployee( boolean ) method which updates * the value for the object's activeEmployee property. *
  • *
* * @version $Id$ * @see org.apache.commons.beanutils.PropertyUtils * @see org.apache.commons.collections.Closure */ public class BeanPropertyValueChangeClosure implements Closure { /** For logging. */ private final Log log = LogFactory.getLog(this.getClass()); /** * The name of the property which will be updated when this Closure executes. */ private String propertyName; /** * The value that the property specified by propertyName * will be updated to when this Closure executes. */ private Object propertyValue; /** * Determines whether null objects in the property path will genenerate an * IllegalArgumentException or not. If set to true then if any objects * in the property path leading up to the target property evaluate to null then the * IllegalArgumentException throw by PropertyUtils will be logged but * not rethrown. If set to false then if any objects in the property path leading * up to the target property evaluate to null then the * IllegalArgumentException throw by PropertyUtils will be logged and * rethrown. */ private boolean ignoreNull; /** * Constructor which takes the name of the property to be changed, the new value to set * the property to, and assumes ignoreNull to be false. * * @param propertyName The name of the property that will be updated with the value specified by * propertyValue. * @param propertyValue The value that propertyName will be set to on the target * object. * @throws IllegalArgumentException If the propertyName provided is null or empty. */ public BeanPropertyValueChangeClosure(final String propertyName, final Object propertyValue) { this(propertyName, propertyValue, false); } /** * Constructor which takes the name of the property to be changed, the new value to set * the property to and a boolean which determines whether null objects in the * property path will genenerate an IllegalArgumentException or not. * * @param propertyName The name of the property that will be updated with the value specified by * propertyValue. * @param propertyValue The value that propertyName will be set to on the target * object. * @param ignoreNull Determines whether null objects in the property path will * genenerate an IllegalArgumentException or not. * @throws IllegalArgumentException If the propertyName provided is null or empty. */ public BeanPropertyValueChangeClosure(final String propertyName, final Object propertyValue, final boolean ignoreNull) { super(); if ((propertyName != null) && (propertyName.length() > 0)) { this.propertyName = propertyName; this.propertyValue = propertyValue; this.ignoreNull = ignoreNull; } else { throw new IllegalArgumentException("propertyName cannot be null or empty"); } } /** * Updates the target object provided using the property update criteria provided when this * BeanPropertyValueChangeClosure was constructed. If any object in the property * path leading up to the target property is null then the outcome will be based on * the value of the ignoreNull attribute. By default, ignoreNull is * false and would result in an IllegalArgumentException if an object * in the property path leading up to the target property is null. * * @param object The object to be updated. * @throws IllegalArgumentException If an IllegalAccessException, InvocationTargetException, or * NoSuchMethodException is thrown when trying to access the property specified on the object * provided. Or if an object in the property path provided is null and * ignoreNull is set to false. */ public void execute(final Object object) { try { PropertyUtils.setProperty(object, propertyName, propertyValue); } catch (final IllegalArgumentException e) { final String errorMsg = "Unable to execute Closure. Null value encountered in property path..."; if (ignoreNull) { log.warn("WARNING: " + errorMsg + e); } else { final IllegalArgumentException iae = new IllegalArgumentException(errorMsg); if (!BeanUtils.initCause(iae, e)) { log.error(errorMsg, e); } throw iae; } } catch (final IllegalAccessException e) { final String errorMsg = "Unable to access the property provided."; final IllegalArgumentException iae = new IllegalArgumentException(errorMsg); if (!BeanUtils.initCause(iae, e)) { log.error(errorMsg, e); } throw iae; } catch (final InvocationTargetException e) { final String errorMsg = "Exception occurred in property's getter"; final IllegalArgumentException iae = new IllegalArgumentException(errorMsg); if (!BeanUtils.initCause(iae, e)) { log.error(errorMsg, e); } throw iae; } catch (final NoSuchMethodException e) { final String errorMsg = "Property not found"; final IllegalArgumentException iae = new IllegalArgumentException(errorMsg); if (!BeanUtils.initCause(iae, e)) { log.error(errorMsg, e); } throw iae; } } /** * Returns the name of the property which will be updated when this Closure executes. * * @return The name of the property which will be updated when this Closure executes. */ public String getPropertyName() { return propertyName; } /** * Returns the value that the property specified by propertyName * will be updated to when this Closure executes. * * @return The value that the property specified by propertyName * will be updated to when this Closure executes. */ public Object getPropertyValue() { return propertyValue; } /** * Returns the flag that determines whether null objects in the property path will * genenerate an IllegalArgumentException or not. If set to true then * if any objects in the property path leading up to the target property evaluate to * null then the IllegalArgumentException throw by * PropertyUtils will be logged but not rethrown. If set to false then * if any objects in the property path leading up to the target property evaluate to * null then the IllegalArgumentException throw by * PropertyUtils will be logged and rethrown. * * @return The flag that determines whether null objects in the property path will * genenerate an IllegalArgumentException or not. */ public boolean isIgnoreNull() { return ignoreNull; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy