/* * Copyright 2005-2014 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; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.io.Reader; import java.io.Writer; import javax.xml.namespace.QName; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stream.StreamResult; import org.springframework.core.io.InputStreamSource; import org.springframework.core.io.Resource; import org.springframework.util.FileCopyUtils; import org.springframework.xml.sax.SaxUtils; import org.springframework.xml.transform.StringSource; /** * Mock implementation of the {@code WebServiceMessage} interface. * * @author Arjen Poutsma * @since 1.0.0 */ public class MockWebServiceMessage implements FaultAwareWebServiceMessage { private StringBuilder content; private boolean fault = false; private QName faultCode; private String faultReason; public MockWebServiceMessage() { } public MockWebServiceMessage(Source source) throws TransformerException { TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); content = new StringBuilder(); transformer.transform(source, getPayloadResult()); } public MockWebServiceMessage(Resource resource) throws IOException, TransformerException { this(new SAXSource(SaxUtils.createInputSource(resource))); } public MockWebServiceMessage(StringBuilder content) { this.content = content; } public MockWebServiceMessage(String content) { if (content != null) { this.content = new StringBuilder(content); } } public String getPayloadAsString() { return content != null ? content.toString() : null; } public void setPayload(InputStreamSource inputStreamSource) throws IOException { checkContent(); InputStream is = null; try { is = inputStreamSource.getInputStream(); Reader reader = new InputStreamReader(is, "UTF-8"); content.replace(0, content.length(), FileCopyUtils.copyToString(reader)); } finally { if (is != null) { is.close(); } } } public void setPayload(String content) { checkContent(); this.content.replace(0, this.content.length(), content); } private void checkContent() { if (content == null) { content = new StringBuilder(); } } @Override public Result getPayloadResult() { checkContent(); content.setLength(0); return new StreamResult(new StringBufferWriter()); } @Override public Source getPayloadSource() { return content != null ? new StringSource(content.toString()) : null; } @Override public boolean hasFault() { return fault; } public void setFault(boolean fault) { this.fault = fault; } @Override public QName getFaultCode() { return faultCode; } public void setFaultCode(QName faultCode) { this.faultCode = faultCode; } @Override public String getFaultReason() { return faultReason; } public void setFaultReason(String faultReason) { this.faultReason = faultReason; } @Override public void writeTo(OutputStream outputStream) throws IOException { if (content != null) { PrintWriter writer = new PrintWriter(outputStream); writer.write(content.toString()); } } public String toString() { StringBuilder builder = new StringBuilder("MockWebServiceMessage {"); if (content != null) { builder.append(content); } builder.append('}'); return builder.toString(); } private class StringBufferWriter extends Writer { private StringBufferWriter() { super(content); } @Override public void write(String str) { content.append(str); } @Override public void write(int c) { content.append((char) c); } @Override public void write(String str, int off, int len) { content.append(str.substring(off, off + len)); } @Override public void close() throws IOException { } @Override public void flush() { } @Override public void write(char cbuf[], int off, int len) { if (off < 0 || off > cbuf.length || len < 0 || off + len > cbuf.length || off + len < 0) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return; } content.append(cbuf, off, len); } } }