All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.nifi.jasn1.convert.converters.TbcdStringConverter Maven / Gradle / Ivy

/*
 * 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.nifi.jasn1.convert.converters;

import com.beanit.asn1bean.ber.types.BerOctetString;
import com.beanit.asn1bean.ber.types.BerType;
import org.apache.nifi.jasn1.convert.JASN1Converter;
import org.apache.nifi.jasn1.convert.JASN1TypeAndValueConverter;
import org.apache.nifi.serialization.record.DataType;
import org.apache.nifi.serialization.record.RecordFieldType;

public class TbcdStringConverter implements JASN1TypeAndValueConverter {

    private static final String TBCD_STRING_TYPE = "TBCDSTRING";
    private static final char[] TBCD_SYMBOLS = "0123456789*#abc".toCharArray();
    private static final int FILLER_DECIMAL_CODE = 15;

    @Override
    public boolean supportsType(Class berType) {
        boolean supportsType = BerOctetString.class.isAssignableFrom(berType) && isTbcdString(berType);

        return supportsType;
    }

    @Override
    public DataType convertType(Class berType, JASN1Converter converter) {
        DataType dataType = RecordFieldType.STRING.getDataType();

        return dataType;
    }

    @Override
    public boolean supportsValue(BerType value, DataType dataType) {
        boolean supportsValue = value instanceof BerOctetString && isTbcdString(value.getClass());

        return supportsValue;
    }

    @Override
    public Object convertValue(BerType value, DataType dataType, JASN1Converter converter) {
        final BerOctetString berValue = ((BerOctetString) value);

        byte[] bytes = berValue.value;

        int size = (bytes == null ? 0 : bytes.length);
        StringBuilder resultBuilder = new StringBuilder(2 * size);

        for (int octetIndex = 0; octetIndex < size; ++octetIndex) {
            int octet = bytes[octetIndex];

            int digit2 = (octet >> 4) & 0xF;
            int digit1 = octet & 0xF;

            if (digit1 == FILLER_DECIMAL_CODE) {
                invalidFiller(octetIndex, octet);
            } else if (digit1 > 15) {
                invalidInteger(digit1);
            } else {
                resultBuilder.append(TBCD_SYMBOLS[digit1]);
            }

            if (digit2 == FILLER_DECIMAL_CODE) {
                if (octetIndex != size - 1) {
                    invalidFiller(octetIndex, octet);
                }
            } else if (digit2 > 15) {
                invalidInteger(digit2);
            } else {
                resultBuilder.append(TBCD_SYMBOLS[digit2]);
            }
        }

        return resultBuilder.toString();
    }

    private boolean isTbcdString(Class berType) {
        Class currentType = berType;
        while (currentType != null) {
            if (currentType.getSimpleName().equals(TBCD_STRING_TYPE)) {
                return true;
            }

            currentType = currentType.getSuperclass();
        }

        return false;
    }

    private void invalidFiller(int octetIndex, int octet) {
        throw new NumberFormatException("Illegal filler in octet " + octetIndex + ": " + octet);
    }

    private void invalidInteger(int digit) {
        throw new IllegalArgumentException(
                "Integer should be between 0 - 15 for Telephony Binary Coded Decimal String. Received " + digit);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy