blob: 5f1b3e7c9c6f85d4889d29bd54a6dc2b7ff241f7 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.internal.oxm;
import org.eclipse.persistence.internal.core.sessions.CoreAbstractSession;
import org.eclipse.persistence.internal.oxm.record.MarshalContext;
import org.eclipse.persistence.internal.oxm.record.MarshalRecord;
import org.eclipse.persistence.internal.oxm.record.UnmarshalRecord;
import org.xml.sax.Attributes;
/**
* INTERNAL:
* <p><b>Purpose</b>: A NodeValue is responsible for performing the unmarshal
* and marshal operation at a mapping or policy level. The operations are based
* on a SAX ContextHandler.</p>
* <p><b>Responsibilities</b>:<ul>
* <li>Maintain a reference to the owning XPathNode.</li>
* <li>Given a XPathFragment recognize the node to which the mapping should be
* applied.</li>
* <li>Perform the unmarshal and marshal operation for the given mapping or
* policy.</li>
* </ul>
*/
public abstract class NodeValue {
protected XPathNode xPathNode;
public XPathNode getXPathNode() {
return xPathNode;
}
public void setXPathNode(XPathNode xPathNode) {
this.xPathNode = xPathNode;
}
/**
* INTERNAL:
* Return whether we ignore this node value when marshalling its parent
*/
public boolean isMarshalOnlyNodeValue() {
return false;
}
/**
* INTERNAL:
*/
public boolean isOwningNode(XPathFragment xPathFragment) {
return null == xPathFragment.getNextFragment();
}
/**
* INTERNAL:
*/
public abstract boolean marshal(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, CoreAbstractSession session, NamespaceResolver namespaceResolver);
/**
* INTERNAL:
* This method is no longer required as now MarshalRecord maintains a
* reference to the XMLMarshaller.
*/
public boolean marshal(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, CoreAbstractSession session, NamespaceResolver namespaceResolver, Marshaller marshaller) {
marshalRecord.setMarshaller(marshaller);
return this.marshal(xPathFragment, marshalRecord, object, session, namespaceResolver);
}
/**
* INTERNAL:
*/
public boolean marshal(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, CoreAbstractSession session, NamespaceResolver namespaceResolver, MarshalContext marshalContext, XPathFragment rootFragment) {
return this.marshal(xPathFragment, marshalRecord, object, session, namespaceResolver, marshalContext);
}
/**
* INTERNAL:
* This method provides an optimization in cases where the value has already
* been calculated.
*/
public abstract boolean marshalSingleValue(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, Object objectValue, CoreAbstractSession session, NamespaceResolver namespaceResolver, MarshalContext marshalContext);
/**
* INTERNAL:
* This method provides an optimization in cases where the value has already
* been calculated.
*/
public boolean marshalSingleValue(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, Object objectValue, CoreAbstractSession session, NamespaceResolver namespaceResolver, MarshalContext marshalContext, XPathFragment rootFragment) {
return this.marshalSingleValue(xPathFragment, marshalRecord, object, objectValue, session, namespaceResolver, marshalContext);
}
/**
* INTERNAL:
* Override this method if the NodeValue is applicable to sequenced objects.
*/
public boolean marshal(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, CoreAbstractSession session, NamespaceResolver namespaceResolver, MarshalContext marshalContext) {
return this.marshal(xPathFragment, marshalRecord, object, session, namespaceResolver);
}
/**
* INTERNAL:
*/
public boolean startElement(XPathFragment xPathFragment, UnmarshalRecord unmarshalRecord, Attributes atts) {
return true;
}
/**
* INTERNAL:
*/
public void attribute(UnmarshalRecord unmarshalRecord, String URI, String localName, String value) {
// No operation for parent
}
/**
* INTERNAL:
*/
public void endElement(XPathFragment xPathFragment, UnmarshalRecord unmarshalRecord) {
}
/**
* INTERNAL:
*/
public UnmarshalRecord buildSelfRecord(UnmarshalRecord unmarshalRecord, Attributes atts) {
return null;
}
public void endSelfNodeValue(UnmarshalRecord unmarshalRecord, UnmarshalRecord selfRecord, Attributes atts) {
}
/**
* INTERNAL:
* @return Returns true if the NodeValue implements ContainerValue.
* @see org.eclipse.persistence.internal.oxm.ContainerValue
*/
public boolean isContainerValue() {
return false;
}
/**
* INTERNAL:
* @return Returns true if the NodeValue implements NullCapableValue.
* @see org.eclipse.persistence.internal.oxm.NullCapableValue
*/
public boolean isNullCapableValue() {
return false;
}
public void endElement(XPathFragment xPathFragment, UnmarshalRecord unmarshalRecord, Object collection) {
}
public boolean isUnmarshalNodeValue() {
return true;
}
public boolean isMarshalNodeValue() {
return true;
}
/**
* INTERNAL:
* Marshal any 'self' mapped attributes.
*
*/
public boolean marshalSelfAttributes(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, CoreAbstractSession session, NamespaceResolver namespaceResolver, Marshaller marshaller) {
return false;
}
public boolean isMappingNodeValue() {
return false;
}
public boolean isWhitespaceAware() {
return false;
}
public boolean isAnyMappingNodeValue() {
return false;
}
/**
* INTERNAL:
* Return true if this is the node value representing mixed content.
*/
public boolean isMixedContentNodeValue() {
return false;
}
public boolean isWrapperNodeValue() {
return false;
}
}