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 */ 016package org.opengion.fukurou.xml; 017 018import java.util.List; 019import java.util.ArrayList; 020import org.xml.sax.Attributes; 021 022import static org.opengion.fukurou.system.HybsConst.CR; // 6.1.0.0 (2014/12/26) refactoring 023import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE; // 6.1.0.0 (2014/12/26) refactoring 024 025/** 026 * 属性リストをã‚らã‚ã™ã€OGAttributes クラスを定義ã—ã¾ã™ã€‚ 027 * 028 * 属性リストã¯ã€ã‚ーã¨å€¤ã®ãƒšã‚¢ã‚’ã€ä¸¦ã³é †ã§ç®¡ç†ã—ã¦ã„るリストをä¿æŒã—ã¦ã„ã¾ã™ã€‚ 029 * 内部的ã«ã¯ã€ org.xml.sax.Attributes ã‹ã‚‰ã®å€¤ã®è¨å®šã¨ã€ã‚¿ãƒ–ã®å±žæ€§ã®æ•´åˆ—ã‚’è¡Œã†ãŸã‚ã® 030 * 属性タブã€å±žæ€§ã®æ”¹è¡Œã®åˆ¶å¾¡ã€å±žæ€§ã®é•·ã•ã®åˆ¶å¾¡ ãªã©ã‚’è¡Œã„ã¾ã™ã€‚ 031 * 032 * @og.rev 5.1.8.0 (2010/07/01) æ–°è¦ä½œæˆ 033 * 034 * @version 5.0 035 * @author Kazuhiko Hasegawa 036 * @since JDK6.0, 037 */ 038public class OGAttributes { 039 040 /** 属性ã®å€‹æ•°åˆ¶é™ã€‚ã“ã®å€‹æ•°ã§æ”¹è¡Œã‚’è¡Œã†ã€‚ {@value} */ 041 public static final int CR_CNT = 4; 042 /** 属性ã®é•·ã•åˆ¶é™ã€‚ã“れ以上ã®å ´åˆã¯ã€æ”¹è¡Œã‚’è¡Œã†ã€‚ {@value} */ 043 public static final int CR_LEN = 80; 044 045 private final List<OGAtts> attList = new ArrayList<>(); 046 047 private boolean useCR ; // 属性ã®æ”¹è¡Œå‡ºåŠ›ã‚’è¡Œã†ã‹ã©ã†ã‹ã€‚個数制é™ãŒï¼‘ã¨åŒã˜ 048 private int maxValLen ; // 属性ã®åå‰ã®æœ€å¤§æ–‡å—æ•° 049 private String id ; // 特別ãªå±žæ€§ã€‚id ã§æ¤œç´¢ã‚’高速化ã™ã‚‹ãŸã‚。 050 051 /** 052 * デフォルトトコンストラクター 053 * 054 * å–ã‚Šã‚ãˆãšã€å±žæ€§ã‚ªãƒ–ジェクトを構築ã™ã‚‹å ´åˆã«ä½¿ç”¨ã—ã¾ã™ã€‚ 055 * 属性タブã¯ã€æ”¹è¡Œï¼‹ã‚¿ãƒ–ã€å±žæ€§ãƒªã‚¹ãƒˆã¯ã€ç©ºã®ãƒªã‚¹ãƒˆã€å±žæ€§æ”¹è¡Œã¯ã€false ã‚’åˆæœŸè¨å®šã—ã¾ã™ã€‚ 056 * 057 */ 058 public OGAttributes() { 059 // Document empty method ãƒã‚§ãƒƒã‚¯å¯¾ç– 060 } 061 062 /** 063 * 属性タブã€å±žæ€§ãƒªã‚¹ãƒˆã€å±žæ€§æ”¹è¡Œã®æœ‰ç„¡ã‚’指定ã—ã¦ã®ãƒˆã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ãƒ¼ 064 * 065 * 属性タブã€å±žæ€§ãƒªã‚¹ãƒˆã« null を指定ã™ã‚‹ã¨ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒˆã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ãƒ¼ã®è¨å®šã¨ 066 * åŒã˜çŠ¶æ…‹ã«ãªã‚Šã¾ã™ã€‚ 067 * 068 * æ³¨æ„ å±žæ€§å€¤ã®æ£è¦åŒ–ã¯å¿…ãšè¡Œã‚ã‚Œã¾ã™ã€‚ 069 * 属性値ã«å«ã¾ã‚Œã‚‹CR(復帰), LF(改行), TAB(タブ)ã¯ã€åŠè§’スペースã«ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚ 070 * XMLã®è¦å®šã§ã¯ã€å±žæ€§ã®ä¸¦ã³é †ã¯ä¿éšœã•ã‚Œã¾ã›ã‚“ãŒã€SAXã®Attributesã¯ã€XMLã«è¨˜è¿°ã•ã‚ŒãŸé †ç•ªã§ 071 * å–å¾—ã§ãã¦ã„ã¾ã™ã®ã§ã€ã“ã®ã‚¯ãƒ©ã‚¹ã§ã®å±žæ€§ãƒªã‚¹ãƒˆã‚‚ã€è¨˜è¿°é †ã§ã®ä¸¦ã³é †ã«ãªã‚Šã¾ã™ã€‚ 072 * 073 * @og.rev 5.1.9.0 (2010/08/01) id 属性ã®ã¿ç‰¹åˆ¥ã«ã‚ャッシュã—ã¦ãŠã。 074 * 075 * @param attri 属性リスト 076 */ 077 public OGAttributes( final Attributes attri ) { 078 079 final int num = attri == null ? 0 : attri.getLength(); 080 int maxLen = 0; 081 for( int i=0; i<num; i++ ) { 082 final String key = attri.getQName(i); 083 final String val = attri.getValue(i); 084 final OGAtts atts = new OGAtts( key,val ); 085 attList.add( atts ); 086 maxLen = atts.maxKeyLen( maxLen ); 087 088 if( "id".equals( key ) ) { id = val; } // 5.1.9.0 (2010/08/01) 089 } 090 091 maxValLen = maxLen; 092 } 093 094 /** 095 * 属性改行ã®æœ‰ç„¡ã‚’è¨å®šã—ã¾ã™ã€‚ 096 * 097 * ã‚¿ã‚°ã«ã‚ˆã£ã¦ã€å±žæ€§ãŒå¤šããªã£ãŸã‚Šã€æ„味ãŒé‡è¦ãªå ´åˆã¯ã€å±žæ€§ï¼‘ã¤ã¥ã¤ã«æ”¹è¡Œã‚’ 098 * è¡Œã„ãŸã„ケースãŒã‚ã‚Šã¾ã™ã€‚ 099 * 属性改行をtrue ã«è¨å®šã™ã‚‹ã¨ã€å±žæ€§ä¸€ã¤ã¥ã¤ã§ã€æ”¹è¡Œã‚’è¡Œã„ã¾ã™ã€‚ 100 * 101 * false ã®å ´åˆã¯ã€è‡ªå‹•çš„ãªæ”¹è¡Œå‡¦ç†ãŒè¡Œã‚ã‚Œã¾ã™ã€‚ 102 * ã“ã‚Œã¯ã€å±žæ€§ã®å€‹æ•°åˆ¶é™(CR_CNT)を超ãˆã‚‹å ´åˆã¯ã€æ”¹è¡Œã‚’è¡Œã„ã¾ã™ã€‚ 103 * 104 * @param useCR 属性改行ã®æœ‰ç„¡(true:1属性å˜ä½ã®æ”¹è¡Œ) 105 * @see #CR_CNT 106 * @see #CR_LEN 107 */ 108 public void setUseCR( final boolean useCR ) { 109 this.useCR = useCR; 110 } 111 112 /** 113 * 属性リストã®å€‹æ•°ã‚’å–å¾—ã—ã¾ã™ã€‚ 114 * 115 * @return 属性リストã®å€‹æ•° 116 */ 117 public int size() { 118 return attList.size(); 119 } 120 121 /** 122 * 属性リストã‹ã‚‰ã€æŒ‡å®šã®é…列番å·ã®ã€å±žæ€§ã‚ーをå–å¾—ã—ã¾ã™ã€‚ 123 * 124 * @param adrs é…åˆ—ç•ªå· 125 * 126 * @return 属性ã‚ー 127 */ 128 public String getKey( final int adrs ) { 129 return attList.get(adrs).KEY ; 130 } 131 132 /** 133 * 属性リストã‹ã‚‰ã€æŒ‡å®šã®é…列番å·ã®ã€å±žæ€§å€¤ã‚’å–å¾—ã—ã¾ã™ã€‚ 134 * 135 * @param adrs é…åˆ—ç•ªå· 136 * 137 * @return 属性値 138 */ 139 public String getVal( final int adrs ) { 140 return attList.get(adrs).VAL ; 141 } 142 143 /** 144 * 属性リストã‹ã‚‰ã€æŒ‡å®šã®å±žæ€§ã‚ーã®ã€å±žæ€§å€¤ã‚’å–å¾—ã—ã¾ã™ã€‚ 145 * 146 * ã“ã®å‡¦ç†ã¯ã€å±žæ€§ãƒªã‚¹ãƒˆã‚’ã™ã¹ã¦ã‚¹ã‚ャンã—ã¦ã€ã‚ーã«ãƒžãƒƒãƒã™ã‚‹ 147 * 属性オブジェクトを見ã¤ã‘ã€ãã“ã‹ã‚‰ã€å±žæ€§å€¤ã‚’å–り出ã™ã®ã§ã€ 148 * パフォーマンスã«å•é¡ŒãŒã‚ã‚Šã¾ã™ã€‚ 149 * 基本的ã«ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹æŒ‡å®šã§ã€å±žæ€§å€¤ã‚’å–り出ã™ã‚ˆã†ã«ã—ã¦ãã ã•ã„。 150 * 151 * @og.rev 5.1.9.0 (2010/08/01) æ–°è¦è¿½åŠ 152 * 153 * @param key 属性ã‚ー 154 * 155 * @return 属性値 156 */ 157 public String getVal( final String key ) { 158 String val = null; 159 160 if( key != null ) { 161 for( final OGAtts atts : attList ) { 162 if( key.equals( atts.KEY ) ) { 163 val = atts.VAL; 164 break; 165 } 166 } 167 } 168 169 return val; 170 } 171 172 /** 173 * 属性リストã‹ã‚‰ã€æŒ‡å®šã®å±žæ€§ã‚ーã®ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’å–å¾—ã—ã¾ã™ã€‚ 174 * 175 * ã©ã¡ã‚‰ã‹ã¨ã„ã†ã¨ã€ã‚ーã®å˜åœ¨ãƒã‚§ãƒƒã‚¯ã«è¿‘ã„処ç†ã‚’è¡Œã„ã¾ã™ã€‚ 176 * ã“ã®å‡¦ç†ã¯ã€å±žæ€§ãƒªã‚¹ãƒˆã‚’ã™ã¹ã¦ã‚¹ã‚ャンã—ã¦ã€ã‚ーã«ãƒžãƒƒãƒã™ã‚‹ 177 * 属性オブジェクトを見ã¤ã‘ã€ãã“ã‹ã‚‰ã€å±žæ€§å€¤ã‚’å–り出ã™ã®ã§ã€ 178 * パフォーマンスã«å•é¡ŒãŒã‚ã‚Šã¾ã™ã€‚ 179 * 180 * @og.rev 5.1.9.0 (2010/08/01) æ–°è¦è¿½åŠ 181 * 182 * @param key 属性ã‚ー 183 * 184 * @return アドレス ã‚ーãŒå˜åœ¨ã—ãªã„å ´åˆã¯ã€-1 ã‚’è¿”ã™ã€‚ 185 */ 186 public int getAdrs( final String key ) { 187 int adrs = -1; 188 189 if( key != null ) { 190 for( int i=0; i<attList.size(); i++ ) { 191 if( key.equals( attList.get(i).KEY ) ) { 192 adrs = i; 193 break; 194 } 195 } 196 } 197 198 return adrs; 199 } 200 201 /** 202 * 属性リストã‹ã‚‰ã€id属性ã®ã€å±žæ€§å€¤ã‚’å–å¾—ã—ã¾ã™ã€‚ 203 * 204 * id属性 ã¯ã€å†…部的ã«ã‚ャッシュã—ã¦ãŠã‚Šã€ã™ãã«å–り出ã›ã¾ã™ã€‚ 205 * タグを特定ã™ã‚‹å ´åˆã€ä¸€èˆ¬å±žæ€§ã®ã‚ーã¨å€¤ã§é¸åˆ¥ã™ã‚‹ã®ã§ã¯ãªã〠206 * id属性を付与ã—ã¦é¸åˆ¥ã™ã‚‹ã‚ˆã†ã«ã™ã‚Œã°ã€é«˜é€Ÿã«è¦‹ã¤ã‘ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ 207 * 208 * @og.rev 5.1.9.0 (2010/08/01) æ–°è¦è¿½åŠ 209 * 210 * @return id属性値 211 */ 212 public String getId() { return id; } 213 214 /** 215 * 属性リストã®ã€æŒ‡å®šã®é…列番å·ã«ã€å±žæ€§å€¤ã‚’è¨å®šã—ã¾ã™ã€‚ 216 * 217 * @og.rev 5.1.9.0 (2010/08/01) id 属性ã®ã¿ç‰¹åˆ¥ã«ã‚ャッシュã—ã¦ãŠã。 218 * 219 * @param adrs é…åˆ—ç•ªå· 220 * @param val 属性値 221 */ 222 public void setVal( final int adrs , final String val ) { 223 final OGAtts atts = attList.remove(adrs) ; 224 attList.add( adrs , new OGAtts( atts.KEY,val ) ); 225 226 if( "id".equals( atts.KEY ) ) { id = val; } // 5.1.9.0 (2010/08/01) 227 } 228 229 /** 230 * 属性リストã«ã€æŒ‡å®šã®ã‚ーã€å±žæ€§å€¤ã‚’è¨å®šã—ã¾ã™ã€‚ 231 * ã‚‚ã—ã€å±žæ€§ãƒªã‚¹ãƒˆã«ã€æŒ‡å®šã®ã‚ーãŒã‚ã‚Œã°ã€å±žæ€§å€¤ã‚’変更ã—ã¾ã™ã€‚ 232 * ãªã‘ã‚Œã°ã€æœ€å¾Œã«è¿½åŠ ã—ã¾ã™ã€‚ 233 * 234 * @og.rev 5.6.1.2 (2013/02/22) æ–°è¦è¿½åŠ 235 * 236 * @param key 属性ã‚ー 237 * @param val 属性値 238 */ 239 public void setVal( final String key , final String val ) { 240 final int adrs = getAdrs( key ); 241 if( adrs < 0 ) { add( key,val ); } 242 else { setVal( adrs,val ); } 243 } 244 245 /** 246 * 属性リストã«ã€å±žæ€§(ã‚ーã€å€¤ã®ã‚»ãƒƒãƒˆ)ã‚’è¨å®šã—ã¾ã™ã€‚ 247 * 248 * 属性リストã®ä¸€ç•ªæœ€å¾Œã«ã€å±žæ€§(ã‚ーã€å€¤ã®ã‚»ãƒƒãƒˆ)ã‚’è¨å®šã—ã¾ã™ã€‚ 249 * 250 * @og.rev 5.1.9.0 (2010/08/01) id 属性ã®ã¿ç‰¹åˆ¥ã«ã‚ャッシュã—ã¦ãŠã。 251 * 252 * @param key 属性リストã®ã‚ー 253 * @param val 属性リストã®å€¤ 254 */ 255 public void add( final String key , final String val ) { 256 257 final OGAtts atts = new OGAtts( key,val ); 258 attList.add( atts ); 259 maxValLen = atts.maxKeyLen( maxValLen ); 260 261 if( "id".equals( key ) ) { id = val; } // 5.1.9.0 (2010/08/01) 262 } 263 264 /** 265 * 指定ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å±žæ€§ãƒªã‚¹ãƒˆã«ã€å±žæ€§(ã‚ーã€å€¤ã®ã‚»ãƒƒãƒˆ)ã‚’è¨å®šã—ã¾ã™ã€‚ 266 * 267 * 指定ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å±žæ€§ã‚’ç½®ãæ›ãˆã‚‹ã®ã§ã¯ãªãè¿½åŠ ã—ã¾ã™ã€‚ 268 * 269 * @og.rev 5.1.9.0 (2010/08/01) id 属性ã®ã¿ç‰¹åˆ¥ã«ã‚ャッシュã—ã¦ãŠã。 270 * 271 * @param adrs 属性リストã®ã‚¢ãƒ‰ãƒ¬ã‚¹ 272 * @param key 属性リストã®ã‚ー 273 * @param val 属性リストã®å€¤ 274 */ 275 public void add( final int adrs , final String key , final String val ) { 276 277 final OGAtts atts = new OGAtts( key,val ); 278 attList.add( adrs , atts ); 279 maxValLen = atts.maxKeyLen( maxValLen ); 280 281 if( "id".equals( key ) ) { id = val; } // 5.1.9.0 (2010/08/01) 282 } 283 284 /** 285 * 指定ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å±žæ€§ãƒªã‚¹ãƒˆã‹ã‚‰ã€å±žæ€§æƒ…å ±ã‚’å‰Šé™¤ã—ã¾ã™ã€‚ 286 * 287 * 指定ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å±žæ€§ã‚’ç½®ãæ›ãˆã‚‹ã®ã§ã¯ãªãè¿½åŠ ã—ã¾ã™ã€‚ 288 * 289 * @og.rev 5.1.9.0 (2010/08/01) id 属性ã®ã¿ç‰¹åˆ¥ã«ã‚ャッシュã—ã¦ãŠã。 290 * 291 * @param adrs 属性リストã®ã‚¢ãƒ‰ãƒ¬ã‚¹ 292 */ 293 public void remove( final int adrs ) { 294 final OGAtts atts = attList.remove(adrs) ; 295 296 if( "id".equals( atts.KEY ) ) { id = null; } // 5.1.9.0 (2010/08/01) 297 298 // 削除ã—ãŸã‚ー㌠maxValLen ã ã£ãŸã¨ã—ã¦ã‚‚ã€å†è¨ˆç®—ã¯ã€è¡Œã„ã¾ã›ã‚“。 299 // å†è¨ˆç®—ã¨ã¯ã€æ¬¡ã®é•·ã•ã‚’見ã¤ã‘ã‚‹å¿…è¦ãŒã‚ã‚‹ã®ã§ã€ã™ã¹ã¦ã® OGAtts ã‚’ã‚‚ã†ä¸€åº¦ 300 // ãƒã‚§ãƒƒã‚¯ã™ã‚‹å¿…è¦ãŒå‡ºã¦ãã‚‹ãŸã‚ã§ã™ã€‚ 301 } 302 303 /** 304 * オブジェクトã®æ–‡å—列表ç¾ã‚’è¿”ã—ã¾ã™ã€‚ 305 * 306 * 属性ã«ã¤ã„ã¦ã¯ã€ä¸¦ã³é †ã¯ã€ç™»éŒ²é †ãŒä¿éšœã•ã‚Œã¾ã™ã€‚ 307 * 308 * 属性ã¯ã€ï¼“ã¤ã®ãƒ‘ターンã§æ–‡å—列化を行ã„ã¾ã™ã€‚ 309 * ・useCR=true ã®å ´åˆ 310 * ã“ã®å ´åˆã¯ã€å±žæ€§ã‚’1行ãšã¤æ”¹è¡Œã—ãªãŒã‚‰ä½œæˆã—ã¾ã™ã€‚属性ã‚ーã¯ã€ 311 * 最大長+1 ã§ã‚¹ãƒšãƒ¼ã‚¹åŸ‹ã‚ã•ã‚Œã¦ã€æ•´å½¢ã•ã‚Œã¾ã™ã€‚ 312 * ・useCR=false ã®å ´åˆ 313 * ・属性ã®å€‹æ•°åˆ¶é™(CR_CNT)å˜ä½ã«ã€æ”¹è¡ŒãŒè¡Œã‚ã‚Œã¾ã™ã€‚ 314 * ã“ã‚Œã¯ã€å±žæ€§ãŒå³ã«å¤šã並ã³ã™ãŽã‚‹ã®ã‚’防ãŽã¾ã™ã€‚ 315 * ・属性ã®é•·ã•åˆ¶é™(CR_LEN)å˜ä½ã§ã€æ”¹è¡ŒãŒè¡Œã‚ã‚Œã¾ã™ã€‚ 316 * ã“ã‚Œã¯ã€ãŸã¨ãˆã€å±žæ€§ã®å€‹æ•°ãŒå°‘ãªãã¦ã‚‚ã€æ–‡å—列ã¨ã—ã¦é•·ã„å ´åˆã¯ã€ 317 * 改行ã•ã›ã¾ã™ã€‚ 318 * 319 * @og.rev 5.6.1.2 (2013/02/22) 改行処ç†ã®ä¿®æ£ã€‚最後ã®å±žæ€§å‡¦ç†ã®å¾Œã«ã‚‚改行を入れる。 320 * @og.rev 5.6.4.4 (2013/05/31) 改行処ç†ã®ä¿®æ£ã€‚attTabãŒã€ã‚¼ãƒæ–‡å—列ã®å ´åˆã®å¯¾å¿œã€‚ 321 * 322 * @param attTab Nodeã®éšŽå±¤ã‚’表ã™æ–‡å—列。 323 * @return ã“ã®ã‚ªãƒ–ジェクトã®æ–‡å—åˆ—è¡¨ç¾ 324 * @og.rtnNotNull 325 * @see OGNode#toString() 326 * @see #setUseCR( boolean ) 327 */ 328 public String getText( final String attTab ) { 329 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 330 331 final String crTab = attTab.length() > 0 ? attTab : (CR + "\t") ; 332 333 if( useCR ) { 334 for( int i=0; i<size(); i++ ) { 335 final OGAtts atts = attList.get(i); 336 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ConsecutiveAppendsShouldReuse 対応 337 buf.append( crTab ) 338 // 6.0.2.5 (2014/10/31) char ã‚’ append ã™ã‚‹ã€‚ 339 .append( atts.getAlignKey( maxValLen ) ).append( '=' ).append( atts.QRT_VAL ); 340 } 341 // 5.6.1.2 (2013/02/22) 改行処ç†ã®ä¿®æ£ã€‚最後ã®å±žæ€§å‡¦ç†ã®å¾Œã«ã‚‚改行を入れる。 342 buf.append( CR ); 343 } 344 else { 345 int crCnt = 0; 346 int crLen = 0; 347 for( int i=0; i<size(); i++ ) { 348 final OGAtts atts = attList.get(i); 349 crCnt++ ; 350 crLen += atts.LEN; 351 // 6.0.2.5 (2014/10/31) char ã‚’ append ã™ã‚‹ã€‚ 352 if( i>0 && (crCnt > CR_CNT || crLen > CR_LEN) ) { 353 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ConsecutiveAppendsShouldReuse 対応 354 buf.append( crTab ) 355 .append( atts.KEY ).append( '=' ).append( atts.QRT_VAL ); 356 crCnt = 0; 357 crLen = 0; 358 } 359 else { 360 buf.append( ' ' ).append( atts.KEY ).append( '=' ).append( atts.QRT_VAL ); 361 } 362 } 363 } 364 365 return buf.toString(); 366 } 367 368 /** 369 * オブジェクトã®æ–‡å—列表ç¾ã‚’è¿”ã—ã¾ã™ã€‚ 370 * 371 * @og.rev 5.6.1.2 (2013/02/22) 改行処ç†ã®ä¿®æ£ã€‚最後ã®å±žæ€§å‡¦ç†ã®å¾Œã«ã‚‚改行を入れる。 372 * 373 * @return ã“ã®ã‚ªãƒ–ジェクトã®æ–‡å—åˆ—è¡¨ç¾ 374 * @og.rtnNotNull 375 * @see OGNode#toString() 376 */ 377 @Override 378 public String toString() { 379 return getText( " " ); 380 } 381 382 /** 383 * 属性ã‚ーã¨å±žæ€§å€¤ã‚’管ç†ã™ã‚‹ クラス 384 * 385 * 属性自身ã¯ã€å±žæ€§ã‚ーã¨å±žæ€§å€¤ã®ã¿ã§å分ã§ã™ãŒã€æ”¹è¡Œå‡¦ç†ã‚„æ–‡å—列ã®é•·ã•è¨å®šã§ã€ 386 * 予ã‚内部処ç†ã‚’ã—ã¦ãŠããŸã„ãŸã‚ã€ã‚¯ãƒ©ã‚¹åŒ–ã—ã¦ã„ã¾ã™ã€‚ 387 * 388 * 内部変数ã¯ã€final ã™ã‚‹ã“ã¨ã§å®šæ•°åŒ–ã—ã€ã‚¢ã‚¯ã‚»ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰çµŒç”±ã§ã¯ãªãã€ç›´æŽ¥å†…部変数を 389 * å‚ç…§ã•ã›ã‚‹ã“ã¨ã§ã€è¦‹æ˜“ã•ã‚’優先ã—ã¦ã„ã¾ã™ã€‚ 390 * 391 * @og.rev 6.3.9.1 (2015/11/27) private static final class ã«å¤‰æ›´ã€‚ 392 * 393 */ 394 private static final class OGAtts { 395 /** 属性ã®é•·ã•ã‚’ãã‚ãˆã‚‹ãŸã‚ã®ç©ºç™½æ–‡å—ã®æƒ…å ± **/ 396 private static final String SPACE = " "; // 5.1.9.0 (2010/09/01) public ⇒ private ã¸å¤‰æ›´ 397 398 /** 属性ã‚ー **/ 399 private final String KEY ; 400 /** 属性値 **/ 401 private final String VAL ; 402 private final int KLEN ; 403 private final int LEN ; 404 private final String QRT_VAL; 405 406 /** 407 * 引数を指定ã—ã¦æ§‹ç¯‰ã™ã‚‹ã€ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ãƒ¼ 408 * 409 * 属性ã‚ーã¨ã€å±žæ€§å€¤ を指定ã—ã¦ã€ã‚ªãƒ–ジェクトを構築ã—ã¾ã™ã€‚ 410 * 411 * 412 * @og.rev 6.3.9.1 (2015/11/27) 修飾åã‚’ã€public → ãªã—(パッケージプライベート)ã«å¤‰æ›´ã€‚ 413 * @param key 属性ã‚ー 414 * @param val 属性値 415 */ 416 /* default */ OGAtts( final String key , final String val ) { 417 KEY = key; 418 VAL = val == null ? "" : htmlFilter(val) ; 419 KLEN = key.length(); 420 LEN = KLEN + VAL.length(); 421 422 QRT_VAL = VAL.indexOf( '"' ) >= 0 ? ("'" + VAL + "'") : ("\"" + VAL + "\"") ; 423 } 424 425 /** 426 * ã‚ーã®æ–‡å—é•·ã•ã®æ¯”較ã§ã€å¤§ãã„æ•°å—ã‚’è¿”ã—ã¾ã™ã€‚ 427 * 428 * 属性ã‚ーã®æœ€å¤§ã®æ–‡å—列長を求ã‚ã‚‹ãŸã‚ã€å¼•æ•°ã®é•·ã•ã¨ã€å±žæ€§ã‚ーã®é•·ã•ã‚’比較ã—ã¦ã€ 429 * 大ããªå€¤ã®æ–¹ã‚’è¿”ã—ã¾ã™ã€‚ 430 * ã“ã®å‡¦ç†ã‚’ã€å±žæ€§ã™ã¹ã¦ã«è¡Œãˆã°ã€æœ€çµ‚çš„ã«æœ€ã‚‚大ããªå€¤ãŒæ®‹ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ 431 * 432 * @param maxLen 属性ã‚ーã®æœ€å¤§é•·ã• 433 * 434 * @return 属性リスト群ã®é•·ã•è£œæ£ãŒè¡Œã‚ã‚ŒãŸã€å±žæ€§ã‚ー+空白文å—列 435 */ 436 /* default */ int maxKeyLen( final int maxLen ) { 437 return maxLen > KLEN ? maxLen : KLEN ; 438 } 439 440 /** 441 * é•·ã•è£œæ£ãŒè¡Œã‚ã‚ŒãŸå±žæ€§ã‚ーをå–å¾—ã—ã¾ã™ã€‚ 442 * 443 * useCR=true ã®å ´åˆã«ã€å±žæ€§ã®æ”¹è¡ŒãŒè¡Œã‚ã‚Œã¾ã™ãŒã€ãã®ã¨ãã«ã€ã‚ーãŒç¸¦ã«ä¸¦ã³ã¾ã™ã€‚ 444 * ãã—ã¦ã€å€¤ã‚‚縦ã«ä¸¦ã¶ãŸã‚ã€é–“ã® ï½¢ï¼ï½£è¨˜å·ã®ä½ç½®ã‚’ãã‚ãˆã¦ã€è¡¨ç¤ºã—ã¾ã™ã€‚ 445 * 属性リストã®æœ€å¤§é•·ã•ï¼‹ï¼‘ ã«ãªã‚‹ã‚ˆã†ã«ã€ã‚ーã®æ–‡å—列ã«ã‚¹ãƒšãƒ¼ã‚¹ã‚’埋ã‚ã¾ã™ã€‚ 446 * ã“ã‚Œã«ã‚ˆã‚Šã€å±žæ€§ã‚’改行ã—ã¦è¡¨ç¤ºã—ã¦ã‚‚ã€å€¤ã®è¡¨ç¤ºä½ç½®ãŒãã‚ã„ã¾ã™ã€‚ 447 * 448 * @param maxLen 属性ã‚ーã®æœ€å¤§é•·ã• 449 * 450 * @return 属性リスト群ã®é•·ã•è£œæ£ãŒè¡Œã‚ã‚ŒãŸã€å±žæ€§ã‚ー+空白文å—列 451 * @og.rtnNotNull 452 */ 453 /* default */ String getAlignKey( final int maxLen ) { 454 return KEY + SPACE.substring( KLEN,maxLen ) ; 455 } 456 457 /** 458 * HTML上ã®ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—æ–‡å—を変æ›ã—ã¾ã™ã€‚ 459 * 460 * HTMLã§è¡¨ç¤ºã™ã‚‹å ´åˆã«ãã¡ã‚“ã¨ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—æ–‡å—ã«å¤‰æ›ã—ã¦ãŠã‹ãªã„㨠461 * Script を実行ã•ã‚ŒãŸã‚Šã€ä¸è¦ãªHTMLコマンドを潜り込ã¾ã•ã‚ŒãŸã‚Šã™ã‚‹ãŸã‚〠462 * ã‚»ã‚ュリティーホールã«ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ã®ã§ã€æ³¨æ„ã—ã¦ãã ã•ã„。 463 * 464 * ※ オリジナルã¯ã€org.opengion.fukurou.util.StringUtil#htmlFilter( String ) 465 * ã§ã™ãŒã€ãƒ€ãƒ–ルクオートã€ã‚·ãƒ³ã‚°ãƒ«ã‚¯ã‚ªãƒ¼ãƒˆã®å¤‰æ›å‡¦ç†ã‚’çœã„ã¦ã„ã¾ã™ã€‚ 466 * 467 * @og.rev 8.5.5.1 (2024/02/29) switchæ–‡ã«ã‚¢ãƒãƒ¼æ§‹æ–‡ã‚’使用 468 * 469 * @param input HTMLエスケープå‰ã®æ–‡å—列 470 * 471 * @return エスケープ文å—ã«å¤‰æ›å¾Œã®æ–‡å—列 472 * @og.rtnNotNull 473 * @see org.opengion.fukurou.util.StringUtil#htmlFilter( String ) 474 */ 475 private String htmlFilter( final String input ) { 476 if( input == null || input.isEmpty() ) { return ""; } 477 478 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ); 479// char ch; 480 for( int i=0; i<input.length(); i++ ) { 481// ch = input.charAt(i); 482 final char ch = input.charAt(i); 483 // 8.5.5.1 (2024/02/29) switchæ–‡ã«ã‚¢ãƒãƒ¼æ§‹æ–‡ã‚’使用 484// switch( ch ) { 485// case '<' : rtn.append("<"); break; 486// case '>' : rtn.append(">"); break; 487// // case '"' : rtn.append("""); break; 488// // case '\'' : rtn.append("'"); break; 489// case '&' : rtn.append("&"); break; 490// default : rtn.append(ch); break; // 6.0.2.5 (2014/10/31) break追記 491// } 492 switch( ch ) { 493 case '<' -> rtn.append("<"); 494 case '>' -> rtn.append(">"); 495 // case '"' -> rtn.append(""") 496 // case '\'' -> rtn.append("'"); 497 case '&' -> rtn.append("&"); 498 default -> rtn.append(ch); // 6.0.2.5 (2014/10/31) break追記 499 } 500 } 501 return rtn.toString() ; 502 } 503 } 504}