You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ia...@apache.org on 2003/12/19 14:50:06 UTC
cvs commit: ws-axis/java/src/org/apache/axis/encoding/ser SimpleListSerializerFactory.java SimpleListDeserializer.java SimpleListDeserializerFactory.java SimpleListSerializer.java
ias 2003/12/19 05:50:06
Added: java/src/org/apache/axis/encoding/ser
SimpleListSerializerFactory.java
SimpleListDeserializer.java
SimpleListDeserializerFactory.java
SimpleListSerializer.java
Log:
initial check-in
Revision Changes Path
1.1 ws-axis/java/src/org/apache/axis/encoding/ser/SimpleListSerializerFactory.java
Index: SimpleListSerializerFactory.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2002 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/>.
*/
/**
* SerializerFactory for
* <xsd:simpleType ...>
* <xsd:list itemType="...">
* </xsd:simpleType>
* based on SimpleSerializerFactory
*
* @author Ias (iasandcb@tmax.co.kr)
*/
package org.apache.axis.encoding.ser;
import javax.xml.namespace.QName;
public class SimpleListSerializerFactory extends BaseSerializerFactory {
/**
* Note that the factory is constructed with the QName and xmlType. This is important
* to allow distinction between primitive values and java.lang wrappers.
**/
public SimpleListSerializerFactory(Class javaType, QName xmlType) {
super(SimpleListSerializer.class, xmlType, javaType);
}
}
1.1 ws-axis/java/src/org/apache/axis/encoding/ser/SimpleListDeserializer.java
Index: SimpleListDeserializer.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 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.apache.axis.encoding.ser;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import javax.xml.namespace.QName;
import org.apache.axis.description.TypeDesc;
import org.apache.axis.encoding.DeserializationContext;
import org.apache.axis.encoding.Deserializer;
import org.apache.axis.encoding.DeserializerImpl;
import org.apache.axis.encoding.SimpleType;
import org.apache.axis.encoding.TypeMapping;
import org.apache.axis.message.SOAPHandler;
import org.apache.axis.utils.BeanPropertyDescriptor;
import org.apache.axis.utils.Messages;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
/**
* Deserializer for
* <xsd:simpleType ...>
* <xsd:list itemType="...">
* </xsd:simpleType>
* based on SimpleDeserializer
*
* @author Ias (iasandcb@tmax.co.kr)
*/
public class SimpleListDeserializer extends DeserializerImpl {
StringBuffer val = new StringBuffer();
private Constructor constructor = null;
private Map propertyMap = null;
private HashMap attributeMap = null;
public QName xmlType;
public Class javaType;
private TypeDesc typeDesc = null;
protected SimpleListDeserializer cacheStringDSer = null;
protected QName cacheXMLType = null;
/**
* The Deserializer is constructed with the xmlType and
* javaType (which could be a java primitive like int.class)
*/
public SimpleListDeserializer(Class javaType, QName xmlType) {
this.xmlType = xmlType;
this.javaType = javaType;
}
public SimpleListDeserializer(Class javaType, QName xmlType, TypeDesc typeDesc) {
this.xmlType = xmlType;
this.javaType = javaType;
this.typeDesc = typeDesc;
}
/**
* Reset deserializer for re-use
*/
public void reset() {
val.setLength(0); // Reset string buffer back to zero
attributeMap = null; // Remove attribute map
isNil = false; // Don't know if nil
isEnded = false; // Indicate the end of element not yet called
}
/**
* Remove the Value Targets of the Deserializer.
* Simple deserializers may be re-used, so don't
* nullify the vector.
*/
public void removeValueTargets() {
if (targets != null) {
targets.clear();
// targets = null;
}
}
/**
* The Factory calls setConstructor.
*/
public void setConstructor(Constructor c)
{
constructor = c;
}
/**
* There should not be nested elements, so thow and exception if this occurs.
*/
public SOAPHandler onStartChild(String namespace,
String localName,
String prefix,
Attributes attributes,
DeserializationContext context)
throws SAXException
{
throw new SAXException(
Messages.getMessage("cantHandle00", "SimpleDeserializer"));
}
/**
* Append any characters received to the value. This method is defined
* by Deserializer.
*/
public void characters(char [] chars, int start, int end)
throws SAXException
{
val.append(chars, start, end);
}
/**
* Append any characters to the value. This method is defined by
* Deserializer.
*/
public void onEndElement(String namespace, String localName,
DeserializationContext context)
throws SAXException
{
if (isNil || val == null) {
value = null;
return;
}
try {
value = makeValue(val.toString());
} catch (InvocationTargetException ite) {
Throwable realException = ite.getTargetException();
if (realException instanceof Exception)
throw new SAXException((Exception)realException);
else
throw new SAXException(ite.getMessage());
} catch (Exception e) {
throw new SAXException(e);
}
// If this is a SimpleType, set attributes we have stashed away
setSimpleTypeAttributes();
}
/**
* Convert the string that has been accumulated into an Object. Subclasses
* may override this.
* @param source the serialized value to be deserialized
* @throws Exception any exception thrown by this method will be wrapped
*/
public Object makeValue(String source) throws Exception
{
// According to XML Schema Spec Part 0: Primer 2.3.1 - white space delimitor
StringTokenizer tokenizer = new StringTokenizer(source.trim());
int length = tokenizer.countTokens();
Object list = Array.newInstance(javaType, length);
for (int i = 0; i < length; i++) {
String token = tokenizer.nextToken();
Array.set(list, i, makeUnitValue(token));
}
return list;
}
private Object makeUnitValue(String source) throws Exception
{
// If the javaType is a boolean, except a number of different sources
if (javaType == boolean.class || javaType == Boolean.class) {
// This is a pretty lame test, but it is what the previous code did.
switch (source.charAt(0)) {
case '0': case 'f': case 'F':
return Boolean.FALSE;
case '1': case 't': case 'T':
return Boolean.TRUE;
default:
throw new NumberFormatException(
Messages.getMessage("badBool00"));
}
}
// If expecting a Float or a Double, need to accept some special cases.
if (javaType == float.class ||
javaType == java.lang.Float.class) {
if (source.equals("NaN")) {
return new Float(Float.NaN);
} else if (source.equals("INF")) {
return new Float(Float.POSITIVE_INFINITY);
} else if (source.equals("-INF")) {
return new Float(Float.NEGATIVE_INFINITY);
}
}
if (javaType == double.class ||
javaType == java.lang.Double.class) {
if (source.equals("NaN")) {
return new Double(Double.NaN);
} else if (source.equals("INF")) {
return new Double(Double.POSITIVE_INFINITY);
} else if (source.equals("-INF")) {
return new Double(Double.NEGATIVE_INFINITY);
}
}
return constructor.newInstance(new Object [] { source });
}
/**
* Set the bean properties that correspond to element attributes.
*
* This method is invoked after startElement when the element requires
* deserialization (i.e. the element is not an href and the value is not nil.)
* @param namespace is the namespace of the element
* @param localName is the name of the element
* @param prefix is the prefix of the element
* @param attributes are the attributes on the element...used to get the type
* @param context is the DeserializationContext
*/
public void onStartElement(String namespace, String localName,
String prefix, Attributes attributes,
DeserializationContext context)
throws SAXException
{
// If we have no metadata, we have no attributes. Q.E.D.
if (typeDesc == null)
return;
// loop through the attributes and set bean properties that
// correspond to attributes
for (int i=0; i < attributes.getLength(); i++) {
QName attrQName = new QName(attributes.getURI(i),
attributes.getLocalName(i));
String fieldName = typeDesc.getFieldNameForAttribute(attrQName);
if (fieldName == null)
continue;
// look for the attribute property
BeanPropertyDescriptor bpd =
(BeanPropertyDescriptor) propertyMap.get(fieldName);
if (bpd != null) {
if (!bpd.isWriteable() || bpd.isIndexed() ) continue ;
// determine the QName for this child element
TypeMapping tm = context.getTypeMapping();
Class type = bpd.getType();
QName qn = tm.getTypeQName(type);
if (qn == null)
throw new SAXException(
Messages.getMessage("unregistered00", type.toString()));
// get the deserializer
Deserializer dSer = context.getDeserializerForType(qn);
if (dSer == null)
throw new SAXException(
Messages.getMessage("noDeser00", type.toString()));
if (! (dSer instanceof SimpleListDeserializer))
throw new SAXException(
Messages.getMessage("AttrNotSimpleType00",
bpd.getName(),
type.toString()));
// Success! Create an object from the string and save
// it in our attribute map for later.
if (attributeMap == null) {
attributeMap = new HashMap();
}
try {
Object val = ((SimpleListDeserializer)dSer).
makeValue(attributes.getValue(i));
attributeMap.put(fieldName, val);
} catch (Exception e) {
throw new SAXException(e);
}
} // if
} // attribute loop
} // onStartElement
/**
* Process any attributes we may have encountered (in onStartElement)
*/
private void setSimpleTypeAttributes() throws SAXException {
// if this isn't a simpleType bean, wont have attributes
if (! SimpleType.class.isAssignableFrom(javaType) ||
attributeMap == null)
return;
// loop through map
Set entries = attributeMap.entrySet();
for (Iterator iterator = entries.iterator(); iterator.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
String name = (String) entry.getKey();
Object val = entry.getValue();
BeanPropertyDescriptor bpd =
(BeanPropertyDescriptor) propertyMap.get(name);
if (!bpd.isWriteable() || bpd.isIndexed()) continue;
try {
bpd.set(value, val );
} catch (Exception e) {
throw new SAXException(e);
}
}
}
}
1.1 ws-axis/java/src/org/apache/axis/encoding/ser/SimpleListDeserializerFactory.java
Index: SimpleListDeserializerFactory.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 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.apache.axis.encoding.ser;
import org.apache.axis.utils.JavaUtils;
import javax.xml.namespace.QName;
import javax.xml.rpc.JAXRPCException;
import java.lang.reflect.Constructor;
/**
* DeserializerFactory for
* <xsd:simpleType ...>
* <xsd:list itemType="...">
* </xsd:simpleType>
* based on SimpleDeserializerFactory
*
* @author Ias (iasandcb@tmax.co.kr)
*/
public class SimpleListDeserializerFactory extends BaseDeserializerFactory {
private Constructor constructor = null;
/**
* Note that the factory is constructed with the QName and xmlType. This is important
* to allow distinction between primitive values and java.lang wrappers.
**/
public SimpleListDeserializerFactory(Class javaType, QName xmlType) {
super(SimpleListDeserializer.class, xmlType, javaType.getComponentType());
Class componentType = javaType.getComponentType();
try {
if (!componentType.isPrimitive()) {
constructor =
componentType.getDeclaredConstructor(new Class [] {String.class});
}
else {
Class wrapper = JavaUtils.getWrapperClass(componentType);
if (wrapper != null)
constructor =
wrapper.getDeclaredConstructor(new Class [] {String.class});
}
} catch (java.lang.NoSuchMethodException e) {
throw new IllegalArgumentException(e.toString());
}
}
/**
* Get the Deserializer and the set the Constructor so the
* deserializer does not have to do introspection.
*/
public javax.xml.rpc.encoding.Deserializer getDeserializerAs(String mechanismType)
throws JAXRPCException {
if (javaType == java.lang.Object.class) {
return null;
}
SimpleListDeserializer deser = (SimpleListDeserializer) super.getDeserializerAs(mechanismType);
if (deser != null)
deser.setConstructor(constructor);
return deser;
}
}
1.1 ws-axis/java/src/org/apache/axis/encoding/ser/SimpleListSerializer.java
Index: SimpleListSerializer.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 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.apache.axis.encoding.ser;
import java.io.IOException;
import java.lang.reflect.Array;
import javax.xml.namespace.QName;
import org.apache.axis.AxisFault;
import org.apache.axis.Constants;
import org.apache.axis.description.FieldDesc;
import org.apache.axis.description.TypeDesc;
import org.apache.axis.encoding.SerializationContext;
import org.apache.axis.encoding.SimpleType;
import org.apache.axis.encoding.SimpleValueSerializer;
import org.apache.axis.utils.BeanPropertyDescriptor;
import org.apache.axis.utils.Messages;
import org.apache.axis.wsdl.fromJava.Types;
import org.w3c.dom.Element;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.AttributesImpl;
/**
* Serializer for
* <xsd:simpleType ...>
* <xsd:list itemType="...">
* </xsd:simpleType>
* based on SimpleSerializer
*
* @author Ias <ia...@tmax.co.kr>
*/
public class SimpleListSerializer implements SimpleValueSerializer {
public QName xmlType;
public Class javaType;
private BeanPropertyDescriptor[] propertyDescriptor = null;
private TypeDesc typeDesc = null;
public SimpleListSerializer(Class javaType, QName xmlType) {
this.xmlType = xmlType;
this.javaType = javaType;
}
public SimpleListSerializer(Class javaType, QName xmlType, TypeDesc typeDesc) {
this.xmlType = xmlType;
this.javaType = javaType;
this.typeDesc = typeDesc;
}
/**
* Serialize a list of primitives or simple values.
*/
public void serialize(QName name, Attributes attributes,
Object value, SerializationContext context)
throws IOException
{
if (value != null && value.getClass() == java.lang.Object.class) {
throw new IOException(Messages.getMessage("cantSerialize02"));
}
// get any attributes
if (value instanceof SimpleType)
attributes = getObjectAttributes(value, attributes, context);
context.startElement(name, attributes);
if (value != null) {
context.writeSafeString(getValueAsString(value, context));
}
context.endElement();
}
public String getValueAsString(Object value, SerializationContext context) {
// We could have separate serializers/deserializers to take
// care of Float/Double cases, but it makes more sence to
// put them here with the rest of the java lang primitives.
int length = Array.getLength(value);
StringBuffer result = new StringBuffer();
for (int i = 0; i < length; i++) {
Object object = Array.get(value, i);
if (object instanceof Float ||
object instanceof Double) {
double data = 0.0;
if (object instanceof Float) {
data = ((Float) object).doubleValue();
} else {
data = ((Double) object).doubleValue();
}
if (Double.isNaN(data)) {
result.append("NaN");
} else if (data == Double.POSITIVE_INFINITY) {
result.append("INF");
} else if (data == Double.NEGATIVE_INFINITY) {
result.append("-INF");
}
else {
result.append(object.toString());
}
}
else {
result.append(object.toString());
}
if (i < length - 1) {
result.append(' ');
}
}
return result.toString();
}
private Attributes getObjectAttributes(Object value,
Attributes attributes,
SerializationContext context) {
if (typeDesc == null || !typeDesc.hasAttributes())
return attributes;
AttributesImpl attrs;
if (attributes == null) {
attrs = new AttributesImpl();
} else if (attributes instanceof AttributesImpl) {
attrs = (AttributesImpl)attributes;
} else {
attrs = new AttributesImpl(attributes);
}
try {
// Find each property that is an attribute
// and add it to our attribute list
for (int i=0; i<propertyDescriptor.length; i++) {
String propName = propertyDescriptor[i].getName();
if (propName.equals("class"))
continue;
FieldDesc field = typeDesc.getFieldByName(propName);
// skip it if its not an attribute
if (field == null || field.isElement())
continue;
QName qname = field.getXmlName();
if (qname == null) {
qname = new QName("", propName);
}
if (propertyDescriptor[i].isReadable() &&
!propertyDescriptor[i].isIndexed()) {
// add to our attributes
Object propValue = propertyDescriptor[i].get(value);
// If the property value does not exist, don't serialize
// the attribute. In the future, the decision to serializer
// the attribute may be more sophisticated. For example, don't
// serialize if the attribute matches the default value.
if (propValue != null) {
String propString = getValueAsString(propValue, context);
String namespace = qname.getNamespaceURI();
String localName = qname.getLocalPart();
attrs.addAttribute(namespace,
localName,
context.qName2String(qname),
"CDATA",
propString);
}
}
}
} catch (Exception e) {
// no attributes
return attrs;
}
return attrs;
}
public String getMechanismType() { return Constants.AXIS_SAX; }
/**
* Return XML schema for the specified type, suitable for insertion into
* the <types> element of a WSDL document, or underneath an
* <element> or <attribute> declaration.
*
* @param javaType the Java Class we're writing out schema for
* @param types the Java2WSDL Types object which holds the context
* for the WSDL being generated.
* @return a type element containing a schema simpleType/complexType
* @see org.apache.axis.wsdl.fromJava.Types
*/
public Element writeSchema(Class javaType, Types types) throws Exception {
// Let the caller generate WSDL if this is not a SimpleType
if (!SimpleType.class.isAssignableFrom(javaType))
return null;
// ComplexType representation of SimpleType bean class
Element complexType = types.createElement("complexType");
types.writeSchemaElementDecl(xmlType, complexType);
complexType.setAttribute("name", xmlType.getLocalPart());
// Produce simpleContent extending base type.
Element simpleContent = types.createElement("simpleContent");
complexType.appendChild(simpleContent);
Element extension = types.createElement("extension");
simpleContent.appendChild(extension);
// Get the base type from the "value" element of the bean
String base = "string";
for (int i=0; i<propertyDescriptor.length; i++) {
String propName = propertyDescriptor[i].getName();
if (!propName.equals("value")) {
if (typeDesc != null) {
FieldDesc field = typeDesc.getFieldByName(propName);
if (field != null) {
if (field.isElement()) {
// throw?
}
QName qname = field.getXmlName();
if (qname == null) {
// Use the default...
qname = new QName("", propName);
}
// write attribute element
Class fieldType = propertyDescriptor[i].getType();
// Attribute must be a simple type, enum or SimpleType
if (!types.isAcceptableAsAttribute(fieldType)) {
throw new AxisFault(Messages.getMessage("AttrNotSimpleType00",
propName,
fieldType.getName()));
}
// write attribute element
// TODO the attribute name needs to be preserved from the XML
Element elem = types.createAttributeElement(propName,
fieldType,
field.getXmlType(),
false,
extension.getOwnerDocument());
extension.appendChild(elem);
}
}
continue;
}
BeanPropertyDescriptor bpd = propertyDescriptor[i];
Class type = bpd.getType();
// Attribute must extend a simple type, enum or SimpleType
if (!types.isAcceptableAsAttribute(type)) {
throw new AxisFault(Messages.getMessage("AttrNotSimpleType01",
type.getName()));
}
base = types.writeType(type);
extension.setAttribute("base", base);
}
// done
return complexType;
}
}