package org.compass.core.converter.mapping.xsem;
import org.compass.core.Resource;
import org.compass.core.converter.ConversionException;
import org.compass.core.converter.Converter;
import org.compass.core.mapping.Mapping;
import org.compass.core.mapping.xsem.XmlPropertyMapping;
import org.compass.core.marshall.MarshallingContext;
import org.compass.core.xml.XmlObject;
/**
* Responsible for converting {@link XmlObject} based on {@link org.compass.core.mapping.xsem.XmlIdMapping}.
* Uses the {@link org.compass.core.mapping.xsem.XmlIdMapping} value converter to actually convert the given
* value.
* <p/>
* The converter executes the given xpath expression associated with {@link org.compass.core.mapping.xsem.XmlIdMapping}
* and uses the FIRST one as the xml object to convert using the value converter.
* <p/>
* Also note, that un-marshalling is not supported.
*
* @author kimchy
*/
public class XmlIdMappingConverter implements Converter {
public boolean marshall(Resource resource, Object root, Mapping mapping, MarshallingContext context) throws ConversionException {
if (root == null) {
return false;
}
XmlObject xmlObject = (XmlObject) root;
XmlPropertyMapping xmlPropertyMapping = (XmlPropertyMapping) mapping;
XmlObject[] xmlObjects = XmlConverterUtils.select(xmlObject, xmlPropertyMapping);
if (xmlObjects == null || xmlObjects.length == 0) {
throw new ConversionException("Id with xpath [" + xmlPropertyMapping.getXPath() + "] returned no values");
}
boolean stored = xmlPropertyMapping.getValueConverter().marshall(resource, xmlObjects[0], xmlPropertyMapping, context);
if (!stored) {
throw new ConversionException("No id value for xpath expression [" + xmlPropertyMapping.getXPath() + "]");
}
return stored;
}
public Object unmarshall(Resource resource, Mapping mapping, MarshallingContext context) throws ConversionException {
throw new ConversionException("Not supported, please use xml-content mapping");
}
}