/*******************************************************************************
* Copyright (c) 1998, 2015 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.tools.workbench.mappingsmodel.mapping;
import java.text.Collator;
import java.util.List;
import org.eclipse.persistence.tools.workbench.mappingsmodel.MWDataField;
import org.eclipse.persistence.tools.workbench.mappingsmodel.MWModel;
import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWMappingDescriptor;
import org.eclipse.persistence.tools.workbench.mappingsmodel.handles.MWMethodHandle;
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.relational.MWRelationalFieldTransformerAssociation;
import org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml.MWXmlFieldTransformerAssociation;
import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWClass;
import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWMethod;
import org.eclipse.persistence.descriptors.InheritancePolicy;
import org.eclipse.persistence.internal.helper.DatabaseField;
import org.eclipse.persistence.mappings.foundation.AbstractTransformationMapping;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
/**
* Abstract class used in MWTransformationMapping.
* Subclasses of MWTransformationMapping must also use
* subclasses of this class.
*/
public abstract class MWFieldTransformerAssociation
extends MWModel
implements MWTransformer.Parent
{
// **************** Variables *********************************************
/**
* The field associated with the field transformer
* (actual instance variable is responsibility of subclass)
*/
public final static String FIELD_PROPERTY = "field";
/** The FieldTransformer used to translate from Object to data value */
private volatile MWTransformer fieldTransformer;
public final static String FIELD_TRANSFORMER_PROPERTY = "fieldTransformer";
// **************** Constructors ******************************************
/** Default constructor - for TopLink use only */
protected MWFieldTransformerAssociation() {
super();
}
protected MWFieldTransformerAssociation(MWTransformationMapping parent) {
super(parent);
this.fieldTransformer = new MWNullTransformer(this);
}
protected MWFieldTransformerAssociation(MWTransformationMapping parent, MWMethod fieldTransformerMethod) {
super(parent);
this.fieldTransformer = new MWMethodBasedTransformer(this, fieldTransformerMethod);
}
protected MWFieldTransformerAssociation(MWTransformationMapping parent, MWClass fieldTransformerClass) {
super(parent);
this.fieldTransformer = new MWClassBasedTransformer(this, fieldTransformerClass);
}
// **************** Initialization ****************************************
protected void addChildrenTo(List children) {
super.addChildrenTo(children);
children.add(this.fieldTransformer);
}
// **************** Containment *******************************************
public MWTransformationMapping getMapping() {
return (MWTransformationMapping) this.getParent();
}
public MWMappingDescriptor getParentDescriptor() {
return getMapping().getParentDescriptor();
}
// **************** MWTransformer.Parent **********************************************
public MWTransformationMapping transformationMapping() {
return this.getMapping();
}
// **************** Field *************************************************
public String fieldName() {
if (getField() == null) {
return "";
}
return this.getField().fieldName();
}
public abstract MWDataField getField();
// **************** Field transformer *************************************
public MWTransformer getFieldTransformer() {
return this.fieldTransformer;
}
protected void setFieldTransformer(MWTransformer newFieldTransformer) {
MWTransformer oldFieldTransformer = this.fieldTransformer;
this.fieldTransformer = newFieldTransformer;
this.firePropertyChanged(FIELD_TRANSFORMER_PROPERTY, oldFieldTransformer, newFieldTransformer);
}
public void clearFieldTransformer() {
this.setFieldTransformer(new MWNullTransformer(this));
}
public void setFieldTransformer(MWMethod newFieldTransformerMethod) {
this.setFieldTransformer(new MWMethodBasedTransformer(this, newFieldTransformerMethod));
}
public void setFieldTransformer(MWClass newFieldTransformerClass) {
this.setFieldTransformer(new MWClassBasedTransformer(this, newFieldTransformerClass));
}
public void toString(StringBuffer sb) {
MWDataField field = this.getField();
sb.append((field == null) ? "null" : field.fieldName());
sb.append(" => ");
this.fieldTransformer.toString(sb);
}
// **************** Problems *********************************************
protected void addProblemsTo(List currentProblems) {
super.addProblemsTo(currentProblems);
this.fieldTransformer.addFieldTransformerProblemsForAssociation(currentProblems, this);
}
// **************** Runtime conversion ************************************
public void addRuntimeFieldTransformer(AbstractTransformationMapping mapping) {
DatabaseField runtimeField = this.runtimeField();
if (runtimeField != null) {
this.fieldTransformer.addRuntimeFieldTransformer(mapping, runtimeField);
}
}
protected DatabaseField runtimeField() {
return (this.getField() == null) ? null : this.getField().runtimeField();
}
// **************** Comparable contract ***********************************
public int compareTo(Object o) {
return Collator.getInstance().compare(this.fieldName(), ((MWFieldTransformerAssociation) o).fieldName());
}
// **************** TopLink methods ***************************************
public static XMLDescriptor buildDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(MWFieldTransformerAssociation.class);
InheritancePolicy ip = (InheritancePolicy)descriptor.getInheritancePolicy();
ip.setClassIndicatorFieldName("@type");
ip.addClassIndicator(MWXmlFieldTransformerAssociation.class, "xml");
ip.addClassIndicator(MWRelationalFieldTransformerAssociation.class, "relational");
XMLCompositeObjectMapping fieldTransformerMapping = new XMLCompositeObjectMapping();
fieldTransformerMapping.setAttributeName("fieldTransformer");
fieldTransformerMapping.setGetMethodName("getFieldTransformerForTopLink");
fieldTransformerMapping.setSetMethodName("setFieldTransformerForTopLink");
fieldTransformerMapping.setReferenceClass(MWTransformer.class);
fieldTransformerMapping.setXPath("field-transformer");
descriptor.addMapping(fieldTransformerMapping);
return descriptor;
}
/**
* check for null transformer
*/
private MWTransformer getFieldTransformerForTopLink() {
return this.fieldTransformer.valueForTopLink();
}
private void setFieldTransformerForTopLink(MWTransformer transformer) {
this.fieldTransformer = MWTransformer.buildTransformerForTopLink(transformer);
}
}