001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.fukurou.util;
017    
018    import java.util.Map ;
019    import java.util.LinkedHashMap ;
020    import java.util.Locale;
021    import java.util.Iterator;
022    
023    /**
024     * EnumType.java ã¯ã€å?通的ã«ä½¿ç”¨ã•れã‚?æ–?­—åž‹é¸æŠžãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’ç°¡ç´?Œ–ã™ã‚‹ã‚¯ãƒ©ã‚¹ã§ã™ã?
025     * JDK5.0 より導å?ã•れã?enum ã«é¡žä¼¼ã®æ©Ÿè?ã‚’æä¾›ã—ã¾ã™ãŒã€å?部çš?«ã‚ˆã‚Šç‰¹åŒ–ã—ã?
026     * 機è?ã‚’æä¾›ã—ã¾ã™ã?
027     * 具体的ã«ã¯ã€ãƒ‡ãƒãƒƒã‚°æƒ??ã®ç°¡æ˜“å?åŠ›ã‚„ã€æ–‡å­—å?入力時ã®åŒ?«é–¢ä¿‚ãƒã‚§ãƒ?‚¯ã€?
028     * ãƒ?ƒ•ォルトå?(åˆæœŸå€¤)ã®ç™»éŒ²ãªã©ã§ã™ã?
029     * åˆæœŸå€¤ã«ã¯ã€String,int,boolean ã®?“ã‚¿ã‚¤ãƒ—ãŒæŒ?®šã§ãã¾ã™ã?
030     *
031     * @version  4.0
032     * @author       Kazuhiko Hasegawa
033     * @since    JDK5.0,
034     */
035    public final class EnumType<T extends Comparable<T>> {      // 4.3.3.6 (2008/11/15) Generics警告対�
036            /** シスãƒ?ƒ ä¾å­˜ã?改行記å·ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?     */
037            private static final String CR = System.getProperty("line.separator");
038    
039            /** ?˜ã¤åˆ??スペã?スã§ã™ã?  */
040            private static final String SPACE = "    " ;
041    
042            private final Map<String,Types<T>> typemap = new LinkedHashMap<String,Types<T>>();
043    
044            private final String title  ;
045            private final T      defVal ;
046    
047            /**
048             * タイトルã¨åˆæœŸå€¤ã‚’指定ã—ã¦æ§‹ç¯‰ã™ã‚?コンストラクター
049             * nval メソãƒ?ƒ‰ã‚’使用ã™ã‚‹å ´åˆã«ã€åˆ©ç”¨ã—ã¾ã™ã?
050             *
051             * @param title タイトル
052             * @param val åˆæœŸå€¤
053             */
054            public EnumType( final String title,final T val ) {
055                    this.title = title ;
056                    defVal = val ;
057            }
058    
059            /**
060             * キーã¨ãã?説æ˜?メãƒ?‚»ãƒ¼ã‚¸)を追åŠ?—ã¾ã™ã?
061             * å†?ƒ¨ã‚­ãƒ£ãƒ?‚·ãƒ¥(Map)ã«è¿½åŠ?—ã¾ã™ã?
062             * 通常ã®ãƒ¡ã‚½ãƒ?ƒ‰åãªã‚‰ã?put ã?add ã§ã™ãŒã€return ã«
063             * 自åˆ??身を記述ã§ãã‚‹ãŸã‚ã€å?期設å®?コンストラクタ)?‹å?設定を
064             * 連続ã—ã¦è¨˜è¿°ã™ã‚‹ã“ã¨ãŒå?æ¥ã‚?append メソãƒ?ƒ‰ã«ã¡ãªã‚“ã§å‘½åã—ã¦ã?¾ã™ã?
065             *
066             * @param key キー
067             * @param msg メãƒ?‚»ãƒ¼ã‚¸
068             *
069             * @return      自�?身
070             */
071            public EnumType<T> append( final T key, final String msg ) {
072                    typemap.put( String.valueOf( key ).toUpperCase( Locale.JAPAN ),new Types<T>( key,msg ) );
073                    return this ;
074            }
075    
076            /**
077             * æ–?­—å?相当ã?設定å?よりã€å¯¾å¿œã™ã‚?T オブジェクトを返ã—ã¾ã™ã?
078             * T ã¯ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ä½œæ?時ã«ã€new EnumType&lt;T&gt; ã§æŒ?®šã™ã‚‹ã‚ªãƒ–ジェクトã§ã™ã?
079             * å¼•æ•°ã®æ–?­—å?ã¯ã€?String.valueOf( T ) ã§å¾—られるæ–?­—å?ã§ã™ã?
080             * 引数ãŒã?null ã‹ã?é•·ã•ã‚¼ãƒ­ã®æ–?­—å?ã®å ´åˆã?ã€ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ã§æŒ?®šã—ã?
081             * åˆæœŸå€¤ãŒè¿”ã•れã¾ã™ã?
082             * T ã« Boolean ã‚?Integer を指定ã—ã¦ã?‚‹å ´åˆã?ã€ã‚¢ãƒ³ãƒœã‚¯ã‚·ãƒ³ã‚°æ©Ÿè?ã«ã‚ˆã‚Šã€?
083             * boolean ã‚?int ã«è‡ªå‹•çš„ã«ã‚­ãƒ£ã‚¹ãƒˆã•れã¾ã™ã?
084             *
085             * @param       strKey æ–?­—å?相当ã?設定å?
086             *
087             * @return      strKeyã«å¯¾å¿œã™ã‚‹ã‚ªãƒ–ジェクãƒ?
088             * @throws IllegalArgumentException 引数ãŒMapã«å­˜åœ¨ã—ãªã‹ã£ãŸå?å?nullã¯OK)
089             */
090            public T nval( final String strKey ) {
091                    if( strKey != null && strKey.length() > 0 ) {
092                            String upKey = strKey.toUpperCase( Locale.JAPAN );
093                            if( typemap.containsKey( upKey ) ) {
094                                    Types<T> type = typemap.get( upKey );
095                                    return type.getKey();
096                            }
097                            else {
098                                    String errMsg = title + " ç¯?›²è¨­å®šã‚¨ãƒ©ãƒ¼"
099                                                            + CR + "引数 [" + strKey + "] ã¯ã€å?部ã«ãƒžãƒƒãƒ—ã•れã¦ã?¾ã›ã‚“ã€?
100                                                            + CR + toString() ;
101                                    throw new IllegalArgumentException( errMsg );
102                            }
103                    }
104                    return defVal ;
105            }
106    
107            /**
108             * åˆæœŸå€¤ã‚’è¿”ã—ã¾ã™ã?
109             * T ã« Boolean ã‚?Integer を指定ã—ã¦ã?‚‹å ´åˆã?ã€ã‚¢ãƒ³ãƒœã‚¯ã‚·ãƒ³ã‚°æ©Ÿè?ã«ã‚ˆã‚Šã€?
110             * boolean ã‚?int ã«è‡ªå‹•çš„ã«ã‚­ãƒ£ã‚¹ãƒˆã•れã¾ã™ã?
111             *
112             * @return      åˆæœŸå€¤ã‚ªãƒ–ジェクãƒ?
113             */
114            public T getDefault() {
115                    return defVal ;
116            }
117    
118            /**
119             * 設定ã—ã?T ãŒå­˜åœ¨ã—ã¦ã?‚‹ã‹ã©ã?‹ã‚’è¿”ã—ã¾ã™ã?
120             * å†?ƒ¨ã«å€¤ã‚’å–り込んã å¾Œã§ä½¿ç”¨ã™ã‚‹ã€å­˜åœ¨ãƒã‚§ãƒ?‚¯ã§ã™ã?
121             * 通常ã€nval ã§ å–り込んã å¾Œã?ã€ãƒã‚§ãƒ?‚¯ä¸è¦ã§ã™ã?
122             * 引数ã?null ã®å ´åˆã?ã€false ã‚’è¿”ã—ã¾ã™ã?
123             *
124             * @param key T 設定ã—ã?Tオブジェクãƒ?
125             *
126             * @return      存在ã™ã‚‹:true / 存在ã—ãªã?false
127             */
128            public boolean contains( final T key ) {
129                    if( key == null ) {
130                            return false;
131                    }
132                    return typemap.containsKey( String.valueOf( key ).toUpperCase( Locale.JAPAN ) );
133            }
134    
135            /**
136             * å†?ƒ¨ã®æ–?­—å?表ç¾ã‚’è¿”ã—ã¾ã™ã?
137             *
138             * @return      å†?ƒ¨ã®æ–?­—å?表ç¾
139             */
140            @Override
141            public String toString() {
142    //              Types<T>[] types = typemap.values().toArray( new Types[typemap.size()] );
143    //              StringBuilder buf = new StringBuilder();
144    //              buf.append( CR );
145    //              for( int i=0; i<types.length; i++ ) {
146    //                      buf.append( SPACE ).append( types[i].toString() ).append( CR );
147    //              }
148    //              return buf.toString();
149    
150                    // 4.3.3.6 (2008/11/15) Generics警告対å¿?, toArray ã‹ã‚‰ã€Iterator ã«ã€å¤‰æ›´
151                    Iterator<Types<T>> ite = typemap.values().iterator();
152                    StringBuilder buf = new StringBuilder();
153                    buf.append( CR );
154                    while( ite.hasNext() ) {
155                            buf.append( SPACE ).append( ite.next() ).append( CR );
156                    }
157                    return buf.toString();
158            }
159    
160            /**
161             * å†?ƒ¨ã‚ªãƒ–ジェクトを管ç?™ã‚‹ç‚ºã® インナã?クラス
162             * キーオブジェクトã¨ãã?説明ã?ペアを管ç?—ã¾ã™ã?
163             *
164             * @version  4.0
165             * @author       Kazuhiko Hasegawa
166             * @since    JDK5.0,
167             */
168            private static class Types<T> {
169                    private final T key ;
170                    private final String msg ;
171    
172                    /**
173                     * キーã¨èª¬æ˜Žã‚’æŒ?®šã—ãŸã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿
174                     *
175                     * @param key T キーオブジェク�
176                     * @param       msg     説�
177                     * @throws IllegalArgumentException キーオブジェクトãŒnullã®å ´å?
178                     */
179                    public Types( final T key,final String msg ) {
180                            if( key == null ) {
181                                    String errMsg = "key ã«ã¯ null ã‚’ã‚»ãƒ?ƒˆã§ãã¾ã›ã‚“ã€? ;
182                                    throw new IllegalArgumentException( errMsg );
183                            }
184    
185                            this.key = key;
186                            this.msg = msg;
187                    }
188    
189                    /**
190                     * キーオブジェクトを返ã—ã¾ã™ã?
191                     *
192                     * @return key T キーオブジェク�
193                     */
194                    public T getKey() { return key; }
195    
196                    /**
197                     * 説明を返ã—ã¾ã™ã?
198                     *
199                     * @return msg String 説�
200                     */
201                    public String getMsg() { return msg; }
202    
203                    /**
204                     * å†?ƒ¨ã®æ–?­—å?表ç¾ã‚’è¿”ã—ã¾ã™ã?
205                     *
206                     * @return      å†?ƒ¨ã®æ–?­—å?表ç¾
207                     */
208                    public String toString() {
209                            return key + " : " + msg ;
210                    }
211            }
212    }