Implmented one already, but not very optimal...
Niclas On Friday 12 July 2002 16:35, Niclas Hedhman wrote: > Before I write one, > > Anybody got a CollectionSerializer??? > > > Niclas
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 2000 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 "SOAP" 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 [EMAIL PROTECTED] * * 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 and was * originally based on software copyright (c) 2000, International * Business Machines, Inc., http://www.apache.org. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package com.ewarna.xzone.soap; 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>HashtableSerializer</code> can be used to serialize and * deserialize Hashtables using the <code>SOAP-ENC</code> * encoding style.<p> * * TODO: This should eventually deal with any Maps, but doesn't yet. * * @author Glen Daniels ([EMAIL PROTECTED]) * @author Niclas Hedhman, [EMAIL PROTECTED] */ public class CollectionSerializer implements Serializer, Deserializer { private static final String STR_ITEM = "item"; private static final String STR_VALUE = "value"; public CollectionSerializer() { super(); System.out.println( "CollectionSerializer created." ); } 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 Map) { SoapEncUtils.generateStructureHeader( inScopeEncStyle, javaType, context, sink, nsStack, xjmr); sink.write(StringUtils.lineSeparator); Collection c = (Collection)src; Iterator list = c.iterator(); while( list.hasNext() ) { Object value = list.next(); sink.write("<" + STR_ITEM + ">"); sink.write(StringUtils.lineSeparator); if (value == null) { SoapEncUtils.generateNullStructure(Constants.NS_URI_SOAP_ENC, Object.class, STR_VALUE, sink, nsStack, xjmr); } else { Class actualComponentType = value.getClass(); xjmr.marshall(Constants.NS_URI_SOAP_ENC, 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 CollectionSerializer"); } } 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(HashMap.class, null); } System.out.println( "Root Element:" + root ); Collection c = new ArrayList(); 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); c.add( valBean.value ); tempEl = DOMUtils.getNextSiblingElement(tempEl); } return new Bean(ArrayList.class, c); } 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); } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>