Author: veithen Date: Sun Jul 12 19:01:28 2009 New Revision: 793397 URL: http://svn.apache.org/viewvc?rev=793397&view=rev Log: WSCOMMONS-433: Allow OMText implementations to stream data when serializing a DataHandler as base64 encoded character data.
Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/AbstractBase64OutputStream.java (with props) webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64Constants.java (with props) webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64WriterOutputStream.java (with props) webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/package.html (with props) webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamIOException.java (with props) webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterUtil.java (with props) webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterWriter.java (with props) webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/activation/ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/activation/TestDataSource.java (with props) Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/AbstractBase64OutputStream.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/AbstractBase64OutputStream.java?rev=793397&view=auto ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/AbstractBase64OutputStream.java (added) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/AbstractBase64OutputStream.java Sun Jul 12 19:01:28 2009 @@ -0,0 +1,147 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.axiom.util.base64; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * Base class for {...@link OutputStream} implementations that encode data in base64. + */ +public abstract class AbstractBase64OutputStream extends OutputStream { + private final byte[] in = new byte[3]; + private final byte[] out = new byte[4]; + private int rest; // Number of bytes remaining in the inBuffer + private boolean completed; + + public final void write(byte[] b, int off, int len) throws IOException { + if (completed) { + throw new IOException("Attempt to write data after base64 encoding has been completed"); + } + if (rest > 0) { + while (len > 0 && rest < 3) { + in[rest++] = b[off++]; + len--; + } + if (rest == 3) { + encode(in, 0, 3); + rest = 0; + } + } + while (len >= 3) { + encode(b, off, 3); + off += 3; + len -= 3; + } + while (len > 0) { + in[rest++] = b[off++]; + len--; + } + } + + public final void write(int b) throws IOException { + in[rest++] = (byte)b; + if (rest == 3) { + encode(in, 0, 3); + rest = 0; + } + } + + /** + * Write out any pending data, including padding if necessary. + * + * @throws IOException if an I/O error occurs + */ + public final void complete() throws IOException { + if (!completed) { + if (rest > 0) { + encode(in, 0, rest); + } + flushBuffer(); + completed = true; + } + } + + private void encode(byte[] data, int off, int len) throws IOException { + if (len == 1) { + int i = data[off] & 0xff; + out[0] = Base64Constants.S_BASE64CHAR[i >> 2]; + out[1] = Base64Constants.S_BASE64CHAR[(i << 4) & 0x3f]; + out[2] = Base64Constants.S_BASE64PAD; + out[3] = Base64Constants.S_BASE64PAD; + } else if (len == 2) { + int i = ((data[off] & 0xff) << 8) + (data[off + 1] & 0xff); + out[0] = Base64Constants.S_BASE64CHAR[i >> 10]; + out[1] = Base64Constants.S_BASE64CHAR[(i >> 4) & 0x3f]; + out[2] = Base64Constants.S_BASE64CHAR[(i << 2) & 0x3f]; + out[3] = Base64Constants.S_BASE64PAD; + } else { + int i = ((data[off] & 0xff) << 16) + + ((data[off + 1] & 0xff) << 8) + + (data[off + 2] & 0xff); + out[0] = Base64Constants.S_BASE64CHAR[i >> 18]; + out[1] = Base64Constants.S_BASE64CHAR[(i >> 12) & 0x3f]; + out[2] = Base64Constants.S_BASE64CHAR[(i >> 6) & 0x3f]; + out[3] = Base64Constants.S_BASE64CHAR[i & 0x3f]; + } + doWrite(out); + } + + public final void flush() throws IOException { + flushBuffer(); + doFlush(); + } + + public final void close() throws IOException { + complete(); + doClose(); + } + + /** + * Write base64 encoded data. If necessary, the implementation should accumulate + * the data in a buffer before writing it to the underlying stream. + * + * @param b a byte array of length 4 + * @throws IOException if an I/O error occurs + */ + protected abstract void doWrite(byte[] b) throws IOException; + + /** + * Write any pending data to the underlying stream, if applicable. + * Note that implementations should not flush the underlying stream. + * + * @throws IOException if an I/O error occurs + */ + protected abstract void flushBuffer() throws IOException; + + /** + * Flush the underlying stream, if applicable. + * + * @throws IOException if an I/O error occurs + */ + protected abstract void doFlush() throws IOException; + + /** + * Close the underlying stream, if applicable. + * + * @throws IOException if an I/O error occurs + */ + protected abstract void doClose() throws IOException; +} Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/AbstractBase64OutputStream.java ------------------------------------------------------------------------------ svn:eol-style = native Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64Constants.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64Constants.java?rev=793397&view=auto ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64Constants.java (added) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64Constants.java Sun Jul 12 19:01:28 2009 @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.axiom.util.base64; + +// For internal use only +interface Base64Constants { + byte[] S_BASE64CHAR = { 'A', 'B', 'C', 'D', 'E', 'F', + 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', + 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', + 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', '+', '/' }; + + byte S_BASE64PAD = '='; +} Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64Constants.java ------------------------------------------------------------------------------ svn:eol-style = native Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64WriterOutputStream.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64WriterOutputStream.java?rev=793397&view=auto ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64WriterOutputStream.java (added) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64WriterOutputStream.java Sun Jul 12 19:01:28 2009 @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.axiom.util.base64; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; + +/** + * {...@link OutputStream} implementation that writes base64 encoded data to a {...@link Writer}. + * This class internally buffers the data before writing it to the underlying stream. + */ +public class Base64WriterOutputStream extends AbstractBase64OutputStream { + private final Writer writer; + private final char[] buffer; + private int len; + + /** + * Constructor. + * + * @param writer the stream to write the encoded data to + * @param bufferSize the buffer size to use + */ + public Base64WriterOutputStream(Writer writer, int bufferSize) { + this.writer = writer; + buffer = new char[bufferSize]; + } + + /** + * Constructor that sets the buffer size to its default value of 4096 characters. + * + * @param writer the stream to write the encoded data to + */ + public Base64WriterOutputStream(Writer writer) { + this(writer, 4096); + } + + protected void doWrite(byte[] b) throws IOException { + if (buffer.length - len < 4) { + flushBuffer(); + } + for (int i=0; i<4; i++) { + buffer[len++] = (char)(b[i] & 0xFF); + } + } + + protected void flushBuffer() throws IOException { + writer.write(buffer, 0, len); + len = 0; + } + + protected void doFlush() throws IOException { + writer.flush(); + } + + protected void doClose() throws IOException { + writer.close(); + } +} Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/Base64WriterOutputStream.java ------------------------------------------------------------------------------ svn:eol-style = native Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/package.html URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/package.html?rev=793397&view=auto ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/package.html (added) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/package.html Sun Jul 12 19:01:28 2009 @@ -0,0 +1,5 @@ +<html> +<body> +Contains utility classes to work with base64 encoded data. +</body> +</html> \ No newline at end of file Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/base64/package.html ------------------------------------------------------------------------------ svn:eol-style = native Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamIOException.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamIOException.java?rev=793397&view=auto ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamIOException.java (added) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamIOException.java Sun Jul 12 19:01:28 2009 @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.axiom.util.stax; + +import java.io.IOException; + +import javax.xml.stream.XMLStreamException; + +/** + * {...@link IOException} that wraps an {...@link XMLStreamException}. + */ +public class XMLStreamIOException extends IOException { + private static final long serialVersionUID = -2209565480803762583L; + + /** + * Constructor. + * + * @param cause the {...@link XMLStreamException} to wrap + */ + public XMLStreamIOException(XMLStreamException cause) { + initCause(cause); + } + + /** + * Get the wrapped {...@link XMLStreamException}. + * + * @return the wrapped exception + */ + public XMLStreamException getXMLStreamException() { + return (XMLStreamException)getCause(); + } +} Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamIOException.java ------------------------------------------------------------------------------ svn:eol-style = native Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterUtil.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterUtil.java?rev=793397&view=auto ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterUtil.java (added) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterUtil.java Sun Jul 12 19:01:28 2009 @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.axiom.util.stax; + +import java.io.IOException; + +import javax.activation.DataHandler; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; + +import org.apache.axiom.util.base64.Base64WriterOutputStream; + +/** + * Contains utility methods to work with {...@link XMLStreamWriter} objects. + */ +public class XMLStreamWriterUtil { + /** + * Write base64 encoded data to a stream writer. This will result in one or more + * {...@link javax.xml.stream.XMLStreamConstants#CHARACTERS} events to be written + * to the stream (or zero events if the data handler produces an empty byte sequence), + * i.e. the data is streamed from the data handler directly to the stream writer. + * Since no in-memory base64 representation of the entire binary data is built, this + * method is suitable for very large amounts of data. + * + * @param writer the stream writer to write the data to + * @param dh the data handler containing the data to encode + * @throws IOException if an error occurs when reading the data from the data handler + * @throws XMLStreamException if an error occurs when writing the base64 encoded data to + * the stream + */ + public static void writeBase64(XMLStreamWriter writer, DataHandler dh) + throws IOException, XMLStreamException { + + Base64WriterOutputStream out = new Base64WriterOutputStream( + new XMLStreamWriterWriter(writer)); + try { + dh.writeTo(out); + out.close(); + } catch (XMLStreamIOException ex) { + throw ex.getXMLStreamException(); + } + } +} Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterUtil.java ------------------------------------------------------------------------------ svn:eol-style = native Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterWriter.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterWriter.java?rev=793397&view=auto ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterWriter.java (added) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterWriter.java Sun Jul 12 19:01:28 2009 @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.axiom.util.stax; + +import java.io.IOException; +import java.io.Writer; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; + +/** + * {...@link Writer} implementation that writes data as + * {...@link javax.xml.stream.XMLStreamConstants#CHARACTERS} events to an {...@link XMLStreamWriter}. + * Note that this class + * <ul> + * <li>doesn't buffer the data;</li> + * <li>ignores calls to {...@link #flush()} and {...@link #close()};</li> + * <li>is not thread-safe (synchronized).</li> + * </ul> + * Any {...@link XMLStreamException} occurring in the underlying {...@link XMLStreamWriter} will + * be wrapped using {...@link XMLStreamIOException}. + */ +public class XMLStreamWriterWriter extends Writer { + private final XMLStreamWriter writer; + + /** + * Constructor. + * + * @param writer the XML stream writer to write the events to + */ + public XMLStreamWriterWriter(XMLStreamWriter writer) { + this.writer = writer; + } + + public void write(char[] cbuf, int off, int len) throws IOException { + try { + writer.writeCharacters(cbuf, off, len); + } catch (XMLStreamException ex) { + throw new XMLStreamIOException(ex); + } + } + + public void write(String str, int off, int len) throws IOException { + write(str.substring(off, off+len)); + } + + public void write(String str) throws IOException { + try { + writer.writeCharacters(str); + } catch (XMLStreamException ex) { + throw new XMLStreamIOException(ex); + } + } + + public void write(int c) throws IOException { + write(new char[] { (char)c }); + } + + public void flush() throws IOException { + // Do nothing + } + + public void close() throws IOException { + // Do nothing + } +} Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/XMLStreamWriterWriter.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java?rev=793397&r1=793396&r2=793397&view=diff ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/OMTextTestBase.java Sun Jul 12 19:01:28 2009 @@ -20,8 +20,11 @@ package org.apache.axiom.om; import javax.activation.DataHandler; +import javax.activation.DataSource; import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider; +import org.apache.axiom.util.activation.TestDataSource; +import org.apache.commons.io.output.NullOutputStream; public class OMTextTestBase extends AbstractTestCase { static class TestDataHandlerProvider implements DataHandlerProvider { @@ -82,4 +85,25 @@ assertEquals("Text value mismatch", tempText, textNode.getText()); } + + /** + * Test that when an OMText node is written to an XMLStreamWriter without MTOM support, + * the implementation doesn't construct an in-memory base64 representation of the complete + * binary content, but writes it in chunks (streaming). + * <p> + * Regression test for WSCOMMONS-433. + * + * @throws Exception + */ + public void testBase64Streaming() throws Exception { + OMFactory factory = omMetaFactory.getOMFactory(); + OMElement elem = factory.createOMElement("test", null); + // Create a data source that would eat up all memory when loaded. If the test + // doesn't fail with an OutOfMemoryError, we know that the OMText implementation + // supports streaming. + DataSource ds = new TestDataSource('A', Runtime.getRuntime().maxMemory()); + OMText text = factory.createOMText(new DataHandler(ds), false); + elem.addChild(text); + elem.serialize(new NullOutputStream()); + } } Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/activation/TestDataSource.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/activation/TestDataSource.java?rev=793397&view=auto ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/activation/TestDataSource.java (added) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/activation/TestDataSource.java Sun Jul 12 19:01:28 2009 @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.axiom.util.activation; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.activation.DataSource; + +/** + * Test data source that produces a byte sequence with specified length and with all bytes + * equal to a specified value. + */ +public class TestDataSource implements DataSource { + final int value; + final long length; + + public TestDataSource(int value, long length) { + this.value = value; + this.length = length; + } + + public String getName() { + return null; + } + + public String getContentType() { + return null; + } + + public InputStream getInputStream() throws IOException { + return new InputStream() { + private long position; + + public int read() throws IOException { + if (position == length) { + return -1; + } else { + position++; + return value; + } + } + }; + } + + public OutputStream getOutputStream() throws IOException { + throw new UnsupportedOperationException(); + } +} Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/activation/TestDataSource.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java?rev=793397&r1=793396&r2=793397&view=diff ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/TextNodeImpl.java Sun Jul 12 19:01:28 2009 @@ -34,10 +34,12 @@ import org.apache.axiom.om.impl.builder.XOPBuilder; import org.apache.axiom.om.util.TextHelper; import org.apache.axiom.om.util.UUIDGenerator; +import org.apache.axiom.util.stax.XMLStreamWriterUtil; import org.w3c.dom.DOMException; import org.w3c.dom.Node; import org.w3c.dom.Text; +import javax.activation.DataHandler; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; @@ -496,7 +498,11 @@ writer.writeOptimized(this); writer.writeEndElement(); } else { - writer.writeCharacters(this.getText()); + try { + XMLStreamWriterUtil.writeBase64(writer, (DataHandler)getDataHandler()); + } catch (IOException ex) { + throw new OMException("Error reading data handler", ex); + } } } } Modified: webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java?rev=793397&r1=793396&r2=793397&view=diff ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMTextImpl.java Sun Jul 12 19:01:28 2009 @@ -36,7 +36,9 @@ import org.apache.axiom.om.impl.util.OMSerializerUtil; import org.apache.axiom.om.util.TextHelper; import org.apache.axiom.om.util.UUIDGenerator; +import org.apache.axiom.util.stax.XMLStreamWriterUtil; +import javax.activation.DataHandler; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; @@ -433,12 +435,12 @@ private void internalSerializeLocal(XMLStreamWriter writer2) throws XMLStreamException { - if ((!this.isBinary) || (!this.isOptimized())) { + if (!this.isBinary) { writeOutput(writer2); } else { //check whether we have a MTOMXMLStreamWriter. if so //we can optimize the writing! - if (writer2 instanceof MTOMXMLStreamWriter) { + if (this.isOptimized() && writer2 instanceof MTOMXMLStreamWriter) { MTOMXMLStreamWriter writer = (MTOMXMLStreamWriter) writer2; if (writer.isOptimized() && writer.isOptimizedThreshold(this)) { if (contentID == null) { @@ -451,16 +453,15 @@ this.serializeStartpart(writer); writer.writeOptimized(this); writer.writeEndElement(); - } else { - //do normal base64 - writeOutput(writer); + return; } - } else { - //we do not have a optimized writer. Just do the normal - //base64 writing - writeOutput(writer2); } - + //do normal base64 + try { + XMLStreamWriterUtil.writeBase64(writer2, (DataHandler)getDataHandler()); + } catch (IOException ex) { + throw new OMException("Error reading data handler", ex); + } } }