/*******************************************************************************
* 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.descriptor.xml;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.eclipse.persistence.tools.workbench.mappingsmodel.MWDataField;
import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWReturningPolicy;
import org.eclipse.persistence.tools.workbench.mappingsmodel.schema.MWSchemaContextComponent;
import org.eclipse.persistence.tools.workbench.mappingsmodel.xml.MWXmlField;
import org.eclipse.persistence.tools.workbench.mappingsmodel.xml.MWXpathContext;
import org.eclipse.persistence.tools.workbench.mappingsmodel.xml.MWXpathSpec;
import org.eclipse.persistence.tools.workbench.utility.CollectionTools;
import org.eclipse.persistence.tools.workbench.utility.iterators.CloneIterator;
import org.eclipse.persistence.tools.workbench.utility.iterators.FilteringIterator;
import org.eclipse.persistence.tools.workbench.utility.node.Node;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping;
public final class MWEisReturningPolicy
extends MWReturningPolicy
implements MWXpathContext
{
/** The implementation of the implied collection on the superclass */
private Collection updateFields;
// ********** constructors/initialization **********
/** Default constructor - for TopLink use only */
private MWEisReturningPolicy() {
super();
}
MWEisReturningPolicy(MWEisDescriptor parent) {
super(parent);
}
protected void initialize(Node parent) {
super.initialize(parent);
this.updateFields = new Vector();
}
protected void addChildrenTo(List children) {
super.addChildrenTo(children);
synchronized (this.updateFields) { children.addAll(this.updateFields); }
}
// **************** Insert fields *****************************************
public MWEisReturningPolicyInsertFieldReturnOnlyFlag addInsertFieldReadOnlyFlag(String xpath) {
MWEisReturningPolicyInsertFieldReturnOnlyFlag insertFieldReturnOnlyFlag =
this.buildEmptyInsertFieldReadOnlyFlag();
insertFieldReturnOnlyFlag.getXmlField().setXpath(xpath);
this.addInsertFieldReadOnlyFlag(insertFieldReturnOnlyFlag);
return insertFieldReturnOnlyFlag;
}
public MWEisReturningPolicyInsertFieldReturnOnlyFlag buildEmptyInsertFieldReadOnlyFlag() {
return new MWEisReturningPolicyInsertFieldReturnOnlyFlag(this);
}
// **************** Update fields *****************************************
public Iterator updateFields() {
return new CloneIterator(this.updateFields) {
protected void remove(Object current) {
MWEisReturningPolicy.this.removeUpdateField((MWXmlField) current);
}
};
}
public int updateFieldsSize() {
return this.updateFields.size();
}
public MWXmlField addUpdateField(String xpath) {
MWXmlField updateField = this.buildEmptyUpdateField();
updateField.setXpath(xpath);
this.addUpdateField(updateField);
return updateField;
}
public void addUpdateField(MWXmlField updateField) {
this.addItemToCollection(updateField, this.updateFields, UPDATE_FIELDS_COLLECTION);
}
public MWXmlField buildEmptyUpdateField() {
return new MWXmlField(this);
}
public void removeUpdateField(MWDataField updateField) {
this.removeUpdateField((MWXmlField) updateField);
}
public void removeUpdateField(MWXmlField updateField) {
this.removeItemFromCollection(updateField, this.updateFields, UPDATE_FIELDS_COLLECTION);
}
// ********** MWXpathContext implementation **********
public MWSchemaContextComponent schemaContext(MWXmlField xmlField) {
return this.eisDescriptor().getSchemaContext();
}
public MWXpathSpec xpathSpec(MWXmlField xmlField) {
return this.buildXpathSpec();
}
protected MWXpathSpec buildXpathSpec() {
return new MWXpathSpec() {
public boolean mayUseCollectionData() {
return false;
}
public boolean mayUseComplexData() {
return false;
}
public boolean mayUseSimpleData() {
return true;
}
};
}
// ********** Convenience **********
public MWEisDescriptor eisDescriptor() {
return (MWEisDescriptor) this.getParent();
}
// ********** TopLink methods **********
public static XMLDescriptor buildDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(MWEisReturningPolicy.class);
XMLCompositeCollectionMapping insertFieldReturnOnlyFlagsMapping = new XMLCompositeCollectionMapping();
insertFieldReturnOnlyFlagsMapping.setAttributeName("insertFieldReturnOnlyFlags");
insertFieldReturnOnlyFlagsMapping.setGetMethodName("getInsertFieldReturnOnlyFlagsForTopLink");
insertFieldReturnOnlyFlagsMapping.setSetMethodName("setInsertFieldReturnOnlyFlagsForTopLink");
insertFieldReturnOnlyFlagsMapping.setReferenceClass(MWEisReturningPolicyInsertFieldReturnOnlyFlag.class);
insertFieldReturnOnlyFlagsMapping.setXPath("insert-field-read-only-flags/insert-field-read-only-flag");
descriptor.addMapping(insertFieldReturnOnlyFlagsMapping);
XMLCompositeCollectionMapping updateFieldsMapping = new XMLCompositeCollectionMapping();
updateFieldsMapping.setAttributeName("updateFields");
updateFieldsMapping.setGetMethodName("getUpdateFieldsForTopLink");
updateFieldsMapping.setSetMethodName("setUpdateFieldsForTopLink");
updateFieldsMapping.setReferenceClass(MWXmlField.class);
updateFieldsMapping.setXPath("update-fields/update-field");
descriptor.addMapping(updateFieldsMapping);
return descriptor;
}
/**
* "override" this method to write out only the fields that have an xpath
*/
private Collection getInsertFieldReturnOnlyFlagsForTopLink() {
return CollectionTools.sortedSet(this.specifiedInsertFieldReturnOnlyFlags());
}
private Iterator specifiedInsertFieldReturnOnlyFlags() {
return new FilteringIterator(this.insertFieldReturnOnlyFlags()) {
protected boolean accept(Object o) {
return ((MWEisReturningPolicyInsertFieldReturnOnlyFlag) o).getXmlField().isSpecified();
}
};
}
private Collection getUpdateFieldsForTopLink() {
return CollectionTools.sortedSet(this.specifiedUpdateFields());
}
private Iterator specifiedUpdateFields() {
return new FilteringIterator(this.updateFields()) {
protected boolean accept(Object o) {
return ((MWXmlField) o).isSpecified();
}
};
}
private void setUpdateFieldsForTopLink(Collection updateFields) {
this.updateFields = updateFields;
}
}