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.taglet; 017 018 import java.lang.reflect.Field; 019 020 import com.sun.javadoc.Tag; 021 import com.sun.javadoc.Doc; 022 import com.sun.javadoc.MethodDoc; 023 import com.sun.javadoc.ClassDoc; 024 import com.sun.javadoc.PackageDoc; 025 import com.sun.javadoc.ProgramElementDoc; 026 027 /** 028 * Doclet ã‚’å?ç?™ã‚‹ã?ãƒã‚°ãƒ©ãƒ?§å…±é€šã—ã¦ä½¿ç”¨ã•れる簡易メソãƒ?ƒ‰ç¾¤(ユーãƒ?‚£ãƒªãƒ?‚£ã‚¯ãƒ©ã‚¹)ã§ã™ã? 029 * 030 * @version 4.0 031 * @author Kazuhiko Hasegawa 032 * @since JDK5.0, 033 */ 034 public final class DocletUtil { 035 /** リターンコーãƒ? System.getProperty("line.separator") */ 036 public static final String CR = System.getProperty("line.separator"); 037 038 private static final String CLS = "org.opengion.hayabusa.common.BuildNumber"; // package.class 039 private static final String FLD = "VERSION_NO"; // field 040 private static String versionNo = null; // æœ??ã«ä¸?º¦ã?‘å–å¾—ã—ã¦ãŠãã¾ã™ã? 041 042 /** 043 * ã™ã¹ã¦ã?staticメソãƒ?ƒ‰ãªã®ã§ã€ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ã‚’呼ã³å‡ºã•ãªãã—ã¦ãŠãã¾ã™ã? 044 * 045 */ 046 private DocletUtil() {} 047 048 /** 049 * 入力文å—å?ã® HTML æ–?—をフィルタリングã—ã¾ã™ã? 050 * "&" ã¯ã€?&#38;" ã€?<" ã¯ã€?&lt;" ã€?>" ã¯ã€?&gt;" ã«å¤‰æ›ã—ã¾ã™ã? 051 * StringUtil.htmlFilter ã¨ã®é•ã„ã¯ã€?;' â†?";" ã¸ã®å¤‰æ›ãŒã‚ã‚‹ã“ã¨ã§ã™ã? 052 * 053 * @og.rev 5.5.4.1 (2012/07/06) DocletUtil.htmlFilter â†?StringUtil.htmlFilter ã«å¤‰æ›´ã®ãŸã‚ã€å»?¢ 054 * 055 * @param input String 056 * 057 * @return 変æ›å¾Œæ–‡å—å? 058 */ 059 // public static String htmlFilter( final String input ) { 060 // if( input == null ) { return ""; } 061 // 062 // int len = input.length(); 063 // 064 // StringBuilder rtn = new StringBuilder( len + 50 ); 065 // char ch; 066 // for(int i=0; i<len; i++) { 067 // ch = input.charAt(i); 068 // switch( ch ) { 069 // case '<' : rtn.append("<"); break; 070 // case '>' : rtn.append(">"); break; 071 // case '"' : rtn.append("""); break; 072 // case '\'' : rtn.append("'"); break; 073 // case '&' : rtn.append("&"); break; 074 // case ';' : rtn.append(";"); break; 075 // default : rtn.append(ch); 076 // } 077 // } 078 // return( rtn.toString() ); 079 // } 080 081 /** 082 * target æ–?—å?ã«å«ã¾ã‚Œã‚‹ from æ–?—å?ã‚?to æ–?—å?ã«ç½®ãæ›ãˆã¾ã™ã? 083 * 084 * @param target å…??æ–?—å? 085 * @param from ç½®æ›å?FROM 086 * @param to ç½®æ›å?TO 087 * 088 * @return 変æ›å¾Œæ–‡å—å? 089 */ 090 public static String replace( final String target,final String from,final String to ) { 091 if( target == null || from == null || to == null ) { return target; } 092 StringBuilder strBuf = new StringBuilder( 200 ); 093 094 int start = 0; 095 int end = target.indexOf( from,start ); 096 while( end >= 0 ) { 097 strBuf.append( target.substring( start,end ) ); 098 strBuf.append( to ); 099 start = end + from.length(); 100 end = target.indexOf( from,start ); 101 } 102 strBuf.append( target.substring( start ) ); 103 104 return strBuf.toString(); 105 } 106 107 /** 108 * ã‚³ãƒ¡ãƒ³ãƒˆéƒ¨ã®æ–?—å?ã‚’å–å¾—ã—ã¾ã™ã? 109 * 110 * @og.rev 5.5.4.1 (2012/07/06) コメントã?æ–?—å?ã§ãªãã?Tagé…å?ã¨ã—ã¦å‡¦ç?•ã›ã‚‹ã€? 111 * 112 * @param cmnt String 113 * 114 * @return コメント文å—å? 115 */ 116 // public static String commentText( final String cmnt ) { 117 // if( cmnt == null ) { return ""; } 118 // 119 // String rtn = cmnt; 120 // int indx = cmnt.indexOf( "{@value}" ); 121 // if( indx >= 0 ) { 122 // rtn = cmnt.substring( indx+8 ); // {@value} 以å‰ã‚’削除 123 // } 124 // return htmlFilter( rtn ); 125 // } 126 127 /** 128 * ã‚»ãƒ?‚¿ãƒ¼ãƒ¡ã‚½ãƒ?ƒ‰ã® setXXXX ã® set を削除ã—ã?æ¬¡ã®æ–?—ã‚’å°æ–‡å—化ã—ã¾ã™ã? 129 * ã¤ã¾ã‚Šã?ã‚»ãƒ?‚¿ãƒ¼ãƒ¡ã‚½ãƒ?ƒ‰ã‹ã‚‰å±žæ?値を推測ã—ã¾ã™ã? 130 * (è¶?‰¹æ®Šå?ç?ã‚»ãƒ?‚¿ãƒ¼ãƒ¡ã‚½ãƒ?ƒ‰ã®set以下2文å—ç›®ãŒå¤§æ–?—ã?å ´åˆã?ã€? 131 * ?‘æ–‡å—目も大æ–?—ã¨è€?ˆã¦å°æ–‡å—化を行ã„ã¾ã›ã‚“ã€? 132 * 例ãˆã°ã€setSYS ã‚?setUSER ãªã©ã€RequestValueTag.javaã«ä½¿ç”¨ã™ã‚‹ã‚±ãƒ¼ã‚¹ã§ã™ã? 133 * 134 * @param target 処ç?¯¾è±¡ã¨ãªã‚‹æ–‡å—å? 135 * 136 * @return オプションæ–?—å? 137 */ 138 public static String removeSetter( final String target ) { 139 if( target != null && target.startsWith( "set" ) ) { 140 char[] chs = target.toCharArray(); 141 if( chs.length > 4 && !( chs[4] >= 'A' && chs[4] <= 'Z' ) ) { 142 chs[3] = Character.toLowerCase( chs[3] ) ; 143 } 144 return new String( chs,3,chs.length-3 ); 145 } 146 return target; 147 } 148 149 /** 150 * オプションé…å?æ–?—å?ã‚ˆã‚Šã€æŒ‡å®šã?ã‚ーã«å¯¾å¿œã™ã‚‹ã‚ªãƒ—ション値を返ã—ã¾ã™ã? 151 * 152 * @param key ã‚ー 153 * @param options オプションé…å?æ–?—å? 154 * 155 * @return オプションæ–?—å? 156 */ 157 public static String getOption( final String key , final String[][] options ) { 158 String rtn = ""; 159 if( key == null || options == null ) { return rtn; } 160 161 for( int i=0; i<options.length; i++ ) { 162 if( key.equalsIgnoreCase( options[i][0] ) ) { 163 rtn = options[i][1]; 164 break ; 165 } 166 } 167 return rtn ; 168 } 169 170 /** 171 * {@og.value package.class#field} å½¢å¼ã?valueã‚¿ã‚°ã‚’æ–‡å—å?ã«ç½®ãæ›ãˆã¾ã™ã? 172 * 173 * 処ç?š„ã«ã¯ã€ãƒªãƒ•レクションã§ã€å?ã‚’å–å¾—ã—ã¾ã™ã?値ã¯ã€staticフィールドã?ã¿å–å¾—å¯èƒ½ã§ã™ã? 174 * 175 * @og.rev 5.5.4.1 (2012/07/06) æ–°è¦è¿½åŠ? 176 * @og.rev 5.5.5.6 (2012/08/31) クラスåã?å–å¾—ã§ã€ProgramElementDoc ã§å‡¦ç?™ã‚‹ã‚ˆã?«å¤‰æ›´ 177 * 178 * @param tag Tagオブジェクãƒ? 179 * 180 * @return valueã‚¿ã‚°ã®è§£æžçµæžœã®æ–?—å? 181 */ 182 public static String valueTag( final Tag tag ) { 183 String txt = tag.text(); 184 if( txt != null ) { 185 String cls = null; // package.class 186 String fld = null; // field 187 188 // package.class#field å½¢å¼ã?è§£æžã? 189 int adrs = txt.indexOf('#') ; 190 if( adrs > 0 ) { 191 cls = txt.substring( 0,adrs ); // package.class 192 fld = txt.substring( adrs+1 ); // field 193 } 194 else if( adrs == 0 ) { 195 fld = txt.substring( 1 ); // #field 196 } 197 else { 198 String errMsg = "è¦å‘?{@value package.class#field} å½¢å¼ã? フィールドå #field ãŒã‚りã¾ã›ã‚“ã€? + CR 199 + tag.position() + " : " + txt + CR ; 200 System.err.println( errMsg ); 201 // # を付ã‘忘れãŸã¨è€?ˆã€è?åˆ??身ã®ã‚¯ãƒ©ã‚¹ã‚’利用 202 fld = txt; // field 203 } 204 205 // package.class ã‚’ãã¡ã‚“ã¨ä½œæ?ã™ã‚‹ã€? 206 Doc doc = tag.holder(); 207 // if( doc.isMethod() ) { 208 // MethodDoc mdoc = (MethodDoc)doc; 209 // ClassDoc cdoc = mdoc.containingClass(); 210 // if( cls == null ) { // package.class ãŒç™»éŒ²ã•れã¦ã?ªã??åˆã? 211 // cls = cdoc.qualifiedName() ; 212 // } 213 // else if( cls.indexOf('.') < 0 ) { // class ã®ã¿ãŒç™»éŒ²ã•れã¦ã?‚‹å ´åˆã?findClass ã§ã€package è¾¼ã®æ£å¼ã‚¯ãƒ©ã‚¹åを検索ã™ã‚‹ã€? 214 // ClassDoc pdoc = cdoc.findClass( cls ); 215 // cls = pdoc.qualifiedName() ; 216 // } 217 // } 218 219 // 5.5.5.6 (2012/08/31) ProgramElementDoc ã§å‡¦ç?™ã‚‹ã‚ˆã?«å¤‰æ›´ 220 if( doc instanceof ProgramElementDoc ) { 221 ProgramElementDoc pdoc = (ProgramElementDoc)doc; 222 ClassDoc cdoc = pdoc.containingClass(); 223 if( cdoc != null ) { 224 if( cls == null ) { // package.class ãŒç™»éŒ²ã•れã¦ã?ªã??åˆã? 225 cls = cdoc.qualifiedName() ; 226 } 227 else if( cls.indexOf('.') < 0 ) { // class ã®ã¿ãŒç™»éŒ²ã•れã¦ã?‚‹å ´åˆã?findClass ã§ã€package è¾¼ã®æ£å¼ã‚¯ãƒ©ã‚¹åを検索ã™ã‚‹ã€? 228 ClassDoc fdoc = cdoc.findClass( cls ); 229 if( fdoc != null ) { 230 cls = fdoc.qualifiedName() ; 231 } 232 } 233 } 234 else { 235 if( cls == null ) { // package.class ãŒç™»éŒ²ã•れã¦ã?ªã??åˆã? 236 cls = pdoc.qualifiedName() ; 237 } 238 } 239 } 240 241 // 5.6.3.3 (2013/04/19) メソãƒ?ƒ‰åŒ–ã§å…±æœ‰ã—ã¾ã™ã? 242 txt = getStaticField( cls,fld ); 243 244 // try { 245 // Field fldObj = Class.forName( cls ).getDeclaredField( fld ); 246 // // privateフィールドã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã€?ã‚»ã‚ュリãƒ?‚£ãƒ¼ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã«ã‚ˆã£ã¦ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ãŒã‹ã‘られã¦ã?ªã??å? 247 // if( !fldObj.isAccessible() ) { fldObj.setAccessible( true ); } 248 // txt = String.valueOf( fldObj.get( null ) ); // static フィールドã?ã€å¼•æ•° null ã§å€¤ã‚’å–å¾? 249 // } 250 // catch( Exception ex ) { 251 // String errMsg = "è¦å‘?{@value package.class#field} å½¢å¼ã?対象ãŒã‚りã¾ã›ã‚“ã€? + CR 252 // + tag.position() + " : " + tag.text() + CR 253 // + ex.getMessage() + CR; 254 // System.err.println( errMsg ); 255 // } 256 } 257 return txt ; 258 } 259 260 /** 261 * {@og.doc03Link queryType Query_**** クラス} å½¢å¼ã?doc03Linkタグをリンクæ–?—å?ã«ç½®ãæ›ãˆã¾ã™ã? 262 * 263 * <a href="/gf/jsp/DOC03/index.jsp?command=NEW&GAMENID=DOC03&VERNO=X.X.X.X&VALUENAME=queryType" target="CONTENTS">Query_**** クラス</a> 264 * ã®ã‚ˆã†ãªãƒªãƒ³ã‚¯ã‚’作æ?ã—ã¾ã™ã? 265 * 第ä¸?¼•æ•°ã¯ã€VALUENAME ã®å¼•æ•°ã§ã™ã? 266 * ãれ以é™ã?ãƒ?‚ストã?ã€ãƒªãƒ³ã‚¯æ–?—å?ã®ãƒ‰ã‚ュメントã«ãªã‚Šã¾ã™ã? 267 * DOC03 ç”»é¢ã¸ã®ãƒªãƒ³ã‚¯ã‚’作æ?ã™ã‚‹ã«å½“ãŸã‚Šã?ãƒã?ジョンãŒå¿?¦ã§ã™ã?org.opengion.hayabusa.common.BuildNumber#VERSION_NO ã‹ã‚‰å–å¾—ã—ã¾ã™ãŒã€? 268 * パッケージã®å„ªå…ˆé?ã®é–¢ä¿‚ã§ã€ãƒªãƒ•レクションを使用ã—ã¾ã™ã? 269 * 270 * @og.rev 5.6.3.3 (2013/04/19) æ–°è¦ä½œæ? 271 * 272 * @param tag Tagオブジェクãƒ? 273 * 274 * @return valueã‚¿ã‚°ã®è§£æžçµæžœã®æ–?—å? 275 */ 276 public static String doc03LinkTag( final Tag tag ) { 277 if( versionNo == null ) { versionNo = getStaticField( CLS , FLD ); } 278 279 String txt = tag.text(); 280 if( txt != null ) { 281 String valnm = null; // VALUENAME 282 String body = null; // ドã‚ュメンãƒ? 283 284 int adrs = txt.indexOf(' ') ; // æœ??ã®ã‚¹ãƒšã?スã§åˆ?›¢ã—ã¾ã™ã? 285 if( adrs > 0 ) { 286 valnm = txt.substring( 0,adrs ); // VALUENAME 287 body = txt.substring( adrs+1 ); // ドã‚ュメンãƒ? 288 } 289 else { 290 valnm = txt; // VALUENAME 291 body = txt; // ドã‚ュメンãƒ? 292 } 293 294 txt = "<a href=\"/gf/jsp/DOC03/index.jsp?command=NEW&GAMENID=DOC03" 295 + "&VERNO=" + versionNo 296 + "&VALUENAME=" + valnm 297 + "\" target=\"CONTENTS\">" 298 + body 299 + "</a>" ; 300 } 301 return txt ; 302 } 303 304 /** 305 * パッケージ.クラスå?ã¨ã€ãƒ•ィールドå ã‹ã‚‰ã€staticフィールドã?値をå–å¾—ã—ã¾ã™ã? 306 * 307 * Field fldObj = Class.forName( cls ).getDeclaredField( fld ); ã§ã€Fieldオブジェクトを呼出ã—ã? 308 * String.valueOf( fldObj.get( null ) ); ã§ã€å?ã‚’å–å¾—ã—ã¦ã?¾ã™ã? 309 * static フィールドã?ã€å¼•æ•° null ã§å€¤ã‚’å–å¾—ã§ãã¾ã™ã? 310 * 311 * 例ï¼? 312 * String cls = "org.opengion.hayabusa.common.BuildNumber"; // package.class 313 * String fld = "VERSION_NO"; // field 314 * 315 * @og.rev 5.6.3.3 (2013/04/19) æ–°è¦ä½œæ? 316 * 317 * @param cls パッケージ.クラスå? 318 * @param fld フィールドå 319 * @return å–å¾—å? 320 */ 321 public static String getStaticField( final String cls , final String fld ) { 322 323 String txt = null; 324 try { 325 Field fldObj = Class.forName( cls ).getDeclaredField( fld ); 326 // privateフィールドã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã€?ã‚»ã‚ュリãƒ?‚£ãƒ¼ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã«ã‚ˆã£ã¦ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ãŒã‹ã‘られã¦ã?ªã??å? 327 if( !fldObj.isAccessible() ) { fldObj.setAccessible( true ); } 328 txt = String.valueOf( fldObj.get( null ) ); // static フィールドã?ã€å¼•æ•° null ã§å€¤ã‚’å–å¾? 329 } 330 catch( Exception ex ) { 331 String errMsg = "package.class = " + cls + " field = " + fld + " ã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸã€? 332 + ex.getMessage() + CR; 333 System.err.println( errMsg ); 334 } 335 336 return txt ; 337 } 338 }