/*
 * NetUtil.java
 * 
 * Author: http://www.hrtdotnet.jp/
 * 
 */
package jp.hrtdotnet.java.net;

/**
 * ネット関係のユーティリティクラスです。
 * 
 * @version 2.0
 * @author hrtdotnet.jp
 * <br>http://www.hrtdotnet.jp/
 * @since 2.0
 */
public class NetUtil {

    /** MACアドレスのオクテット数です。 */
    public static final int MAC_ADDRESS_LENGTH = 6;

    /**
     * MACアドレスをオクテット(byte)列に分割します。
     * 分割には「:」もしくは「-」が使われます。
     * 
     * @param macAddress MACアドレス
     * @return MACアドレスをオクテット列に変換した値
     */
    public static byte[] octetMacAddress(String macAddress) {
        return octetMacAddress(macAddress, "(\\:|\\-)");
    }
    
    /**
     * MACアドレスをオクテット(byte)列に分割します。
     * 
     * @param macAddress MACアドレス
     * @param delim 区切り文字
     * @return MACアドレスをオクテット列に変換した値
     */
    public static byte[] octetMacAddress(String macAddress, String delim) {

        //オクテット列変換後MACアドレス
        byte[] byteMacAddress = null;
        //String列分割後MACアドレス
        String[] splitMacAddress = null;     

        //不正MACアドレスチェック
        if (macAddress == null) {
            throw new NullPointerException("Mac-Address is null.");
        }
        
        //区切り文字がnullもしくは空文字は区切り文字無しとして分割
        if (delim == null || delim.length() == 0) {
            
            //不正MACアドレスチェック
            if (macAddress.length() != MAC_ADDRESS_LENGTH * 2) {
                throw new IllegalArgumentException("Mac-Address is invalid.");
            }

            //分割
            splitMacAddress = new String[MAC_ADDRESS_LENGTH];
            for (int i = 0; i < MAC_ADDRESS_LENGTH; i++) {
                int index = i * 2;
                splitMacAddress[i] = macAddress.substring(index, index + 2);
            }

        //区切り文字で分割
        } else {
            //分割
            splitMacAddress = macAddress.split(delim);

            //不正MACアドレスチェック
            if (splitMacAddress.length != MAC_ADDRESS_LENGTH) {
                throw new IllegalArgumentException("Mac-Address is invalid.");
            }
        }

        //オクテット(byte)に変換
        byteMacAddress = new byte[MAC_ADDRESS_LENGTH];
        for (int i = 0; i < MAC_ADDRESS_LENGTH; i++) {
            byteMacAddress[i] = (byte) Integer.parseInt(splitMacAddress[i], 16);
        }
        return byteMacAddress;
    }
}
