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

com.epam.deltix.qsrv.hf.codec.EnumAnalyzer Maven / Gradle / Ivy

/*
 * Copyright 2021 EPAM Systems, Inc
 *
 * See the NOTICE file distributed with this work for additional information
 * regarding copyright ownership. 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 com.epam.deltix.qsrv.hf.codec;

import com.epam.deltix.qsrv.hf.pub.md.EnumClassDescriptor;
import com.epam.deltix.qsrv.hf.pub.md.EnumValue;
import com.epam.deltix.util.collections.generated.LongArrayList;
import com.epam.deltix.util.collections.generated.LongToObjectHashMap;
import com.epam.deltix.util.lang.Util;

/**
 * Date: 5/30/12
 *
 * @author BazylevD
 */
public class EnumAnalyzer {
    private static final Class[] ENUM_ALLOWED_CLASSES =
            new Class[]{
                    byte.class, short.class, int.class, long.class, CharSequence.class, String.class,
            };

    private Class enumClass;
    private EnumClassDescriptor ecd;
    private boolean isEncoding;

    private long[] ordinalToSchemaValueMapping;
    private LongToObjectHashMap schemaValueToEnumValueMapping;
    private LongArrayList invalidEnumValues;

    public boolean analyze(Class enumClass, EnumClassDescriptor ecd, boolean isEncoding) {
        this.enumClass = enumClass;
        this.ecd = ecd;
        this.isEncoding = isEncoding;
        boolean hasNotBindingField = false;

        final Object[] enumClassConstants = enumClass.getEnumConstants();
        final EnumValue[] enumValues = ecd.getValues();

        // TODO: if not enum, skip validation ???
        if (Util.indexOf(ENUM_ALLOWED_CLASSES, enumClass) != -1) {
            return false;
        } else if (enumClass.isEnum()) {

            // whether mapping is necessary?

            // compare enum with ECD
            if (isEncoding) { // encoder
                ordinalToSchemaValueMapping = new long[enumClassConstants.length];
                this.invalidEnumValues = new LongArrayList(enumClassConstants.length);

                int         num = enumValues.length;
                final String[] values = new String [num];
                for (int ii = 0; ii < num; ii++)
                    values [ii] = enumValues [ii].symbol.toLowerCase();

                for (int i = 0; i < enumClassConstants.length; i++) {
                    final Object enumValue = enumClassConstants[i];
                    final String value = enumValue.toString().toLowerCase();
                    final int idx = Util.indexOf(values, value);
                    ordinalToSchemaValueMapping[i] = (idx != -1) ? enumValues[idx].value : (-1);
                    if (idx == -1) {
                        hasNotBindingField = (true);
                        this.invalidEnumValues.add(((Enum) enumValue).ordinal());
                    }
                }
            }
            // compare ECD with enum
            else {      // decoder
                schemaValueToEnumValueMapping = new LongToObjectHashMap<>(enumValues.length);

                final String[] values = new String [enumClassConstants.length];
                for (int ii = 0; ii < enumClassConstants.length; ii++)
                    values [ii] = enumClassConstants[ii].toString().toLowerCase();

                for (EnumValue enumValue : enumValues) {
                    @SuppressWarnings ("unchecked")
                    final int idx = Util.indexOf(values, enumValue.symbol.toLowerCase());
                    if (idx != - 1)
                        schemaValueToEnumValueMapping.put(enumValue.value, (Enum) enumClassConstants[idx]);
                    else
                        hasNotBindingField = (true);
                }
            }
        }

        return hasNotBindingField;
    }

    public long[] getEnumMap() {
        return ordinalToSchemaValueMapping;
    }

    public LongArrayList getBindingMap() {
        return invalidEnumValues;
    }

    // return enum values taking into account ECD mapping
    public LongToObjectHashMap getEnumValues() {
        if (enumClass.isEnum()) {
            return schemaValueToEnumValueMapping;
        } else return null;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy