1 7 9 10 11 package org.ccil.cowan.tagsoup; 12 import org.xml.sax.Attributes ; 13 14 15 49 public class AttributesImpl implements Attributes 50 { 51 52 53 57 58 61 public AttributesImpl () 62 { 63 length = 0; 64 data = null; 65 } 66 67 68 76 public AttributesImpl (Attributes atts) 77 { 78 setAttributes(atts); 79 } 80 81 82 83 87 88 94 public int getLength () 95 { 96 return length; 97 } 98 99 100 108 public String getURI (int index) 109 { 110 if (index >= 0 && index < length) { 111 return data[index*5]; 112 } else { 113 return null; 114 } 115 } 116 117 118 126 public String getLocalName (int index) 127 { 128 if (index >= 0 && index < length) { 129 return data[index*5+1]; 130 } else { 131 return null; 132 } 133 } 134 135 136 144 public String getQName (int index) 145 { 146 if (index >= 0 && index < length) { 147 return data[index*5+2]; 148 } else { 149 return null; 150 } 151 } 152 153 154 162 public String getType (int index) 163 { 164 if (index >= 0 && index < length) { 165 return data[index*5+3]; 166 } else { 167 return null; 168 } 169 } 170 171 172 179 public String getValue (int index) 180 { 181 if (index >= 0 && index < length) { 182 return data[index*5+4]; 183 } else { 184 return null; 185 } 186 } 187 188 189 202 public int getIndex (String uri, String localName) 203 { 204 int max = length * 5; 205 for (int i = 0; i < max; i += 5) { 206 if (data[i].equals(uri) && data[i+1].equals(localName)) { 207 return i / 5; 208 } 209 } 210 return -1; 211 } 212 213 214 221 public int getIndex (String qName) 222 { 223 int max = length * 5; 224 for (int i = 0; i < max; i += 5) { 225 if (data[i+2].equals(qName)) { 226 return i / 5; 227 } 228 } 229 return -1; 230 } 231 232 233 243 public String getType (String uri, String localName) 244 { 245 int max = length * 5; 246 for (int i = 0; i < max; i += 5) { 247 if (data[i].equals(uri) && data[i+1].equals(localName)) { 248 return data[i+3]; 249 } 250 } 251 return null; 252 } 253 254 255 263 public String getType (String qName) 264 { 265 int max = length * 5; 266 for (int i = 0; i < max; i += 5) { 267 if (data[i+2].equals(qName)) { 268 return data[i+3]; 269 } 270 } 271 return null; 272 } 273 274 275 285 public String getValue (String uri, String localName) 286 { 287 int max = length * 5; 288 for (int i = 0; i < max; i += 5) { 289 if (data[i].equals(uri) && data[i+1].equals(localName)) { 290 return data[i+4]; 291 } 292 } 293 return null; 294 } 295 296 297 305 public String getValue (String qName) 306 { 307 int max = length * 5; 308 for (int i = 0; i < max; i += 5) { 309 if (data[i+2].equals(qName)) { 310 return data[i+4]; 311 } 312 } 313 return null; 314 } 315 316 317 318 322 323 330 public void clear () 331 { 332 if (data != null) { 333 for (int i = 0; i < (length * 5); i++) 334 data [i] = null; 335 } 336 length = 0; 337 } 338 339 340 348 public void setAttributes (Attributes atts) 349 { 350 clear(); 351 length = atts.getLength(); 352 if (length > 0) { 353 data = new String [length*5]; 354 for (int i = 0; i < length; i++) { 355 data[i*5] = atts.getURI(i); 356 data[i*5+1] = atts.getLocalName(i); 357 data[i*5+2] = atts.getQName(i); 358 data[i*5+3] = atts.getType(i); 359 data[i*5+4] = atts.getValue(i); 360 } 361 } 362 } 363 364 365 382 public void addAttribute (String uri, String localName, String qName, 383 String type, String value) 384 { 385 ensureCapacity(length+1); 386 data[length*5] = uri; 387 data[length*5+1] = localName; 388 data[length*5+2] = qName; 389 data[length*5+3] = type; 390 data[length*5+4] = value; 391 length++; 392 } 393 394 395 416 public void setAttribute (int index, String uri, String localName, 417 String qName, String type, String value) 418 { 419 if (index >= 0 && index < length) { 420 data[index*5] = uri; 421 data[index*5+1] = localName; 422 data[index*5+2] = qName; 423 data[index*5+3] = type; 424 data[index*5+4] = value; 425 } else { 426 badIndex(index); 427 } 428 } 429 430 431 439 public void removeAttribute (int index) 440 { 441 if (index >= 0 && index < length) { 442 if (index < length - 1) { 443 System.arraycopy(data, (index+1)*5, data, index*5, 444 (length-index-1)*5); 445 } 446 index = (length - 1) * 5; 447 data [index++] = null; 448 data [index++] = null; 449 data [index++] = null; 450 data [index++] = null; 451 data [index] = null; 452 length--; 453 } else { 454 badIndex(index); 455 } 456 } 457 458 459 469 public void setURI (int index, String uri) 470 { 471 if (index >= 0 && index < length) { 472 data[index*5] = uri; 473 } else { 474 badIndex(index); 475 } 476 } 477 478 479 489 public void setLocalName (int index, String localName) 490 { 491 if (index >= 0 && index < length) { 492 data[index*5+1] = localName; 493 } else { 494 badIndex(index); 495 } 496 } 497 498 499 509 public void setQName (int index, String qName) 510 { 511 if (index >= 0 && index < length) { 512 data[index*5+2] = qName; 513 } else { 514 badIndex(index); 515 } 516 } 517 518 519 528 public void setType (int index, String type) 529 { 530 if (index >= 0 && index < length) { 531 data[index*5+3] = type; 532 } else { 533 badIndex(index); 534 } 535 } 536 537 538 547 public void setValue (int index, String value) 548 { 549 if (index >= 0 && index < length) { 550 data[index*5+4] = value; 551 } else { 552 badIndex(index); 553 } 554 } 555 556 557 558 562 563 569 private void ensureCapacity (int n) { 570 if (n <= 0) { 571 return; 572 } 573 int max; 574 if (data == null || data.length == 0) { 575 max = 25; 576 } 577 else if (data.length >= n * 5) { 578 return; 579 } 580 else { 581 max = data.length; 582 } 583 while (max < n * 5) { 584 max *= 2; 585 } 586 587 String newData[] = new String [max]; 588 if (length > 0) { 589 System.arraycopy(data, 0, newData, 0, length*5); 590 } 591 data = newData; 592 } 593 594 595 601 private void badIndex (int index) 602 throws ArrayIndexOutOfBoundsException 603 { 604 String msg = 605 "Attempt to modify attribute at illegal index: " + index; 606 throw new ArrayIndexOutOfBoundsException (msg); 607 } 608 609 610 611 615 int length; 616 String data []; 617 618 } 619 620 622 | Popular Tags |