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.MWHandle; import org.eclipse.persistence.tools.workbench.mappingsmodel.handles.MWMethodHandle; import org.eclipse.persistence.tools.workbench.mappingsmodel.handles.MWHandle.NodeReferenceScrubber; import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWMethod; import org.eclipse.persistence.tools.workbench.utility.node.Node; public final class MWMethodContainerAccessor extends MWContainerAccessor { // **************** Variables ********************************************* private MWMethodHandle accessorGetMethodHandle; public final static String ACCESSOR_GET_METHOD_PROPERTY = "accessorGetMethod"; private MWMethodHandle accessorSetMethodHandle; public final static String ACCESSOR_SET_METHOD_PROPERTY = "accessorSetMethodHandle"; // **************** Constructors ****************************************** /** Default constructor - for TopLink use only */ public MWMethodContainerAccessor() { super(); } public MWMethodContainerAccessor(MWNode parent, MWMethod getMethod, MWMethod setMethod) { super(parent); this.setAccessorGetMethod(getMethod); this.setAccessorSetMethod(setMethod); } // **************** Initialization **************************************** protected void initialize(Node parent) { super.initialize(parent); this.accessorGetMethodHandle = new MWMethodHandle(this, this.buildGetMethodScrubber()); this.accessorSetMethodHandle = new MWMethodHandle(this, this.buildSetMethodScrubber()); } // **************** Problems handling ******************************************** @Override protected void addProblemsTo(List currentProblems) { super.addProblemsTo(currentProblems); this.addGetMethodNotSelectedProblemToList(currentProblems); this.addSetMethodNotSelectedProblemToList(currentProblems); } private void addGetMethodNotSelectedProblemToList(List currentProblems) { if (this.getAccessorGetMethod() == null) { this.buildProblem(ProblemConstants.MAPPING_CONTAINER_ACCESSOR_GET_METHOD_NOT_SELECTED); } } private void addSetMethodNotSelectedProblemToList(List currentProblems) { if (this.getAccessorSetMethod() == null) { this.buildProblem(ProblemConstants.MAPPING_CONTAINER_ACCESSOR_SET_METHOD_NOT_SELECTED); } } // **************** Containment hierarchy ********************************* protected void addChildrenTo(List children) { super.addChildrenTo(children); children.add(this.accessorGetMethodHandle); children.add(this.accessorSetMethodHandle); } private NodeReferenceScrubber buildGetMethodScrubber() { return new NodeReferenceScrubber() { public void nodeReferenceRemoved(Node node, MWHandle handle) { MWMethodContainerAccessor.this.setAccessorGetMethod(null); } public String toString() { return "MWMethodContainerAccessor.buildGetMethodScrubber()"; } }; } private NodeReferenceScrubber buildSetMethodScrubber() { return new NodeReferenceScrubber() { public void nodeReferenceRemoved(Node node, MWHandle handle) { MWMethodContainerAccessor.this.setAccessorSetMethod(null); } public String toString() { return "MWMethodContainerAccessor.buildSetMethodScrubber()"; } }; } // **************** Accessor Methods ************************************* public MWMethod getAccessorGetMethod() { return this.accessorGetMethodHandle.getMethod(); } public void setAccessorGetMethod(MWMethod newAccessorMethod) { MWMethod oldAccessorMethod = this.getAccessorGetMethod(); this.accessorGetMethodHandle.setMethod(newAccessorMethod); if (this.attributeValueHasChanged(oldAccessorMethod, newAccessorMethod)) { this.firePropertyChanged(ACCESSOR_GET_METHOD_PROPERTY, oldAccessorMethod, newAccessorMethod); this.firePropertyChanged(CONTAINER_ACCESSOR_PROPERTY, oldAccessorMethod, newAccessorMethod); } } public MWMethod getAccessorSetMethod() { return this.accessorSetMethodHandle.getMethod(); } public void setAccessorSetMethod(MWMethod newAccessorMethod) { MWMethod oldAccessorMethod = this.getAccessorSetMethod(); this.accessorSetMethodHandle.setMethod(newAccessorMethod); if (this.attributeValueHasChanged(oldAccessorMethod, newAccessorMethod)) { this.firePropertyChanged(ACCESSOR_SET_METHOD_PROPERTY, oldAccessorMethod, newAccessorMethod); this.firePropertyChanged(CONTAINER_ACCESSOR_PROPERTY, oldAccessorMethod, newAccessorMethod); } } @Override public String accessorDisplayString() { MWMethod getMethod = this.getAccessorGetMethod(); MWMethod setMethod = this.getAccessorSetMethod(); String displayString = ""; if(getMethod != null) { displayString += getMethod.displayString(); } if(setMethod != null) { displayString += "/"; displayString += setMethod.displayString(); } return displayString; } // **************** Runtime conversion ************************************ public void adjustRuntimeMapping(AbstractCompositeObjectMapping mapping) { ((XMLCompositeObjectMapping)mapping).setContainerGetMethodName(getAccessorGetMethod().getName()); ((XMLCompositeObjectMapping)mapping).setContainerSetMethodName(getAccessorSetMethod().getName()); } public void adjustRuntimeMapping(AbstractCompositeCollectionMapping mapping) { ((XMLCompositeCollectionMapping)mapping).setContainerGetMethodName(getAccessorGetMethod().getName()); ((XMLCompositeCollectionMapping)mapping).setContainerSetMethodName(getAccessorSetMethod().getName()); } // **************** TopLink Methods *************************************** public static XMLDescriptor buildDescriptor() { XMLDescriptor descriptor = new XMLDescriptor(); descriptor.setJavaClass(MWMethodContainerAccessor.class); descriptor.getInheritancePolicy().setParentClass(MWContainerAccessor.class); XMLCompositeObjectMapping getMethodHandleMapping = new XMLCompositeObjectMapping(); getMethodHandleMapping.setAttributeName("accessorGetMethodHandle"); getMethodHandleMapping.setGetMethodName("getAccessorGetMethodHandleForTopLink"); getMethodHandleMapping.setSetMethodName("setAccessorGetMethodHandleForTopLink"); getMethodHandleMapping.setReferenceClass(MWMethodHandle.class); getMethodHandleMapping.setXPath("accessor-get-method-handle"); descriptor.addMapping(getMethodHandleMapping); XMLCompositeObjectMapping setMethodHandleMapping = new XMLCompositeObjectMapping(); setMethodHandleMapping.setAttributeName("accessorSetMethodHandle"); setMethodHandleMapping.setGetMethodName("getAccessorSetMethodHandleForTopLink"); setMethodHandleMapping.setSetMethodName("setAccessorSetMethodHandleForTopLink"); setMethodHandleMapping.setReferenceClass(MWMethodHandle.class); setMethodHandleMapping.setXPath("accessor-set-method-handle"); descriptor.addMapping(setMethodHandleMapping); return descriptor; } /** * check for null */ private MWMethodHandle getAccessorGetMethodHandleForTopLink() { return (this.accessorGetMethodHandle.getMethod() == null) ? null : this.accessorGetMethodHandle; } private void setAccessorGetMethodHandleForTopLink(MWMethodHandle methodHandle) { NodeReferenceScrubber scrubber = this.buildGetMethodScrubber(); this.accessorGetMethodHandle = ((methodHandle == null) ? new MWMethodHandle(this, scrubber) : methodHandle.setScrubber(scrubber)); } /** * check for null */ private MWMethodHandle getAccessorSetMethodHandleForTopLink() { return (this.accessorSetMethodHandle.getMethod() == null) ? null : this.accessorSetMethodHandle; } private void setAccessorSetMethodHandleForTopLink(MWMethodHandle methodHandle) { NodeReferenceScrubber scrubber = this.buildSetMethodScrubber(); this.accessorSetMethodHandle = ((methodHandle == null) ? new MWMethodHandle(this, scrubber) : methodHandle.setScrubber(scrubber)); } @Override public boolean isNull() { return false; } @Override public boolean isMethods() { return true; } @Override public boolean isAttribute() { return false; } }