The Deserializer base class.
addChildDeserializer
public void addChildDeserializer(Deserializer dSer)
componentsReady
public boolean componentsReady()
Some deserializers (ArrayDeserializer) require
all of the component values to be known before the
value is complete.
(For the ArrayDeserializer this is important because
the elements are stored in an ArrayList, and all values
must be known before the ArrayList is converted into the
expected array.
This routine is used to indicate when the components are ready.
The default (true) is useful for most Deserializers.
- componentsReady in interface Deserializer
endElement
public final void endElement(String namespace,
String localName,
DeserializationContext context)
throws SAXException
endElement is called when the end element tag is reached.
It handles href/id information for multi-ref processing
and invokes the valueComplete() method of the deserializer
which sets the targets with the deserialized value.
- endElement in interface Deserializer
- endElement in interface SOAPHandler
namespace
- is the namespace of the child elementlocalName
- is the local name of the child elementcontext
- is the deserialization context
getMechanismType
public String getMechanismType()
JAX-RPC compliant method which returns mechanism type.
- getMechanismType in interface Deserializer
getValue
public Object getValue()
Get the deserialized value.
- getValue in interface Deserializer
- Object representing deserialized value or null
getValue
public Object getValue(Object hint)
If the deserializer has component values (like ArrayDeserializer)
this method gets the specific component via the hint.
The default implementation returns null.
- getValue in interface Deserializer
- Object representing deserialized value or null
getValueTargets
public Vector getValueTargets()
Get the Value Targets of the Deserializer.
- getValueTargets in interface Deserializer
- Vector of Target objects or null
moveValueTargets
public void moveValueTargets(Deserializer other)
Move someone else's targets to our own (see DeserializationContext)
The DeserializationContext only allows one Deserializer to
wait for a unknown multi-ref'ed value. So to ensure
that all of the targets are updated, this method is invoked
to copy the Target objects to the waiting Deserializer.
- moveValueTargets in interface Deserializer
other
- is the Deserializer to copy targets from.
onEndElement
public void onEndElement(String namespace,
String localName,
DeserializationContext context)
throws SAXException
onEndElement is called by endElement. It is not called
if the element has an href.
- onEndElement in interface Deserializer
namespace
- is the namespace of the child elementlocalName
- is the local name of the child elementcontext
- is the deserialization context
onStartChild
public SOAPHandler onStartChild(String namespace,
String localName,
String prefix,
Attributes attributes,
DeserializationContext context)
throws SAXException
onStartChild is called on each child element.
The default behavior supplied by DeserializationImpl is to do nothing.
A specific deserializer may perform other tasks. For example a
BeanDeserializer will construct a deserializer for the indicated
property and return it.
- onStartChild in interface Deserializer
- onStartChild in interface SOAPHandler
namespace
- is the namespace of the child elementlocalName
- is the local name of the child elementprefix
- is the prefix used on the name of the child elementattributes
- are the attributes of the child elementcontext
- is the deserialization context.
- is a Deserializer to use to deserialize a child (must be
a derived class of SOAPHandler) or null if no deserialization should
be performed.
onStartElement
public void onStartElement(String namespace,
String localName,
String prefix,
Attributes attributes,
DeserializationContext context)
throws SAXException
This method is invoked after startElement when the element requires
deserialization (i.e. the element is not an href and the value is not nil.)
DeserializerImpl provides default behavior, which simply
involves obtaining a correct Deserializer and plugging its handler.
- onStartElement in interface Deserializer
namespace
- is the namespace of the elementlocalName
- is the name of the elementprefix
- is the prefix of the elementattributes
- are the attributes on the element...used to get the typecontext
- is the DeserializationContext
registerValueTarget
public void registerValueTarget(Target target)
For deserializers of non-primitives, the value may not be
known until later (due to multi-referencing). In such
cases the deserializer registers Target object(s). When
the value is known, the set(value) will be invoked for
each Target registered with the Deserializer. The Target
object abstracts the function of setting a target with a
value. See the Target interface for more info.
- registerValueTarget in interface Deserializer
setChildValue
public void setChildValue(Object value,
Object hint)
throws SAXException
If the deserializer has component values (like ArrayDeserializer)
this method sets the specific component via the hint.
The default implementation does nothing.
- setChildValue in interface Deserializer
hint
- Object representing deserialized value or null
setDefaultType
public void setDefaultType(QName qName)
In some circumstances an element may not have
a type attribute, but a default type qname is known from
information in the container. For example,
an element of an array may not have a type= attribute,
so the default qname is the component type of the array.
This method is used to communicate the default type information
to the deserializer.
- setDefaultType in interface Deserializer
setValue
public void setValue(Object value)
Set the deserialized value.
- setValue in interface Deserializer
value
- Object representing deserialized value
setValue
public void setValue(Object value,
Object hint)
throws SAXException
- setValue in interface Callback
startElement
public void startElement(String namespace,
String localName,
String prefix,
Attributes attributes,
DeserializationContext context)
throws SAXException
This method is invoked when an element start tag is encountered.
DeserializerImpl provides default behavior, which involves the following:
- directly handling the deserialization of a nill value
- handling the registration of the id value.
- handling the registration of a fixup if this element is an href.
- calling onStartElement to do the actual deserialization if not nill or href cases.
- startElement in interface Deserializer
- startElement in interface SOAPHandler
namespace
- is the namespace of the elementlocalName
- is the name of the elementprefix
- is the prefix of the elementattributes
- are the attributes on the element...used to get the typecontext
- is the DeserializationContext
Normally a specific Deserializer (FooDeserializer) should extend DeserializerImpl.
Here is the flow that will occur in such cases:
1) DeserializerImpl.startElement(...) will be called and do the id/href/nill stuff.
2) If real deserialization needs to take place DeserializerImpl.onStartElement will be
invoked, which will attempt to install the specific Deserializer (FooDeserializer)
3) The FooDeserializer.startElement(...) will be called to do the Foo specific stuff.
This results in a call to FooDeserializer.onStartElement(...) if startElement was
not overridden.
4) The onChildElement(...) method is called for each child element. Nothing occurs
if not overridden. The FooDeserializer.onStartChild(...) method should return
the deserializer for the child element.
5) When the end tag is reached, the endElement(..) method is invoked. The default
behavior is to handle hrefs/ids, call onEndElement and then call the Deserializer
valueComplete method.
So the methods that you potentially want to override are:
onStartElement, onStartChild, componentsReady, setValue(object, hint)
You probably should not override startElement or endElement.
If you need specific behaviour at the end of the element consider overriding
onEndElement.
See the pre-existing Deserializers for more information.
valueComplete
public void valueComplete()
throws SAXException
The valueComplete() method is invoked when the
end tag of the element is read. This results
in the setting of all registered Targets (see
registerValueTarget).
Note that the valueComplete() only processes
the Targets if componentReady() returns true.
So if you override componentReady(), then your
specific Deserializer will need to call valueComplete()
when your components are ready (See ArrayDeserializer)
- valueComplete in interface Deserializer