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.xml;
017    
018    import java.util.Map;
019    import java.util.LinkedHashMap;
020    import java.util.List;
021    
022    /**
023     * ã“ã?クラスã¯ã€XMLファイルã®ã‚¿ã‚°ã‚¨ãƒ¬ãƒ¡ãƒ³ãƒˆã‚’表ã™ã‚ªãƒ–ジェクトã§ã™ã?
024     * ã‚¿ã‚°ã¨ã—ã¦ã¯ã€ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ã«Mapを指定ã™ã‚Œã?(defaultMap)ã‚¿ã‚°ã®ã‚«ãƒ©ãƒ?‚’
025     * åˆæœŸè¨­å®šã—ã¾ã™ã?ã“ã?å ´åˆã?Map ã« LinkedHashMap を指定ã™ã‚Œã?ã€ã‚«ãƒ©ãƒ??
026     * é ?•ªã‚‚指定é?ã«ãªã‚Šã¾ã™ã?
027     * ã“ã“ã§æŒ?®šã—ãŸMapã®å€¤ã¯ã€put メソãƒ?ƒ‰ã«ã‚ˆã‚Šä¸Šæ›¸ãã•れã¾ã™ã?
028     * setAfterMap ã§æŒ?®šã—ãŸMapã¯ã€æ—¢å­˜ã?å†?ƒ¨æƒ??を上書ãã—ã¾ã™ã?キーãŒã‚れã?ã€?
029     * afterMap ã®å€¤ãŒä¸Šæ›¸ãã•れã?キーãŒç„¡ã‘ã‚Œã°æ–°è¦ã«ã‚­ãƒ¼ãŒè¿½åŠ?•れã¾ã™ã?
030     * ä¸?ˆ¬ã«ã¯ã€XMLファイルã‹ã‚‰æ§‹ç¯‰ã•れãŸå¾Œã§ã€XMLãƒ•ã‚¡ã‚¤ãƒ«ã®æƒ??ã‚’ä¸?‹¬ã—ã¦
031     * æ›¸ãæ›ãˆã‚‹å ´åˆãªã©ã«ä½¿ç”¨ã—ã¾ã™ã?
032     * 処ç??途中ã«ã‚»ãƒ?ƒˆã—ãŸå ´åˆã?ã€ãれã¾ã§ã®å€¤ãŒä¸Šæ›¸ãã•れã?ãれ以é™ã?値ã¯ã€?
033     * put ã«ã‚ˆã‚Šè¨­å®šã•れãŸå€¤ã?優先ã•れã¾ã™ã?
034     * toString() ã«ã‚ˆã‚Šã€ç°¡æ˜“的㫠オラクル?¸?¤?«å½¢å¼ã??¸?­?¬ãƒ•ァイルã®
035     * ?‘レコーãƒ?åˆ??æƒ??ã‚’è¿”ã—ã¾ã™ã?
036     * オラクル?¸?¤?«å½¢å¼ã??¸?­?¬ãƒ•ァイルã¨ã¯ã€ä¸‹è¨˜ã?よã†ãª ROWSET をトãƒ??ã¨ã™ã‚‹ ROW ã®
037     * é›?¾ã‚Šã§?‘レコードを表ã—ã?å„ROWã«ã¯ã€ã‚«ãƒ©ãƒ?をキーã¨ã™ã‚‹XMLã«ãªã£ã¦ã?¾ã™ã?
038     *
039     *   <ROWSET>
040     *       <ROW num="1">                         â†?ã“ã?部åˆ??ã¿
041     *           <カラãƒ?>値1</カラãƒ?>      â†?ã“ã?部åˆ??ã¿
042     *             ?¥?¥?¥                                   â†?ã“ã?部åˆ??ã¿
043     *           <カラãƒ?>値n</カラãƒ?>      â†?ã“ã?部åˆ??ã¿
044     *       </ROW>                                â†?ã“ã?部åˆ??ã¿
045     *        ?¥?¥?¥
046     *       <ROW num="n">
047     *          ?¥?¥?¥
048     *       </ROW>
049     *   <ROWSET>
050     *
051     * ã“ã?å½¢å¼ã§ã‚れã°ã€XDK(Oracle XML Developer's Kit)を利用ã™ã‚Œã°ã€?žå¸¸ã«ç°¡å˜ã«
052     * ãƒ??タベã?スã¨XMLファイルã¨ã®äº¤æ›ãŒå¯èƒ½ã§ã™ã?
053     * <a href="http://otn.oracle.co.jp/software/tech/xml/xdk/index.html" target="_blank" >
054     * XDK(Oracle XML Developer's Kit)</a>
055     *
056     * @version  4.0
057     * @author   Kazuhiko Hasegawa
058     * @since    JDK5.0,
059     */
060    public class TagElement {
061            private static final String CR = System.getProperty("line.separator");
062            private final String name ;
063            private final Map<String,String> map ;
064            private String num  = null;
065            private String body = null;
066    
067            /**
068             * Tagåã‚’æŒ?®šã—ã¦ã€ã‚ªãƒ–ジェクトを構築ã—ã¾ã™ã?
069             *
070             * @param       name    Tagå?
071             */
072            public TagElement( final String name ) {
073                    this( name,null );
074            }
075    
076            /**
077             * Tagåã¨åˆæœŸåŒ–ã?ãƒ??を指定ã—ã¦ã€ã‚ªãƒ–ジェクトを構築ã—ã¾ã™ã?
078             *
079             * @param       name            Tagå?
080             * @param       defaultMap      åˆæœŸåŒ–ã?ãƒ??
081             */
082            public TagElement( final String name, final Map<String,String> defaultMap ) {
083                    this.name = name;
084                    if( defaultMap != null ) {
085                            map = new LinkedHashMap<String,String>( defaultMap );
086                    }
087                    else {
088                            map = new LinkedHashMap<String,String>();
089                    }
090            }
091    
092            /**
093             * Tagåã‚’å–å¾—ã—ã¾ã™ã?
094             *
095             * @return      Tagå?
096             */
097            public String getName() {
098                    return name;
099            }
100    
101            /**
102             * カラãƒ?¨å€¤ã®ãƒšã‚¢ã‚’登録ã—ã¾ã™ã?
103             * ã™ã§ã« å†?ƒ¨ã«åŒä¸?‚«ãƒ©ãƒ?Œå­˜åœ¨ã™ã‚‹å ´åˆã?ã€å?ã®æ›¸ãæ›ãˆã‚’ã€ã‚«ãƒ©ãƒ?Œ
104             * 存在ã—ãªã??åˆã?ã€ã‚«ãƒ©ãƒ??追åŠ?‚’行ã„ã¾ã™ã?
105             * カラãƒ??ã€è¿½åŠ?•れãŸé ?•ªã‚’å?ç¾ã—ã¦XML化ã§ãã¾ã™ã?
106             *
107             * @og.rev 5.6.6.1 (2013/07/12) key ã?null ã‚?ゼロæ–?­—å?ã®å ´åˆã?ã€Map ã«è¿½åŠ?—ã¾ã›ã‚“ã€?
108             *
109             * @param       key     カラ�
110             * @param       val     値
111             */
112            public void put( final String key, final String val ) {
113                    if( key != null && key.length() > 0 ) {                                      // 5.6.6.1 (2013/07/12)
114                            map.put( key,val );
115                    }
116            }
117    
118            /**
119             * ã™ã§ã«æ§‹ç¯‰æ¸ˆã¿ã® カラãƒ?¨å€¤ã«ã€ä¸Šæ›¸ã㧠マップ情報を追åŠ?—ã¾ã™ã?
120             * ã™ã§ã« å†?ƒ¨ã«åŒä¸?‚«ãƒ©ãƒ?Œå­˜åœ¨ã™ã‚‹å ´åˆã?ã€å?ã®æ›¸ãæ›ãˆã‚’ã€ã‚«ãƒ©ãƒ?Œ
121             * 存在ã—ãªã??åˆã?ã€ã‚«ãƒ©ãƒ??追åŠ?‚’行ã„ã¾ã™ã?
122             * カラãƒ??ã€è¿½åŠ?•れãŸé ?•ªã‚’å?ç¾ã—ã¦XML化ã§ãã¾ã™ã?
123             *
124             * @param afterMap      後設定ã?ãƒ??
125             */
126            public void setAfterMap( final Map<String,String> afterMap ) {
127                    if( afterMap != null ) {
128                            map.putAll( afterMap );
129                    }
130            }
131    
132            /**
133             * キーを指定ã—ã¦å€¤ã‚’å–å¾—ã—ã¾ã™ã?
134             *
135             * @param       key     カラ�
136             *
137             * @return      値
138             */
139            public String get( final String key ) {
140                    return map.get( key );
141            }
142    
143            /**
144             * 行番å·ã‚’å–å¾—ã—ã¾ã™ã?
145             *
146             * @return      値
147             */
148            public String getRowNo() {
149                    return num;
150            }
151    
152            /**
153             * 行番å·ã‚’設定ã—ã¾ã™ã?
154             *
155             * @param       num     値
156             */
157            public void setRowNo( final String num ) {
158                    this.num = num ;
159            }
160    
161            /**
162             * BODYéƒ¨ã®æ–?­—å?ã‚’å–å¾—ã—ã¾ã™ã?
163             *
164             * @return      値
165             */
166            public String getBody() {
167                    return body;
168            }
169    
170            /**
171             * BODYéƒ¨ã®æ–?­—å?を設定ã—ã¾ã™ã?
172             *
173             * @param       body    値
174             */
175            public void setBody( final String body ) {
176                    this.body = body ;
177            }
178    
179            /**
180             * カラãƒ??é…å?ã‚’è¿”ã—ã¾ã™ã?
181             *
182             * @return      カラãƒ??é…å?(é ?ºã?ã€ã‚«ãƒ©ãƒ??登録é ?
183             */
184            public String[] getKeys() {
185                    return map.keySet().toArray( new String[map.size()] );
186            }
187    
188            /**
189             * カラãƒ??列ã?é ?¨åŒã˜ã€å?ã®é…å?ã‚’è¿”ã—ã¾ã™ã?
190             *
191             * @return      値ã®é…å?(é ?ºã?ã€ã‚«ãƒ©ãƒ??登録é ?¨ä¸??ã—ã¦ã?¾ã™ã?)
192             */
193            public String[] getValues() {
194                    return map.values().toArray( new String[map.size()] );
195            }
196    
197            /**
198             * 引数ã®ã‚«ãƒ©ãƒ?ã®Listã®é ?•ªã§ã€ã‚«ãƒ©ãƒ??列ã?値ã®é…å?ã‚’è¿”ã—ã¾ã™ã?
199             *
200             * @param clms  カラãƒ?ã®Listオブジェクãƒ?
201             *
202             * @return      値ã®é…å?(é ?ºã?ã€ã‚«ãƒ©ãƒ??登録é ?¨ä¸??ã—ã¦ã?¾ã™ã?)
203             */
204            public String[] getValues( final List<String> clms ) {
205                    int size = clms.size();
206                    String[] vals = new String[size];
207                    for( int i=0; i<size; i++ ) {
208                            vals[i] = map.get( clms.get(i) );
209                    }
210    
211                    return vals;
212            }
213    
214            /**
215             * 引数ã®ã‚«ãƒ©ãƒ?ã®é…å?ã®é ?•ªã§ã€ã‚«ãƒ©ãƒ??列ã?値ã®é…å?ã‚’è¿”ã—ã¾ã™ã?
216             * カラãƒ?ãŒã?存在ã—ãªã??åˆã?ã€å?ã¯ã€null ã‚’è¿”ã—ã¾ã™ã?
217             *
218             * @param       clms    カラãƒ?ã®é…å?æ–?­—å?
219             *
220             * @return      値ã®é…å?(é ?ºã?ã€ã‚«ãƒ©ãƒ??é…å?é ?¨ä¸??ã—ã¦ã?¾ã™ã?)
221             */
222            public String[] getValues( final String[] clms ) {
223                    int size = clms.length;
224                    String[] vals = new String[size];
225                    for( int i=0; i<size; i++ ) {
226                            vals[i] = map.get( clms[i] );
227                    }
228    
229                    return vals;
230            }
231    
232            /**
233             * å†?ƒ¨æƒ??ã®æ–?­—å?表ç¾ã‚’è¿”ã—ã¾ã™ã?
234             * ?‘レコードå?を表ã?ROW ã®XML表ç¾ã‚’作æ?ã—ã¾ã™ã?å‰å¾Œã«ã€ROWSET ã‚?
235             * 追åŠ?™ã‚Œã?ã€ã‚ªãƒ©ã‚¯ãƒ«XDKå½¢å¼ã?XMLを作æ?ã§ãã¾ã™ã?
236             *
237             * @return      å†?ƒ¨æƒ??ã®æ–?­—å?表ç¾
238             */
239            @Override
240            public String toString() {
241    
242                    StringBuilder buf = new StringBuilder();
243                    buf.append( "<" ).append( name );
244                    if( num != null ) {
245                            buf.append( " num=\"" ).append( num ).append( "\" " );
246                    }
247                    buf.append( ">" ).append( CR );
248    
249                    if( body != null ) {
250                            buf.append( body ).append( CR );
251                    }
252                    else {
253                            String[] keys = getKeys();
254                            for( int i=0; i<keys.length; i++ ) {
255                                    String val = get( keys[i] );
256                                    if( val == null ) {
257                                            buf.append( "  <" ).append( keys[i] ).append( " />" );
258                                    }
259                                    else {
260                                            buf.append( "  <" ).append( keys[i] ).append( ">" );
261                                            buf.append( val );
262                                            buf.append( "</" ).append( keys[i] ).append( ">" );
263                                    }
264                                    buf.append( CR );
265                            }
266                    }
267                    buf.append( "</" ).append( name ).append( ">" ).append( CR );
268    
269                    return buf.toString();
270            }
271    }