Author: veithen Date: Mon Jan 26 15:14:33 2009 New Revision: 737710 URL: http://svn.apache.org/viewvc?rev=737710&view=rev Log: Decode charset encoding when in pretty print ("XML Format") mode.
Added: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilter.java (with props) webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilterTest.java (with props) Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/AbstractConnection.java webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetDecoderFilter.java webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/ReadOnlyStream.java webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Stream.java webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HttpFilter.java webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/ContentFilterFactory.java webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/DefaultContentFilterFactory.java webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/MimePartFilter.java Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/AbstractConnection.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/AbstractConnection.java?rev=737710&r1=737709&r2=737710&view=diff ============================================================================== --- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/AbstractConnection.java (original) +++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/AbstractConnection.java Mon Jan 26 15:14:33 2009 @@ -37,6 +37,7 @@ import java.io.StringWriter; import java.io.Writer; import java.net.Socket; +import java.nio.charset.Charset; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -45,6 +46,8 @@ * a connection listens to a single current connection */ public abstract class AbstractConnection extends Thread { + private static final Charset UTF8 = Charset.forName("utf-8"); + private final Configuration config; /** @@ -181,7 +184,7 @@ filter.setContentFilterFactory(new DefaultContentFilterFactory()); requestPipeline.addFilter(filter); } - requestPipeline.addFilter(new CharsetDecoderFilter(inputWriter)); + requestPipeline.addFilter(new CharsetDecoderFilter(inputWriter, UTF8)); // If we act as a proxy, we first need to read the start of the request before // the outSocket is available. @@ -202,7 +205,7 @@ filter.setContentFilterFactory(new DefaultContentFilterFactory()); responsePipeline.addFilter(filter); } - responsePipeline.addFilter(new CharsetDecoderFilter(outputWriter)); + responsePipeline.addFilter(new CharsetDecoderFilter(outputWriter, UTF8)); // this is the channel to the endpoint rr1 = new SocketRR(this, inSocket, tmpIn1, outSocket, tmpOut2, requestPipeline); Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetDecoderFilter.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetDecoderFilter.java?rev=737710&r1=737709&r2=737710&view=diff ============================================================================== --- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetDecoderFilter.java (original) +++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetDecoderFilter.java Mon Jan 26 15:14:33 2009 @@ -18,26 +18,44 @@ import java.io.IOException; import java.io.Writer; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CoderResult; /** * Filter that decodes the stream to character data and sends it to a {...@link Writer}. */ public class CharsetDecoderFilter implements StreamFilter { private final Writer writer; + private final CharsetDecoder decoder; + private final ByteBuffer inBuffer = ByteBuffer.allocate(64); + private final CharBuffer outBuffer = CharBuffer.allocate(64); - public CharsetDecoderFilter(Writer writer) { + public CharsetDecoderFilter(Writer writer, Charset charset) { this.writer = writer; + decoder = charset.newDecoder(); + } + + public CharsetDecoderFilter(Writer writer, String charsetName) { + this(writer, Charset.forName(charsetName)); } public void invoke(Stream stream) { - StringBuffer buffer = new StringBuffer(stream.available()); - while (stream.available() > 0) { - buffer.append((char)stream.skip()); - } - try { - writer.write(buffer.toString()); - } catch (IOException ex) { - throw new StreamException(ex); - } + CoderResult coderResult; + do { + stream.skip(stream.read(inBuffer)); + inBuffer.flip(); + coderResult = decoder.decode(inBuffer, outBuffer, stream.isEndOfStream()); + outBuffer.flip(); + try { + writer.write(outBuffer.array(), outBuffer.position(), outBuffer.remaining()); + } catch (IOException ex) { + throw new StreamException(ex); + } + outBuffer.clear(); + inBuffer.compact(); + } while (stream.available() > 0 || coderResult == CoderResult.OVERFLOW); } } Added: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilter.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilter.java?rev=737710&view=auto ============================================================================== --- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilter.java (added) +++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilter.java Mon Jan 26 15:14:33 2009 @@ -0,0 +1,63 @@ +/* + * Copyright 2004,2005 The Apache Software Foundation. + * + * 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.apache.ws.commons.tcpmon.core.filter; + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CoderResult; + +/** + * Filter that changes the charset encoding of a stream. + */ +public class CharsetRecoderFilter implements StreamFilter { + private final CharsetDecoder decoder; + private final CharsetEncoder encoder; + private final ByteBuffer inBuffer = ByteBuffer.allocate(64); + private final CharBuffer charBuffer = CharBuffer.allocate(64); + private final ByteBuffer outBuffer = ByteBuffer.allocate(64); + + public CharsetRecoderFilter(Charset fromCharset, Charset toCharset) { + decoder = fromCharset.newDecoder(); + encoder = toCharset.newEncoder(); + } + + public CharsetRecoderFilter(String fromCharset, String toCharset) { + this(Charset.forName(fromCharset), Charset.forName(toCharset)); + } + + public void invoke(Stream stream) { + CoderResult inResult; + do { + stream.discard(stream.read(inBuffer)); + inBuffer.flip(); + inResult = decoder.decode(inBuffer, charBuffer, stream.isEndOfStream()); + charBuffer.flip(); + CoderResult outResult; + do { + outResult = encoder.encode(charBuffer, outBuffer, stream.isEndOfStream() && inResult == CoderResult.UNDERFLOW); + outBuffer.flip(); + stream.insert(outBuffer); + outBuffer.compact(); + } while (outResult == CoderResult.OVERFLOW); + inBuffer.compact(); + charBuffer.compact(); + } while (stream.available() > 0 || inResult == CoderResult.OVERFLOW); + } +} Propchange: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilter.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java?rev=737710&r1=737709&r2=737710&view=diff ============================================================================== --- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java (original) +++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Pipeline.java Mon Jan 26 15:14:33 2009 @@ -19,6 +19,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.ByteBuffer; import java.util.LinkedList; /** @@ -211,6 +212,12 @@ return c; } + public int read(ByteBuffer buffer) { + int c = Math.min(buffer.remaining(), inLength); + buffer.put(inBuffer, inOffset, c); + return c; + } + public void readAll(OutputStream out) throws IOException { out.write(inBuffer, inOffset, inLength); } @@ -229,7 +236,7 @@ inLength -= len; } - public void insert(byte b) { + private void prepareOutput() { flushSkip(false); if (outLength > 0 && outLength == outBuffer.length) { flushOutput(false); @@ -237,6 +244,10 @@ if (outBuffer == null) { outBuffer = allocateBuffer(); } + } + + public void insert(byte b) { + prepareOutput(); outBuffer[outLength++] = b; } @@ -246,6 +257,15 @@ invokeNext(buffer, offset, length, false, true); } + public void insert(ByteBuffer buffer) { + while (buffer.hasRemaining()) { + prepareOutput(); + int c = Math.min(outBuffer.length-outLength, buffer.remaining()); + buffer.get(outBuffer, outLength, c); + outLength += c; + } + } + public byte skip() { byte b = inBuffer[inOffset]; skip(1); Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/ReadOnlyStream.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/ReadOnlyStream.java?rev=737710&r1=737709&r2=737710&view=diff ============================================================================== --- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/ReadOnlyStream.java (original) +++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/ReadOnlyStream.java Mon Jan 26 15:14:33 2009 @@ -18,6 +18,7 @@ import java.io.IOException; import java.io.OutputStream; +import java.nio.ByteBuffer; public class ReadOnlyStream implements Stream { private final Stream parent; @@ -56,6 +57,10 @@ // Ignore this } + public void insert(ByteBuffer buffer) { + // Ignore this + } + public boolean isEndOfStream() { return parent.isEndOfStream(); } @@ -64,6 +69,10 @@ return parent.read(buffer, offset, length); } + public int read(ByteBuffer buffer) { + return parent.read(buffer); + } + public void readAll(OutputStream out) throws IOException { parent.readAll(out); } Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Stream.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Stream.java?rev=737710&r1=737709&r2=737710&view=diff ============================================================================== --- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Stream.java (original) +++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/Stream.java Mon Jan 26 15:14:33 2009 @@ -18,6 +18,7 @@ import java.io.IOException; import java.io.OutputStream; +import java.nio.ByteBuffer; /** * Interface used by a filter to access the stream flowing through a pipeline. @@ -78,6 +79,20 @@ int read(byte[] buffer, int offset, int length); /** + * Read data from the stream into a byte buffer, starting from the + * current position in the stream. + * Calling this method will not modify the current position in + * the stream. + * The number of bytes read is only limited by the number of available + * bytes in the stream and the remaining bytes in the buffer (as returned + * by {...@link ByteBuffer#remaining()}. + * + * @param buffer the buffer into which the data is read + * @return the total number of bytes read into the buffer + */ + int read(ByteBuffer buffer); + + /** * Read all currently available data from the stream and * copy it to an {...@link OutputStream} object. * Calling this method will not modify the current position in @@ -128,6 +143,15 @@ void insert(byte[] buffer, int offset, int length); /** + * Insert the content of a byte buffer at the current position in the stream. + * The logical position after invocation of this method will + * be just after the last inserted byte. + * + * @param buffer the byte buffer containing the sequence to be inserted in the stream + */ + void insert(ByteBuffer buffer); + + /** * Skip the byte at the current position in the stream. * This will increment the current position and copy the byte * to the next filter. Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HttpFilter.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HttpFilter.java?rev=737710&r1=737709&r2=737710&view=diff ============================================================================== --- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HttpFilter.java (original) +++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/http/HttpFilter.java Mon Jan 26 15:14:33 2009 @@ -44,7 +44,7 @@ private int state = STATE_FIRST_LINE; private ContentFilterFactory contentFilterFactory; private EntityProcessor transferDecoder; - private StreamFilter contentFilter; + private StreamFilter[] contentFilterChain; public HttpFilter(boolean decodeTransferEncoding) { this.decodeTransferEncoding = decodeTransferEncoding; @@ -87,8 +87,10 @@ case STATE_HEADER: { if (headerProcessor.process(stream)) { state = STATE_CONTENT; - if (contentFilter != null) { - stream.pushFilter(contentFilter); + if (contentFilterChain != null) { + for (int i=contentFilterChain.length-1; i>=0; i--) { + stream.pushFilter(contentFilterChain[i]); + } } break; } else { @@ -101,8 +103,10 @@ decodeTransferEncoding ? stream : new ReadOnlyStream(stream); if (transferDecoder.process(decoderStream)) { state = STATE_COMPLETE; - if (contentFilter != null) { - stream.popFilter(); + if (contentFilterChain != null) { + for (int i=0; i<contentFilterChain.length; i++) { + stream.popFilter(); + } } } break; @@ -126,7 +130,7 @@ } } else if (name.equalsIgnoreCase("Content-Type")) { if (contentFilterFactory != null) { - contentFilter = contentFilterFactory.getContentFilter(value); + contentFilterChain = contentFilterFactory.getContentFilterChain(value); } } for (Iterator it = handlers.iterator(); it.hasNext(); ) { Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/ContentFilterFactory.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/ContentFilterFactory.java?rev=737710&r1=737709&r2=737710&view=diff ============================================================================== --- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/ContentFilterFactory.java (original) +++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/ContentFilterFactory.java Mon Jan 26 15:14:33 2009 @@ -23,12 +23,12 @@ */ public interface ContentFilterFactory { /** - * Get a new filter for the given content type. + * Get a new filter (chain) for the given content type. * * @param contentType the content type - * @return the filter to apply to the content or - * <code>null</code> if no filter should - * be applied + * @return the filters to apply to the content or + * <code>null</code> (or an empty array) if no + * filter should be applied */ - StreamFilter getContentFilter(String contentType); + StreamFilter[] getContentFilterChain(String contentType); } Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/DefaultContentFilterFactory.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/DefaultContentFilterFactory.java?rev=737710&r1=737709&r2=737710&view=diff ============================================================================== --- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/DefaultContentFilterFactory.java (original) +++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/DefaultContentFilterFactory.java Mon Jan 26 15:14:33 2009 @@ -16,6 +16,17 @@ package org.apache.ws.commons.tcpmon.core.filter.mime; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.activation.MimeType; +import javax.activation.MimeTypeParseException; + +import org.apache.ws.commons.tcpmon.core.filter.CharsetRecoderFilter; import org.apache.ws.commons.tcpmon.core.filter.StreamFilter; import org.apache.ws.commons.tcpmon.core.filter.XmlFormatFilter; @@ -23,16 +34,34 @@ * Default {...@link ContentFilterFactory} implementation. */ public class DefaultContentFilterFactory implements ContentFilterFactory { - public StreamFilter getContentFilter(String contentType) { - int idx = contentType.indexOf(';'); - String baseContentType = (idx == -1 ? contentType : contentType.substring(0, idx)).trim().toLowerCase(); - if (baseContentType.equals("text/xml") || baseContentType.equals("application/xml") - || baseContentType.equals("application/soap+xml") || baseContentType.equals("application/xop+xml")) { - return new XmlFormatFilter(3); - } else if (baseContentType.equals("multipart/related")) { - return new MultipartFilter(this, contentType); - } else { + private static final Set xmlContentTypes = new HashSet(Arrays.asList(new String[] { + "text/xml", "application/xml", "application/soap+xml", "application/xop+xml" })); + private static final Charset UTF8 = Charset.forName("utf-8"); + + public StreamFilter[] getContentFilterChain(String contentType) { + MimeType ctype; + try { + ctype = new MimeType(contentType); + } catch (MimeTypeParseException ex) { return null; } + String baseType = ctype.getBaseType().toLowerCase(); + boolean isXml = xmlContentTypes.contains(baseType); + List filters = new ArrayList(2); + if (isXml || ctype.getPrimaryType().equalsIgnoreCase("text")) { + String charsetName = ctype.getParameter("charset"); + if (charsetName != null) { + Charset charset = Charset.forName(charsetName); + if (!charset.equals(UTF8)) { + filters.add(new CharsetRecoderFilter(charset, UTF8)); + } + } + } + if (isXml) { + filters.add(new XmlFormatFilter(3)); + } else if (baseType.equals("multipart/related")) { + filters.add(new MultipartFilter(this, contentType)); + } + return filters.isEmpty() ? null : (StreamFilter[])filters.toArray(new StreamFilter[filters.size()]); } } Modified: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/MimePartFilter.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/MimePartFilter.java?rev=737710&r1=737709&r2=737710&view=diff ============================================================================== --- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/MimePartFilter.java (original) +++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/main/java/org/apache/ws/commons/tcpmon/core/filter/mime/MimePartFilter.java Mon Jan 26 15:14:33 2009 @@ -26,14 +26,14 @@ */ public class MimePartFilter implements StreamFilter { private HeaderProcessor headerProcessor; - private StreamFilter contentFilter; + private StreamFilter[] contentFilterChain; public MimePartFilter(final ContentFilterFactory contentFilterFactory) { headerProcessor = new HeaderProcessor(); headerProcessor.addHandler(new HeaderHandler() { public String handleHeader(String name, String value) { if (name.equalsIgnoreCase("Content-Type")) { - contentFilter = contentFilterFactory.getContentFilter(value); + contentFilterChain = contentFilterFactory.getContentFilterChain(value); } return value; } @@ -47,8 +47,10 @@ } else { if (headerProcessor.process(stream)) { headerProcessor = null; - if (contentFilter != null) { - stream.pushFilter(contentFilter); + if (contentFilterChain != null) { + for (int i=contentFilterChain.length-1; i>=0; i--) { + stream.pushFilter(contentFilterChain[i]); + } } } else { return; Added: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilterTest.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilterTest.java?rev=737710&view=auto ============================================================================== --- webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilterTest.java (added) +++ webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilterTest.java Mon Jan 26 15:14:33 2009 @@ -0,0 +1,47 @@ +/* + * Copyright 2004,2005 The Apache Software Foundation. + * + * 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.apache.ws.commons.tcpmon.core.filter; + +import junit.framework.TestCase; + +public class CharsetRecoderFilterTest extends TestCase { + private static final String latin1TestString; + + static { + StringBuffer buffer = new StringBuffer(); + for (int i=0; i<20; i++) { + for (char c=32; c<256; c++) { + buffer.append(c); + } + } + latin1TestString = buffer.toString(); + } + + private void test(String s, String fromCharset, String toCharset) throws Exception { + byte[] in = s.getBytes(fromCharset); + byte[] out = TestUtil.filter(new CharsetRecoderFilter(fromCharset, toCharset), in); + assertEquals(s, new String(out, toCharset)); + } + + public void testLatin1ToUTF8() throws Exception { + test(latin1TestString, "iso-8859-1", "utf-8"); + } + + public void testUTF8ToLatin1() throws Exception { + test(latin1TestString, "utf-8", "iso-8859-1"); + } +} Propchange: webservices/commons/trunk/modules/tcpmon/modules/tcpmon-core/src/test/java/org/apache/ws/commons/tcpmon/core/filter/CharsetRecoderFilterTest.java ------------------------------------------------------------------------------ svn:eol-style = native