// for XMLObjectReferenceMappings we need a non-shared cache, so
// try and get a Unit Of Work from the XMLContext
session = xmlContext.getReadSession(xmlDescriptor);
UnmarshalRecord unmarshalRecord;
if (isPrimitiveType) {
unmarshalRecord = new XMLRootRecord(primitiveWrapperClass);
unmarshalRecord.setSession((AbstractSession) unmarshaller.getXMLContext().getSession(0));
} else if (xmlDescriptor.hasInheritance()) {
unmarshalRecord = new UnmarshalRecord(null);
unmarshalRecord.setUnmarshalNamespaceResolver(unmarshalNamespaceResolver);
unmarshalRecord.setAttributes(atts);
Class classValue = xmlDescriptor.getInheritancePolicy().classFromRow(unmarshalRecord, session);
if (classValue == null) {
// no xsi:type attribute - look for type indicator on the default root element
QName leafElementType = xmlDescriptor.getDefaultRootElementType();
// if we have a user-set type, try to get the class from the inheritance policy
if (leafElementType != null) {
Object indicator = xmlDescriptor.getInheritancePolicy().getClassIndicatorMapping().get(leafElementType);
if(indicator != null) {
classValue = (Class)indicator;
}
}
}
if (classValue != null) {
xmlDescriptor = (XMLDescriptor)session.getDescriptor(classValue);
} else {
// since there is no xsi:type attribute, we'll use the descriptor
// that was retrieved based on the rootQName - we need to make
// sure it is non-abstract
if (Modifier.isAbstract(xmlDescriptor.getJavaClass().getModifiers())) {
// need to throw an exception here
throw DescriptorException.missingClassIndicatorField(unmarshalRecord, xmlDescriptor.getInheritancePolicy().getDescriptor());
}
}
unmarshalRecord = (UnmarshalRecord)xmlDescriptor.getObjectBuilder().createRecord(session);
} else {
unmarshalRecord = (UnmarshalRecord)xmlDescriptor.getObjectBuilder().createRecord(session);
}
this.descriptor = xmlDescriptor;
this.rootRecord = unmarshalRecord;
if (locator != null) {
unmarshalRecord.setDocumentLocator(locator);
}
unmarshalRecord.setUnmarshaller(this.unmarshaller);
unmarshalRecord.setXMLReader(this.getXMLReader());
unmarshalRecord.setAttributes(atts);
if(atts != null && null != atts.getValue(XMLConstants.SCHEMA_INSTANCE_URL, XMLConstants.SCHEMA_NIL_ATTRIBUTE)) {
unmarshalRecord.setNil(true);
}
unmarshalRecord.setUnmarshalNamespaceResolver(unmarshalNamespaceResolver);
unmarshalRecord.startDocument();
unmarshalRecord.initializeRecord(null);
xmlReader.setContentHandler(unmarshalRecord);
xmlReader.setLexicalHandler(unmarshalRecord);
unmarshalRecord.startElement(namespaceURI, localName, qName, atts);
// if we located the descriptor via xsi:type attribute, create and
// return an XMLRoot object
} catch (EclipseLinkException e) {
if (null == xmlReader.getErrorHandler()) {