1 19 20 package org.openide.src; 21 22 import java.util.List ; 23 import java.util.ArrayList ; 24 25 import org.openide.src.SourceException; 26 import org.openide.src.JavaDoc; 27 import org.openide.src.JavaDocTag; 28 29 33 class JavaDocMemoryImpl implements JavaDoc, java.io.Serializable { 34 35 protected String rawText; 36 37 private transient String text; 38 39 41 private static final JavaDocTagMemoryImpl[] EMPTY_ARRAY = new JavaDocTagMemoryImpl[] {}; 42 43 46 private static final String lineSeparator; 47 48 51 private static final int lineSeparatorLength; 52 53 private static final char LINEFEED = '\n'; 54 55 static { 56 String sep = System.getProperty("line.separator"); if (sep == null || 58 sep.equals("\n")) { lineSeparator = null; 60 lineSeparatorLength = 0; 61 } else { 62 lineSeparator = sep; 63 lineSeparatorLength = sep.length(); 64 } 65 } 66 67 68 70 71 public JavaDocMemoryImpl( String rawText ) { 72 this.rawText = rawText; 73 } 74 75 78 public String getRawText () { 79 return rawText; 80 } 81 82 86 public void setRawText (String s) throws SourceException { 87 rawText = s; 88 } 89 90 93 public String getText () { 94 if ( rawText == null ) 95 return ""; List tmp = new ArrayList (); 97 parseComment( tmp ); 98 return text; 99 } 100 101 105 public void setText (String s) throws SourceException { 106 regenerateRawText( convertNewLines(s), getTags(), getSeeTags() ); 109 } 110 111 113 public void clearJavaDoc() throws SourceException { 114 rawText = null; 115 } 116 117 120 public boolean isEmpty() { 121 return rawText == null; 122 } 123 124 126 public JavaDocTag[] getTags() { 127 if ( rawText == null ) 128 return EMPTY_ARRAY; 129 130 List tagList = new ArrayList (); 131 132 parseComment( tagList ); 133 134 JavaDocTag[] tagArray = new JavaDocTag[ tagList.size() ]; 135 tagList.toArray( tagArray ); 136 137 return tagArray; 138 } 139 140 142 public JavaDocTag[] getTags( String name ) { 143 JavaDocTag[] allTags = getTags(); 144 ArrayList resultList = new ArrayList ( allTags.length ); 145 146 for( int i = 0; i < allTags.length; i++ ) { 147 if ( allTags[i].name().equals( name ) ) 148 resultList.add( allTags[i] ); 149 } 150 151 JavaDocTag result[] = new JavaDocTag[ resultList.size() ]; 152 resultList.toArray( result ); 153 return result; 154 } 155 156 161 synchronized public void changeTags( JavaDocTag[] tags, int action ) throws SourceException { 162 163 StringBuffer sb = new StringBuffer (); 164 165 switch ( action ) { 166 case ADD: 167 case SET: 168 sb.append( action == ADD ? getRawText() : getText() ); 169 for( int i = 0; i < tags.length; i++ ) { 170 sb.append( "\n" ).append( tags[i].toString() ); } 172 setRawText( sb.toString() ); 173 break; 174 175 case REMOVE: 176 JavaDocTag currTags[] = getTags(); 177 sb.append( getText() ); 178 179 for( int i = 0; i < currTags.length; i++ ) { 180 boolean found = false; 181 String strTag = currTags[i].toString(); 182 for( int j = 0; j < tags.length; j ++ ) { 183 if ( strTag.equals( tags[j].toString() ) ) { 184 found = true; 185 break; 186 } 187 } 188 if ( !found ) 189 sb.append( "\n" ).append( strTag ); } 191 setRawText( sb.toString() ); 192 break; 193 } 194 } 195 196 198 public JavaDocTag.See[] getSeeTags() { 199 200 JavaDocTag[] allTags = getTags(); 201 ArrayList resultList = new ArrayList ( allTags.length ); 202 203 for( int i = 0; i < allTags.length; i++ ) { 204 if ( allTags[i] instanceof JavaDocTag.See ) 205 resultList.add( allTags[i] ); 206 } 207 208 JavaDocTag.See result[] = new JavaDocTag.See[ resultList.size() ]; 209 resultList.toArray( result ); 210 return result; 211 } 212 213 214 216 protected void regenerateRawText( String text, JavaDocTag[] tags, JavaDocTag.See[] seeTags ) { 217 StringBuffer sb = new StringBuffer ( text.length() + tags.length * 80 + seeTags.length * 80 ); 218 219 sb.append( text ); 220 221 for (int i = 0; i < tags.length; i++ ) { 222 sb.append( tags[i].toString() ); 223 } 224 225 for (int i = 0; i < seeTags.length; i++ ) { 226 sb.append( seeTags[i].toString() ); 227 } 228 229 rawText = sb.toString(); 230 } 231 232 233 236 static class Class extends JavaDocMemoryImpl implements JavaDoc.Class { 237 static final long serialVersionUID =3206093459760846163L; 238 Class( String rawText ) { 239 super( rawText ); 240 } 241 } 242 243 246 static class Field extends JavaDocMemoryImpl implements JavaDoc.Field { 247 248 Field ( String rawText ) { 249 super( rawText ); 250 } 251 252 254 public JavaDocTag.SerialField[] getSerialFieldTags() { 255 JavaDocTag[] allTags = this.getTags(); 256 ArrayList resultList = new ArrayList ( allTags.length ); 257 258 for( int i = 0; i < allTags.length; i++ ) { 259 if ( allTags[i] instanceof JavaDocTag.SerialField ) 260 resultList.add( allTags[i] ); 261 } 262 263 JavaDocTag.SerialField result[] = new JavaDocTag.SerialField[ resultList.size() ]; 264 resultList.toArray( result ); 265 return result; 266 } 267 268 } 269 270 272 static class Method extends JavaDocMemoryImpl implements JavaDoc.Method { 273 274 Method ( String rawText ) { 275 super( rawText ); 276 } 277 278 280 public JavaDocTag.Param[] getParamTags() { 281 JavaDocTag[] allTags = this.getTags(); 282 ArrayList resultList = new ArrayList ( allTags.length ); 283 284 for( int i = 0; i < allTags.length; i++ ) { 285 if ( allTags[i] instanceof JavaDocTag.Param ) 286 resultList.add( allTags[i] ); 287 } 288 289 JavaDocTag.Param result[] = new JavaDocTag.Param[ resultList.size() ]; 290 resultList.toArray( result ); 291 return result; 292 } 293 294 296 public JavaDocTag.Throws[] getThrowsTags() { 297 JavaDocTag[] allTags = this.getTags(); 298 ArrayList resultList = new ArrayList ( allTags.length ); 299 300 for( int i = 0; i < allTags.length; i++ ) { 301 if ( allTags[i] instanceof JavaDocTag.Throws ) 302 resultList.add( allTags[i] ); 303 } 304 305 JavaDocTag.Throws result[] = new JavaDocTag.Throws[ resultList.size() ]; 306 resultList.toArray( result ); 307 return result; 308 } 309 } 310 311 313 316 317 private void parseComment( List tagList ) { 318 final int IN_TEXT = 1; 319 final int TAG_GAP = 2; 320 final int TAG_NAME = 3; 321 final int TAG_TEXT = 4; 322 323 int state = IN_TEXT; 324 325 boolean newLine = true; 326 327 String tagName = null; 328 329 int tagStart = 0; 330 int textStart = 0; 331 int textEnd = 0; 332 int lastNonWhite = -1; 333 int len = rawText.length(); 334 335 for (int inx = 0; inx < len; ++inx) { 336 337 char ch = rawText.charAt(inx); 338 boolean isWhite = Character.isWhitespace(ch); 339 340 switch (state) { 341 case IN_TEXT: 342 if (newLine && ch == '@') { 343 parseCommentComponent(tagList, null, 0, textEnd); 344 tagStart = inx; 345 state = TAG_NAME; 346 } 347 break; 348 case TAG_NAME: 349 if (isWhite) { 350 tagName = rawText.substring(tagStart, inx); 351 state = TAG_GAP; 352 } 353 break; 354 case TAG_GAP: 355 if (isWhite) { 356 break; 357 } 358 textStart = inx; 359 state = TAG_TEXT; 360 case TAG_TEXT: 362 if (newLine && ch == '@') { 363 parseCommentComponent(tagList, tagName, textStart, lastNonWhite + 1); 364 tagStart = inx; 365 state = TAG_NAME; 366 } 367 break; 368 } 369 370 if (lineSeparator != null && 372 inx + lineSeparatorLength <= len && 373 rawText.regionMatches(inx, lineSeparator, 0, lineSeparatorLength)) { 374 newLine = true; 375 if (state == IN_TEXT) { 376 textEnd = inx; 377 } 378 inx += lineSeparatorLength - 1; 380 } else if (ch == '\n') { 381 newLine = true; 382 if (state == IN_TEXT) { 383 textEnd = inx; 384 } 385 } else if (!isWhite) { 386 lastNonWhite = inx; 387 newLine = false; 388 } 389 } 390 391 switch (state) { 393 case TAG_NAME: 394 tagName = rawText.substring(tagStart, len); 395 396 case TAG_GAP: 397 textStart = len; 398 399 case TAG_TEXT: 400 case IN_TEXT: 401 parseCommentComponent(tagList, tagName, textStart, lastNonWhite + 1); 402 break; 403 }; 404 405 } 406 407 411 private void parseCommentComponent( List tagList, String tagName, int from, int upto) { 412 String tx = upto <= from ? "" : rawText.substring(from, upto); if (tagName == null) { 414 text = tx; 415 } 416 else { 417 JavaDocTagMemoryImpl tag; 418 if (tagName.equals("@exception") || tagName.equals("@throws")) { warnIfEmpty(tagName, tx); 420 tag = new JavaDocTagMemoryImpl.Throws(tagName, tx); 421 } 422 else if (tagName.equals("@param")) { warnIfEmpty(tagName, tx); 424 tag = new JavaDocTagMemoryImpl.Param(tagName, tx); 425 } 426 else if (tagName.equals("@see")) { warnIfEmpty( tagName, tx); 428 tag = new JavaDocTagMemoryImpl.See(tagName, tx); 429 } 430 else if (tagName.equals("@serialField")) { warnIfEmpty( tagName, tx); 432 tag = new JavaDocTagMemoryImpl.SerialField(tagName, tx); 433 } 434 else if (tagName.equals("@return")) { warnIfEmpty(tagName, tx); 436 tag = new JavaDocTagMemoryImpl(tagName, tx); 437 } 438 else if (tagName.equals("@author")) { warnIfEmpty(tagName, tx); 440 tag = new JavaDocTagMemoryImpl(tagName, tx); 441 } 442 else if (tagName.equals("@version")) { warnIfEmpty( tagName, tx); 444 tag = new JavaDocTagMemoryImpl(tagName, tx); 445 } 446 else { 447 tag = new JavaDocTagMemoryImpl(tagName, tx); 448 } 449 tagList.add(tag); 450 } 451 } 452 453 454 private void warnIfEmpty( String tagName, String tx) { 456 461 } 462 463 static String convertNewLines(String input) { 464 if (lineSeparator == null) 465 return input; 466 467 int firstIndex; 468 473 firstIndex = input.indexOf(lineSeparator); 474 if (firstIndex == -1) 475 return input; 476 StringBuffer result = new StringBuffer (); 478 char[] contents = input.toCharArray(); 479 if (firstIndex > 0) 480 result.append(contents, 0, firstIndex); 481 result.append(LINEFEED); 482 483 firstIndex += lineSeparatorLength; 484 int lastPos = firstIndex; 485 while (firstIndex < contents.length) { 486 firstIndex = input.indexOf(lineSeparator, firstIndex); 487 if (firstIndex == -1) { 488 result.append(contents, lastPos, contents.length - lastPos); 490 return result.toString(); 491 } 492 result.append(contents, lastPos, firstIndex - lastPos); 494 result.append(LINEFEED); 495 firstIndex += lineSeparatorLength; 496 lastPos = firstIndex; 497 } 498 result.append(contents, lastPos, firstIndex - lastPos); 501 return result.toString(); 503 } 504 505 } 506 | Popular Tags |