You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by ch...@apache.org on 2005/03/08 09:56:29 UTC
svn commit: r156512 [1/4] - in
webservices/axis/trunk/archive/java/scratch/Thilina: ./ MTOM/ MTOM/lib/
MTOM/src/ MTOM/src/java/ MTOM/src/java/org/ MTOM/src/java/org/apache/
MTOM/src/java/org/apache/axis/ MTOM/src/java/org/apache/axis/encoding/
MTOM/src/java/org/apache/axis/impl/ MTOM/src/java/org/apache/axis/impl/llom/
MTOM/src/java/org/apache/axis/impl/llom/builder/
MTOM/src/java/org/apache/axis/impl/llom/exception/
MTOM/src/java/org/apache/axis/impl/llom/factory/
MTOM/src/java/org/apache/axis/impl/llom/mtom/
MTOM/src/java/org/apache/axis/impl/llom/serialize/
MTOM/src/java/org/apache/axis/impl/llom/traverse/
MTOM/src/java/org/apache/axis/om/ MTOM/src/test-resources/ MTOM/src/test/
MTOM/src/test/org/ MTOM/src/test/org/apache/ MTOM/src/test/org/apache/axis/
MTOM/src/test/org/apache/axis/mtom/
Author: chinthaka
Date: Tue Mar 8 00:56:12 2005
New Revision: 156512
URL: http://svn.apache.org/viewcvs?view=rev&rev=156512
Log:
Applying Thilina's patch on MTOM implementation.
Added:
webservices/axis/trunk/archive/java/scratch/Thilina/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/activation.jar (with props)
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/axis2-core-M1.jar (with props)
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/axis2-om-M1.jar (with props)
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/jsr173_1.0_api.jar (with props)
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/jsr173_1.0_ri.jar (with props)
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/mail.jar (with props)
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/encoding/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/encoding/Base64.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMAttributeImpl.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMDocument.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMElementImpl.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNamedNodeImpl.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNamespaceImpl.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNavigator.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNodeImpl.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMStAXWrapper.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMTextImpl.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/SOAPBodyImpl.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/SOAPEnvelopeImpl.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/SOAPFaultImpl.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/SOAPHeaderBlockImpl.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/SOAPHeaderImpl.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/builder/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/builder/StAXBuilder.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/builder/StAXOMBuilder.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/exception/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/exception/MTOMException.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/exception/OMBuilderException.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/exception/OMSerializerException.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/exception/OMStreamingException.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/exception/XMLStreamException.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/factory/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/factory/OMLinkedListImplFactory.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/mtom/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/mtom/AttachmentPart.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/mtom/ByteArrayDataSource.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/mtom/MIMEBodyPartInputStream.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/mtom/MIMEInputStream.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/mtom/MIMEParser.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/mtom/MTOMBuilder.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/mtom/MTOMXMLStreamWriter.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/mtom/OMBlob.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/serialize/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/serialize/SimpleOMSerializer.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/serialize/StreamingOMSerializer.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/serialize/XMLSerilazer.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/traverse/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/traverse/OMChildrenIterator.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/traverse/OMChildrenQNameIterator.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/FactoryFinder.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMAttribute.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMBody.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMConstants.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMElement.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMEnvelope.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMException.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMFactory.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMFactoryException.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMFault.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMHeader.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMHeaderBlock.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMNamedNode.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMNamespace.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMNode.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMText.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OMXMLParserWrapper.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/OutObject.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/SOAPBody.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/SOAPEnvelope.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/SOAPFault.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/SOAPHeader.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/SOAPHeaderBlock.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/om/StreamingWrapper.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test-resources/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test-resources/OMSerializeBase64Out.txt
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test-resources/OMSerializeMTOMBaseOut.txt
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test-resources/OMSerializeMTOMOut.txt
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test/org/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test/org/apache/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test/org/apache/axis/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test/org/apache/axis/mtom/
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test/org/apache/axis/mtom/MTOMFileTest.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test/org/apache/axis/mtom/MTOMOMSerializeTester.java
webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/test/org/apache/axis/mtom/MtomTesterWhitemesaFile1.java
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/activation.jar
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/activation.jar?view=auto&rev=156512
==============================================================================
Binary file - no diff available.
Propchange: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/activation.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/axis2-core-M1.jar
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/axis2-core-M1.jar?view=auto&rev=156512
==============================================================================
Binary file - no diff available.
Propchange: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/axis2-core-M1.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/axis2-om-M1.jar
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/axis2-om-M1.jar?view=auto&rev=156512
==============================================================================
Binary file - no diff available.
Propchange: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/axis2-om-M1.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/jsr173_1.0_api.jar
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/jsr173_1.0_api.jar?view=auto&rev=156512
==============================================================================
Binary file - no diff available.
Propchange: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/jsr173_1.0_api.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/jsr173_1.0_ri.jar
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/jsr173_1.0_ri.jar?view=auto&rev=156512
==============================================================================
Binary file - no diff available.
Propchange: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/jsr173_1.0_ri.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/mail.jar
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/mail.jar?view=auto&rev=156512
==============================================================================
Binary file - no diff available.
Propchange: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/lib/mail.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/encoding/Base64.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/encoding/Base64.java?view=auto&rev=156512
==============================================================================
--- webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/encoding/Base64.java (added)
+++ webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/encoding/Base64.java Tue Mar 8 00:56:12 2005
@@ -0,0 +1,288 @@
+/*
+ * Copyright 2001-2004 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.axis.encoding;
+
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+
+/**
+ * @author TAMURA Kent <kent@trl.ibm.co.jp>
+ */
+public class Base64 {
+ private static final char[] 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', '+', '/'
+ };
+ private static final char S_BASE64PAD = '=';
+ private static final byte[] S_DECODETABLE = new byte[128];
+
+ static {
+ for (int i = 0; i < S_DECODETABLE.length; i++)
+ S_DECODETABLE[i] = Byte.MAX_VALUE; // 127
+ for (int i = 0; i < S_BASE64CHAR.length; i++) // 0 to 63
+ S_DECODETABLE[S_BASE64CHAR[i]] = (byte) i;
+ }
+
+ private static int decode0(char[] ibuf, byte[] obuf, int wp) {
+ int outlen = 3;
+ if (ibuf[3] == S_BASE64PAD) outlen = 2;
+ if (ibuf[2] == S_BASE64PAD) outlen = 1;
+ int b0 = S_DECODETABLE[ibuf[0]];
+ int b1 = S_DECODETABLE[ibuf[1]];
+ int b2 = S_DECODETABLE[ibuf[2]];
+ int b3 = S_DECODETABLE[ibuf[3]];
+ switch (outlen) {
+ case 1:
+ obuf[wp] = (byte) (b0 << 2 & 0xfc | b1 >> 4 & 0x3);
+ return 1;
+ case 2:
+ obuf[wp++] = (byte) (b0 << 2 & 0xfc | b1 >> 4 & 0x3);
+ obuf[wp] = (byte) (b1 << 4 & 0xf0 | b2 >> 2 & 0xf);
+ return 2;
+ case 3:
+ obuf[wp++] = (byte) (b0 << 2 & 0xfc | b1 >> 4 & 0x3);
+ obuf[wp++] = (byte) (b1 << 4 & 0xf0 | b2 >> 2 & 0xf);
+ obuf[wp] = (byte) (b2 << 6 & 0xc0 | b3 & 0x3f);
+ return 3;
+ default:
+ throw new RuntimeException("internalError00");
+ }
+ }
+
+ /**
+ *
+ */
+ public static byte[] decode(char[] data, int off, int len) {
+ char[] ibuf = new char[4];
+ int ibufcount = 0;
+ byte[] obuf = new byte[len / 4 * 3 + 3];
+ int obufcount = 0;
+ for (int i = off; i < off + len; i++) {
+ char ch = data[i];
+ if (ch == S_BASE64PAD
+ || ch < S_DECODETABLE.length && S_DECODETABLE[ch] != Byte.MAX_VALUE) {
+ ibuf[ibufcount++] = ch;
+ if (ibufcount == ibuf.length) {
+ ibufcount = 0;
+ obufcount += decode0(ibuf, obuf, obufcount);
+ }
+ }
+ }
+ if (obufcount == obuf.length)
+ return obuf;
+ byte[] ret = new byte[obufcount];
+ System.arraycopy(obuf, 0, ret, 0, obufcount);
+ return ret;
+ }
+
+ /**
+ *
+ */
+ public static byte[] decode(String data) {
+ char[] ibuf = new char[4];
+ int ibufcount = 0;
+ byte[] obuf = new byte[data.length() / 4 * 3 + 3];
+ int obufcount = 0;
+ for (int i = 0; i < data.length(); i++) {
+ char ch = data.charAt(i);
+ if (ch == S_BASE64PAD
+ || ch < S_DECODETABLE.length && S_DECODETABLE[ch] != Byte.MAX_VALUE) {
+ ibuf[ibufcount++] = ch;
+ if (ibufcount == ibuf.length) {
+ ibufcount = 0;
+ obufcount += decode0(ibuf, obuf, obufcount);
+ }
+ }
+ }
+ if (obufcount == obuf.length)
+ return obuf;
+ byte[] ret = new byte[obufcount];
+ System.arraycopy(obuf, 0, ret, 0, obufcount);
+ return ret;
+ }
+
+ /**
+ *
+ */
+ public static void decode(char[] data, int off, int len, OutputStream ostream) throws IOException {
+ char[] ibuf = new char[4];
+ int ibufcount = 0;
+ byte[] obuf = new byte[3];
+ for (int i = off; i < off + len; i++) {
+ char ch = data[i];
+ if (ch == S_BASE64PAD
+ || ch < S_DECODETABLE.length && S_DECODETABLE[ch] != Byte.MAX_VALUE) {
+ ibuf[ibufcount++] = ch;
+ if (ibufcount == ibuf.length) {
+ ibufcount = 0;
+ int obufcount = decode0(ibuf, obuf, 0);
+ ostream.write(obuf, 0, obufcount);
+ }
+ }
+ }
+ }
+
+ /**
+ *
+ */
+ public static void decode(String data, OutputStream ostream) throws IOException {
+ char[] ibuf = new char[4];
+ int ibufcount = 0;
+ byte[] obuf = new byte[3];
+ for (int i = 0; i < data.length(); i++) {
+ char ch = data.charAt(i);
+ if (ch == S_BASE64PAD
+ || ch < S_DECODETABLE.length && S_DECODETABLE[ch] != Byte.MAX_VALUE) {
+ ibuf[ibufcount++] = ch;
+ if (ibufcount == ibuf.length) {
+ ibufcount = 0;
+ int obufcount = decode0(ibuf, obuf, 0);
+ ostream.write(obuf, 0, obufcount);
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns base64 representation of specified byte array.
+ */
+ public static String encode(byte[] data) {
+ return encode(data, 0, data.length);
+ }
+
+ /**
+ * Returns base64 representation of specified byte array.
+ */
+ public static String encode(byte[] data, int off, int len) {
+ if (len <= 0) return "";
+ char[] out = new char[len / 3 * 4 + 4];
+ int rindex = off;
+ int windex = 0;
+ int rest = len - off;
+ while (rest >= 3) {
+ int i = ((data[rindex] & 0xff) << 16)
+ + ((data[rindex + 1] & 0xff) << 8)
+ + (data[rindex + 2] & 0xff);
+ out[windex++] = S_BASE64CHAR[i >> 18];
+ out[windex++] = S_BASE64CHAR[(i >> 12) & 0x3f];
+ out[windex++] = S_BASE64CHAR[(i >> 6) & 0x3f];
+ out[windex++] = S_BASE64CHAR[i & 0x3f];
+ rindex += 3;
+ rest -= 3;
+ }
+ if (rest == 1) {
+ int i = data[rindex] & 0xff;
+ out[windex++] = S_BASE64CHAR[i >> 2];
+ out[windex++] = S_BASE64CHAR[(i << 4) & 0x3f];
+ out[windex++] = S_BASE64PAD;
+ out[windex++] = S_BASE64PAD;
+ } else if (rest == 2) {
+ int i = ((data[rindex] & 0xff) << 8) + (data[rindex + 1] & 0xff);
+ out[windex++] = S_BASE64CHAR[i >> 10];
+ out[windex++] = S_BASE64CHAR[(i >> 4) & 0x3f];
+ out[windex++] = S_BASE64CHAR[(i << 2) & 0x3f];
+ out[windex++] = S_BASE64PAD;
+ }
+ return new String(out, 0, windex);
+ }
+
+ /**
+ * Outputs base64 representation of the specified byte array to a byte
+ * stream.
+ */
+ public static void encode(byte[] data, int off, int len, OutputStream ostream) throws IOException {
+ if (len <= 0) return;
+ byte[] out = new byte[4];
+ int rindex = off;
+ int rest = len - off;
+ while (rest >= 3) {
+ int i = ((data[rindex] & 0xff) << 16)
+ + ((data[rindex + 1] & 0xff) << 8)
+ + (data[rindex + 2] & 0xff);
+ out[0] = (byte) S_BASE64CHAR[i >> 18];
+ out[1] = (byte) S_BASE64CHAR[(i >> 12) & 0x3f];
+ out[2] = (byte) S_BASE64CHAR[(i >> 6) & 0x3f];
+ out[3] = (byte) S_BASE64CHAR[i & 0x3f];
+ ostream.write(out, 0, 4);
+ rindex += 3;
+ rest -= 3;
+ }
+ if (rest == 1) {
+ int i = data[rindex] & 0xff;
+ out[0] = (byte) S_BASE64CHAR[i >> 2];
+ out[1] = (byte) S_BASE64CHAR[(i << 4) & 0x3f];
+ out[2] = (byte) S_BASE64PAD;
+ out[3] = (byte) S_BASE64PAD;
+ ostream.write(out, 0, 4);
+ } else if (rest == 2) {
+ int i = ((data[rindex] & 0xff) << 8) + (data[rindex + 1] & 0xff);
+ out[0] = (byte) S_BASE64CHAR[i >> 10];
+ out[1] = (byte) S_BASE64CHAR[(i >> 4) & 0x3f];
+ out[2] = (byte) S_BASE64CHAR[(i << 2) & 0x3f];
+ out[3] = (byte) S_BASE64PAD;
+ ostream.write(out, 0, 4);
+ }
+ }
+
+ /**
+ * Outputs base64 representation of the specified byte array to a character
+ * stream.
+ */
+ public static void encode(byte[] data, int off, int len, Writer writer) throws IOException {
+ if (len <= 0) return;
+ char[] out = new char[4];
+ int rindex = off;
+ int rest = len - off;
+ int output = 0;
+ while (rest >= 3) {
+ int i = ((data[rindex] & 0xff) << 16)
+ + ((data[rindex + 1] & 0xff) << 8)
+ + (data[rindex + 2] & 0xff);
+ out[0] = S_BASE64CHAR[i >> 18];
+ out[1] = S_BASE64CHAR[(i >> 12) & 0x3f];
+ out[2] = S_BASE64CHAR[(i >> 6) & 0x3f];
+ out[3] = S_BASE64CHAR[i & 0x3f];
+ writer.write(out, 0, 4);
+ rindex += 3;
+ rest -= 3;
+ output += 4;
+ if (output % 76 == 0)
+ writer.write("\n");
+ }
+ if (rest == 1) {
+ int i = data[rindex] & 0xff;
+ out[0] = S_BASE64CHAR[i >> 2];
+ out[1] = S_BASE64CHAR[(i << 4) & 0x3f];
+ out[2] = S_BASE64PAD;
+ out[3] = S_BASE64PAD;
+ writer.write(out, 0, 4);
+ } else if (rest == 2) {
+ int i = ((data[rindex] & 0xff) << 8) + (data[rindex + 1] & 0xff);
+ out[0] = S_BASE64CHAR[i >> 10];
+ out[1] = S_BASE64CHAR[(i >> 4) & 0x3f];
+ out[2] = S_BASE64CHAR[(i << 2) & 0x3f];
+ out[3] = S_BASE64PAD;
+ writer.write(out, 0, 4);
+ }
+ }
+}
\ No newline at end of file
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMAttributeImpl.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMAttributeImpl.java?view=auto&rev=156512
==============================================================================
--- webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMAttributeImpl.java (added)
+++ webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMAttributeImpl.java Tue Mar 8 00:56:12 2005
@@ -0,0 +1,78 @@
+package org.apache.axis.impl.llom;
+
+import org.apache.axis.om.OMAttribute;
+import org.apache.axis.om.OMNamespace;
+
+import javax.xml.namespace.QName;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * <p/>
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.
+ * <p/>
+ */
+public class OMAttributeImpl implements OMAttribute {
+
+ private String localName;
+ private String value;
+ private OMNamespace namespace;
+
+ private static String QUOTE_ENTITY = """;
+ private static Matcher matcher = Pattern.compile("\"").matcher(null);
+
+ public OMAttributeImpl(String localName, OMNamespace ns, String value) {
+ setLocalName(localName);
+ setValue(value);
+ setOMNamespace(ns);
+ }
+
+ synchronized static String replaceQuoteWithEntity(String value) {
+ matcher.reset(value);
+ return matcher.replaceAll(QUOTE_ENTITY);
+ }
+
+ public QName getQName() {
+
+
+ String namespaceName = namespace != null ? namespace.getName() : null;
+ return new QName(namespaceName, localName);
+ }
+
+ // -------- Getters and Setters
+ public String getLocalName() {
+ return localName;
+ }
+
+ public void setLocalName(String localName) {
+ this.localName = localName;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public void setOMNamespace(OMNamespace omNamespace) {
+ this.namespace = omNamespace;
+ }
+
+ public OMNamespace getNamespace() {
+ return namespace;
+ }
+
+}
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMDocument.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMDocument.java?view=auto&rev=156512
==============================================================================
--- webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMDocument.java (added)
+++ webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMDocument.java Tue Mar 8 00:56:12 2005
@@ -0,0 +1,52 @@
+package org.apache.axis.impl.llom;
+
+import org.apache.axis.om.OMElement;
+import org.apache.axis.om.OMXMLParserWrapper;
+
+/**
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * <p/>
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.
+ * <p/>
+ */
+public class OMDocument {
+ private OMElement rootElement;
+ private OMXMLParserWrapper parserWrapper;
+
+ /**
+ * @param rootElement
+ * @param parserWrapper
+ */
+ public OMDocument(OMElement rootElement, OMXMLParserWrapper parserWrapper) {
+ this.rootElement = rootElement;
+ this.parserWrapper = parserWrapper;
+ }
+
+ /**
+ * @param parserWrapper
+ */
+ public OMDocument(OMXMLParserWrapper parserWrapper) {
+ this.parserWrapper = parserWrapper;
+ }
+
+ public OMElement getRootElement() {
+ if (rootElement == null) {
+ parserWrapper.next();
+ }
+ return rootElement;
+ }
+
+ public void setRootElement(OMElement rootElement) {
+ this.rootElement = rootElement;
+ }
+}
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMElementImpl.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMElementImpl.java?view=auto&rev=156512
==============================================================================
--- webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMElementImpl.java (added)
+++ webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMElementImpl.java Tue Mar 8 00:56:12 2005
@@ -0,0 +1,372 @@
+package org.apache.axis.impl.llom;
+
+import org.apache.axis.impl.llom.traverse.OMChildrenIterator;
+import org.apache.axis.impl.llom.traverse.OMChildrenQNameIterator;
+import org.apache.axis.om.*;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.ListIterator;
+
+
+/**
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * <p/>
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.
+ * <p/>
+ */
+public class OMElementImpl extends OMNamedNodeImpl implements OMElement {
+
+ private OMNode firstChild;
+ private OMXMLParserWrapper builder;
+ private OMAttributeImpl firstAttribute;
+ private ArrayList namespaces;
+ private ArrayList attributes;
+
+ public OMElementImpl(OMElement parent) {
+ super(parent);
+ done = true;
+ }
+
+
+ public OMElementImpl(String localName, OMNamespace ns) {
+ super(localName, ns, null);
+ done = true;
+ }
+
+
+ public OMElementImpl(String localName, OMNamespace ns, OMElement parent, OMXMLParserWrapper builder) {
+ super(localName, ns, parent);
+ this.builder = builder;
+ }
+
+ /**
+ * This will add child to the element. One can decide whether he append the
+ * child or he adds to the front of the children list
+ *
+ * @param child
+ */
+ public void addChild(OMNode child) {
+ addChild((OMNodeImpl) child);
+ }
+
+ /**
+ * This will search for children with a given QName and will return an
+ * iterator to traverse through the OMNodes. This QName can contain any
+ * combination of prefix, localname and URI
+ *
+ * @param elementQName
+ * @return
+ * @throws org.apache.axis.om.OMException
+ */
+ public Iterator getChildrenWithName(QName elementQName) throws OMException {
+ return new OMChildrenQNameIterator((OMNodeImpl) getFirstChild(), elementQName);
+ }
+
+ private void addChild(OMNodeImpl child) {
+ if (firstChild == null && !done)
+ builder.next();
+ child.setPreviousSibling(null);
+ child.setNextSibling(firstChild);
+ if (firstChild != null) {
+ OMNodeImpl firstChildImpl = (OMNodeImpl) firstChild;
+ firstChildImpl.setPreviousSibling(child);
+ }
+ child.setParent(this);
+// child.setComplete(true);
+ firstChild = child;
+ }
+
+ /**
+ * This will give the next sibling. This can be an OMAttribute for
+ * OMAttribute or OMText or OMELement for others.
+ *
+ * @return
+ * @throws org.apache.axis.om.OMException
+ */
+ public OMNode getNextSibling() throws OMException {
+ while (!done)
+ builder.next();
+ return super.getNextSibling();
+ }
+
+ /**
+ * This returns a collection of this element. Children can be of types
+ * OMElement, OMText.
+ */
+ public Iterator getChildren() {
+ return new OMChildrenIterator(getFirstChild());
+ }
+
+ // --------------------- Namespace Methods ------------------------------------------------------------
+ /**
+ * THis will create a namespace in the current element scope
+ *
+ * @param uri
+ * @param prefix
+ * @return
+ */
+ public OMNamespace declareNamespace(String uri, String prefix) {
+
+ if (namespaces == null) {
+ namespaces = new ArrayList(5);
+ // the default size of the ArrayList is 10. But I think this is too much as on average number of namespaces is
+ // much more than 10. So I selected 5. Hope this is ok as an initial value. -- Eran Chinthaka 13/12/2004
+
+ }
+ OMNamespaceImpl ns = new OMNamespaceImpl(uri, prefix);
+ namespaces.add(ns);
+ return ns;
+ }
+
+ //TODO correct this
+ public void setValue(String value) {
+ OMText txt = OMFactory.newInstance().createText(value);
+ this.addChild(txt);
+ }
+
+ /**
+ * @param namespace
+ * @return
+ */
+ public OMNamespace declareNamespace(OMNamespace namespace) {
+ if (namespaces == null) {
+ namespaces = new ArrayList(5);
+ // the default size of the ArrayList is 10. But I think this is too much as on average number of namespaces is
+ // much more than 10. So I selected 5. Hope this is ok as an initial value. -- Eran Chinthaka 13/12/2004
+
+ }
+ namespaces.add(namespace);
+ return namespace;
+ }
+
+ /**
+ * This will find a namespace with the given uri and prefix, in the scope of
+ * the docuemnt. This will start to find from the current element and goes
+ * up in the hiararchy until this finds one. If none is found, return null
+ *
+ * @param uri
+ * @param prefix
+ * @return
+ * @throws org.apache.axis.om.OMException
+ */
+ public OMNamespace findInScopeNamespace(String uri, String prefix) throws OMException {
+
+ // check in the current element
+ OMNamespace namespace = findDeclaredNamespace(uri, prefix);
+ if (namespace != null) {
+ return namespace;
+ }
+ // go up to check with ancestors
+ if (parent != null)
+ return parent.findInScopeNamespace(uri, prefix);
+ return null;
+ }
+
+ /**
+ * This will ckeck for the namespace <B>only</B> in the current Element
+ *
+ * @param uri
+ * @param prefix
+ * @return
+ * @throws OMException
+ */
+ public OMNamespace findDeclaredNamespace(String uri, String prefix) throws OMException {
+
+ if (namespaces == null) {
+ return null;
+ }
+ // check in the current element
+ ListIterator namespaceListIterator = namespaces.listIterator();
+ if (prefix == null) {
+ while (namespaceListIterator.hasNext()) {
+ OMNamespace omNamespace = (OMNamespace) namespaceListIterator.next();
+ if (omNamespace.getName().equals(uri)) {
+ return omNamespace;
+ }
+ }
+ } else {
+ while (namespaceListIterator.hasNext()) {
+ OMNamespace omNamespace = (OMNamespace) namespaceListIterator.next();
+ if (omNamespace.equals(uri, prefix)) {
+ return omNamespace;
+ }
+ }
+
+ }
+ return null;
+
+ }
+
+ public Iterator getAllDeclaredNamespaces() {
+ if (namespaces == null) {
+
+ // no namespace declared in this element.
+ // return a null iterator
+ // have to look in to this later
+ return new Iterator() {
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean hasNext() {
+ return false;
+ }
+
+ public Object next() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+
+ return namespaces.listIterator();
+ }
+
+ // ---------------------------------------------------------------------------------------------------------------
+
+ /**
+ * This will help to search for an attribute with a given QName within this
+ * Element
+ *
+ * @param qname
+ * @return
+ * @throws org.apache.axis.om.OMException
+ */
+ public OMAttribute getAttributeWithQName(QName qname) throws OMException {
+
+ if (attributes == null) {
+ return null;
+ }
+
+ ListIterator attrIter = attributes.listIterator();
+ OMAttribute omAttribute = null;
+ while (attrIter.hasNext()) {
+ omAttribute = (OMAttribute) attrIter.next();
+ if (omAttribute.getQName().equals(qname)) {
+ return omAttribute;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * This will return a List of OMAttributes
+ *
+ * @return
+ */
+ public Iterator getAttributes() {
+ if (attributes == null) {
+ attributes = new ArrayList(1);
+ }
+ return attributes.listIterator();
+ }
+
+ /**
+ * This will insert attribute to this element. Implementor can decide as to
+ * insert this in the front or at the end of set of attributes
+ *
+ * @param attr
+ */
+ public void insertAttribute(OMAttribute attr) {
+ if (attributes == null) {
+ attributes = new ArrayList(5);
+ }
+ attributes.add(attr);
+ }
+
+ public void removeAttribute(OMAttribute attr) {
+ if (attributes.indexOf(attr) != -1) {
+ attributes.remove(attr);
+ }
+ }
+
+ public void setBuilder(OMXMLParserWrapper wrapper) {
+ this.builder = wrapper;
+ }
+
+ public OMXMLParserWrapper getBuilder() {
+ return builder;
+ }
+
+ /**
+ * This will force the parser to proceed, if parser has not yet finished
+ * with the XML input
+ */
+ public void buildNext() {
+ builder.next();
+ }
+
+ public OMNode getFirstChild() {
+ if (firstChild == null && !done)
+ buildNext();
+ return firstChild;
+ }
+
+
+ public void setFirstChild(OMNode firstChild) {
+ this.firstChild = firstChild;
+ }
+
+
+ /**
+ * This will remove this information item and its children, from the model
+ * completely
+ *
+ * @throws org.apache.axis.om.OMException
+ */
+ public void detach() throws OMException {
+ if (done)
+ super.detach();
+ else
+ builder.discard(this);
+ }
+
+ public boolean isComplete() {
+ return done;
+ }
+
+ /**
+ * This will return the literal value of the node. OMText --> the text
+ * OMElement --> local name of the element in String format OMAttribute -->
+ * the value of the attribue
+ *
+ * @return
+ * @throws org.apache.axis.om.OMException
+ */
+ public String getValue() throws OMException {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * This is to get the type of node, as this is the super class of all the
+ * nodes
+ *
+ * @return
+ * @throws org.apache.axis.om.OMException
+ */
+ public short getType() throws OMException {
+ return OMNode.ELEMENT_NODE;
+ }
+
+ /**
+ *
+ */
+ public XMLStreamReader getPullParser(boolean cacheOff) {
+ if (builder == null && cacheOff)
+ throw new UnsupportedOperationException("This element was not created in a manner to be switched");
+ return new OMStAXWrapper(builder, this, cacheOff);
+ }
+}
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNamedNodeImpl.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNamedNodeImpl.java?view=auto&rev=156512
==============================================================================
--- webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNamedNodeImpl.java (added)
+++ webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNamedNodeImpl.java Tue Mar 8 00:56:12 2005
@@ -0,0 +1,94 @@
+package org.apache.axis.impl.llom;
+
+import org.apache.axis.om.OMElement;
+import org.apache.axis.om.OMException;
+import org.apache.axis.om.OMNamedNode;
+import org.apache.axis.om.OMNamespace;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * <p/>
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.
+ * <p/>
+ */
+public class OMNamedNodeImpl extends OMNodeImpl implements OMNamedNode {
+
+ protected OMNamespace ns;
+ protected String localName;
+
+
+ public OMNamedNodeImpl(String localName, OMNamespace ns, OMElement parent) {
+ super(parent);
+ this.localName = localName;
+ this.ns = ns;
+ }
+
+ public OMNamedNodeImpl(OMElement parent) {
+ super(parent);
+ }
+
+ public String getLocalName() {
+ return localName;
+ }
+
+ public void setLocalName(String localName) {
+ this.localName = localName;
+ }
+
+ public OMNamespace getNamespace() throws OMException {
+ if (ns == null)
+ throw new OMException("all elements in a soap message must be namespace qualified");
+ return ns;
+ }
+
+ public String getNamespaceName() {
+ return ns.getName();
+ }
+
+ /**
+ * @param namespace
+ */
+ public void setNamespace(OMNamespace namespace) {
+ this.ns = namespace;
+ }
+
+
+ public QName getQName() {
+ QName qName = new QName(ns.getName(), localName, ns.getPrefix());
+ return qName;
+ }
+
+// /**
+// * Equals method of QName seems doesn't working the way I need in this situation.
+// * So implementing my own !!
+// *
+// * @param qName
+// * @return
+// */
+// public boolean isQNameEquals(QName qName) {
+// String thatLocalName = qName.getLocalName();
+//
+// return ((thatLocalName == null && this.localName == null) || (thatLocalName != null && thatLocalName.equalsIgnoreCase(this.localName)))
+// && ns.equals(qName.getNamespaceURI(), qName.getPrefix());
+// }
+//
+// private String getStringValue(String s) {
+// if (s == null) {
+// return "null";
+// }
+//
+// return s;
+// }
+}
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNamespaceImpl.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNamespaceImpl.java?view=auto&rev=156512
==============================================================================
--- webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNamespaceImpl.java (added)
+++ webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNamespaceImpl.java Tue Mar 8 00:56:12 2005
@@ -0,0 +1,51 @@
+package org.apache.axis.impl.llom;
+
+import org.apache.axis.om.OMNamespace;
+
+/**
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * <p/>
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.
+ * <p/>
+ */
+public class OMNamespaceImpl implements OMNamespace {
+ private String prefix;
+ private String uri;
+ //private String value;
+
+ /**
+ * @param uri
+ * @param prefix
+ */
+ public OMNamespaceImpl(String uri, String prefix) {
+ this.uri = uri;
+ this.prefix = prefix;
+ }
+
+
+ public boolean equals(String uri, String prefix) {
+ return ((prefix == null && this.prefix == null) || (prefix != null && prefix.equals(this.prefix)))
+ && uri.equals(uri);
+ }
+
+
+ public String getPrefix() {
+ return prefix;
+ }
+
+ public String getName() {
+ return uri;
+ }
+
+
+}
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNavigator.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNavigator.java?view=auto&rev=156512
==============================================================================
--- webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNavigator.java (added)
+++ webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNavigator.java Tue Mar 8 00:56:12 2005
@@ -0,0 +1,158 @@
+/*
+* Copyright 2004 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.
+*
+*/
+
+/*
+* Created on Sep 25, 2004
+*
+
+*/
+package org.apache.axis.impl.llom;
+
+import org.apache.axis.om.OMElement;
+import org.apache.axis.om.OMNode;
+
+/**
+ * Refer to the testClass to find out how to use features like isNavigable,
+ * isComplete and step
+ */
+public class OMNavigator {
+
+ protected OMNode node;
+ private boolean visited;
+ private OMNode next;
+
+ //root is the starting element. Once the navigator comes back to the
+ //root, the traversal is terminated
+ private OMNode root;
+ private boolean backtracked;
+
+ //flags that tell the status of the navigator
+ private boolean end = false;
+ private boolean start = true;
+
+ public OMNavigator() {
+ }
+
+ public OMNavigator(OMNode node) {
+ init(node);
+ }
+
+ public void init(OMNode node) {
+ next = node;
+ root = node;
+ backtracked = false;
+ }
+
+ /**
+ * get the next node
+ *
+ * @return OMnode in the sequence of preorder traversal. Note however that
+ * an element node is treated slightly diffrently. Once the element
+ * is passed it returns the same element in the next encounter as
+ * well
+ */
+ public OMNode next() {
+ if (next == null) {
+ return null;
+ }
+ node = next;
+ visited = backtracked;
+ backtracked = false;
+
+ updateNextNode();
+ //set the starting and ending flags
+ if (root.equals(node)) {
+ if (!start) {
+ end = true;
+ } else {
+ start = false;
+ }
+ }
+
+ return node;
+ }
+
+ /**
+ * Private method to encapsulate the searching logic
+ */
+ private void updateNextNode() {
+ if (next instanceof OMElement && !visited) {
+
+ OMElement e = (OMElement) next;
+ if (e.getFirstChild() != null)
+ next = e.getFirstChild();
+ else if (e.isComplete())
+ backtracked = true;
+ else
+ next = null;
+
+ } else {
+ OMNode nextSibling = next.getNextSibling();
+ OMNode parent = next.getParent();
+
+ if (nextSibling != null)
+ next = nextSibling;
+ else if (parent != null && parent.isComplete()) {
+ next = parent;
+ backtracked = true;
+ } else
+ next = null;
+ }
+ }
+
+
+ public boolean visited() {
+ return visited;
+ }
+
+ /**
+ * This is a very special method. This allows the navigator to step once it
+ * has reached the existing om. At this point the isNavigable method will
+ * return false but the isComplete method may return false which means that
+ * the navigating the given element is not complete but the navigator cannot
+ * proceed
+ */
+ public void step() {
+ if (!end) {
+ next = node;
+ updateNextNode();
+ }
+ }
+
+ /**
+ * the navigable status
+ *
+ * @return
+ */
+ public boolean isNavigable() {
+ if (end)
+ return false;
+ else if (next == null)
+ return false;
+ else
+ return true;
+ }
+
+ /**
+ * The completed status
+ *
+ * @return
+ */
+ public boolean isCompleted() {
+ return end;
+ }
+}
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNodeImpl.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNodeImpl.java?view=auto&rev=156512
==============================================================================
--- webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNodeImpl.java (added)
+++ webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMNodeImpl.java Tue Mar 8 00:56:12 2005
@@ -0,0 +1,202 @@
+package org.apache.axis.impl.llom;
+
+import org.apache.axis.om.OMElement;
+import org.apache.axis.om.OMException;
+import org.apache.axis.om.OMNode;
+
+/**
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * <p/>
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.
+ * <p/>
+ */
+public class OMNodeImpl implements OMNode {
+ protected OMElementImpl parent;
+ protected OMNodeImpl nextSibling;
+ protected OMNodeImpl previousSibling;
+ protected String value;
+ protected boolean done = false;
+ protected short nodeType;
+
+ public OMNodeImpl() {
+ }
+
+
+ /**
+ * For a node to exist there must be a parent
+ *
+ * @param parent
+ */
+
+
+ public OMNodeImpl(OMElement parent) {
+ if (parent instanceof OMNodeImpl)
+ this.parent = (OMElementImpl) parent;
+ }
+
+ /**
+ * This method should return the immediate parent of the node. Parent is
+ * always an Element
+ *
+ * @return
+ * @throws org.apache.axis.om.OMException
+ */
+ public OMElement getParent() throws OMException {
+ return parent;
+ }
+
+ public void setParent(OMElement element) {
+ if (element instanceof OMNodeImpl)
+ this.parent = (OMElementImpl) element;
+ }
+
+ /**
+ * This will give the next sibling. This can be an OMAttribute for
+ * OMAttribute or OMText or OMELement for others.
+ *
+ * @return
+ * @throws org.apache.axis.om.OMException
+ */
+ public OMNode getNextSibling() throws OMException {
+ if (nextSibling == null && parent != null && !parent.isComplete())
+ parent.buildNext();
+ return nextSibling;
+ }
+
+ public void setNextSibling(OMNode node) {
+ this.nextSibling = (OMNodeImpl) node;
+ }
+
+ /**
+ * This will return the literal value of the node. OMText --> the text
+ * OMElement --> local name of the element in String format OMAttribute -->
+ * the value of the attribue
+ *
+ * @return
+ * @throws org.apache.axis.om.OMException
+ */
+ public String getValue() throws OMException {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ /**
+ * this will indicate whether parser has parsed this information item
+ * completely or not. If somethings info are not available in the item, one
+ * has to check this attribute to make sure that, this item has been parsed
+ * completely or not.
+ *
+ * @return
+ */
+ public boolean isComplete() {
+ return true;
+ }
+
+ public void setComplete(boolean state) {
+ this.done = state;
+ }
+
+ /**
+ * This will remove this information item and its children, from the model
+ * completely
+ *
+ * @throws org.apache.axis.om.OMException
+ */
+ public void detach() throws OMException {
+ if (parent == null)
+ throw new OMException();
+ OMNodeImpl nextSibling = (OMNodeImpl) getNextSibling();
+ if (previousSibling == null)
+ parent.setFirstChild(nextSibling);
+ else
+ previousSibling.setNextSibling(nextSibling);
+ if (nextSibling != null)
+ nextSibling.setPreviousSibling(previousSibling);
+
+ }
+
+ /**
+ * This will insert a sibling just after the current information item.
+ *
+ * @param sibling
+ * @throws org.apache.axis.om.OMException
+ */
+ public void insertSiblingAfter(OMNode sibling) throws OMException {
+ if (parent == null)
+ throw new OMException();
+ sibling.setParent(parent);
+
+ if (sibling instanceof OMNodeImpl) {
+ OMNodeImpl siblingImpl = (OMNodeImpl) sibling;
+ if (nextSibling == null)
+ getNextSibling();
+ siblingImpl.setPreviousSibling(this);
+ if (nextSibling != null)
+ nextSibling.setPreviousSibling(sibling);
+ sibling.setNextSibling(nextSibling);
+ nextSibling = siblingImpl;
+ }
+
+ }
+
+ /**
+ * This will insert a sibling just before the current information item
+ *
+ * @param sibling
+ * @throws org.apache.axis.om.OMException
+ */
+ public void insertSiblingBefore(OMNode sibling) throws OMException {
+ if (parent == null)
+ throw new OMException();
+ sibling.setParent(parent);
+
+ if (sibling instanceof OMNodeImpl) {
+ OMNodeImpl siblingImpl = (OMNodeImpl) sibling;
+ siblingImpl.setPreviousSibling(previousSibling);
+ siblingImpl.setNextSibling(this);
+ if (previousSibling == null)
+ parent.setFirstChild(siblingImpl);
+ else
+ previousSibling.setNextSibling(siblingImpl);
+ previousSibling = siblingImpl;
+ }
+ }
+
+ /**
+ * This is to get the type of node, as this is the super class of all the
+ * nodes
+ *
+ * @return
+ * @throws org.apache.axis.om.OMException
+ */
+ public short getType() throws OMException {
+ return nodeType;
+ }
+
+ public void setType(short nodeType) throws OMException {
+ this.nodeType = nodeType;
+ }
+
+ public OMNode getPreviousSibling() {
+ return previousSibling;
+ }
+
+ public void setPreviousSibling(OMNode previousSibling) {
+ this.previousSibling = (OMNodeImpl) previousSibling;
+ }
+
+
+}
Added: webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMStAXWrapper.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMStAXWrapper.java?view=auto&rev=156512
==============================================================================
--- webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMStAXWrapper.java (added)
+++ webservices/axis/trunk/archive/java/scratch/Thilina/MTOM/src/java/org/apache/axis/impl/llom/OMStAXWrapper.java Tue Mar 8 00:56:12 2005
@@ -0,0 +1,865 @@
+package org.apache.axis.impl.llom;
+
+import org.apache.axis.impl.llom.exception.OMStreamingException;
+import org.apache.axis.om.*;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import java.util.Iterator;
+import java.util.Stack;
+
+/**
+ * Copyright 2001-2004 The Apache Software Foundation.
+ * <p/>
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.
+ */
+
+/**
+ * Note - This class also implements the streaming constants interface to get
+ * access to the StAX constants
+ */
+public class OMStAXWrapper implements XMLStreamReader, XMLStreamConstants {
+
+
+ private OMNavigator navigator;
+ private OMXMLParserWrapper builder;
+ private XMLStreamReader parser;
+ private OMNode rootNode;
+ private boolean isFirst = true;
+ //the boolean flag that keeps the state of the document!
+ private boolean complete = false;
+
+
+ private int currentEvent = 0;
+ // navigable means the output should be taken from the navigator
+ // as soon as the navigator returns a null navigable will be reset
+ //to false and the subsequent events will be taken from the builder
+ //or the parser directly
+ private boolean navigable = true;
+
+ // SwitchingAllowed is set to false by default
+ // this means that unless the user explicitly states
+ // that he wants things not to be cached, everything will
+ // be cached
+ boolean switchingAllowed = false;
+
+ private Stack elementStack = new Stack();
+
+ //keeps the next event. The parser actually keeps one step ahead to
+ //detect the end of navigation. (at the end of the stream the navigator
+ //returns a null
+ private OMNode nextNode = null;
+
+ //holder for the current node. Needs this to generate events from the current node
+ private OMNode currentNode = null;
+
+ //needs this to refer to the last known node
+ private OMNode lastNode = null;
+
+ private boolean switched = false;
+
+ public void setAllowSwitching(boolean b) {
+ this.switchingAllowed = b;
+ }
+
+ public boolean isAllowSwitching() {
+ return switchingAllowed;
+ }
+
+ /**
+ * When constructing the OMStaxWrapper, the creator must produce the builder
+ * (an instance of the OMXMLparserWrapper of the input) and the Element Node
+ * to start parsing. The wrapper wil parse(proceed) until the end of the
+ * given element. hence care should be taken to pass the root element if the
+ * entire document is needed
+ */
+ OMStAXWrapper(OMXMLParserWrapper builder, OMElement startNode) {
+ this(builder, startNode, false);
+ }
+
+ OMStAXWrapper(OMXMLParserWrapper builder, OMElement startNode, boolean cacheOff) {
+ //create a navigator
+ this.navigator = new OMNavigator(startNode);
+ this.builder = builder;
+ this.rootNode = startNode;
+ //initaite the next and current nodes
+ //Note - navigator is written in such a way that it first
+ //returns the starting node at the first call to it
+ currentNode = navigator.next();
+ nextNode = navigator.next();
+ switchingAllowed = cacheOff;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getPrefix()
+ */
+ public String getPrefix() {
+ String returnStr = null;
+ if (currentEvent == START_ELEMENT || currentEvent == END_ELEMENT) {
+ if (navigable) {
+ OMNamespace ns = ((OMElement) lastNode).getNamespace();
+ returnStr = ns == null ? null : ns.getPrefix();
+ } else {
+ returnStr = parser.getPrefix();
+ }
+ }
+ return returnStr;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getNamespaceURI()
+ */
+ public String getNamespaceURI() {
+ String returnStr = null;
+ if (currentEvent == START_ELEMENT || currentEvent == END_ELEMENT || currentEvent == NAMESPACE) {
+ if (navigable) {
+ OMNamespace ns = ((OMElement) lastNode).getNamespace();
+ returnStr = ns == null ? null : ns.getName();
+ } else {
+ returnStr = parser.getNamespaceURI();
+ }
+ }
+
+ return returnStr;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#hasName()
+ */
+ public boolean hasName() {
+ if (currentEvent == START_ELEMENT || currentEvent == END_ELEMENT) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getLocalName()
+ */
+ public String getLocalName() {
+ String returnStr = null;
+ if (currentEvent == START_ELEMENT || currentEvent == END_ELEMENT || currentEvent == ENTITY_REFERENCE) {
+ if (navigable) {
+ returnStr = ((OMElement) lastNode).getLocalName();
+ } else {
+ returnStr = parser.getLocalName();
+ }
+ }
+ return returnStr;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getName()
+ */
+ public QName getName() {
+ QName returnName = null;
+ if (currentEvent == START_ELEMENT || currentEvent == END_ELEMENT) {
+ if (navigable) {
+ returnName = getQName((OMNamedNode) lastNode);
+ } else {
+ returnName = parser.getName();
+ }
+ }
+ return returnName;
+ }
+
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#hasText()
+ */
+ public boolean hasText() {
+ return (currentEvent == CHARACTERS ||
+ currentEvent == DTD ||
+ currentEvent == ENTITY_REFERENCE ||
+ currentEvent == COMMENT ||
+ currentEvent == SPACE);
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getTextLength()
+ */
+ public int getTextLength() {
+ int returnLength = 0;
+ if (hasText()) {
+ if (navigable) {
+ OMText textNode = (OMText) lastNode;
+ returnLength = textNode.getValue().length();
+ } else {
+ returnLength = parser.getTextLength();
+ }
+
+ }
+ return returnLength;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getTextStart()
+ */
+ public int getTextStart() {
+ int returnLength = 0;
+ if (hasText()) {
+ if (!navigable) {
+ returnLength = parser.getTextStart();
+ }
+ //Note - this has no relevant method in the OM
+ }
+ return returnLength;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getTextCharacters(int, char[], int,
+ * int)
+ */
+ public int getTextCharacters(int i, char[] chars, int i1, int i2) throws XMLStreamException {
+ int returnLength = 0;
+ if (hasText()) {
+ if (!navigable) {
+ try {
+ returnLength = parser.getTextCharacters(i, chars, i1, i2);
+ } catch (XMLStreamException e) {
+ throw new OMStreamingException(e);
+ }
+ }
+ //Note - this has no relevant method in the OM
+ }
+ return returnLength;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getTextCharacters()
+ */
+ public char[] getTextCharacters() {
+ char[] returnArray = null;
+ if (hasText()) {
+ if (navigable) {
+ OMText textNode = (OMText) lastNode;
+ String str = textNode.getValue();
+ returnArray = str.toCharArray();
+ } else {
+ returnArray = parser.getTextCharacters();
+ }
+
+ }
+ return returnArray;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getText()
+ */
+ public String getText() {
+ String returnString = null;
+ if (hasText()) {
+ if (navigable) {
+ OMText textNode = (OMText) lastNode;
+ returnString = textNode.getValue();
+ } else {
+ returnString = parser.getText();
+ }
+ }
+ return returnString;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getEventType()
+ */
+ //todo this should be improved
+ public int getEventType() {
+ return currentEvent;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getNamespaceURI
+ */
+ public String getNamespaceURI(int i) {
+ String returnString = null;
+ if (isStartElement() || isEndElement() || currentEvent == NAMESPACE) {
+ if (navigable) {
+ OMNamespace ns = (OMNamespace) getItemFromIterator(((OMElement) lastNode).getAllDeclaredNamespaces(), i);
+ returnString = ns == null ? null : ns.getName();
+ } else {
+ returnString = parser.getNamespaceURI(i);
+ }
+ }
+ return returnString;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getNamespacePrefix
+ */
+ public String getNamespacePrefix(int i) {
+ String returnString = null;
+ if (isStartElement() || isEndElement() || currentEvent == NAMESPACE) {
+ if (navigable) {
+ OMNamespace ns = (OMNamespace) getItemFromIterator(((OMElement) lastNode).getAllDeclaredNamespaces(), i);
+ returnString = ns == null ? null : ns.getPrefix();
+ } else {
+ returnString = parser.getNamespacePrefix(i);
+ }
+ }
+ return returnString;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getNamespaceCount()
+ */
+ public int getNamespaceCount() {
+ int returnCount = 0;
+ if (isStartElement() || isEndElement() || currentEvent == NAMESPACE) {
+ if (navigable) {
+ returnCount = getCount(((OMElement) lastNode).getAllDeclaredNamespaces());
+ } else {
+ returnCount = parser.getNamespaceCount();
+ }
+ }
+ return returnCount;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#isAttributeSpecified
+ */
+ public boolean isAttributeSpecified(int i) {
+ boolean returnValue = false;
+ if (isStartElement() || currentEvent == ATTRIBUTE) {
+ if (navigable) {
+ //theres nothing to be returned here
+ } else {
+ returnValue = parser.isAttributeSpecified(i);
+ }
+ } else {
+ throw new IllegalStateException("attribute type accessed in illegal event!");
+ }
+ return returnValue;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getAttributeValue
+ */
+ public String getAttributeValue(int i) {
+ String returnString = null;
+ if (isStartElement() || currentEvent == ATTRIBUTE) {
+ if (navigable) {
+ OMAttribute attrib = getAttribute((OMElement) lastNode, i);
+ if (attrib != null) {
+ returnString = attrib.getValue();
+ }
+ } else {
+ returnString = parser.getAttributeValue(i);
+ }
+ } else {
+ throw new IllegalStateException("attribute type accessed in illegal event!");
+ }
+ return returnString;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getAttributeType
+ */
+ public String getAttributeType(int i) {
+ String returnString = null;
+ if (isStartElement() || currentEvent == ATTRIBUTE) {
+ if (navigable) {
+ //todo implement this
+ } else {
+ returnString = parser.getAttributeType(i);
+ }
+ } else {
+ throw new IllegalStateException("attribute type accessed in illegal event!");
+ }
+ return returnString;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getAttributePrefix
+ */
+ public String getAttributePrefix(int i) {
+ String returnString = null;
+ if (isStartElement() || currentEvent == ATTRIBUTE) {
+ if (navigable) {
+ OMAttribute attrib = getAttribute((OMElement) lastNode, i);
+ if (attrib != null) {
+ OMNamespace nameSpace = attrib.getNamespace();
+ if (nameSpace != null) {
+ returnString = nameSpace.getPrefix();
+ }
+ }
+ } else {
+ returnString = parser.getAttributePrefix(i);
+ }
+ } else {
+ throw new IllegalStateException("attribute prefix accessed in illegal event!");
+ }
+ return returnString;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getAttributeLocalName
+ */
+ public String getAttributeLocalName(int i) {
+ String returnString = null;
+ if (isStartElement() || currentEvent == ATTRIBUTE) {
+ if (navigable) {
+ OMAttribute attrib = getAttribute((OMElement) lastNode, i);
+ if (attrib != null)
+ returnString = attrib.getLocalName();
+
+ } else {
+ returnString = parser.getAttributeLocalName(i);
+ }
+ } else {
+ throw new IllegalStateException("attribute localName accessed in illegal event!");
+ }
+ return returnString;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getAttributeNamespace
+ */
+ public String getAttributeNamespace(int i) {
+ String returnString = null;
+ if (isStartElement() || currentEvent == ATTRIBUTE) {
+ if (navigable) {
+ OMAttribute attrib = getAttribute((OMElement) lastNode, i);
+ if (attrib != null) {
+ OMNamespace nameSpace = attrib.getNamespace();
+ if (nameSpace != null) {
+ returnString = nameSpace.getName();
+ }
+ }
+ } else {
+ returnString = parser.getAttributeNamespace(i);
+ }
+ } else {
+ throw new IllegalStateException("attribute nameSpace accessed in illegal event!");
+ }
+ return returnString;
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getAttributeName
+ */
+ public QName getAttributeName(int i) {
+ QName returnQName = null;
+ if (isStartElement() || currentEvent == ATTRIBUTE) {
+ if (navigable) {
+ returnQName = getAttribute((OMElement) lastNode, i).getQName();
+ } else {
+ returnQName = parser.getAttributeName(i);
+ }
+ } else {
+ throw new IllegalStateException("attribute count accessed in illegal event!");
+ }
+ return returnQName;
+ }
+
+ /**
+ * @return
+ * @see javax.xml.stream.XMLStreamReader#getAttributeCount
+ */
+ public int getAttributeCount() {
+ int returnCount = 0;
+ if (isStartElement() || currentEvent == ATTRIBUTE) {
+ if (navigable) {
+ OMElement elt = (OMElement) lastNode;
+ returnCount = getCount(elt.getAttributes());
+ } else {
+ returnCount = parser.getAttributeCount();
+ }
+
+ } else {
+ throw new IllegalStateException("attribute count accessed in illegal event!");
+ }
+
+ return returnCount;
+ }
+
+
+ //todo
+ public String getAttributeValue(String s, String s1) {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean isWhiteSpace() {
+ boolean b;
+ if (navigable) {
+ b = (currentEvent == SPACE);
+ } else {
+ b = parser.isWhiteSpace();
+ }
+
+ return b;
+ }
+
+ public boolean isCharacters() {
+ boolean b;
+ if (navigable) {
+ b = (currentEvent == CHARACTERS);
+ } else {
+ b = parser.isCharacters();
+ }
+ return b;
+ }
+
+ public boolean isEndElement() {
+ boolean b;
+ if (navigable) {
+ b = (currentEvent == END_ELEMENT);
+ } else {
+ b = parser.isEndElement();
+ }
+ return b;
+ }
+
+ /**
+ * @param i
+ * @param s
+ * @param s1
+ * @throws XMLStreamException
+ * @see javax.xml.stream.XMLStreamReader#require(int, String, String)
+ */
+ public void require(int i, String s, String s1) throws XMLStreamException {
+ throw new XMLStreamException();
+ }
+
+ public boolean isStartElement() {
+ boolean b;
+ if (navigable) {
+ b = (currentEvent == START_ELEMENT);
+ } else {
+ b = parser.isStartElement();
+ }
+ return b;
+ }
+
+ public String getNamespaceURI(String s) {
+ String returnString = null;
+ if (isStartElement() || isEndElement() || currentEvent == NAMESPACE) {
+ if (navigable) {
+ //Nothing to do here! How to get the namespacace references
+ } else {
+ returnString = parser.getNamespaceURI(s);
+ }
+ }
+ return returnString;
+ }
+
+ public void close() throws XMLStreamException {
+ //this doesnot mean anything with respect to the OM
+ if (!navigable) {
+ parser.close();
+
+ }
+
+ }
+
+ public boolean hasNext() throws XMLStreamException {
+ return !complete;
+ }
+
+ /**
+ * Not implemented yet
+ *
+ * @return
+ * @throws org.apache.axis.impl.llom.exception.OMStreamingException
+ *
+ */
+ public int nextTag() throws XMLStreamException {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @see javax.xml.stream.XMLStreamReader#getElementText()
+ */
+ public String getElementText() throws XMLStreamException {
+
+ String returnText = "";
+
+ if (navigable) {
+ if (currentNode.getType() == OMNode.ELEMENT_NODE) {
+ //todo complete this
+ return null;
+ }
+ } else {
+ try {
+ returnText = parser.getElementText();
+ } catch (XMLStreamException e) {
+ throw new OMStreamingException(e);
+ }
+ }
+ return returnText;
+ }
+
+ public int next() throws XMLStreamException {
+
+ if (complete) {
+ throw new OMStreamingException("Parser completed!");
+ }
+
+ if (switched) {
+ //set navigable to false.Now the subsequent requests will be directed to
+ //the parser
+ navigable = false;
+ }
+ if (navigable) {
+ currentEvent = generateEvents(currentNode);
+ updateCompleteStatus();
+ updateNextNode();
+ } else {
+ currentEvent = builder.next();
+ updateCompleteStatus();
+ }
+ return currentEvent;
+ }
+
+ public Object getProperty(String s) throws IllegalArgumentException {
+ throw new UnsupportedOperationException();
+ }
+
+
+ /**
+ * This is a very important method. this keeps the navigator one step ahead
+ * and pushes the navigator one event ahead. If the nextNode is null then
+ * navigable is set to false; At the same time the parser and builder are
+ * set up for the upcoming event generation
+ */
+ private void updateNextNode() throws XMLStreamException {
+ lastNode = currentNode;
+ currentNode = nextNode;
+
+ if (navigator.isNavigable()) {
+ nextNode = navigator.next();
+ } else {
+ if (!switchingAllowed) {
+ if (navigator.isCompleted()) {
+ nextNode = null;
+ } else {
+ builder.next();
+ navigator.step();
+ nextNode = navigator.next();
+ }
+ } else {
+ //reset caching (the default is ON so it was not needed in the
+ //earlier case!
+ builder.setCache(false);
+ //load the parser
+ try {
+ parser = (XMLStreamReader) builder.getParser();
+ } catch (ClassCastException e) {
+ throw new XMLStreamException("incompatible parser found!", e);
+ }
+
+ switched = true;
+
+
+ }
+ }
+ }
+
+ private void updateCompleteStatus() {
+
+ if (!navigable) {
+ complete = (currentEvent == END_DOCUMENT);
+ } else {
+ if (rootNode.equals(currentNode))
+ if (isFirst)
+ isFirst = false;
+ else
+ complete = true;
+ }
+ }
+
+
+ public NamespaceContext getNamespaceContext() {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getEncoding() {
+ throw new UnsupportedOperationException();
+ }
+
+ public Location getLocation() {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getVersion() {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean isStandalone() {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean standaloneSet() {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getCharacterEncodingScheme() {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getPITarget() {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getPIData() {
+ throw new UnsupportedOperationException();
+ }
+
+ /*
+
+ ################################################################
+ Generator methods for the OMNodes returned by the navigator
+ ################################################################
+
+ */
+
+ private int generateEvents(OMNode node) {
+ int returnEvent = 0;
+
+ int nodeType = node.getType();
+ switch (nodeType) {
+ case OMNode.ELEMENT_NODE:
+ returnEvent = generateElementEvents((OMElement) node);
+ break;
+ case OMNode.TEXT_NODE:
+ returnEvent = generateTextEvents();
+ break;
+ case OMNode.COMMENT_NODE:
+ returnEvent = generateCommentEvents();
+ break;
+ case OMNode.CDATA_SECTION_NODE:
+ returnEvent = generateCdataEvents();
+ break;
+ default:
+ break; //just ignore any other nodes
+ }
+
+ return returnEvent;
+ }
+
+
+ private int generateElementEvents(OMElement elt) {
+ int returnValue = START_ELEMENT;
+ if (!elementStack.isEmpty() && elementStack.peek().equals(elt)) {
+ returnValue = END_ELEMENT;
+ elementStack.pop();
+ } else {
+ elementStack.push(elt);
+ }
+ return returnValue;
+ }
+
+
+ private int generateTextEvents() {
+ return CHARACTERS;
+ }
+
+ private int generateCommentEvents() {
+ return COMMENT;
+ }
+
+ private int generateCdataEvents() {
+ return CDATA;
+ }
+
+ /*
+ ####################################################################
+ Other helper methods
+ ####################################################################
+ */
+
+ /**
+ * helper method
+ *
+ * @param it
+ * @return
+ */
+ private int getCount(Iterator it) {
+ int count = 0;
+ if (it != null) {
+ while (it.hasNext()) {
+ it.next();
+ count++;
+ }
+ }
+ return count;
+ }
+
+ /**
+ * Helper method
+ *
+ * @param it
+ * @param index
+ * @return
+ */
+ private Object getItemFromIterator(Iterator it, int index) {
+ int count = 0;
+ Object returnObject = null;
+ boolean found = false;
+ if (it != null) {
+ while (it.hasNext()) {
+ returnObject = it.next();
+ if (index == count++) {
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if (found) {
+ return returnObject;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Helper method
+ *
+ * @param namedNode
+ * @return
+ */
+ private QName getQName(OMNamedNode namedNode) {
+ QName returnName;
+ OMNamespace ns = namedNode.getNamespace();
+ String localPart = namedNode.getLocalName();
+ if (ns != null) {
+ String prefix = ns.getPrefix();
+ String uri = ns.getName();
+ if (prefix == null || prefix.equals(""))
+ returnName = new QName(uri, localPart);
+ else
+ returnName = new QName(uri, localPart, prefix);
+ } else {
+ returnName = new QName(localPart);
+ }
+ return returnName;
+ }
+
+ /**
+ * @param elt
+ * @param index
+ * @return
+ */
+ private OMAttribute getAttribute(OMElement elt, int index) {
+ OMAttribute returnAttrib = null;
+ if (elt != null) {
+ returnAttrib = (OMAttribute) getItemFromIterator(elt.getAttributes(), index);
+ }
+ return returnAttrib;
+ }
+}