org.eclipse.persistence.internal.oxm.record.deferred.CompositeObjectMappingContentHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of eclipselink Show documentation
Show all versions of eclipselink Show documentation
EclipseLink build based upon Git transaction 180e602
/*******************************************************************************
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.internal.oxm.record.deferred;
import org.eclipse.persistence.internal.oxm.XMLCompositeObjectMappingNodeValue;
import org.eclipse.persistence.internal.oxm.XPathFragment;
import org.eclipse.persistence.internal.oxm.mappings.CompositeObjectMapping;
import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
import org.eclipse.persistence.internal.oxm.record.UnmarshalRecord;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
/**
* INTERNAL:
*
* Purpose: An implementation of DeferredContentHandler used to queue
* events to enable state-specific behavior for simple, complex or empty
* elements.
*
* Responsibilities:
*
* Null Composite Objects are marshalled in 2 ways when the input XML node is
* empty. (1) as null - isNullRepresentedByEmptyNode = true (2) as empty object -
* isNullRepresentedByEmptyNode = false A deferred contentHandler is used to
* queue events until we are able to determine whether we are in one of
* empty/simple/complex state. Control is returned to the UnmarshalHandler after
* creation of (1) or (2) above is started.
*
*/
public class CompositeObjectMappingContentHandler extends CompositeMappingContentHandler {
/** The NullCapableValue that passed control to this handler */
private XMLCompositeObjectMappingNodeValue nodeValue;
public CompositeObjectMappingContentHandler(UnmarshalRecord parentRecord, //
XMLCompositeObjectMappingNodeValue aNodeValue, CompositeObjectMapping aMapping, //
Attributes atts, XPathFragment aFragment, Descriptor aDescriptor) {
super(parentRecord, aMapping, atts, aMapping.getNullPolicy(), aFragment, aDescriptor);
nodeValue = aNodeValue;
}
@Override
protected XMLCompositeObjectMappingNodeValue getNodeValue() {
return nodeValue;
}
@Override
protected void processEmptyElement() throws SAXException {
// Remove original startElement event as it has been precluded by the nodeValue call below
getEvents().remove(0);
// Prerequisite: We know that (nullPolicy.isNullRepresentedByEmptyNode() || nullPolicy.isNullRepresentedByXsiNil()) is true
// Null: Set the object to null on the node value if we are empty with inrben=true
nodeValue.setNullValue(getParent().getCurrentObject(), getParent().getSession());
executeEvents(getParent());
}
}