| BeanPropertyTarget.java |
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Axis" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.jboss.axis.encoding.ser;
import org.jboss.axis.encoding.Target;
import org.jboss.axis.utils.BeanPropertyDescriptor;
import org.jboss.axis.utils.JavaUtils;
import org.jboss.axis.utils.Messages;
import org.jboss.logging.Logger;
import org.xml.sax.SAXException;
import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
/**
* Class which knows how to update a bean property
*/
public class BeanPropertyTarget implements Target
{
private static Logger log = Logger.getLogger(BeanPropertyTarget.class.getName());
private Object object;
private BeanPropertyDescriptor pd;
private int index = -1;
// This is the constructor we find in startElement if the bean
// does not have a default constructor
// TDI 22-Jun-2004
protected DeferedBeanConstruction deferedConstruction;
protected BeanDeserializer beanDeserializer;
/**
* This constructor is used for a normal property.
*
* @param object is the bean class
* @param pd is the property
*/
public BeanPropertyTarget(Object object, BeanPropertyDescriptor pd)
{
this.object = object;
this.pd = pd;
this.index = -1; // disable indexing
}
/**
* This constructor is used for an indexed property.
*
* @param object is the bean class
* @param pd is the property
* @param i is the index
*/
public BeanPropertyTarget(Object object, BeanPropertyDescriptor pd, int i)
{
this.object = object;
this.pd = pd;
this.index = i;
}
/**
* This constructor is used for a property with defered construction.
*/
public BeanPropertyTarget(BeanDeserializer beanDeserializer, DeferedBeanConstruction deferedConstruction, BeanPropertyDescriptor pd)
{
this.beanDeserializer = beanDeserializer;
this.deferedConstruction = deferedConstruction;
this.pd = pd;
this.index = -1; // disable indexing
}
/**
* set the bean property with specified value
*
* @param value is the value.
*/
public void set(Object value) throws SAXException
{
if (object == null && deferedConstruction == null)
throw new IllegalStateException("Target object does not exist");
if (object == null && deferedConstruction != null)
{
object = deferedConstruction.newBeanInstance(value);
beanDeserializer.setValue(object);
return;
}
try
{
// Set the value on the bean property.
// Use the indexed property method if the
// index is set.
if (index < 0)
{
pd.set(object, value);
}
else
{
pd.set(object, index, value);
}
}
catch (Exception e)
{
try
{
// If an exception occurred,
// see it the value can be converted into
// the expected type.
Class type = pd.getType();
if (JavaUtils.isConvertable(value, type))
{
value = JavaUtils.convert(value, type);
if (index < 0)
{
//-TME 25-June-2004
// If not setter (immutable bean)
// Will throw IllegalAccessException, so swallow it
try
{
pd.set(object, value);
}
catch (IllegalAccessException e1)
{
log.warn("Can not set " + value + " on " + object +
" as it does not have a setter for this value.");
}
}
else
pd.set(object, index, value);
}
else
{
// It is possible that an indexed
// format was expected, but the
// entire array was sent. In such
// cases traverse the array and
// call the setter for each item.
if (index == 0 &&
value.getClass().isArray() &&
!type.getClass().isArray())
{
for (int i = 0; i < Array.getLength(value); i++)
{
Object item =
JavaUtils.convert(Array.get(value, i), type);
pd.set(object, i, item);
}
}
else
{
// Can't proceed. Throw an exception that
// will be caught in the catch block below.
throw e;
}
}
}
catch (Exception ex)
{
// Throw a SAX exception with an informative
// message.
String field = pd.getName();
if (index >= 0)
{
field += "[" + index + "]";
}
String valueType = "null";
if (value != null)
valueType = value.getClass().getName();
log.error(Messages.getMessage("cantConvert02",
new String[]{valueType, field, pd.getType().getName()}));
if (ex instanceof InvocationTargetException)
{
Throwable t = ((InvocationTargetException)ex).getTargetException();
if (t != null)
{
String classname = this.object.getClass().getName();
//show the context where this exception occured.
throw new SAXException(Messages.getMessage("cantConvert04",
new String[]{
classname,
field,
(value == null) ? null : value.toString(),
t.getMessage()}));
}
}
throw new SAXException(ex);
}
}
}
}
| BeanPropertyTarget.java |