tomj 02/02/27 11:19:44 Modified: java/src/org/apache/axis/encoding/ser SimpleDeserializer.java Log: Rework SimpleType to store attributes until after the endElement, then set them. Revision Changes Path 1.4 +53 -18 xml-axis/java/src/org/apache/axis/encoding/ser/SimpleDeserializer.java Index: SimpleDeserializer.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/SimpleDeserializer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- SimpleDeserializer.java 27 Feb 2002 13:41:27 -0000 1.3 +++ SimpleDeserializer.java 27 Feb 2002 19:19:44 -0000 1.4 @@ -61,6 +61,8 @@ import java.lang.reflect.InvocationTargetException; import java.util.Vector; import java.util.HashMap; +import java.util.Set; +import java.util.Iterator; import org.apache.axis.InternalException; import org.apache.axis.message.SOAPHandler; @@ -96,6 +98,7 @@ private Constructor constructor = null; private BeanPropertyDescriptor[] pd = null; private HashMap propertyMap = new HashMap(); + private HashMap attributeMap = null; public QName xmlType; public Class javaType; @@ -175,6 +178,9 @@ } catch (Exception e) { throw new SAXException(e); } + + // If this is a SimpleType, set attributes we have stashed away + setSimpleTypeAttributes(); } /** @@ -268,16 +274,22 @@ !beanAttributeNames.contains(attrNameLo)) continue; - // look for the attribute property + if (attributeMap == null) + attributeMap = new HashMap(); + + // look for the attribute property, save the name + attrName = attrNameUp; BeanPropertyDescriptor bpd = (BeanPropertyDescriptor) propertyMap.get(attrNameUp); - if (bpd == null) + if (bpd == null) { + attrName = attrNameLo; bpd = (BeanPropertyDescriptor) propertyMap.get(attrNameLo); - if (bpd == null) + } + if (bpd == null) { + attrName = mangledName; bpd = (BeanPropertyDescriptor) propertyMap.get(mangledName); + } if (bpd != null) { - if (bpd.getWriteMethod() == null ) continue ; - // determine the QName for this child element TypeMapping tm = context.getTypeMapping(); Class type = bpd.getType(); @@ -293,20 +305,17 @@ JavaUtils.getMessage("noDeser00", type.toString())); if (! (dSer instanceof SimpleDeserializer)) throw new SAXException( - JavaUtils.getMessage("AttrNotSimpleType00", - bpd.getName(), - type.toString())); - - if (bpd.getWriteMethod().getParameterTypes().length == 1) { - // Success! Create an object from the string and set - // it in the bean - try { - Object val = ((SimpleDeserializer)dSer). + JavaUtils.getMessage("AttrNotSimpleType00", + bpd.getName(), + type.toString())); + + // Success! Store name, value in HashMap for later + try { + Object val = ((SimpleDeserializer)dSer). makeValue(attributes.getValue(i)); - bpd.getWriteMethod().invoke(value, new Object[] {val} ); - } catch (Exception e) { - throw new SAXException(e); - } + attributeMap.put(attrName, val); + } catch (Exception e) { + throw new SAXException(e); } } // if bpd != null @@ -314,5 +323,31 @@ } // if attributes exist } // 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)) + return; + + // loop through map + Set keys = attributeMap.keySet(); + for (Iterator iterator = keys.iterator(); iterator.hasNext();) { + String name = (String) iterator.next(); + Object val = attributeMap.get(name); + + BeanPropertyDescriptor bpd = + (BeanPropertyDescriptor) propertyMap.get(name); + if (bpd.getWriteMethod() == null) continue; + try { + if (bpd.getWriteMethod().getParameterTypes().length == 1) { + bpd.getWriteMethod().invoke(value, new Object[] {val} ); + } + } catch (Exception e) { + throw new SAXException(e); + } + } + } }