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.hayabusa.resource;
017    
018    import java.text.MessageFormat;
019    
020    import org.opengion.hayabusa.common.HybsSystem ;
021    import org.opengion.fukurou.util.StringUtil ;
022    
023    /**
024     * systemId , lang に対応したラベルãƒ??タを作æ?しますã?
025     *
026     * ラベルãƒ??タはã€??目(CLM)に対して、各種ラベルæƒ??を持ってã�?�¾すã?
027     * 従来のラベルは、表示名称として、ä¸?¨®類しか持ってã�?�¾せんでしたがã?
028     * ラベルãƒ??タはã€?¼“種類ã?名称とã€?¼‘種類ã?概要を持ってã�?�¾すã?
029     *
030     *   label       : 名称(長)      従来のラベルと同じで定義された文字そのもã?ですã?
031     *   shortLabel  : 名称(HTML短)  概要説明をバルーン表示する短ã�?��称ですã?
032     *   longLabel   : 名称(HTML長)  概要説明をバルーン表示する長ã�?��称ですã?
033     *   description : 概要説æ˜?     カラãƒ??説明やバルーンに使用しますã?
034     *
035     * 名称(HTML長)は、従来の表示名称にあたりますã?これは、ä¸?ˆ¬çš?�ªラベルとして
036     * 使用されますã?名称(HTML短)は、テーブルä¸?¦§のヘッãƒ??の様に、特殊なケースでã€?
037     * 簡略化された名称を使用するときに利用されますã?こã?åˆ?‚Š替えã?、è?動で判断されますã?
038     * 名称(HTML短)に、なにも設定されてã�?�ªã�??合ã?、名称(HTML長)がè?動的に使用されますã?で
039     * 初期ãƒ??タ移行時には、そのままã€??常時もãƒ??ブルヘッãƒ??時も同じæ–?­—å?ã�?
040     * 使用されますã?
041     * ただしã?ä¸?¦§表示のã�?�¡、EXCEL出力などのãƒ??タには、名称(長)が使用されますã?
042     * これは、名称(HTML短)ã‚?��称(HTML長)は、Tips表示を行う為のHTML構文を採用してã�?‚‹為
043     * ãƒ?‚­スト等に出力するには不適åˆ?� からですã?またã?EXCEL等ã?ãƒ??ルでは、ラベル名が
044     * 長くてもセルå¹?­‰で調整できる為、簡略化された名称よりも正式名称で出力しますã?
045     *
046     * ラベルãƒ??タを作æ?する場合ã?、同ä¸?ƒ©ベルで、作æ?区åˆ?KBSAKU)違いの場合ã?ã€?
047     * æœ?‚‚大きな作æ?区åˆ?‚’持つコードを使用しますã?
048     * 作æ?区åˆ?KBSAKU)はã€?:シスãƒ?ƒ 予ç´??1:アプリ設定ã?2:ユーザー設å®?とã�?�†具合に
049     * カスタマイズの度合いに応じて大きな数字を割り当てることで、キーæƒ??を上書き修正
050     * することが可能になりますã?(削除することは出来ませんã€?
051     *
052     * @og.rev 4.0.0.0 (2004/12/31) 新規作æ?
053     * @og.group リソース管ç�?
054     *
055     * @version  4.0
056     * @author   Kazuhiko Hasegawa
057     * @since    JDK5.0,
058     */
059    public final class LabelData implements LabelInterface {
060    
061            /** å†?ƒ¨ãƒ??タのカラãƒ?•ª号 {@value}        */
062            public static final int CLM                     = 0 ;
063            /** å†?ƒ¨ãƒ??タのカラãƒ?•ª号 {@value}        */
064            public static final int SNAME           = 1 ;
065            /** å†?ƒ¨ãƒ??タのカラãƒ?•ª号 {@value}        */
066            public static final int LNAME           = 2 ;
067            /** å†?ƒ¨ãƒ??タのカラãƒ?•ª号 {@value}        */
068            public static final int DESCRIPTION     = 3 ;
069            /** å†?ƒ¨ãƒ??タのカラãƒ?•° {@value}  */
070            public static final int DATA_SIZE       = 4 ;
071            /** リソース読み込みのためにä¸?™‚利用 4.3.5.7 (2009/03/22) */
072            public static final int FG_LOAD         = 4 ;
073    
074            private final String    key                     ;               // é ?›®
075            private final String    label           ;               // 名称(長)
076            private final String    shortLabel      ;               // 名称(HTML短)
077            private final String    longLabel       ;               // 名称(HTML長)
078            private final String    description     ;               // 概要説æ˜?
079            private final boolean   official        ;               // リソース?¤?¢から作æ?されたかどã�?�‹
080            private final boolean   isFormat        ;               // メãƒ?‚»ージフォーマット対象かどã�?�‹ 4.0.0.0 (2007/10/17)
081            private final String    rawShortLabel;          // 名称(未変換短) 4.3.8.0 (2009/08/01)
082            private final boolean   isFormatDesc;           // 概要がフォーマット対象ã�?4.3.7.6 (2009/07/15)
083            private final String    rawLongLabel;           // 名称(未変換長) 5.6.8.2 (2013/09/20)
084    
085            /**
086             * null LabelData オブジェクトを作æ?しますã?
087             * こã?オブジェクトã?ã€?¼¤?¢リソース上に存在しなã�??合に使用されã‚?
088             * null æƒ??を表すã?LabelData オブジェクトですã?
089             * 
090             * @og.rev 5.6.8.2 (2013/09/20) rawLongLabel対å¿?
091             * @og.rev 5.7.3.0 (2014/02/07) public に格上げしますã?
092             *
093             * @param       inkey   キーæƒ??
094             */
095    //      LabelData( final String inkey ) {
096            public LabelData( final String inkey ) {
097                    key                     = inkey.intern() ;
098                    label           = key ;         // 名称(長)
099                    shortLabel      = key ;         // 名称(HTML短)
100                    longLabel       = key ;         // 名称(HTML長)
101                    description     = ""  ;         // 概要説æ˜?
102                    official        = false;        // 非正å¼?
103                    isFormat        = false;        // 非フォーマッãƒ?4.0.0.0 (2007/10/17)
104                    rawShortLabel = key;    // 名称(未変換短) 4.3.8.0 (2009/08/01)
105                    isFormatDesc = false;   // 概要フォーマッãƒ?4.3.7.6 (2009/07/15)
106                    rawLongLabel = key;             // 名称(未変換長)5.6.8.2 (2013/09/20)
107            }
108    
109            /**
110             * 配å?æ–?­—å?のãƒ??タをå?に、LabelDataオブジェクトを構築しますã?
111             * こã?コンストラクタは、他ã?パッケージから呼び出せなã�?‚ˆã�?�«ã€?
112             * パッケージプライベã?トにしておきますã?
113             * こã?コンストラクタはã€?¼¤?¢リソースファイルを想定してã�?�¾すã?
114             *
115             * @og.rev 5.4.0.1 (2011/11/01) SNAME、概要説明ã?rawShortLabel 関係ã?処ç�?‚’修正
116             * @og.rev 5.6.8.2 (2013/09/20) rawLongLabel対å¿?
117             *
118             * @param       data    CLM,SNAME,LNAME,DESCRIPTION
119             */
120            LabelData( final String[] data ) {
121                    key                     = data[CLM].intern() ;                                                  // é ?›®
122                    label           = StringUtil.nval2( data[LNAME],"" ) ;                  // 名称(HTML長)
123                    description     = data[DESCRIPTION] ;                                                   // 概要説æ˜?
124                    official        = true;                                                                                 // 正å¼?
125                    isFormat = ( label.indexOf( '{' ) >= 0 ) ;                   // 4.0.0.0 (2007/10/17)
126    //              isFormatDesc = ( description.indexOf( '{' ) >= 0 ); // 4.3.7.6 (2009/07/15)
127                    String title = null;
128                    
129                    rawLongLabel = label;           // 名称(未変換長)5.6.8.2 (2013/09/20)
130                    if( description == null || description.length() == 0 ) {
131                            isFormatDesc = false;
132                            // 5.4.0.1 (2011/11/01) title と label が間違ってã�?‚‹ã€?SNAME が存在する場å�?
133    //                      title     = StringUtil.htmlFilter( title ) ;
134                            title     = StringUtil.htmlFilter( label ) ;
135    
136                            // 概要説明がなã�??合ã?、そのままラベルを使用するã€?
137                            longLabel = label;
138                    }
139                    else {
140                            isFormatDesc = ( description.indexOf( '{' ) >= 0 );          // 5.1.8.0 (2010/07/01) nullポインタの参ç?外し対ç­?
141                            title        = StringUtil.htmlFilter( description ) ;
142    
143                            // 概要説明がある場合ã?、ツールチップにDESCRIPTIONを表示するã€?
144                            longLabel = "<span title=\""
145    //                                                      + StringUtil.htmlFilter( description )
146                                                            + title
147                                                            + "\">"
148                                                            + label
149                                                            + "</span>" ;
150                    }
151    
152                    String sname = data[SNAME];             // 名称(HTML短)
153                    if( sname == null || sname.length() == 0 ) {
154                            // SNAME がなã�??合ã?、longLabel を使用するã€?
155                            shortLabel    = longLabel;
156    //                      rawShortLabel = longLabel;      // 4.3.8.0 (2009/08/01)
157                            rawShortLabel = label;          // 5.4.0.1 (2011/11/01) longLabel を使ã�?�¨、ツールチップがåŠ?‘³されるためã?
158                    }
159                    else {
160                            // SNAME が存在する場合ã?ãƒ??ルチップにdescriptionかlabelを使用するã€?
161    //                      String title = ( description == null || description.length() == 0 ) ? label : description ;
162                            shortLabel = "<span title=\""
163    //                                                      + StringUtil.htmlFilter( title )
164                                                            + title
165                                                            + "\">"
166                                                            + sname
167                                                            + "</span>" ;
168                            rawShortLabel = sname; // 4.3.8.0 (2009/08/01)
169                    }
170            }
171    
172            /**
173             * ラベルオブジェクトã?キーを返しますã?
174             *
175             * @return      ラベルオブジェクトã?キー
176             */
177            public String getKey() { return key; }
178    
179            /**
180             * ラベルオブジェクトã?名称を返しますã?
181             * これはã€?¼¤?¢上ã? LNAME(名称(長))に該当しますã?
182             *
183             * @return      ラベルオブジェクトã?名称(短)
184             */
185            public String getLabel() { return label; }
186    
187            /**
188             * ラベルオブジェクトã?名称(短)を返しますã?
189             * 概要説明がなã�??合でかつ?¤?¢上ã?SNAMEが未設定ã?場合ã?ã€?
190             * LNAME が返されますã?SNAMEが設定されてã�?‚‹場合ã?ã€?
191             * ãƒ??ルチップにLNAME が表示されますã?
192             * 概要説明が存在する場合ã?、ツールチップに概要説明が
193             * 表示されますã?
194             *
195             * @return      ラベルオブジェクトã?名称(短)
196             */
197            public String getShortLabel() { return shortLabel; }
198    
199            /**
200             * ラベルオブジェクトã?名称(長)を返しますã?
201             * 概要説明が存在する場合ã?、ツールチップに概要説明が
202             * 表示されますã?
203             *
204             * @return      ラベルオブジェクトã?名称(長)
205             * @see #getLongLabel( String )
206             */
207            public String getLongLabel() { return longLabel; }
208    
209            /**
210             * ラベルインターフェースの名称(長)を返しますã?
211             * ãƒ??ルチップに表示するタイトル属æ?(概要説æ˜?を置き換えますã?
212             * null の場合ã?、既存ã?getLongLabel()を返しますã?
213             *
214             * @param       title   ãƒ??ルチップに表示するタイトル属æ?
215             *
216             * @return      ラベルインターフェースの名称(長)
217             * @see #getLongLabel()
218             */
219            public String getLongLabel( final String title ) {
220                    final String tipsLabel ;
221                    if( title == null ) {
222                            tipsLabel = longLabel;
223                    }
224                    else {
225                            tipsLabel = "<span title=\""
226                                                            + StringUtil.htmlFilter( title )
227                                                            + "\">"
228                                                            + label
229                                                            + "</span>" ;
230                    }
231                    return tipsLabel ;
232            }
233    
234            /**
235             * ラベルインターフェースの引数付きメãƒ?‚»ージを返しますã?
236             * メãƒ?‚»ージの引数部åˆ?�«、文字å?配å?を適用して、MessageFormat
237             * で変換した結果を返しますã?(MessageData でのみ有効ですã?)
238             *
239             * @og.rev 4.0.0.0 (2007/10/17) メãƒ?‚»ージリソース統合に伴ã�??MessageDataより移è¡?
240             * @og.rev 4.3.8.0 (2009/08/01) 引数にHTMLサニタイジング処ç�?
241             * @og.rev 5.0.0.2 (2009/09/15) サニタイジング処ç�?‚’ã‚?‚�ã‚?
242             *
243             * @param       vals    メãƒ?‚»ージの引数(æ–?­—å?配å?)
244             *
245             * @return      ラベルインターフェースの引数付きメãƒ?‚»ージ
246             */
247            public String getMessage( final String[] vals ) {
248    //              return label ;
249                    final String rtn ;
250    //      5.0.0.2 (2009/09/15)
251    //              // 4.3.8.0 valsに対してサニタイジングフィルタをかける
252    //              if( vals != null && vals.length > 0){
253    //                      for( int i=0; i<vals.length; i++ ){
254    //                              vals[i] = StringUtil.htmlFilter( vals[i] );
255    //                      }
256    //              }
257    
258                    String[] args = ( vals == null ) ? new String[0] : vals ;
259                    if( isFormat ) {
260                            rtn = MessageFormat.format( label,(Object[])args );
261                    }
262                    else {
263                            StringBuilder buf = new StringBuilder();
264                            buf.append( label );
265                            for( int i=0; i<args.length; i++ ) {
266                                    if( args[i] != null && ! args[i].equals( label ) ) {
267                                            buf.append( " " ).append( args[i] );
268                                    }
269                            }
270                            rtn = buf.toString();
271                    }
272                    return rtn ;
273            }
274    
275            /**
276             * ラベルオブジェクトã?概要説明を返しますã?
277             * 概要説明が存在する場合ã?、ラベルのãƒ??ルチップに
278             * 概要説明が表示されますã?
279             *
280             * @return      ラベルオブジェクトã?概要説æ˜?
281             */
282            public String getDescription() { return description; }
283    
284            /**
285             * ラベルオブジェクトã?概要説明を返しますã?
286             * こã?メソãƒ?ƒ‰では{0},{1}...をパラメータで置換しますã?
287             *
288             * @og.rev 4.3.7.6 (2009/07/15) 新規作æ?
289             * @og.rev 4.3.8.0 (2009/08/01) 引数にHTMLサニタイジング処ç�?
290             * @og.rev 5.0.0.2 (2009/09/15) サニタイジング処ç�?‚’ã‚?‚�ã‚?
291             * @og.rev 5.4.0.1 (2011/11/01) {}が存在しなã�??合ã?単に概要を出åŠ?
292             *
293             * @param       vals    メãƒ?‚»ージの引数(æ–?­—å?配å?)
294             *
295             * @return      ラベルオブジェクトã?概要説æ˜?
296             */
297            public String getDescription( final String[] vals ) {
298                    final String rtn ;
299    
300    //              5.0.0.2 (2009/09/15)
301    //              // 4.3.8.0 valsに対してサニタイジングフィルタをかける
302    //              if( vals != null && vals.length > 0){
303    //                      for( int i=0; i<vals.length; i++ ){
304    //                              vals[i] = StringUtil.htmlFilter( vals[i] );
305    //                      }
306    //              }
307    
308                    String[] args = ( vals == null ) ? new String[0] : vals ;
309                    if( isFormatDesc ) {
310                            rtn = MessageFormat.format( description,(Object[])args );
311                    }
312                    else {
313    //                      StringBuilder buf = new StringBuilder();
314    //                      buf.append( description );
315    //                      // Descriptionでは{}が存在しなã�??合ã?単に概要を出åŠ?
316    //                      // for( int i=0; i<args.length; i++ ) {
317    //                      //      if( args[i] != null && ! args[i].equals( description ) ) {
318    //                      //              buf.append( " " ).append( args[i] );
319    //                      //      }
320    //                      // }
321    //                      rtn = buf.toString();
322    
323                            // 5.4.0.1 (2011/11/01) {}が存在しなã�??合ã?単に概要を出åŠ?・・・ ならã?直接セãƒ?ƒˆに変更
324                            rtn = description;
325                    }
326                    return rtn ;
327            }
328    
329            /**
330             * リソース?¤?¢から作æ?されたかどã�?�‹を返しますã?
331             * 正式な場合ã?、true / リソースになくã?独自に作æ?されたå?合ã?、false になりますã?
332             *
333             * @return      リソース?¤?¢から作æ?されたかどã�?�‹
334             */
335            public boolean isOfficial() { return official; }
336    
337            /**
338             * ラベルオブジェクトã?名称(長)をそのままの形で返しますã?
339             * ??iscription等を付けなã�?
340             *
341             * @og.rev 5.6.8.2 (2009/08/01) 追åŠ?
342             *
343             * @return      ラベルオブジェクトã?名称(長)そã?ままの状æ…?
344             */
345            public String getRawLongLabel() { return rawLongLabel; }
346            
347            /**
348             * ラベルオブジェクトã?名称(短)をspanタグを付けなã�?ж態で返しますã?
349             * SNAMEが未設定ã?場合ã?、LNAME が返されますã?
350             *
351             * @og.rev 4.3.8.0 (2009/08/01) 追åŠ?
352             *
353             * @return      ラベルオブジェクトã?名称(短)にspanタグを付けなã�?жæ…?
354             */
355            public String getRawShortLabel() { return rawShortLabel; }
356    
357            /**
358             * オブジェクトã?識別子として?Œ詳細なユーザーæƒ??を返しますã?
359             *
360             * @return  詳細なユーザーæƒ??
361             */
362            @Override
363            public String toString() {
364                    StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
365                    rtn.append( "CLM :" ).append( key );
366                    rtn.append( " SNAME :" ).append( shortLabel );
367                    rtn.append( " LNAME :" ).append( longLabel );
368                    rtn.append( " DESCRIPTION :" ).append( description ).append( HybsSystem.CR );
369                    return rtn.toString();
370            }
371    }