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    }