package org.eclipse.persistence.tools.workbench.mappingsmodel.mapping.xml;
import java.util.List;
import org.eclipse.persistence.mappings.foundation.AbstractCompositeCollectionMapping;
import org.eclipse.persistence.mappings.foundation.AbstractCompositeObjectMapping;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping;
import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
import org.eclipse.persistence.tools.workbench.mappingsmodel.MWNode;
import org.eclipse.persistence.tools.workbench.mappingsmodel.ProblemConstants;
import org.eclipse.persistence.tools.workbench.mappingsmodel.handles.MWAttributeHandle;
import org.eclipse.persistence.tools.workbench.mappingsmodel.handles.MWHandle;
import org.eclipse.persistence.tools.workbench.mappingsmodel.handles.MWHandle.NodeReferenceScrubber;
import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWClassAttribute;
import org.eclipse.persistence.tools.workbench.utility.node.Node;
public final class MWAttributeContainerAccessor extends MWContainerAccessor {
// **************** Variables *********************************************
private MWAttributeHandle accessorAttributeHandle;
public final static String ACCESSOR_ATTRIBUTE_PROPERTY = "accessorAttributeHandle";
// **************** Constructors ******************************************
/** Default constructor - for TopLink use only */
public MWAttributeContainerAccessor() {
super();
}
public MWAttributeContainerAccessor(MWNode parent, MWClassAttribute attribute) {
super(parent);
this.setAccessorAttribute(attribute);
}
// **************** Initialization ****************************************
protected void initialize(Node parentNode) {
super.initialize(parentNode);
this.accessorAttributeHandle = new MWAttributeHandle(this, this.buildAccessorAttributeScrubber());
}
private NodeReferenceScrubber buildAccessorAttributeScrubber() {
return new NodeReferenceScrubber() {
public void nodeReferenceRemoved(Node node, MWHandle handle) {
MWAttributeContainerAccessor.this.setAccessorAttribute(null);
}
public String toString() {
return "MWAttributeContainerAccessor.buildAccessorAttributeScrubber()";
}
};
}
// **************** Problems handling ********************************************
@Override
protected void addProblemsTo(List currentProblems) {
super.addProblemsTo(currentProblems);
this.addAttributeConfiguredProblemsToList(currentProblems);
}
private void addAttributeConfiguredProblemsToList(List currProblems) {
if (this.getAccessorAttribute() == null) {
this.buildProblem(ProblemConstants.MAPPING_CONTAINER_ACCESSOR_ATTRIBUTE_NOT_SELECTED);
}
}
// **************** Containment hierarchy ****************************************
protected void addChildrenTo(List children) {
super.addChildrenTo(children);
children.add(this.accessorAttributeHandle);
}
// **************** Accessor Attribute *************************************
public MWClassAttribute getAccessorAttribute() {
return this.accessorAttributeHandle.getAttribute();
}
public void setAccessorAttribute(MWClassAttribute newAccessorAttribute) {
MWClassAttribute oldAccessorAttribute = this.getAccessorAttribute();
this.accessorAttributeHandle.setAttribute(newAccessorAttribute);
if (this.attributeValueHasChanged(oldAccessorAttribute, newAccessorAttribute)) {
this.firePropertyChanged(ACCESSOR_ATTRIBUTE_PROPERTY, oldAccessorAttribute, newAccessorAttribute);
this.firePropertyChanged(CONTAINER_ACCESSOR_PROPERTY, oldAccessorAttribute, newAccessorAttribute);
}
}
// **************** Runtime conversion ************************************
public void adjustRuntimeMapping(AbstractCompositeObjectMapping mapping) {
((XMLCompositeObjectMapping)mapping).setContainerAttributeName(getAccessorAttribute().getName());
}
public void adjustRuntimeMapping(AbstractCompositeCollectionMapping mapping) {
((XMLCompositeCollectionMapping)mapping).setContainerAttributeName(getAccessorAttribute().getName());
}
// **************** TopLink Methods ***************************************
public static XMLDescriptor buildDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(MWAttributeContainerAccessor.class);
descriptor.getInheritancePolicy().setParentClass(MWContainerAccessor.class);
// class handle
XMLCompositeObjectMapping accessorClassHandleMapping = new XMLCompositeObjectMapping();
accessorClassHandleMapping.setAttributeName("accessorAttributeHandle");
accessorClassHandleMapping.setGetMethodName("getAccessorAttributeForTopLink");
accessorClassHandleMapping.setSetMethodName("setAccessorAttributeForTopLink");
accessorClassHandleMapping.setReferenceClass(MWAttributeHandle.class);
accessorClassHandleMapping.setXPath("accessor-attribute-handle");
descriptor.addMapping(accessorClassHandleMapping);
return descriptor;
}
private MWAttributeHandle getAccessorAttributeForTopLink() {
return (this.accessorAttributeHandle.getAttribute() == null) ? null : this.accessorAttributeHandle;
}
private void setAccessorAttributeForTopLink(MWAttributeHandle attribute) {
NodeReferenceScrubber scrubber = this.buildAccessorAttributeScrubber();
this.accessorAttributeHandle = ((attribute == null) ? new MWAttributeHandle(this, scrubber) : attribute.setScrubber(scrubber));
}
// **************** UI support *********************************************
@Override
public String accessorDisplayString() {
MWClassAttribute attribute = this.getAccessorAttribute();
return (attribute == null) ? null : attribute.displayString();
}
@Override
public boolean isNull() {
return false;
}
@Override
public boolean isMethods() {
return false;
}
@Override
public boolean isAttribute() {
return true;
}
}