1 19 20 package org.openide.src; 21 22 import java.text.*; 23 import java.util.*; 24 import java.io.*; 25 import java.lang.reflect.Modifier ; 26 27 import org.openide.src.*; 28 import org.openide.util.NbBundle; 29 30 126 public final class ElementFormat extends Format { 127 128 130 131 static final long serialVersionUID = 3775521938640169753L; 132 133 136 private static final String PROPERTIES_NAMES_INDEX = "mnfCtrscpaie"; 138 141 private static final String [] PROPERTIES_NAMES = { 142 ElementProperties.PROP_MODIFIERS, ElementProperties.PROP_NAME, ElementProperties.PROP_NAME, ElementProperties.PROP_NAME, ElementProperties.PROP_TYPE, ElementProperties.PROP_RETURN, ElementProperties.PROP_SUPERCLASS, ElementProperties.PROP_STATIC, ElementProperties.PROP_PARAMETERS, ElementProperties.PROP_PARAMETERS, ElementProperties.PROP_INTERFACES, ElementProperties.PROP_EXCEPTIONS }; 155 156 157 private static final byte STATUS_OUTSIDE = 0; 158 private static final byte STATUS_INSIDE = 1; 159 private static final byte STATUS_RBRACE = 2; 160 161 163 164 private String pattern; 165 166 private boolean source; 168 169 172 private transient LinkedList list; 173 174 176 180 public ElementFormat(String pattern) { 181 applyPattern(pattern); 182 source = true; 183 } 184 185 192 public void setSourceFormat(boolean source) { 193 this.source = source; 194 } 195 196 200 public boolean isSourceFormat() { 201 return source; 202 } 203 204 207 public String getPattern() { 208 return pattern; 209 } 210 211 218 public StringBuffer format(Object o, StringBuffer toAppendTo, FieldPosition pos) { 219 try { 220 Element element = (Element) o; 221 Iterator it = list.iterator(); 222 while (it.hasNext()) { 223 Object obj = it.next(); 224 if (obj instanceof String ) { 225 toAppendTo.append((String )obj); 226 } 227 else { 228 ((Tag)obj).format(element, toAppendTo); 229 } 230 } 231 return toAppendTo; 232 } 233 catch (ClassCastException e) { 234 throw new IllegalArgumentException (NbBundle.getMessage(ElementFormat.class, "MSG_badArgument")); 235 } 236 } 237 238 242 public String format(Element element) { 243 return format(element, new StringBuffer (), null).toString(); 244 } 245 246 251 public boolean dependsOnProperty(String prop) { 252 Iterator it = list.iterator(); 253 while (it.hasNext()) { 254 Object obj = it.next(); 255 if (obj instanceof Tag) { 256 int index = PROPERTIES_NAMES_INDEX.indexOf(((Tag)obj).kind); 257 if (PROPERTIES_NAMES[index].equals(prop)) 258 return true; 259 } 260 } 261 return false; 262 } 263 264 269 public Object parseObject (String source, ParsePosition status) { 270 return null; 271 } 272 273 274 private void readObject(ObjectInputStream s) throws ClassNotFoundException , IOException { 275 s.defaultReadObject(); 276 applyPattern(pattern); 277 } 278 279 281 282 private void applyPattern(String pattern) { 283 this.pattern = pattern; 284 list = new LinkedList(); 285 286 byte status = STATUS_OUTSIDE; 287 StringTokenizer tokenizer = new StringTokenizer(pattern, "{}", true); while (tokenizer.hasMoreTokens()) { 289 String token = tokenizer.nextToken(); 290 switch (status) { 291 292 case STATUS_OUTSIDE: 293 if (token.equals("}")) throw new IllegalArgumentException (NbBundle.getMessage(ElementFormat.class, "MSG_badPattern")); 295 if (token.equals("{")) status = STATUS_INSIDE; 297 else 298 list.add(token); 299 break; 300 301 case STATUS_INSIDE: 302 if ((token.equals("{")) || (token.equals("}"))) throw new IllegalArgumentException (NbBundle.getMessage(ElementFormat.class, "MSG_badPattern")); 304 list.add(createTag(token)); 305 status = STATUS_RBRACE; 306 break; 307 308 case STATUS_RBRACE: 309 if (!token.equals("}")) throw new IllegalArgumentException (NbBundle.getMessage(ElementFormat.class, "MSG_badPattern")); 311 status = STATUS_OUTSIDE; 312 break; 313 314 } 315 } 316 } 317 318 322 private Tag createTag(String s) { 323 if (s.length() > 0) { 324 char c = s.charAt(0); 325 String [] params = new String [0]; 326 327 if (s.length() > 1) { 328 if ((s.length() < 2) || (s.charAt(1) != ',')) 329 throw new IllegalArgumentException (NbBundle.getMessage(ElementFormat.class, "MSG_badPattern")); 330 params = parseParams(s.substring(2)); 331 } 332 333 if ("mnfCtrsc".indexOf(c) != -1) { switch (params.length) { 335 case 0: return new Tag(c, "", ""); case 2: return new Tag(c, params[0], params[1]); 337 } 338 } 339 else if ("paie".indexOf(c) != -1) { switch (params.length) { 341 case 0: return new ArrayTag(c, "", "", ", "); case 2: return new ArrayTag(c, params[0], params[1], ", "); case 3: return new ArrayTag(c, params[0], params[1], params[2]); 344 } 345 } 346 } 347 throw new IllegalArgumentException (NbBundle.getMessage(ElementFormat.class, "MSG_badPattern")); 348 } 349 350 354 private String [] parseParams(String s) { 355 StringTokenizer tokenizer = new StringTokenizer(s, ",", true); ArrayList list = new ArrayList(); 357 StringBuffer token = new StringBuffer (); 358 boolean comma = false; 359 boolean inString = false; 360 361 while (tokenizer.hasMoreTokens()) { 362 String t = tokenizer.nextToken(); 363 364 if (inString) { 365 token.append(t); 366 if (t.endsWith("\"")) { if (token.length() > 1) 368 token.setLength(token.length() - 1); 369 list.add(token.toString()); 370 token.setLength(0); 371 inString = false; 372 comma = true; 373 } 374 continue; 375 } 376 377 if (t.equals(",")) { if (comma) 379 comma = false; 380 else 381 list.add(""); continue; 383 } 384 385 if (comma) 386 throw new IllegalArgumentException (NbBundle.getMessage(ElementFormat.class, "MSG_badPattern")); 387 388 String stringToAdd = t; 389 390 if (t.startsWith("\"")) { if ((t.endsWith("\"")) && (t.length() > 1)) { stringToAdd = (t.length() <= 2) ? "" : t.substring(1, t.length() - 1); } 394 else { 395 token.append(t.substring(1)); 396 inString = true; 397 continue; 398 } 399 } 400 401 list.add(stringToAdd); 402 comma = true; 403 token.setLength(0); 404 } 405 if (!comma) 406 list.add(""); 408 String [] ret = new String [list.size()]; 409 list.toArray(ret); 410 return ret; 411 } 412 413 private static void resolveClassName (StringBuffer sb, ClassElement element) { 414 ClassElement c = element.getDeclaringClass (); 415 if (c == null) { 416 sb.append (element.getName ().getName ()); 417 return; 418 } 419 resolveClassName (sb, c); 420 sb.append ('.').append (element.getName ().getName ()); 421 } 422 423 425 String identifierToString(Identifier id) { 426 return source ? id.getSourceName() : id.getFullName(); 427 } 428 429 431 String typeToString(Type id) { 432 return source ? id.getSourceString() : id.getFullString(); 433 } 434 435 436 private class Tag extends Object implements Serializable { 437 438 char kind; 439 440 441 String prefix; 442 443 444 String suffix; 445 446 static final long serialVersionUID =4946774706959011193L; 447 448 Tag(char kind, String prefix, String suffix) { 449 this.kind = kind; 450 this.prefix = prefix; 451 this.suffix = suffix; 452 } 453 454 458 void format(Element element, StringBuffer buf) { 459 try { 460 int mark = buf.length(); 461 buf.append(prefix); 462 463 switch (kind) { 464 case 'm': 465 buf.append(Modifier.toString(((MemberElement)element).getModifiers())); 466 break; 467 468 case 'n': 469 buf.append(identifierToString(((MemberElement)element).getName())); 470 break; 471 472 case 'f': 473 buf.append(((MemberElement)element).getName().getFullName()); 474 break; 475 476 case 'C': 477 resolveClassName (buf, (ClassElement)element); 478 break; 479 480 case 't': 481 buf.append(typeToString(((FieldElement)element).getType())); 482 break; 483 484 case 'r': 485 buf.append(typeToString(((MethodElement)element).getReturn())); 486 break; 487 488 case 's': 489 Identifier id = ((ClassElement)element).getSuperclass(); 490 if (id != null) 491 buf.append(identifierToString(id)); 492 break; 493 494 case 'c': 495 if (((InitializerElement)element).isStatic()) 496 buf.append(Modifier.toString(Modifier.STATIC)); 497 break; 498 } 499 500 if (buf.length() > mark + prefix.length()) { 501 buf.append(suffix); 502 } 503 else { 504 buf.setLength(mark); 505 } 506 } 507 catch (ClassCastException e) { 508 throw new IllegalArgumentException (NbBundle.getMessage(ElementFormat.class, "MSG_badPattern")); 509 } 510 } 511 } 512 513 515 private class ArrayTag extends Tag { 516 517 String delim; 518 519 static final long serialVersionUID =2060398944304753010L; 520 521 ArrayTag(char kind, String prefix, String suffix, String delim) { 522 super(kind, prefix, suffix); 523 this.delim = delim; 524 } 525 526 530 void format(Element element, StringBuffer buf) { 531 try { 532 int mark = buf.length(); 533 buf.append(prefix); 534 535 switch (kind) { 536 case 'e': 537 Identifier[] ids = ((ConstructorElement)element).getExceptions(); 538 for (int i = 0; i < ids.length; i++) { 539 if (i > 0) 540 buf.append(delim); 541 buf.append(identifierToString(ids[i])); 542 } 543 break; 544 545 case 'p': 546 case 'a': 547 MethodParameter[] args = ((ConstructorElement)element).getParameters(); 548 for (int i = 0; i < args.length; i++) { 549 if (i > 0) 550 buf.append(delim); 551 if (kind == 'a') { 552 args[i].getAsString(buf, source); 553 } 554 else { 555 args[i].getType().getAsString(buf, source); 556 } 557 } 558 break; 559 560 case 'i': 561 ids = ((ClassElement)element).getInterfaces(); 562 for (int i = 0; i < ids.length; i++) { 563 if (i > 0) 564 buf.append(delim); 565 buf.append(identifierToString(ids[i])); 566 } 567 break; 568 } 569 570 if (buf.length() > mark + prefix.length()) { 571 buf.append(suffix); 572 } 573 else { 574 buf.setLength(mark); 575 } 576 } 577 catch (ClassCastException e) { 578 throw new IllegalArgumentException (NbBundle.getMessage(ElementFormat.class, "MSG_badPattern")); 579 } 580 } 581 } 582 } 583 | Popular Tags |