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

nablarch.test.core.util.ByteArrayAwareMap Maven / Gradle / Ivy

There is a newer version: 2.2.0
Show newest version
package nablarch.test.core.util;


import nablarch.core.util.BinaryUtil;
import nablarch.core.util.StringUtil;
import nablarch.core.util.map.MapWrapper;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import static nablarch.core.util.Builder.concat;
import static nablarch.core.util.Builder.join;

/**
 * バイト配列を認識する{@link Map}実装クラス。
 *
 * @param  キーの型
 * @param  値の型
 * @author T.Kawasaki
 */
public class ByteArrayAwareMap extends MapWrapper {

    /** 元のマップ */
    private Map orig;

    /**
     * コンストラクタ。
     *
     * @param orig 元のMap
     */
    public ByteArrayAwareMap(Map orig) {
        this.orig = orig;
    }

    /** {@inheritDoc} */
    @Override
    public Map getDelegateMap() {
        return orig;
    }

    /**
     * {@inheritDoc}
     * 要素中にバイト配列が含まれていた場合、等価であれば等しい要素であるとみなす。
     */
    @Override
    public boolean equals(Object o) {

        if (orig.equals(o)) {
            return true;
        }

        if (!(o instanceof Map)) {
            return false;
        }

        @SuppressWarnings("unchecked")
        Map t = (Map) o;
        if (t.size() != size()) {
            return false;
        }

        for (Entry e : entrySet()) {
            K key = e.getKey();
            V value = e.getValue();
            if (!(t.containsKey(key) && equals(value, t.get(key)))) {
                return false;
            }
        }
        return true;
    }

    /**
     * 2つの値が等価であるか判定する。
     *
     * @param one     値1
     * @param another 値2
     * @return 判定結果
     */
    private boolean equals(V one, V another) {
        if (one == another) {
            return true;
        }
        if (one instanceof byte[]) {
            return another instanceof byte[] && Arrays.equals((byte[]) one, (byte[]) another);
        }
        return one.equals(another);
    }

    /**
     * {@inheritDoc}
     * 要素中にバイト配列が含まれていた場合、16進数文字列に変換して出力する。
     */
    @Override
    public String toString() {
        List elements = new ArrayList(size());
        for (Entry e : entrySet()) {
            K key = e.getKey();
            V value = e.getValue();
            elements.add(concat(toString(key), "=", toString(value)));
        }
        return concat("{", join(elements, ", "), "}");
    }


    /**
     * 文字列に変換する。
     *
     * @param orig 値
     * @return 文字列
     */
    private String toString(Object orig) {
        if (orig == this) {
            return "(this Map)";
        }
        if (orig instanceof byte[]) {
            return BinaryUtil.convertToHexStringWithPrefix((byte[]) orig);
        }
        return orig == null ? "null" : StringUtil.toString(orig);
    }

    /** {@inheritDoc} */
    @Override
    public int hashCode() {
        return orig.hashCode();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy