1 22 package org.jboss.xb.binding.sunday.unmarshalling; 23 24 import java.util.ArrayList ; 25 import java.util.Collection ; 26 import java.util.Collections ; 27 import java.util.HashMap ; 28 import java.util.Iterator ; 29 import java.util.List ; 30 import java.util.Map ; 31 32 import javax.xml.namespace.QName ; 33 34 import org.jboss.xb.binding.metadata.AddMethodMetaData; 35 import org.jboss.xb.binding.metadata.CharactersMetaData; 36 import org.jboss.xb.binding.metadata.ClassMetaData; 37 import org.jboss.xb.binding.metadata.MapEntryMetaData; 38 import org.jboss.xb.binding.metadata.PropertyMetaData; 39 import org.jboss.xb.binding.metadata.ValueMetaData; 40 import org.jboss.xb.binding.Constants; 41 import org.jboss.xb.binding.sunday.marshalling.TermBeforeMarshallingCallback; 42 import org.jboss.xb.binding.sunday.xop.XOPUnmarshaller; 43 import org.jboss.xb.binding.sunday.xop.XOPMarshaller; 44 import org.xml.sax.Attributes ; 45 import org.xml.sax.helpers.AttributesImpl ; 46 47 51 public class TypeBinding 52 { 53 protected QName qName; 54 55 private Map attrs = Collections.EMPTY_MAP; 56 private ParticleHandler handler; private CharactersHandler charactersHandler; 59 private ClassMetaData classMetaData; 60 private ValueMetaData valueMetaData; 61 private PropertyMetaData propertyMetaData; 62 private MapEntryMetaData mapEntryMetaData; 63 private SchemaBinding schemaBinding; private TypeBinding baseType; 65 private boolean skip; 66 private CharactersMetaData charMetaData; 67 private AddMethodMetaData addMethodMetaData; 68 private ValueAdapter valueAdapter = ValueAdapter.NOOP; 69 private TermBeforeMarshallingCallback beforeMarshallingCallback; 70 private TermBeforeSetParentCallback beforeSetParentCallback; 71 private Boolean startElementCreatesObject; 72 private Boolean simple; 73 74 private WildcardBinding wildcard; 75 private ParticleBinding particle; 76 77 private List patternValues; 78 private List enumValues; 79 private TypeBinding itemType; private TypeBinding simpleType; 81 82 private XOPUnmarshaller xopUnmarshaller; 83 private XOPMarshaller xopMarshaller; 84 85 public TypeBinding() 86 { 87 this.qName = null; 88 } 89 90 public TypeBinding(QName qName) 91 { 92 this(qName, DefaultHandlers.CHARACTERS_HANDLER); 94 } 95 96 public TypeBinding(CharactersHandler charactersHandler) 97 { 98 this(null, charactersHandler); 99 } 100 101 public TypeBinding(QName qName, CharactersHandler charactersHandler) 102 { 103 this.qName = qName; 104 this.charactersHandler = charactersHandler; 105 } 106 107 public TypeBinding(QName qName, TypeBinding baseType) 108 { 109 this(qName, baseType.charactersHandler); 110 111 if(baseType.particle != null) 112 { 113 this.particle = baseType.particle; 115 } 116 117 this.attrs = new HashMap (baseType.attrs); 118 this.classMetaData = baseType.classMetaData; 119 this.valueMetaData = baseType.valueMetaData; 120 this.propertyMetaData = baseType.propertyMetaData; 121 this.mapEntryMetaData = baseType.mapEntryMetaData; 122 this.schemaBinding = baseType.schemaBinding; 123 this.baseType = baseType; 124 125 if(!baseType.isStartElementCreatesObject()) 126 { 127 this.handler = baseType.handler; 128 } 129 } 130 131 public QName getQName() 132 { 133 return qName; 134 } 135 136 public ElementBinding getElement(QName name) 137 { 138 return getElement(name, true); 139 } 140 141 private ElementBinding getElement(QName name, boolean ignoreWildcards) 142 { 143 ElementBinding element = null; 144 if(particle != null) 145 { 146 ModelGroupBinding modelGroup = (ModelGroupBinding)particle.getTerm(); 147 element = modelGroup.newCursor(particle).getElement(name, null, ignoreWildcards); 148 } 149 150 if(element == null && !ignoreWildcards && wildcard != null) 151 { 152 element = wildcard.getElement(name, null); 153 } 154 return element; 155 } 156 157 public void addParticle(ParticleBinding particle) 158 { 159 ModelGroupBinding modelGroup; 160 if(this.particle == null) 161 { 162 modelGroup = new AllBinding(schemaBinding); 163 this.particle = new ParticleBinding(modelGroup); 164 } 165 else 166 { 167 modelGroup = (ModelGroupBinding)this.particle.getTerm(); 168 } 169 modelGroup.addParticle(particle); 170 } 171 172 public void addElement(ElementBinding element) 173 { 174 addElement(element, 1, false); 175 } 176 177 public void addElement(ElementBinding element, int minOccurs, boolean unbounded) 178 { 179 ParticleBinding particle = new ParticleBinding(element); 180 particle.setMinOccurs(minOccurs); 181 particle.setMaxOccursUnbounded(unbounded); 182 addParticle(particle); 183 } 184 185 public ElementBinding addElement(QName name, TypeBinding type) 186 { 187 return addElement(name, type, 1, false); 188 } 189 190 public ElementBinding addElement(QName name, TypeBinding type, int minOccurs, boolean unbounded) 191 { 192 ElementBinding el = new ElementBinding(schemaBinding, name, type); 193 addElement(el, minOccurs, unbounded); 194 return el; 195 } 196 197 public void addGroup(Map group) 198 { 199 for(Iterator i = group.entrySet().iterator(); i.hasNext();) 200 { 201 Map.Entry entry = (Map.Entry )i.next(); 202 QName name = (QName )entry.getKey(); 203 TypeBinding type = (TypeBinding)entry.getValue(); 204 addElement(name, type); 205 } 206 } 207 208 public AttributeBinding getAttribute(QName qName) 209 { 210 return (AttributeBinding)attrs.get(qName); 211 } 212 213 221 public Attributes expandWithDefaultAttributes(Attributes attrs) 222 { 223 if(this.attrs.size() == 0) 224 { 225 return attrs; 226 } 227 228 HashMap attrsNotSeen = new HashMap (this.attrs); 230 for(int n = 0; n < attrs.getLength(); n ++) 231 { 232 QName name = new QName (attrs.getURI(n), attrs.getLocalName(n)); 233 attrsNotSeen.remove(name); 234 } 235 236 Attributes expandedAttrs = attrs; 237 if( attrsNotSeen.size() > 0 ) 238 { 239 AttributesImpl tmp = new AttributesImpl (attrs); 240 Iterator iter = attrsNotSeen.entrySet().iterator(); 241 while( iter.hasNext() ) 242 { 243 Map.Entry entry = (Map.Entry ) iter.next(); 244 QName name = (QName ) entry.getKey(); 245 AttributeBinding binding = (AttributeBinding) entry.getValue(); 246 String constraint = binding.getDefaultConstraint(); 247 if( constraint != null ) 248 { 249 tmp.addAttribute(name.getNamespaceURI(), name.getLocalPart(), 254 name.toString(), "CDATA", constraint); 255 } 256 } 257 expandedAttrs = tmp; 258 } 259 260 return expandedAttrs; 261 } 262 263 public AttributeBinding addAttribute(QName name, TypeBinding type, AttributeHandler handler) 264 { 265 AttributeBinding attr = new AttributeBinding(schemaBinding, name, type, handler); 266 switch(attrs.size()) 267 { 268 case 0: 269 attrs = Collections.singletonMap(name, attr); 270 break; 271 case 1: 272 attrs = new HashMap (attrs); 273 default: 274 attrs.put(name, attr); 275 } 276 return attr; 277 } 278 279 public Collection getAttributes() 280 { 281 return attrs.values(); 282 } 283 284 public CharactersHandler getCharactersHandler() 285 { 286 return charactersHandler; 287 } 288 289 294 public void setSimpleType(CharactersHandler charactersHandler) 295 { 296 setSimpleType(new TypeBinding(charactersHandler)); 297 } 298 299 public TypeBinding getSimpleType() 300 { 301 return simpleType; 302 } 303 304 public void setSimpleType(TypeBinding simpleType) 305 { 306 this.simpleType = simpleType; 307 } 308 309 public void setHandler(ParticleHandler handler) 310 { 311 this.handler = handler; 312 } 313 314 public ParticleHandler getHandler() 315 { 316 return handler; 317 } 318 319 public void pushInterceptor(QName qName, ElementInterceptor interceptor) 320 { 321 ElementBinding el = getElement(qName); 322 if(el == null) 323 { 324 el = addElement(qName, new TypeBinding()); 325 } 326 el.pushInterceptor(interceptor); 327 } 328 329 public TypeBinding getBaseType() 330 { 331 return baseType; 332 } 333 334 public void setBaseType(TypeBinding baseType) 335 { 336 this.baseType = baseType; 337 } 338 339 public boolean isSimple() 340 { 341 return simple == null ? particle == null && attrs.isEmpty() : simple.booleanValue(); 342 } 343 344 public void setSimple(boolean simple) 345 { 346 this.simple = simple ? Boolean.TRUE : Boolean.FALSE; 347 } 348 349 public ClassMetaData getClassMetaData() 350 { 351 return classMetaData; 352 } 353 354 public void setClassMetaData(ClassMetaData classMetaData) 355 { 356 this.classMetaData = classMetaData; 357 } 358 359 public SchemaBinding getSchemaBinding() 360 { 361 return schemaBinding; 362 } 363 364 public void setSchemaBinding(SchemaBinding schemaBinding) 365 { 366 this.schemaBinding = schemaBinding; 367 } 368 369 public void setValueMetaData(ValueMetaData valueMetaData) 370 { 371 this.valueMetaData = valueMetaData; 372 } 373 374 public ValueMetaData getValueMetaData() 375 { 376 return valueMetaData; 377 } 378 379 public PropertyMetaData getPropertyMetaData() 380 { 381 return propertyMetaData; 382 } 383 384 public void setPropertyMetaData(PropertyMetaData propertyMetaData) 385 { 386 this.propertyMetaData = propertyMetaData; 387 } 388 389 public MapEntryMetaData getMapEntryMetaData() 390 { 391 return mapEntryMetaData; 392 } 393 394 public void setMapEntryMetaData(MapEntryMetaData mapEntryMetaData) 395 { 396 this.mapEntryMetaData = mapEntryMetaData; 397 } 398 399 public void setSkip(boolean skip) 400 { 401 this.skip = skip; 402 } 403 404 public boolean isSkip() 405 { 406 return skip; 407 } 408 409 public CharactersMetaData getCharactersMetaData() 410 { 411 return charMetaData; 412 } 413 414 public void setCharactersMetaData(CharactersMetaData charMetaData) 415 { 416 this.charMetaData = charMetaData; 417 } 418 419 public void setAddMethodMetaData(AddMethodMetaData addMethodMetaData) 420 { 421 this.addMethodMetaData = addMethodMetaData; 422 } 423 424 public AddMethodMetaData getAddMethodMetaData() 425 { 426 return addMethodMetaData; 427 } 428 429 public ValueAdapter getValueAdapter() 430 { 431 return valueAdapter; 432 } 433 434 public void setValueAdapter(ValueAdapter valueAdapter) 435 { 436 this.valueAdapter = valueAdapter; 437 } 438 439 public boolean isStartElementCreatesObject() 440 { 441 return startElementCreatesObject == null ? 442 particle != null || !attrs.isEmpty() : startElementCreatesObject.booleanValue(); 443 } 444 445 public void setStartElementCreatesObject(boolean startElementCreatesObject) 446 { 447 this.startElementCreatesObject = startElementCreatesObject ? Boolean.TRUE : Boolean.FALSE; 448 } 449 450 public void setWildcard(WildcardBinding wildcard) 451 { 452 this.wildcard = wildcard; 453 } 454 455 public WildcardBinding getWildcard() 456 { 457 return wildcard; 458 } 459 460 public boolean hasWildcard() 461 { 462 return wildcard != null; 463 } 464 465 public ParticleBinding getParticle() 466 { 467 return particle; 468 } 469 470 public void setParticle(ParticleBinding particle) 471 { 472 this.particle = particle; 473 } 474 475 public List getLexicalPattern() 476 { 477 return patternValues; 478 } 479 480 public void addLexicalPattern(String patternValue) 481 { 482 if(patternValues == null) 483 { 484 patternValues = Collections.singletonList(patternValue); 485 } 486 else 487 { 488 if(patternValues.size() == 1) 489 { 490 patternValues = new ArrayList (patternValues); 491 } 492 patternValues.add(patternValue); 493 } 494 } 495 496 public List getLexicalEnumeration() 497 { 498 return enumValues; 499 } 500 501 public void addEnumValue(String value) 502 { 503 if(enumValues == null) 504 { 505 enumValues = Collections.singletonList(value); 506 } 507 else 508 { 509 if(enumValues.size() == 1) 510 { 511 enumValues = new ArrayList (enumValues); 512 } 513 enumValues.add(value); 514 } 515 } 516 517 public void setItemType(TypeBinding itemType) 518 { 519 this.itemType = itemType; 520 } 521 522 public TypeBinding getItemType() 523 { 524 return itemType; 525 } 526 527 public XOPUnmarshaller getXopUnmarshaller() 528 { 529 return xopUnmarshaller == null ? 530 (schemaBinding == null ? null : schemaBinding.getXopUnmarshaller()) : xopUnmarshaller; 531 } 532 533 public void setXopUnmarshaller(XOPUnmarshaller xopUnmarshaller) 534 { 535 this.xopUnmarshaller = xopUnmarshaller; 536 } 537 538 public XOPMarshaller getXopMarshaller() 539 { 540 return xopMarshaller == null ? 541 (schemaBinding == null ? null : schemaBinding.getXopMarshaller()) : xopMarshaller; 542 } 543 544 public void setXopMarshaller(XOPMarshaller xopMarshaller) 545 { 546 this.xopMarshaller = xopMarshaller; 547 } 548 549 public boolean hasOnlyXmlMimeAttributes() 550 { 551 if(attrs.isEmpty()) 552 { 553 return false; 554 } 555 else 556 { 557 Iterator iter = attrs.keySet().iterator(); 558 while(iter.hasNext()) 559 { 560 QName qName = (QName )iter.next(); 561 if(!Constants.NS_XML_MIME.equals(qName.getNamespaceURI())) 562 { 563 return false; 564 } 565 } 566 } 567 return true; 568 } 569 570 public void setBeforeMarshallingCallback(TermBeforeMarshallingCallback marshallingHandler) 571 { 572 this.beforeMarshallingCallback = marshallingHandler; 573 } 574 575 public TermBeforeMarshallingCallback getBeforeMarshallingCallback() 576 { 577 return beforeMarshallingCallback; 578 } 579 580 public void setBeforeSetParentCallback(TermBeforeSetParentCallback beforeSetParent) 581 { 582 this.beforeSetParentCallback = beforeSetParent; 583 } 584 585 public TermBeforeSetParentCallback getBeforeSetParentCallback() 586 { 587 return beforeSetParentCallback; 588 } 589 590 public String toString() 591 { 592 return super.toString() + "[" + qName + "]"; 593 } 594 } 595 | Popular Tags |