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 }