src/share/jaxws_classes/com/sun/xml/internal/fastinfoset/algorithm/BooleanEncodingAlgorithm.java

Thu, 31 Aug 2017 15:18:52 +0800

author
aoqi
date
Thu, 31 Aug 2017 15:18:52 +0800
changeset 637
9c07ef4934dd
parent 384
8f2986ff0235
parent 0
373ffda63c9a
permissions
-rw-r--r--

merge

     1 /*
     2  * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  *
    25  * THIS FILE WAS MODIFIED BY SUN MICROSYSTEMS, INC.
    26  */
    28 package com.sun.xml.internal.fastinfoset.algorithm;
    31 import java.io.EOFException;
    32 import java.io.IOException;
    33 import java.io.InputStream;
    34 import java.io.OutputStream;
    35 import java.nio.CharBuffer;
    36 import java.util.ArrayList;
    37 import java.util.List;
    39 import com.sun.xml.internal.org.jvnet.fastinfoset.EncodingAlgorithmException;
    40 import com.sun.xml.internal.fastinfoset.CommonResourceBundle;
    43 /**
    44  *
    45  * An encoder for handling boolean values.  Suppports the builtin BOOLEAN encoder.
    46  *
    47  * @author Alan Hudson
    48  * @author Paul Sandoz
    49  *
    50  */
    51 public class BooleanEncodingAlgorithm extends BuiltInEncodingAlgorithm {
    53     /** Table for setting a particular bit of a byte */
    54     private static final int[] BIT_TABLE = {
    55         1 << 7,
    56         1 << 6,
    57         1 << 5,
    58         1 << 4,
    59         1 << 3,
    60         1 << 2,
    61         1 << 1,
    62         1 << 0};
    64     public int getPrimtiveLengthFromOctetLength(int octetLength) throws EncodingAlgorithmException {
    65         // Cannot determine the number of boolean values from just the octet length
    66         throw new UnsupportedOperationException();
    67     }
    69     public int getOctetLengthFromPrimitiveLength(int primitiveLength) {
    70         if (primitiveLength < 5) {
    71             return 1;
    72         } else {
    73             final int div = primitiveLength / 8;
    74             return (div == 0) ? 2 : 1 + div;
    75         }
    76     }
    78     public final Object decodeFromBytes(byte[] b, int start, int length) throws EncodingAlgorithmException {
    79         final int blength = getPrimtiveLengthFromOctetLength(length, b[start]);
    80         boolean[] data = new boolean[blength];
    82         decodeFromBytesToBooleanArray(data, 0, blength, b, start, length);
    83         return data;
    84     }
    86     public final Object decodeFromInputStream(InputStream s) throws IOException {
    87         final List booleanList = new ArrayList();
    89         int value = s.read();
    90         if (value == -1) {
    91             throw new EOFException();
    92         }
    93         final int unusedBits = (value >> 4) & 0xFF;
    95         int bitPosition = 4;
    96         int bitPositionEnd = 8;
    97         int valueNext = 0;
    98         do {
    99             valueNext = s.read();
   100             if (valueNext == -1) {
   101                 bitPositionEnd -= unusedBits;
   102             }
   104             while(bitPosition < bitPositionEnd) {
   105                 booleanList.add(
   106                         Boolean.valueOf((value & BIT_TABLE[bitPosition++]) > 0));
   107             }
   109             value = valueNext;
   110         } while (value != -1);
   112         return generateArrayFromList(booleanList);
   113     }
   115     public void encodeToOutputStream(Object data, OutputStream s) throws IOException {
   116         if (!(data instanceof boolean[])) {
   117             throw new IllegalArgumentException(CommonResourceBundle.getInstance().getString("message.dataNotBoolean"));
   118         }
   120         boolean array[] = (boolean[])data;
   121         final int alength = array.length;
   123         final int mod = (alength + 4) % 8;
   124         final int unusedBits = (mod == 0) ? 0 : 8 - mod;
   126         int bitPosition = 4;
   127         int value = unusedBits << 4;
   128         int astart = 0;
   129         while (astart < alength) {
   130             if (array[astart++]) {
   131                 value |= BIT_TABLE[bitPosition];
   132             }
   134             if (++bitPosition == 8) {
   135                 s.write(value);
   136                 bitPosition = value = 0;
   137             }
   138         }
   140         if (bitPosition != 8) {
   141             s.write(value);
   142         }
   143     }
   145     public final Object convertFromCharacters(char[] ch, int start, int length) {
   146         if (length == 0) {
   147             return new boolean[0];
   148         }
   150         final CharBuffer cb = CharBuffer.wrap(ch, start, length);
   151         final List booleanList = new ArrayList();
   153         matchWhiteSpaceDelimnatedWords(cb,
   154             new WordListener() {
   155                 public void word(int start, int end) {
   156                     if (cb.charAt(start) == 't') {
   157                         booleanList.add(Boolean.TRUE);
   158                     } else {
   159                         booleanList.add(Boolean.FALSE);
   160                     }
   161                 }
   162             }
   163         );
   165         return generateArrayFromList(booleanList);
   166     }
   168     public final void convertToCharacters(Object data, StringBuffer s) {
   169         if (data == null) {
   170             return;
   171         }
   173         final boolean[] value = (boolean[]) data;
   174         if (value.length == 0) {
   175             return;
   176         }
   178         // Insure conservately as all false
   179         s.ensureCapacity(value.length * 5);
   181         final int end = value.length - 1;
   182         for (int i = 0; i <= end; i++) {
   183             if (value[i]) {
   184                 s.append("true");
   185             } else {
   186                 s.append("false");
   187             }
   188             if (i != end) {
   189                 s.append(' ');
   190             }
   191         }
   192     }
   194     public int getPrimtiveLengthFromOctetLength(int octetLength, int firstOctet) throws EncodingAlgorithmException {
   195         final int unusedBits = (firstOctet >> 4) & 0xFF;
   196         if (octetLength == 1) {
   197            if (unusedBits > 3) {
   198                throw new EncodingAlgorithmException(CommonResourceBundle.getInstance().getString("message.unusedBits4"));
   199            }
   200            return 4 - unusedBits;
   201         } else {
   202            if (unusedBits > 7) {
   203                throw new EncodingAlgorithmException(CommonResourceBundle.getInstance().getString("message.unusedBits8"));
   204            }
   205            return octetLength * 8 - 4 - unusedBits;
   206         }
   207     }
   209     public final void decodeFromBytesToBooleanArray(boolean[] bdata, int bstart, int blength, byte[] b, int start, int length) {
   210         int value = b[start++] & 0xFF;
   211         int bitPosition = 4;
   212         final int bend = bstart + blength;
   213         while (bstart < bend) {
   214             if (bitPosition == 8) {
   215                 value = b[start++] & 0xFF;
   216                 bitPosition = 0;
   217             }
   219             bdata[bstart++] = (value & BIT_TABLE[bitPosition++]) > 0;
   220         }
   221     }
   223     public void encodeToBytes(Object array, int astart, int alength, byte[] b, int start) {
   224         if (!(array instanceof boolean[])) {
   225             throw new IllegalArgumentException(CommonResourceBundle.getInstance().getString("message.dataNotBoolean"));
   226         }
   228         encodeToBytesFromBooleanArray((boolean[])array, astart, alength, b, start);
   229     }
   231     public void encodeToBytesFromBooleanArray(boolean[] array, int astart, int alength, byte[] b, int start) {
   232         final int mod = (alength + 4) % 8;
   233         final int unusedBits = (mod == 0) ? 0 : 8 - mod;
   235         int bitPosition = 4;
   236         int value = unusedBits << 4;
   237         final int aend = astart + alength;
   238         while (astart < aend) {
   239             if (array[astart++]) {
   240                 value |= BIT_TABLE[bitPosition];
   241             }
   243             if (++bitPosition == 8) {
   244                 b[start++] = (byte)value;
   245                 bitPosition = value = 0;
   246             }
   247         }
   249         if (bitPosition > 0) {
   250             b[start] = (byte)value;
   251         }
   252     }
   255     /**
   256      *
   257      * Generate a boolean array from a list of Booleans.
   258      *
   259      * @param array The array
   260      *
   261      */
   262     private boolean[] generateArrayFromList(List array) {
   263         boolean[] bdata = new boolean[array.size()];
   264         for (int i = 0; i < bdata.length; i++) {
   265             bdata[i] = ((Boolean)array.get(i)).booleanValue();
   266         }
   268         return bdata;
   269     }
   271 }

mercurial