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
> 

Reply via email to