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 }