org.springframework.ws.soap.PerformanceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.ws.soap.PerformanceTest.java

Source

/*
 * Copyright 2005-2010 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.ws.soap;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.StopWatch;
import org.springframework.ws.soap.axiom.AxiomSoapMessageFactory;
import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
import org.springframework.ws.soap.stroap.StroapMessageFactory;
import org.springframework.ws.stream.StreamingPayload;
import org.springframework.ws.stream.StreamingWebServiceMessage;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class PerformanceTest {

    private static final Log logger = LogFactory.getLog(PerformanceTest.class);

    private static final int ITERATIONS = 1000;

    private static final int ELEMENTS = 500;

    private SoapMessageFactory messageFactory;

    private Marshaller marshaller;

    private StopWatch stopWatch;

    private MyRootElement jaxbElement;

    private OutputStream os;

    private boolean streaming = false;

    private static final QName NAME = new QName("http://springframework.org", "root");

    private Transformer transformer;

    public PerformanceTest(SoapMessageFactory messageFactory, StopWatch stopWatch) throws Exception {
        if (messageFactory instanceof InitializingBean) {
            ((InitializingBean) messageFactory).afterPropertiesSet();
        }
        this.messageFactory = messageFactory;
        JAXBContext jaxbContext = JAXBContext.newInstance(MyRootElement.class);
        marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

        jaxbElement = new MyRootElement();
        for (int i = 0; i < ELEMENTS; i++) {
            jaxbElement.getStrings().add(String.valueOf(i));
        }

        os = new NullOutputSteam();

        this.stopWatch = stopWatch;

        this.transformer = TransformerFactory.newInstance().newTransformer();
    }

    public void test(boolean streaming) throws Exception {
        String s = messageFactory.toString() + " streaming " + (streaming ? "enabled" : "disabled");
        stopWatch.start(s);
        logger.info(s);
        for (int i = 0; i < ITERATIONS; i++) {
            SoapMessage message = (SoapMessage) messageFactory.createWebServiceMessage();

            marshal(message, streaming);

            transformer.transform(message.getPayloadSource(), new StreamResult(os));

            message.writeTo(os);

        }
        stopWatch.stop();
    }

    private void marshal(SoapMessage message, boolean streaming) throws JAXBException {
        if (streaming && message instanceof StreamingWebServiceMessage) {
            StreamingWebServiceMessage streamingMessage = (StreamingWebServiceMessage) message;
            StreamingPayload payload = new JaxbStreamingPayload(jaxbElement, NAME, marshaller);

            streamingMessage.setStreamingPayload(payload);
        } else {
            marshaller.marshal(jaxbElement, message.getPayloadResult());
        }
    }

    public static void main(String[] args) throws Exception {
        StopWatch stopWatch = new StopWatch();

        try {
            saaj(stopWatch);
            axiom(stopWatch, false, false);
            axiom(stopWatch, true, false);
            axiom(stopWatch, false, true);
            axiom(stopWatch, true, true);
            stroap(stopWatch, false, false);
            stroap(stopWatch, true, false);
            stroap(stopWatch, false, true);
            stroap(stopWatch, true, true);

        } finally {
            System.out.println(stopWatch.prettyPrint());
        }
    }

    private static void saaj(StopWatch stopWatch) throws Exception {
        SaajSoapMessageFactory ssmf = new SaajSoapMessageFactory();
        PerformanceTest performanceTest = new PerformanceTest(ssmf, stopWatch);
        performanceTest.test(false);
    }

    private static void axiom(StopWatch stopWatch, boolean caching, boolean streaming) throws Exception {
        AxiomSoapMessageFactory axmf = new AxiomSoapMessageFactory();
        axmf.setPayloadCaching(caching);
        PerformanceTest performanceTest = new PerformanceTest(axmf, stopWatch);
        performanceTest.test(streaming);
    }

    private static void stroap(StopWatch stopWatch, boolean caching, boolean streaming) throws Exception {
        StroapMessageFactory smf = new StroapMessageFactory();
        smf.setPayloadCaching(caching);
        PerformanceTest performanceTest = new PerformanceTest(smf, stopWatch);
        performanceTest.test(streaming);
    }

    @XmlRootElement(name = "root", namespace = "http://springframework.org")
    public static class MyRootElement {

        private List<String> strings;

        @XmlElement(name = "string", namespace = "http://springframework.org")
        public List<String> getStrings() {
            if (strings == null) {
                strings = new ArrayList<String>();
            }
            return strings;
        }

    }

    private static class NullOutputSteam extends OutputStream {

        @Override
        public void write(int b) throws IOException {
        }

        @Override
        public void write(byte[] b) throws IOException {
        }

        @Override
        public void write(byte[] b, int off, int len) throws IOException {
        }

        @Override
        public void flush() throws IOException {
        }

        @Override
        public void close() throws IOException {
        }
    }

    private static class JaxbStreamingPayload implements StreamingPayload {

        private final Object jaxbElement;

        private final QName name;

        private final Marshaller marshaller;

        private JaxbStreamingPayload(Object jaxbElement, QName name, Marshaller marshaller) {
            this.jaxbElement = jaxbElement;
            this.name = name;
            this.marshaller = marshaller;
        }

        public QName getName() {
            return name;
        }

        public void writeTo(XMLStreamWriter streamWriter) throws XMLStreamException {
            try {
                marshaller.marshal(jaxbElement, streamWriter);
            } catch (JAXBException ex) {
                throw new XMLStreamException(ex);
            }
        }
    }

}