Hi, When using Soap 2.2 I had trouble because there was no Serializer for a java.util.Enumeration class. I quickly created one based on the HashtableSerializer in the org.apache.soap.encoding.soapenc package. The class is org.apache.soap.encoding.soapenc.EnumerationSerializer
I have attached it. Please feel free to use it if you find it of any use. Thanks, Charles p.s. Great work on SOAP!
package org.apache.soap.encoding.soapenc; import java.beans.*; import java.io.*; import java.util.*; import java.lang.reflect.*; import org.w3c.dom.*; import org.apache.soap.util.*; import org.apache.soap.util.xml.*; import org.apache.soap.*; import org.apache.soap.rpc.*; import org.apache.soap.encoding.soapenc.*; /** * A <code>EnumerationSerializer</code> can be used to serialize and * deserialize Enumerations using the <code>SOAP-ENC</code> * encoding style.<p> * * * @author Charles Mendis ([EMAIL PROTECTED]) */ public class EnumerationSerializer implements Serializer, Deserializer { private static final String STR_ITEM = "item"; private static final String STR_VALUE = "value"; public void marshall(String inScopeEncStyle, Class javaType, Object src, Object context, Writer sink, NSStack nsStack, XMLJavaMappingRegistry xjmr, SOAPContext ctx) throws IllegalArgumentException, IOException { if (src == null) { SoapEncUtils.generateNullStructure(inScopeEncStyle, javaType, context, sink, nsStack, xjmr); } else if (src instanceof Enumeration) { SoapEncUtils.generateStructureHeader(inScopeEncStyle, javaType, context, sink, nsStack, xjmr); sink.write(StringUtils.lineSeparator); for (Enumeration e = (Enumeration)src; e.hasMoreElements(); ) { Object value = e.nextElement(); sink.write("<" + STR_ITEM + ">"); sink.write(StringUtils.lineSeparator); if (value == null) { SoapEncUtils.generateNullStructure(inScopeEncStyle, Object.class, STR_VALUE, sink, nsStack, xjmr); } else { Class actualComponentType = value.getClass(); xjmr.marshall(inScopeEncStyle, actualComponentType, value, STR_VALUE, sink, nsStack, ctx); } sink.write(StringUtils.lineSeparator); sink.write("</" + STR_ITEM + ">"); sink.write(StringUtils.lineSeparator); } sink.write("</" + context + '>'); } else { throw new IllegalArgumentException("Tried to pass a '" + src.getClass().toString() + "' to HashtableSerializer"); } } public Bean unmarshall(String inScopeEncStyle, QName elementType, Node src, XMLJavaMappingRegistry xjmr, SOAPContext ctx) throws IllegalArgumentException { Element root = (Element)src; String name = root.getTagName(); if (SoapEncUtils.isNull(root)) { return new Bean(Enumeration.class, null); } Hashtable hash = new Hashtable(); Element tempEl = DOMUtils.getFirstChildElement(root); while (tempEl != null) { // got an item Element valEl = DOMUtils.getFirstChildElement(tempEl); String tagName = valEl.getTagName(); if (!tagName.equalsIgnoreCase("value")) { throw new IllegalArgumentException("Got <" + tagName + "> tag when expecting <" + STR_VALUE + ">"); } Bean valBean = unmarshallEl(inScopeEncStyle, xjmr, valEl, ctx); hash.put(valBean.value, valBean.value); tempEl = DOMUtils.getNextSiblingElement(tempEl); } return new Bean(Enumeration.class, hash.elements()); } private Bean unmarshallEl(String inScopeEncStyle, XMLJavaMappingRegistry xjmr, Element targetEl, SOAPContext ctx) { String declEncStyle = DOMUtils.getAttributeNS(targetEl, Constants.NS_URI_SOAP_ENV, Constants.ATTR_ENCODING_STYLE); String actualEncStyle = (declEncStyle != null) ? declEncStyle : inScopeEncStyle; QName declItemType = SoapEncUtils.getTypeQName(targetEl); return xjmr.unmarshall(actualEncStyle, declItemType, targetEl, ctx); } }