PreDefAvatar.java

/*
 * pre-defined avatar info
 *
 * License : The MIT License
 * Copyright(c) 2009 olyutorskii
 */

package jp.sourceforge.jindolf.corelib;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

/**
 * プリセット済みAvatarに関する情報。
 * F国運用の時点で20キャラクタ。
 */
public final class PreDefAvatar{

    private final String avatarId;
    private final String fullName;
    private final String jobTitle;
    private final String shortName;
    private final int serialNo;


    /**
     * コンストラクタ。
     * @param avatarId Avatar識別子
     * @param fullName フルネーム
     * @param jobTitle 職業名
     * @param shortName 省略名
     * @param serialNo 通し番号
     */
    private PreDefAvatar(String avatarId,
                         String fullName,
                         String jobTitle,
                         String shortName,
                         int serialNo ){
        super();

        if(    avatarId  == null
            || fullName  == null
            || jobTitle  == null
            || shortName == null ){
            throw new NullPointerException();
        }

        if(    avatarId.length() <= 0
            || fullName.length() <= 0
            || serialNo < 0 ){
            throw new IllegalArgumentException();
        }

        this.avatarId  = avatarId.intern();
        this.fullName  = fullName.intern();
        this.jobTitle  = jobTitle.intern();
        this.shortName = shortName.intern();
        this.serialNo  = serialNo;

        return;
    }


    /**
     * プリセット済みAvatar一覧リストを生成する。
     * @param builder DOMビルダ
     * @return プリセット済みAvatar一覧リスト
     * @throws IOException IOエラー
     * @throws SAXException パースエラー
     */
    public static List<PreDefAvatar> buildPreDefAvatarList(
            DocumentBuilder builder)
            throws IOException,
                   SAXException {
        List<Element> elemList = DomUtils.loadElemList(
                builder, XmlResource.I_URL_AVATARDEF, "preDefinedAvatar");

        List<PreDefAvatar> result = new ArrayList<>(elemList.size());

        for(Element elem : elemList){
            PreDefAvatar avatar = buildAvatar(elem);
            result.add(avatar);
        }

        result = Collections.unmodifiableList(result);

        return result;
    }

    /**
     * 個々のプリセットAvatar定義をオブジェクトに変換する。
     * @param avatarDef プリセットAvatar定義要素
     * @return プリセットAvatar定義オブジェクト
     * @throws SAXException パースエラー
     */
    private static PreDefAvatar buildAvatar(Element avatarDef)
            throws SAXException {
        String avatarId  = avatarDef.getAttribute("avatarId");
        String jobTitle  = avatarDef.getAttribute("jobTitle");
        String shortName = avatarDef.getAttribute("shortName");
        String serialNum = avatarDef.getAttribute("serialNum");

        String fullName = jobTitle + "\u0020" + shortName;

        int serialNo;
        try{
            serialNo = Integer.parseInt(serialNum);
        }catch(NumberFormatException e){
            throw new SAXException("illegal number form", e);
        }

        PreDefAvatar avatar = new PreDefAvatar(avatarId,
                                               fullName,
                                               jobTitle,
                                               shortName,
                                               serialNo );

        return avatar;
    }


    /**
     * Avatar識別子を返す。
     * @return Avatar識別子
     */
    public String getAvatarId(){
        return this.avatarId;
    }

    /**
     * フルネームを返す。
     * @return フルネーム
     */
    public String getFullName(){
        return this.fullName;
    }

    /**
     * 職業名を返す。
     * @return 職業名
     */
    public String getJobTitle(){
        return this.jobTitle;
    }

    /**
     * 省略名を返す。
     * @return 省略名
     */
    public String getShortName(){
        return this.shortName;
    }

    /**
     * 通し番号を返す。
     * @return 通し番号
     */
    public int getSerialNo(){
        return this.serialNo;
    }

}