Hi You can do this with Filter. I hav a ws wich zip and unzip depending on the function caled.
<CODE> package ch.braunvieh.axis.Handler; import ch.braunvieh.axis.Utils.ZipUtil; import ch.braunvieh.util.Utilities; import org.apache.axis.AxisFault; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.handlers.BasicHandler; import org.apache.axis.utils.DOM2Writer; import org.apache.crimson.jaxp.DocumentBuilderFactoryImpl; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.InputSource; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Iterator; import java.util.StringTokenizer; import java.util.Vector; import javax.xml.parsers.DocumentBuilder; import javax.xml.soap.SOAPBody; /** * Copyright (c) 2004 by SBZV, Chamerstrasse 56, 6300 Zug, Switzerland<br> * Project: $project$<br> * Date: $date$<br> * <br> * <b>Beschreibung:</b><br> * Comprimierungshandler um die Parameter rsp. den Respons eines WS zu packen * und zu entpacken * * Im WSDD-File kann der Handler im Request- und im Responseflow eingetragen werden.<br> * Dem Handler müssen die zu bearbeitenden Methoden über den Parameter "methodes" bekanntgemacht werden. * Der Wert von "methodes" ist ein cvs der zu behandelnden Methoden<br> * Bsp: * <handler name="ZipHandler" type="java:ch.braunvieh.axis.Handler.ZipHandler"> * <parameter name="methodes" value="Upload;Download;uploadXmlNodeCompressed;downloadXmlNodeCompressed"/> * </handler> * * @author <a href="mailto:[EMAIL PROTECTED]">bm</a> * @version $Id: ZipHandler.java,v 1.3 2005/07/29 14:44:13 bm Exp $ */ public class ZipHandler extends BasicHandler { Logger log4j = Logger.getLogger(ZipHandler.class); Vector methodes = new Vector(); /** * Zerlegt den übergebenen csv in die einzelnen Methodennamen und hinterlegt * diese auf dem Vector methodes * * @param csv Cvs-String mit den zu behandelden Methoden */ public void setMethodes(String csv) { StringTokenizer st = new StringTokenizer(csv, ";"); while (st.hasMoreTokens()) { String methode = st.nextToken().toUpperCase(); methodes.add(methode); } } /** * Räumt das Objekt vor dem Zerstören sauber auf */ public void cleanup() { methodes = null; } /** * Initialisiert das Objekt */ public void init() { super.init(); setMethodes((String) getOption("methodes")); } public void onFault(MessageContext msgContext) { super.onFault(msgContext); try { log4j.debug(DOM2Writer.nodeToString(msgContext.getCurrentMessage().getSOAPEn velope(), true)); } catch (AxisFault e) { log4j.debug(Utilities.dumpStackTrace(e)); } } /** * Führt die entsprechenden Manipulationen an den Request- rsp. * Respons-Messages des Request- und Respons-Flow durch * * @param msgContext MessageContext * * @throws AxisFault */ public void invoke(MessageContext msgContext) throws AxisFault { Message msg = (Message) msgContext.getCurrentMessage(); String methode = msgContext.getSOAPActionURI(); boolean compute = false; for (Iterator it = methodes.iterator(); it.hasNext();) { String iterat = (String) it.next(); // log4j.debug(methode.toUpperCase()+" ?= /" + iterat); if (methode.toUpperCase().endsWith("/" + iterat)) { compute = true; // log4j.debug("Compute"); break; } } if (compute) { try { // log4j.debug(msg.getSOAPPartAsString()); msg.saveChanges(); SOAPBody body = msg.getSOAPBody(); // if (msgContext.getPastPivot()) { zipMethodParameter((Node) body); msg.saveChanges(); // log4j.debug(msg.getSOAPPartAsString()); // } else { // unzipSubNodes(body.getChildNodes()); // } } catch (Exception e) { log4j.debug(Utilities.dumpStackTrace(e)); throw new AxisFault("Fehler beim Komprimieren", e); } msgContext.setCurrentMessage(msg); } } /** * Entpackt alle Textnodes unterhalb der Nodes der übergebenen Liste * * @param childNodes Liste der Nodes * * @throws Exception */ private void unzipSubNodes(NodeList childNodes) throws Exception { for (int i = 0; i < childNodes.getLength(); i++) { Node node = childNodes.item(i); if (node.hasChildNodes()) { unzipSubNodes(node.getChildNodes()); } else if (node.getNodeValue() != null) { String unzipped = ZipUtil.unzip(node.getNodeValue()); unzipped = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><" + node.getParentNode().getNodeName() + ">" + unzipped + "</" + node.getParentNode().getNodeName() + ">"; Document doc; try { DocumentBuilder builder = DocumentBuilderFactoryImpl.newInstance() .newDocumentBuilder(); InputStream ist = new ByteArrayInputStream(unzipped.getBytes()); InputStreamReader reader = new InputStreamReader(ist); InputSource iso = new InputSource(reader); doc = builder.parse(iso); } catch (Exception e) { log4j.debug(Utilities.dumpStackTrace(e)); doc = null; throw new Exception("Problem in creating and Parsing the InnerXML", e); } if (doc != null) { Node newNode = node.getOwnerDocument().importNode(doc.getFirstChild(), true); Node parentNode = node.getParentNode().getParentNode(); Node oldNode = node.getParentNode(); parentNode.removeChild(oldNode); parentNode.appendChild(newNode); } } } } /** * Packt die Parameter der Methode * * @param body Body-Node * * @throws IOException */ private void zipMethodParameter(Node body) throws IOException { Node methodeNode = body.getFirstChild(); if (methodeNode != null) { NodeList resultList = methodeNode.getChildNodes(); for (int j = 0; j < resultList.getLength(); j++){ Node resultNode = resultList.item(j); if (resultNode != null) { NodeList childList = resultNode.getChildNodes(); if (childList.getLength() > 0) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < childList.getLength(); i++) { String innerXML = DOM2Writer.nodeToString(childList.item(i), true); sb.append(innerXML); } String zipped = sb.toString(); // log4j.debug("bevore: "+zipped); zipped = ZipUtil.zip(zipped); for (int i = 0; i < childList.getLength(); i++) { resultNode.removeChild(childList.item(i)); } Text text = resultNode.getOwnerDocument().createTextNode(zipped); resultNode.appendChild(text); } } } } } } </CODE> The Code is documented in german sorry. But I hope it's anderstandable. I hope it helps you. mit freundlichen Grüssen Berner Martin _____________________________________________________________ Martin Berner, EDV Tel.: ++41-(0)41-729 33 46 Schweizer Braunviehzuchtverband Fax : ++41-(0)41-729 33 77 Chamerstrasse 56 http://www.braunvieh.ch 6300 Zug Email: [EMAIL PROTECTED] _____________________________________________________________ > -----Ursprüngliche Nachricht----- > Von: Plorks mail [mailto:[EMAIL PROTECTED] > Gesendet: Dienstag, 8. November 2005 17:16 > An: undisclosed-recipients > Betreff: zipping soap body before sending > > > > > > hi all > > can anyone give me / shoe links to an example of a > webservice that zips a > messge > > > i need to write a ws will send data to a client. but before > the client get > the data i need to zip it as it will be a large dataset. > > > has anyone an example zipping the soap body at server side ? > > > thanks for any help > > _________________________________________________________________ > MSN Messenger 7.5 is now out. Download it for FREE here. > http://messenger.msn.co.uk >
