blob: e8e092fc86dc80de2b635348164924c48fe50a09 [file] [log] [blame]
/**
* 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.kerby.xdr.type;
import org.apache.kerby.xdr.XdrDataType;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;
/**
* Xdr Boolean type from RFC 4506
* Boolean type has the same representation as signed integers.
*/
public class XdrBoolean extends XdrSimple<Boolean> {
private static final byte[] TRUE_BYTE = new byte[]
{(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01};
private static final byte[] FALSE_BYTE = new byte[]
{(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
public static final XdrBoolean TRUE = new XdrBoolean(true);
public static final XdrBoolean FALSE = new XdrBoolean(false);
/**
* Default constructor, generally for decoding as a container
*/
public XdrBoolean() {
this(null);
}
/**
* Constructor with a value, generally for encoding of the value
* @param value The boolean value
*/
public XdrBoolean(Boolean value) {
super(XdrDataType.BOOLEAN, value);
}
/**
* The length of a signed integer is 4.
* @return Length of a boolean type.
*/
@Override
protected int encodingBodyLength() {
return 4;
}
/**
* Encode boolean type to bytes.
*/
@Override
protected void toBytes() {
setBytes(getValue() ? TRUE_BYTE : FALSE_BYTE);
}
/**
* Decode bytes to boolean value.
* @throws IOException Wrong bytes for boolean.
*/
@Override
protected void toValue() throws IOException {
if (getBytes().length != 4) {
byte[] boolBytes = ByteBuffer.allocate(4).put(getBytes(), 0, 4).array();
/**reset bytes in case the enum type is in a struct or union*/
setBytes(boolBytes);
}
byte[] bytes = getBytes();
if (Arrays.equals(bytes, TRUE_BYTE)) {
setValue(true);
} else if (Arrays.equals(bytes, FALSE_BYTE)) {
setValue(false);
} else {
throw new IOException("Fail to decode boolean type: " + bytes.toString());
}
}
}