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    }