KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jboss > xb > binding > sunday > unmarshalling > TypeBinding


1 /*
2   * JBoss, Home of Professional Open Source
3   * Copyright 2005, JBoss Inc., and individual contributors as indicated
4   * by the @authors tag. See the copyright.txt in the distribution for a
5   * full listing of individual contributors.
6   *
7   * This is free software; you can redistribute it and/or modify it
8   * under the terms of the GNU Lesser General Public License as
9   * published by the Free Software Foundation; either version 2.1 of
10   * the License, or (at your option) any later version.
11   *
12   * This software is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15   * Lesser General Public License for more details.
16   *
17   * You should have received a copy of the GNU Lesser General Public
18   * License along with this software; if not, write to the Free
19   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
21   */

22 package org.jboss.xb.binding.sunday.unmarshalling;
23
24 import java.util.ArrayList JavaDoc;
25 import java.util.Collection JavaDoc;
26 import java.util.Collections JavaDoc;
27 import java.util.HashMap JavaDoc;
28 import java.util.Iterator JavaDoc;
29 import java.util.List JavaDoc;
30 import java.util.Map JavaDoc;
31
32 import javax.xml.namespace.QName JavaDoc;
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 JavaDoc;
45 import org.xml.sax.helpers.AttributesImpl JavaDoc;
46
47 /**
48  * @author <a HREF="mailto:alex@jboss.org">Alexey Loubyansky</a>
49  * @version <tt>$Revision: 2139 $</tt>
50  */

51 public class TypeBinding
52 {
53    protected QName JavaDoc qName;
54    /** Map<QName, AttributeBinding> */
55    private Map JavaDoc attrs = Collections.EMPTY_MAP;
56    private ParticleHandler handler;//todo default handler is now in SundayContentHandler.
57
//private ParticleHandler handler = DefaultHandlers.ELEMENT_HANDLER;
58
private CharactersHandler charactersHandler;
59    private ClassMetaData classMetaData;
60    private ValueMetaData valueMetaData;
61    private PropertyMetaData propertyMetaData;
62    private MapEntryMetaData mapEntryMetaData;
63    private SchemaBinding schemaBinding; // todo it's optional for now...
64
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 JavaDoc startElementCreatesObject;
72    private Boolean JavaDoc simple;
73
74    private WildcardBinding wildcard;
75    private ParticleBinding particle;
76
77    private List JavaDoc patternValues;
78    private List JavaDoc enumValues;
79    private TypeBinding itemType; // the type is a list type with this item type
80
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 JavaDoc qName)
91    {
92       //this(qName, (CharactersHandler)null);
93
this(qName, DefaultHandlers.CHARACTERS_HANDLER);
94    }
95
96    public TypeBinding(CharactersHandler charactersHandler)
97    {
98       this(null, charactersHandler);
99    }
100
101    public TypeBinding(QName JavaDoc qName, CharactersHandler charactersHandler)
102    {
103       this.qName = qName;
104       this.charactersHandler = charactersHandler;
105    }
106
107    public TypeBinding(QName JavaDoc qName, TypeBinding baseType)
108    {
109       this(qName, baseType.charactersHandler);
110
111       if(baseType.particle != null)
112       {
113          // todo
114
this.particle = baseType.particle;
115       }
116
117       this.attrs = new HashMap JavaDoc(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 JavaDoc getQName()
132    {
133       return qName;
134    }
135
136    public ElementBinding getElement(QName JavaDoc name)
137    {
138       return getElement(name, true);
139    }
140
141    private ElementBinding getElement(QName JavaDoc 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 JavaDoc name, TypeBinding type)
186    {
187       return addElement(name, type, 1, false);
188    }
189
190    public ElementBinding addElement(QName JavaDoc 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 JavaDoc group)
198    {
199       for(Iterator JavaDoc i = group.entrySet().iterator(); i.hasNext();)
200       {
201          Map.Entry JavaDoc entry = (Map.Entry JavaDoc)i.next();
202          QName JavaDoc name = (QName JavaDoc)entry.getKey();
203          TypeBinding type = (TypeBinding)entry.getValue();
204          addElement(name, type);
205       }
206    }
207
208    public AttributeBinding getAttribute(QName JavaDoc qName)
209    {
210       return (AttributeBinding)attrs.get(qName);
211    }
212
213    /**
214     * Go through the type attributes to see if there are any with defaults
215     * that do not appears in the attrs list.
216     *
217     * @param attrs - the attributes seen in the document
218     * @return a possibly augmented list that includes unspecified attributes
219     * with default values.
220     */

221    public Attributes JavaDoc expandWithDefaultAttributes(Attributes JavaDoc attrs)
222    {
223       if(this.attrs.size() == 0)
224       {
225          return attrs;
226       }
227
228       // Map<QName, AttributeBinding>
229
HashMap JavaDoc attrsNotSeen = new HashMap JavaDoc(this.attrs);
230       for(int n = 0; n < attrs.getLength(); n ++)
231       {
232          QName JavaDoc name = new QName JavaDoc(attrs.getURI(n), attrs.getLocalName(n));
233          attrsNotSeen.remove(name);
234       }
235
236       Attributes JavaDoc expandedAttrs = attrs;
237       if( attrsNotSeen.size() > 0 )
238       {
239          AttributesImpl JavaDoc tmp = new AttributesImpl JavaDoc(attrs);
240          Iterator JavaDoc iter = attrsNotSeen.entrySet().iterator();
241          while( iter.hasNext() )
242          {
243             Map.Entry JavaDoc entry = (Map.Entry JavaDoc) iter.next();
244             QName JavaDoc name = (QName JavaDoc) entry.getKey();
245             AttributeBinding binding = (AttributeBinding) entry.getValue();
246             String JavaDoc constraint = binding.getDefaultConstraint();
247             if( constraint != null )
248             {
249                // the Javadoc for Attributes.getType(i) says:
250
// "The attribute type is one of the strings
251
// "CDATA", "ID", "IDREF", "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY", "ENTITIES",
252
// or "NOTATION" (always in upper case)."
253
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 JavaDoc 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 JavaDoc(attrs);
273          default:
274             attrs.put(name, attr);
275       }
276       return attr;
277    }
278
279    public Collection JavaDoc getAttributes()
280    {
281       return attrs.values();
282    }
283
284    public CharactersHandler getCharactersHandler()
285    {
286       return charactersHandler;
287    }
288
289    /**
290     * This method will create a new simple type binding with the passed in characters handler
291     * and set this simple type as the simple type of the complex type the method was invoked on.
292     * @param charactersHandler
293     */

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 JavaDoc 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 JavaDoc getLexicalPattern()
476    {
477       return patternValues;
478    }
479
480    public void addLexicalPattern(String JavaDoc 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 JavaDoc(patternValues);
491          }
492          patternValues.add(patternValue);
493       }
494    }
495
496    public List JavaDoc getLexicalEnumeration()
497    {
498       return enumValues;
499    }
500
501    public void addEnumValue(String JavaDoc 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 JavaDoc(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 JavaDoc iter = attrs.keySet().iterator();
558          while(iter.hasNext())
559          {
560             QName JavaDoc qName = (QName JavaDoc)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 JavaDoc toString()
591    {
592       return super.toString() + "[" + qName + "]";
593    }
594 }
595
Popular Tags