org.eclipse.persistence.oxm.mappings.converters.XMLRootConverter 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 f2b9fc5
/*
* Copyright (c) 1998, 2020 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:
// mmacivor - June 05/2008 - 1.0 - Initial implementation
package org.eclipse.persistence.oxm.mappings.converters;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.oxm.XMLMarshaller;
import org.eclipse.persistence.oxm.XMLUnmarshaller;
import org.eclipse.persistence.oxm.XMLRoot;
import org.eclipse.persistence.oxm.XMLField;
import org.eclipse.persistence.exceptions.ConversionException;
import org.eclipse.persistence.internal.oxm.XPathFragment;
import org.eclipse.persistence.sessions.Session;
/**
* Purpose: Provides an implementation of XMLConverter to wrap/unwrap objects in an
* XMLRoot in order to capture element name information.
*
Responsibilities
*
* - Wrap an object in an XMLRoot on unmarshal. Do any required conversions based on type for
* simple mappings.
*
- Unwrap an XMLRoot from the object and pass it along to be marshalled.
*
* @see XMLConverter
* @see org.eclipse.persistence.mappings.converters.Converter Converter
*/
public class XMLRootConverter implements XMLConverter {
private XPathFragment rootFragment;
private XMLField associatedField;
private DatabaseMapping mapping;
public XMLRootConverter(XMLField associatedField) {
this.associatedField = associatedField;
}
@Override
public Object convertDataValueToObjectValue(Object dataValue,
Session session, XMLUnmarshaller unmarshaller) {
return convertDataValueToObjectValue(dataValue, session);
}
@Override
public Object convertObjectValueToDataValue(Object objectValue,
Session session, XMLMarshaller marshaller) {
return convertObjectValueToDataValue(objectValue, session);
}
@Override
public Object convertDataValueToObjectValue(Object dataValue,
Session session) {
XMLRoot root = new XMLRoot();
root.setLocalName(this.rootFragment.getLocalName());
root.setNamespaceURI(this.rootFragment.getNamespaceURI());
if(mapping.isAbstractDirectMapping()){
if ((dataValue == null) || (dataValue.getClass() != mapping.getAttributeClassification())) {
try {
dataValue = session.getDatasourcePlatform().convertObject(dataValue, mapping.getAttributeClassification());
} catch (ConversionException e) {
throw ConversionException.couldNotBeConverted(this, mapping.getDescriptor(), e);
}
}
}
root.setObject(dataValue);
return root;
}
@Override
public Object convertObjectValueToDataValue(Object objectValue,
Session session) {
if(objectValue instanceof XMLRoot) {
return ((XMLRoot)objectValue).getObject();
} else {
return objectValue;
}
}
@Override
public void initialize(DatabaseMapping mapping, Session session) {
XPathFragment fragment = associatedField.getXPathFragment();
while(fragment.getNextFragment() != null && !(fragment.getNextFragment().nameIsText())) {
fragment = fragment.getNextFragment();
}
if(fragment.hasNamespace() && associatedField.getNamespaceResolver() != null){
String uri = associatedField.getNamespaceResolver().resolveNamespacePrefix(fragment.getPrefix());
fragment.setNamespaceURI(uri);
}
this.rootFragment = fragment;
this.mapping = mapping;
}
@Override
public boolean isMutable() {
return false;
}
}