| /* |
| * Copyright 2001-2004 The Apache Software Foundation. |
| * |
| * Licensed 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.axis.encoding.ser; |
| |
| import org.apache.axis.components.logger.LogFactory; |
| import org.apache.axis.encoding.Target; |
| import org.apache.axis.utils.BeanPropertyDescriptor; |
| import org.apache.axis.utils.JavaUtils; |
| import org.apache.axis.utils.Messages; |
| import org.apache.commons.logging.Log; |
| 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 { |
| protected static Log log = |
| LogFactory.getLog(BeanPropertyTarget.class.getName()); |
| |
| private Object object; |
| private BeanPropertyDescriptor pd; |
| private int index = -1; |
| |
| /** |
| * 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; |
| } |
| |
| /** |
| * set the bean property with specified value |
| * @param value is the value. |
| */ |
| public void set(Object value) throws SAXException { |
| |
| 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 (value.getClass().isArray() |
| && value.getClass().getComponentType().isPrimitive() |
| && type.isArray() |
| && type.getComponentType().equals(Object.class)) |
| { |
| //we make our own array type here. |
| type = Array.newInstance(JavaUtils.getWrapperClass(value.getClass().getComponentType()),0).getClass(); |
| } |
| |
| if (JavaUtils.isConvertable(value, type)) { |
| value = JavaUtils.convert(value, type); |
| if (index < 0) |
| pd.set(object, 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 + "]"; |
| } |
| if (log.isErrorEnabled()) { |
| //TODO: why is this just logged on the server-side and not thrown back to the client??? |
| String valueType = "null"; |
| if (value != null) |
| valueType = value.getClass().getName(); |
| log.error(Messages.getMessage("cantConvert02", |
| new String[]{ |
| valueType, |
| field, |
| (index >= 0) ? |
| pd.getType().getComponentType().getName() : |
| 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); |
| } |
| } |
| } |
| } |
| |