/*
 * Copyright (C) 2008 feilong
 *
 * 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.feilong.taglib.display.option;

import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;

import com.feilong.core.Validator;
import com.feilong.core.util.ResourceBundleUtil;
import com.feilong.taglib.display.TagCacheManager;
import com.feilong.tools.slf4j.Slf4jUtil;

/**
 * The Class OptionBuilder.
 *
 * @author feilong
 * @version 1.5.4 2016年4月19日 上午2:01:44
 * @since 1.5.4
 */
public class OptionBuilder{

    /** option 格式 <code>{@value}</code>. */
    private static final String OPTION_PATTERN  = "<option value=\"{}\"{}>{}</option>";

    /** 选中的字符串 <code>{@value}</code>. */
    private static final String SELECTED_STRING = " selected=\"selected\"";

    /**
     * Builds the options.
     *
     * @param optionParam
     *            the option param
     * @return the string
     */
    public static String buildContent(OptionParam optionParam){
        String content = TagCacheManager.getContentFromCache(optionParam);
        if (Validator.isNotNullOrEmpty(content)){
            return content;
        }

        content = buildContentMain(optionParam);
        TagCacheManager.put(optionParam, content);
        return content;
    }

    /**
     * Builds the content main.
     *
     * @param optionParam
     *            the option param
     * @return the string
     */
    private static String buildContentMain(OptionParam optionParam){
        Map<String, String> map = getKeyValueMap(optionParam);
        return render(map, optionParam);
    }

    /**
     * 获得 key value map.
     *
     * @param optionParam
     *            the option param
     * @return the key value map
     */
    private static Map<String, String> getKeyValueMap(OptionParam optionParam){
        Map<String, String> map = ResourceBundleUtil.readAllPropertiesToMap(optionParam.getBaseName(), optionParam.getLocale());
        //XXX 排序
        return map;
    }

    /**
     * Render.
     *
     * @param map
     *            the map
     * @param optionParam
     * @return the object
     */
    private static String render(Map<String, String> map,OptionParam optionParam){
        StringBuilder sb = new StringBuilder();

        String selectedKey = optionParam.getSelectedKey();

        for (Map.Entry<String, String> entry : map.entrySet()){
            String key = entry.getKey();
            String value = entry.getValue();

            String selectedStatus = key.equals(selectedKey) ? SELECTED_STRING : StringUtils.EMPTY;

            String option = Slf4jUtil.formatMessage(OPTION_PATTERN, key, selectedStatus, value);
            sb.append(option).append(SystemUtils.LINE_SEPARATOR);
        }
        return sb.toString();
    }
}

@@ -1317,24 +1317,306 @@
 lected%5C%22%22;%0A%0A
+    /** Don't let anyone instantiate this class. */%0A    private OptionBuilder()%7B%0A        //AssertionError%E4%B8%8D%E6%98%AF%E5%BF%85%E9%A1%BB%E7%9A%84. %E4%BD%86%E5%AE%83%E5%8F%AF%E4%BB%A5%E9%81%BF%E5%85%8D%E4%B8%8D%E5%B0%8F%E5%BF%83%E5%9C%A8%E7%B1%BB%E7%9A%84%E5%86%85%E9%83%A8%E8%B0%83%E7%94%A8%E6%9E%84%E9%80%A0%E5%99%A8. %E4%BF%9D%E8%AF%81%E8%AF%A5%E7%B1%BB%E5%9C%A8%E4%BB%BB%E4%BD%95%E6%83%85%E5%86%B5%E4%B8%8B%E9%83%BD%E4%B8%8D%E4%BC%9A%E8%A2%AB%E5%AE%9E%E4%BE%8B%E5%8C%96.%0A        //see %E3%80%8AEffective Java%E3%80%8B 2nd%0A        throw new AssertionError(%22No %22 + getClass().getName() + %22 instances for you!%22);%0A    %7D%0A%0A
     /**%0A    

update javadoc