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    /**
019     * TagBuffer.java ã¯ã€å?通的ã«ä½¿ç”¨ã•れã‚?簡易タグ作æ?クラスã§ã™ã?
020     * タグヘッãƒ??ã¯ã€ã‚ªãƒ–ジェクト作æ?時ã«ç™»éŒ²ã™ã‚‹ç‚ºã€å¾Œã?変更ã¯å‡ºæ¥ã¾ã›ã‚“ã€?
021     * BODY部ã‚??属æ?ã¯ã€ä¸?º¦ç™»éŒ²ã™ã‚‹ã¨æ›¸ãæ›ãˆã§ãã¾ã›ã‚“ã€?
022     * ã¾ãŸã?åŒä¸?±žæ?ãƒã‚§ãƒ?‚¯ã¯è¡Œã„ã¾ã›ã‚“。登録ã—ãŸå±žæ?ã®ã‚­ãƒ¼ã‚??値をå–りå?ã™ã“ã¨ã‚‚å?æ¥ã¾ã›ã‚“ã€?
023     * ã‚ãã¾ã§ã€ã‚¿ã‚°æ–?­—å?をストレートã«ä½œæ?ã™ã‚‹ã“ã¨ã«ç‰¹åŒ–ã—ãŸã‚¯ãƒ©ã‚¹ã§ã™ã?
024     * ã“れらã?é«˜åº¦ãªæ©Ÿè?ãŒå¿?¦ã§ã‚れã°ã€{@link org.opengion.fukurou.util.Attributes } ã‚’ã”å‚ç?ãã ã•ã„ã€?
025     *
026     * makeTag() メソãƒ?ƒ‰ã‚’呼ã³å‡ºã—ãŸæ™‚点ã§ã€å?部ã«ã‚¿ã‚°æ–?­—å?をキャãƒ?‚·ãƒ¥ã—ã¾ã™ã?
027     * ãれ以é™ã?変更ã¯ã€å?æ¥ã¾ã›ã‚“ã€?
028     *
029     * å†?ƒ¨çš?«ã¯ã€æ§‹é?化ã•れã¦ã?¾ã›ã‚“。ã‚ãã¾ã§ã€æ–‡å­—å?連çµ?StringBuilder)ã®
030     * 簡易クラスã¨ã—ã¦ã€ä½¿ç”¨ã—ã¦ãã ã•ã„ã€?
031     *
032     * @og.group ユーãƒ?‚£ãƒªãƒ?‚£
033     *
034     * @version  4.0
035     * @author       Kazuhiko Hasegawa
036     * @since    JDK5.0,
037     */
038    public final class TagBuffer {
039            private final StringBuilder buf = new StringBuilder(100);
040            private final String tagName ;
041            private       String tagBody     = null;
042            private       String cacheTag = null;
043    
044            /**
045             * ãƒ?ƒ•ォルトコンストラクター
046             * ã“ã?コンストラクターを使用ã™ã‚‹ã¨ã€ã‚¿ã‚°åã‚’æŒ?®šã§ããªã?Ÿã‚ã?
047             * 完æ?å½¢ã®ã‚¿ã‚°ã¯ã€ä½œæ?ã§ãã¾ã›ã‚“。属æ?リスãƒ?key="value")ã®
048             * 連çµå½¢å¼ã‚’å¾—ã‚‹å ´åˆã«ã®ã¿ã€ä½¿ç”¨ã—ã¦ä¸‹ã•ã??
049             *
050             */
051            public TagBuffer() {
052                    this.tagName = null;
053            }
054    
055            /**
056             * コンストラクター
057             * ã‚¿ã‚°åã« null を指定ã™ã‚‹ã¨ã€ãƒ‡ãƒ•ォルトコンストラクターã¨åŒæ§˜ã«ã€?
058             * 完æ?å½¢ã®ã‚¿ã‚°ã¯ã€ä½œæ?ã§ãã¾ã›ã‚“。属æ?リスãƒ?key="value")ã®
059             * 連çµå½¢å¼ã‚’å¾—ã‚‹å ´åˆã«ã®ã¿ã€ã‚¿ã‚°å?ã«null を指定ã—ã¦ä¸‹ã•ã??
060             *
061             * @param       tagName  ã‚¿ã‚°åç§°
062             */
063            public TagBuffer( final String tagName ) {
064                    this.tagName = tagName;
065                    if( tagName != null ) {
066                            buf.append( "<" ).append( tagName ).append( " " );
067                    }
068            }
069    
070            /**
071             * ã‚¿ã‚°ã® BODY部を登録ã—ã¾ã™ã?
072             * 登録ã—ãªã??åˆã?ã€BODY部ã®ãªã?‚¿ã‚°(空è¦ç´?‚¿ã‚°)を生æˆã—ã¾ã™ã?
073             * BODY部を指定ã™ã‚‹ã¨ã€?lt;tagName key="val" ?¥?¥?¥ &gt;body&lt;/tagName&gt; å½¢å¼ã«ãªã‚Šã¾ã™ã?
074             * BODY部ãŒã?null ã®å ´åˆã?ã€?&lt;tagName key="val" ?¥?¥?¥ /&gt; å½¢å¼ã«ãªã‚Šã¾ã™ã?
075             * ã“ã?メソãƒ?ƒ‰ã¯ã€makeTag() ãŒå‘¼ã°ã‚ŒãŸå¾Œã?ã€ç™»éŒ²ã§ããªããªã‚Šã¾ã™ã?
076             *
077             *      @deprecated {@link TagBuffer#addBody(String)}
078             * @param       body     ã‚¿ã‚°ã®BODY部
079             */
080            public void setBody( final String body ) {
081                    if( cacheTag != null ) {
082                            String errMsg = "makeTag() 実行後ã«ã€BODY部ã®å€¤ã‚’æ›¸ãæ›ãˆã‚‹ã“ã¨ã¯å‡ºæ¥ã¾ã›ã‚“ã€? ;
083                            throw new RuntimeException( errMsg );
084                    }
085    
086                    this.tagBody = body;
087            }
088            
089            /**
090             * ã‚¿ã‚°ã® BODY部を追åŠ?™»éŒ²ã—ã¾ã™ã?
091             *
092             * ã™ã§ã«ã€ç™»éŒ²æ¸ˆã¿ã®å ´åˆã?ã€ãã®å€¤ã«ã€è¿½è¨˜ã—ã¾ã™ã?
093             * ãã†ã§ãªã??å?åˆã‚ã¦ã®å ´å?ã¯ã€ãã®å€¤ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?
094             * null を登録ã—ãŸå ´åˆã?ã€ä½•ã‚‚ã—ã¾ã›ã‚“ã€?
095             * ※ 従æ¥ã‚ã£ã?#setBody(String)ã®æ§˜ã«ã€null を登録ã—ãŸå ´åˆã?Body ã‚?
096             * リセãƒ?ƒˆã™ã‚‹æ©Ÿè?ã¯ã‚りã¾ã›ã‚“。新ã—ã„オブジェクトを作æ?ã—ã¦ãã ã•ã„ã€?
097             *
098             * ã“ã?メソãƒ?ƒ‰ã¯ã€makeTag() ãŒå‘¼ã°ã‚ŒãŸå¾Œã?ã€ç™»éŒ²ã§ããªããªã‚Šã¾ã™ã?
099             *
100             * @og.rev 5.8.4.1 (2015/02/20) 6.1.1.0é€?§»æ¤?#setBody(String) ã®ä»£æ›¿ãˆãƒ¡ã‚½ãƒ?ƒ‰ã¨ã—ã¦ã€æ–°è¦è¿½åŠ?
101             *
102             * @param       body     ã‚¿ã‚°ã®BODY部ã«è¿½åŠ?™ã‚‹æ–‡å­—å?
103             *
104             * @return      自�?身
105             * @og.rtnNotNull
106             */
107            public TagBuffer addBody( final String body ) {
108                    return addBody( body,true );
109            }
110            
111            /**
112             * ã‚¿ã‚°ã® BODY部を追åŠ?™»éŒ²ã—ã¾ã™ã?
113             *
114             * ã™ã§ã«ã€?setBody(String) ã§ã€ç™»éŒ²æ¸ˆã¿ã®å ´åˆã?ã€ãã®å€¤ã«ã€è¿½è¨˜ã—ã¾ã™ã?
115             * ãã†ã§ãªã??åˆã?ã€?setBody(String) ã¨åŒã˜å‹•作ã«ãªã‚Šã¾ã™ã?
116             * null を登録ã—ãŸå ´åˆã?ã€ä½•ã‚‚ã—ã¾ã›ã‚“ã€?
117             * 
118             * flag ã«ã€false を指定ã™ã‚‹ã¨ã€è¿½åŠ?™»éŒ²ã—ã¾ã›ã‚“。ã“れã?ã€if( flag ) { tagBuffer.addBody( body ); }
119             * ã®æ§˜ãªåˆ¤å®šå?ç?‚’ã€tagBuffer.body( body,flag ); ã«ç°¡ç´?Œ–ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã§ãã¾ã™ã?
120             * TagBuffer ã¯ã€StringBuilderã®æ§˜ã«ã€ãƒ¡ã‚½ãƒ?ƒ‰ã®æˆ»ã‚Šå?ã¯ã€è?åˆ??身ã®ã‚ªãƒ–ジェクトãªã®ã§ã€?
121             * 上記ã? flag を使用ã—ã¦ã€å?れ目ãªãé?çµã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã?
122             *
123             * ã“ã?メソãƒ?ƒ‰ã¯ã€makeTag() ãŒå‘¼ã°ã‚ŒãŸå¾Œã?ã€ç™»éŒ²ã§ããªããªã‚Šã¾ã™ã?
124             *
125             * @og.rev 5.8.4.1 (2015/02/20) 6.1.1.0é€?§»æ¤?戻りå?ã«ã€è?åˆ??身を返ã™ã‚ˆã†ã«ã—ã¾ã™ã?
126             *
127             * @param       body    ã‚¿ã‚°ã®BODY部ã«è¿½åŠ?™ã‚‹æ–‡å­—å?
128             * @param       flag    ã‚¿ã‚°ã®BODY部ã«è¿½åŠ?‹ã©ã?‹ã‚’決ã‚るフラグ(true:追åŠ?™ã‚?false:何もã—ãªã?
129             *
130             * @return      自�?身
131             * @og.rtnNotNull
132             */
133            public TagBuffer addBody( final String body,final boolean flag ) {
134                    if( cacheTag != null ) {
135                            final String errMsg = "makeTag() 実行後ã«ã€BODY部ã®å€¤ã‚’æ›¸ãæ›ãˆã‚‹ã“ã¨ã¯å‡ºæ¥ã¾ã›ã‚“ã€? ;
136                            throw new RuntimeException( errMsg );
137                    }
138    
139                    if( flag && body != null ) {
140                            if( tagBody !=null ) { tagBody += body; }
141                            else                             { tagBody =  body; }
142                    }
143    
144                    return this ;
145            }
146    
147            /**
148             * タグ㮠属æ?(key="value")を登録ã—ã¾ã™ã?
149             * 属æ?ã¯ã€key="value" ã®æ–?­—å?を作æ?ã—ã¾ã™ã?key ã‹ã?value ã®ã©ã¡ã‚‰ã‹ã?null
150             * ã®å ´åˆã?ã€ç™»éŒ²ã—ã¾ã›ã‚“ã€?
151             * value ã«ã€ãƒ€ãƒ–ルコーãƒ??ション(")ãŒå«ã¾ã‚Œã¦ã?‚‹å ´åˆã?ã€å±žæ?値をシングルコーãƒ??ション
152             * ã§ããりã¾ã™ã?
153             * 両方å«ã¾ã‚Œã¦ã?‚‹å ´åˆã?ã€ã‚·ãƒ³ã‚°ãƒ«ã‚³ãƒ¼ãƒ??ションをエスケープ文字ã«å¤‰æ›ã—ã¾ã™ã?
154             * ã“ã?メソãƒ?ƒ‰ã¯ã€makeTag() ãŒå‘¼ã°ã‚ŒãŸå¾Œã?ã€ç™»éŒ²ã§ããªããªã‚Šã¾ã™ã?
155             *
156             * @og.rev 3.8.6.1 (2006/10/20) シングルã¨ãƒ?ƒ–ãƒ«ãŒæ··åœ¨ã™ã‚‹å ´åˆã?ã€ã‚·ãƒ³ã‚°ãƒ«ã‚’エスケープã™ã‚?
157             *
158             * @param       key      属æ?キー (null ã®å ´åˆã?ã€ãªã«ã‚‚ã—ãªã?
159             * @param       val      属æ?値 (null ã®å ´åˆã?ã€ãªã«ã‚‚ã—ãªã?
160             */
161            public void add( final String key,final String val ) {
162                    if( cacheTag != null ) {
163                            String errMsg = "makeTag() 実行後ã«ã€å±žæ?を追åŠ?™ã‚‹ã“ã¨ã¯å‡ºæ¥ã¾ã›ã‚“ã€? ;
164                            throw new RuntimeException( errMsg );
165                    }
166    
167                    if( key != null && val != null ) {
168                            if( val.indexOf( '\"' ) >= 0 ) {
169                                    String temp = val ;
170                                    if( val.indexOf( "'" ) >= 0 ) { temp = val.replaceAll( "'","&#39;" ); }
171                                    buf.append( key ).append( "='" ).append( temp ).append( "' " );
172                            }
173                            else {
174                                    buf.append( key ).append( "=\"" ).append( val ).append( "\" " );
175                            }
176                    }
177            }
178    
179            /**
180             * ã‚¿ã‚°ã®å±žæ?ã«ã€è¿½åŠ?™»éŒ²ã—ã¾ã™ã?
181             * æ–?­—å?ã¨ã—ã¦ã€key="value" ã®å½¢å¼ãƒ‡ãƒ¼ã‚¿ã‚’与ãˆã¦ãã ã•ã„。é?çµæ™‚ã¯ã€å¾Œã‚ã«
182             * スペã?スをä¸?¤æŒŸã¿ã¾ã™ã?ã§ã€ä¸Žãˆã‚‹å¼•数自体ã«é€£çµç”¨ã‚¹ãƒšã?スを追åŠ?—ã¦ãŠã
183             * å¿?¦ã?ã‚りã¾ã›ã‚“ã€?
184             * 通常ã¯ã€tagName ãªã—ã§ä½œæ?ã—ãŸã€Tagbuffer オブジェクトã? makeTag() メソãƒ?ƒ‰ã®
185             * 返り値を渡ã—ã¾ã™ãŒã€Attributes.getAttribute() ã®è¿”り値ã§ã‚‚使用ã§ãã¾ã™ã?
186             * 引数ã?null ã®å ´åˆã?ã€ãªã«ã‚‚ã—ã¾ã›ã‚“ã€?
187             * ã“ã?メソãƒ?ƒ‰ã¯ã€makeTag() ãŒå‘¼ã°ã‚ŒãŸå¾Œã?ã€ç™»éŒ²ã§ããªããªã‚Šã¾ã™ã?
188             *
189             * @param       str     ã‚¿ã‚°ãƒãƒƒãƒ•ァーを追åŠ?—ã¾ã™ã?
190             * @see         #makeTag()
191             * @see         Attributes#getAttribute()
192             */
193            public void add( final String str ) {
194                    if( cacheTag != null ) {
195                            String errMsg = "makeTag() 実行後ã«ã€å±žæ?を追åŠ?™ã‚‹ã“ã¨ã¯å‡ºæ¥ã¾ã›ã‚“ã€? ;
196                            throw new RuntimeException( errMsg );
197                    }
198    
199                    if( str != null ) {
200                            buf.append( str ).append( " " );
201                    }
202            }
203    
204            /**
205             * ã‚¿ã‚°ã® æ•´å½¢ã•ã‚ŒãŸæ–‡å­—å?ã‚?作æ?ã—ã¾ã™ã?
206             * ã“ã?メソãƒ?ƒ‰ã¯ã€tagName,body,属æ?より ã‚¿ã‚°ã®å®Œæ?å½¢ã®æ–?­—å?を作æ?ã—ã¾ã™ã?
207             * 作æ?ã•ã‚ŒãŸæ–‡å­—å?ã¯ã€å?部ã§ã‚­ãƒ£ãƒ?‚·ãƒ¥ã•れã¾ã™ã?
208             * BODY部を指定ã™ã‚‹ã¨ã€?lt;tagName key="val" ?¥?¥?¥ &gt;body&lt;/tagName&gt; å½¢å¼ã«ãªã‚Šã¾ã™ã?
209             * BODY部ãŒã?null ã®å ´åˆã?ã€?&lt;tagName key="val" ?¥?¥?¥ /&gt; å½¢å¼ã«ãªã‚Šã¾ã™ã?
210             * ã‚¿ã‚°åã‚’æŒ?®šã—ãªã?null)ã¨ã€å®Œæ?å½¢ã®ã‚¿ã‚°ã¯ã€ä½œæ?ã§ãã¾ã›ã‚“ã€?
211             * 属æ?リスãƒ?key="value")ã®é€£çµå½¢å¼ã‚’è¿”ã—ã¾ã™ã?
212             *
213             * ã“ã?メソãƒ?ƒ‰ã®å‘¼ã³å‡ºã—以é™ã§ã¯ã€setBody() ã‚?add() も実行ã§ãã¾ã›ã‚“ã€?
214             *
215             * @return      æ•´å½¢ã•れã?ã‚¿ã‚°æ–?­—å?
216             */
217            public String makeTag() {
218                    if( cacheTag == null ) {
219                            if( tagName != null ) {
220                                    if( tagBody == null ) {
221                                            buf.append( "/>" );
222                                    }
223                                    else {
224                                            buf.append( ">" ).append( tagBody );
225                                            buf.append( "</" ).append( tagName ).append( ">" );
226                                    }
227                            }
228                            cacheTag = buf.toString();
229                    }
230    
231                    return cacheTag;
232            }
233    
234            /**
235             * 行番å·ä»˜ãã®ã‚¿ã‚°ã® æ•´å½¢ã•ã‚ŒãŸæ–‡å­—å?ã‚?作æ?ã—ã¾ã™ã?
236             * ã“ã?メソãƒ?ƒ‰ã¯ã€makeTag() ã®çµæžœã‚ˆã‚Šã€[I] æ–?­—å?を引数ã®è¡Œç•ªå·ã¨å¤‰æ›ã—ã¾ã™ã?
237             * ã“れã«ã‚ˆã‚Šã€å‹•çš?«è¡Œç•ªå·ã¤ãã?æƒ??を属æ?ã«ä»˜ä¸Žã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã?
238             * å†?ƒ¨ã«ã‚­ãƒ£ãƒ?‚·ãƒ¥ã•れるå?ã¯ã€[I] 記å·ã‚’変æ›ã—ã¦ã?ªã?Š¶æ…‹ã?æ–?­—å?ã§ã™ã?
239             * よã£ã¦ã€ã“ã®ãƒ¡ã‚½ãƒ?ƒ‰ã¯ã€rowNo を変ãˆã¦ã€ä½•度ã§ã‚‚呼ã³å‡ºã™ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€?
240             * setBody() ã‚?add() ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“ã€?
241             *
242             * @param       rowNo   行番å·([I] æ–?­—å?を変æ›ã—ã¾ã™ã?)
243             * @param       val     設定å?([V] æ–?­—å?を変æ›ã—ã¾ã™ã?)
244             *
245             * @return      æ•´å½¢ã•れã?ã‚¿ã‚°æ–?­—å?
246             */
247            public String makeTag( final int rowNo,final String val ) {
248                    String tag = makeTag();
249                    tag = StringUtil.replace( tag,"[I]",String.valueOf( rowNo ) );
250                    tag = StringUtil.replace( tag,"[V]",val );
251    
252                    return tag ;
253            }
254    }