| RPCParam.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.message;
import org.jboss.axis.description.ParameterDesc;
import org.jboss.axis.encoding.SerializationContext;
import org.jboss.axis.utils.JavaUtils;
import org.jboss.axis.utils.Messages;
import org.jboss.logging.Logger;
import javax.xml.namespace.QName;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
/**
* An RPC parameter
*
* @author Glen Daniels (gdaniels@macromedia.com)
*/
public class RPCParam
{
private static Logger log = Logger.getLogger(RPCParam.class.getName());
// Who's your daddy?
RPCElement myCall;
private transient QName qname;
// The value of this RPCParam
private Object value;
// counts number of calls to set
private int countSetCalls;
private ParameterDesc paramDesc;
/**
* Do we definitely want (or don't want) to send xsi:types? If null
* (the default), just do whatever our SerializationContext is configured
* to do. If TRUE or FALSE, the SerializationContext will do what we
* want.
*/
private Boolean wantXSIType = null;
private static Method valueSetMethod;
static
{
Class cls = RPCParam.class;
try
{
valueSetMethod = cls.getMethod("set", new Class[]{Object.class});
}
catch (NoSuchMethodException e)
{
log.error(Messages.getMessage("noValue00", "" + e));
System.exit(-1);
}
}
/**
* Constructor for building up messages.
*/
public RPCParam(String name, Object value)
{
this.qname = new QName("", name);
this.value = value;
}
public RPCParam(QName qname, Object value)
{
this.qname = qname;
this.value = value;
}
public RPCParam(String namespace, String name, Object value)
{
this.qname = new QName(namespace, name);
this.value = value;
}
public void setRPCCall(RPCElement call)
{
myCall = call;
}
public Object getValue()
{
return value;
}
public void setValue(Object newValue)
{
value = newValue;
}
/**
* This set method is registered during deserialization
* to set the deserialized value.
* If the method is called multiple times, the
* value is automatically changed into a container to
* hold all of the values.
*
* @param newValue is the deserialized object
*/
public void set(Object newValue)
{
countSetCalls++;
// If this is the first call,
// simply set the value.
if (countSetCalls == 1)
{
this.value = newValue;
return;
}
// If this is the second call, create an
// ArrayList to hold all the values
else if (countSetCalls == 2)
{
ArrayList list = new ArrayList();
list.add(this.value);
this.value = list;
}
// Add the new value to the list
((ArrayList)this.value).add(newValue);
}
public String getName()
{
return this.qname.getLocalPart();
}
public QName getQName()
{
return this.qname;
}
public static Method getValueSetMethod()
{
return valueSetMethod;
}
public ParameterDesc getParamDesc()
{
return paramDesc;
}
public void setParamDesc(ParameterDesc paramDesc)
{
this.paramDesc = paramDesc;
}
public void setXSITypeGeneration(Boolean value)
{
this.wantXSIType = value;
}
public Boolean getXSITypeGeneration()
{
return this.wantXSIType;
}
public void serialize(SerializationContext context)
throws IOException
{
// Set the javaType to value's class unless
// parameter description information exists.
// Set the xmlType using the parameter description
// information. (an xmlType=null causes the
// serialize method to search for a compatible xmlType)
Object serValue = value;
QName xmlType = null;
if (paramDesc != null)
{
Class javaType = null;
xmlType = paramDesc.getTypeQName();
if (xmlType != null)
{
javaType = context.getTypeMapping().getClassForQName(xmlType);
if (serValue != null && javaType != null && !javaType.isAssignableFrom(serValue.getClass()))
{
if (JavaUtils.isConvertable(serValue, javaType))
serValue = JavaUtils.convert(serValue, javaType);
}
}
if (javaType == null)
{
javaType = paramDesc.getJavaType();
}
if (javaType == null && value != null)
{
javaType = value.getClass();
}
if (javaType != null && !javaType.equals(paramDesc.getJavaType()))
{
if (!(javaType.equals(JavaUtils.getHolderValueType(paramDesc.getJavaType()))))
{
// This must (assumedly) be a polymorphic type - in ALL
// such cases, we must send an xsi:type attribute.
wantXSIType = Boolean.TRUE;
}
}
}
context.serialize(qname, // element qname
null, // no extra attrs
serValue, // value
xmlType, // java/xml type
true, wantXSIType);
}
}
| RPCParam.java |