blob: 1065f4fd6915bba4d1e34f7d755b60c73671cfa9 [file] [log] [blame]
package org.eclipse.jpt.jaxb.eclipselink.core.internal.context.java;
import java.util.List;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jpt.common.utility.Filter;
import org.eclipse.jpt.common.utility.internal.CollectionTools;
import org.eclipse.jpt.common.utility.internal.NotNullFilter;
import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
import org.eclipse.jpt.common.utility.internal.iterables.FilteringIterable;
import org.eclipse.jpt.common.utility.internal.iterables.SubIterableWrapper;
import org.eclipse.jpt.common.utility.internal.iterables.TransformationIterable;
import org.eclipse.jpt.jaxb.core.MappingKeys;
import org.eclipse.jpt.jaxb.core.context.JaxbAttributeMapping;
import org.eclipse.jpt.jaxb.core.context.JaxbClass;
import org.eclipse.jpt.jaxb.core.context.JaxbPersistentAttribute;
import org.eclipse.jpt.jaxb.core.internal.context.java.GenericJavaClassMapping;
import org.eclipse.jpt.jaxb.eclipselink.core.context.java.ELClassMapping;
import org.eclipse.jpt.jaxb.eclipselink.core.context.java.ELXmlDiscriminatorNode;
import org.eclipse.jpt.jaxb.eclipselink.core.context.java.ELXmlDiscriminatorValue;
import org.eclipse.jpt.jaxb.eclipselink.core.context.java.ELXmlNamedNodeMapping;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.java.ELJaxb;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.java.XmlDiscriminatorNodeAnnotation;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.java.XmlDiscriminatorValueAnnotation;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
public class ELJavaClassMapping
extends GenericJavaClassMapping
implements ELClassMapping {
protected ELJavaXmlDiscriminatorNode xmlDiscriminatorNode;
protected ELJavaXmlDiscriminatorValue xmlDiscriminatorValue;
public ELJavaClassMapping(JaxbClass parent) {
super(parent);
initXmlDiscriminatorNode();
initXmlDiscriminatorValue();
}
// ***** sync/update *****
@Override
public void synchronizeWithResourceModel() {
super.synchronizeWithResourceModel();
syncXmlDiscriminatorNode();
syncXmlDiscriminatorValue();
}
@Override
public void update() {
super.update();
updateXmlDiscriminatorNode();
updateXmlDiscriminatorValue();
}
// ***** xmlDiscriminatorNode *****
public ELXmlDiscriminatorNode getXmlDiscriminatorNode() {
return this.xmlDiscriminatorNode;
}
protected void setXmlDiscriminatorNode_(ELJavaXmlDiscriminatorNode xmlDiscriminatorNode) {
ELXmlDiscriminatorNode old = this.xmlDiscriminatorNode;
this.xmlDiscriminatorNode = xmlDiscriminatorNode;
firePropertyChanged(XML_DISCRIMINATOR_NODE_PROPERTY, old, xmlDiscriminatorNode);
}
public ELXmlDiscriminatorNode addXmlDiscriminatorNode() {
if (this.xmlDiscriminatorNode != null) {
throw new IllegalStateException();
}
getJavaResourceType().addAnnotation(ELJaxb.XML_DISCRIMINATOR_NODE);
ELJavaXmlDiscriminatorNode xmlDiscriminatorNode = buildXmlDiscriminatorNode();
setXmlDiscriminatorNode_(xmlDiscriminatorNode);
return xmlDiscriminatorNode;
}
public void removeXmlDiscriminatorNode() {
if (this.xmlDiscriminatorNode == null) {
throw new IllegalStateException();
}
getJavaResourceType().removeAnnotation(ELJaxb.XML_DISCRIMINATOR_NODE);
setXmlDiscriminatorNode_(null);
}
public XmlDiscriminatorNodeAnnotation getXmlDiscriminatorNodeAnnotation() {
return (XmlDiscriminatorNodeAnnotation) getJavaResourceType().getAnnotation(ELJaxb.XML_DISCRIMINATOR_NODE);
}
protected ELJavaXmlDiscriminatorNode buildXmlDiscriminatorNode() {
return new ELJavaXmlDiscriminatorNode(this);
}
protected void initXmlDiscriminatorNode() {
XmlDiscriminatorNodeAnnotation annotation = getXmlDiscriminatorNodeAnnotation();
this.xmlDiscriminatorNode = (annotation == null) ? null : buildXmlDiscriminatorNode();
}
protected void syncXmlDiscriminatorNode() {
XmlDiscriminatorNodeAnnotation annotation = getXmlDiscriminatorNodeAnnotation();
if (annotation != null) {
if (this.xmlDiscriminatorNode != null) {
this.xmlDiscriminatorNode.synchronizeWithResourceModel();
}
else {
setXmlDiscriminatorNode_(buildXmlDiscriminatorNode());
}
}
else {
setXmlDiscriminatorNode_(null);
}
}
protected void updateXmlDiscriminatorNode() {
if (this.xmlDiscriminatorNode != null) {
this.xmlDiscriminatorNode.update();
}
}
// ***** xmlDiscriminatorValue *****
public ELXmlDiscriminatorValue getXmlDiscriminatorValue() {
return this.xmlDiscriminatorValue;
}
protected void setXmlDiscriminatorValue_(ELJavaXmlDiscriminatorValue xmlDiscriminatorValue) {
ELXmlDiscriminatorValue old = this.xmlDiscriminatorValue;
this.xmlDiscriminatorValue = xmlDiscriminatorValue;
firePropertyChanged(XML_DISCRIMINATOR_VALUE_PROPERTY, old, xmlDiscriminatorValue);
}
public ELXmlDiscriminatorValue addXmlDiscriminatorValue() {
if (this.xmlDiscriminatorValue != null) {
throw new IllegalStateException();
}
getJavaResourceType().addAnnotation(ELJaxb.XML_DISCRIMINATOR_VALUE);
ELJavaXmlDiscriminatorValue xmlDiscriminatorValue = buildXmlDiscriminatorValue();
setXmlDiscriminatorValue_(xmlDiscriminatorValue);
return xmlDiscriminatorValue;
}
public void removeXmlDiscriminatorValue() {
if (this.xmlDiscriminatorValue == null) {
throw new IllegalStateException();
}
getJavaResourceType().removeAnnotation(ELJaxb.XML_DISCRIMINATOR_VALUE);
setXmlDiscriminatorValue_(null);
}
public XmlDiscriminatorValueAnnotation getXmlDiscriminatorValueAnnotation() {
return (XmlDiscriminatorValueAnnotation) getJavaResourceType().getAnnotation(ELJaxb.XML_DISCRIMINATOR_VALUE);
}
protected ELJavaXmlDiscriminatorValue buildXmlDiscriminatorValue() {
return new ELJavaXmlDiscriminatorValue(this);
}
protected void initXmlDiscriminatorValue() {
XmlDiscriminatorValueAnnotation annotation = getXmlDiscriminatorValueAnnotation();
this.xmlDiscriminatorValue = (annotation == null) ? null : buildXmlDiscriminatorValue();
}
protected void syncXmlDiscriminatorValue() {
XmlDiscriminatorValueAnnotation annotation = getXmlDiscriminatorValueAnnotation();
if (annotation != null) {
if (this.xmlDiscriminatorValue != null) {
this.xmlDiscriminatorValue.synchronizeWithResourceModel();
}
else {
setXmlDiscriminatorValue_(buildXmlDiscriminatorValue());
}
}
else {
setXmlDiscriminatorValue_(null);
}
}
protected void updateXmlDiscriminatorValue() {
if (this.xmlDiscriminatorValue != null) {
this.xmlDiscriminatorValue.update();
}
}
// ***** misc *****
public Iterable<String> getKeyXPaths() {
return new FilteringIterable(
new TransformationIterable<ELXmlNamedNodeMapping, String>(getAllKeyMappings()) {
@Override
protected String transform(ELXmlNamedNodeMapping o) {
return o.getXPath();
}
},
NotNullFilter.instance());
}
protected Iterable<ELXmlNamedNodeMapping> getAllKeyMappings() {
return new FilteringIterable<ELXmlNamedNodeMapping>(
new SubIterableWrapper<JaxbAttributeMapping, ELXmlNamedNodeMapping>(
new FilteringIterable<JaxbAttributeMapping>(
new TransformationIterable<JaxbPersistentAttribute, JaxbAttributeMapping>(getAllAttributes()) {
@Override
protected JaxbAttributeMapping transform(JaxbPersistentAttribute o) {
return o.getMapping();
}
}) {
@Override
protected boolean accept(JaxbAttributeMapping o) {
return (o.getKey() == MappingKeys.XML_ELEMENT_ATTRIBUTE_MAPPING_KEY
|| o.getKey() == MappingKeys.XML_ATTRIBUTE_ATTRIBUTE_MAPPING_KEY);
}
})) {
@Override
protected boolean accept(ELXmlNamedNodeMapping o) {
return o.getXmlID() != null || o.getXmlKey() != null;
}
};
}
// ***** content assist *****
@Override
public Iterable<String> getJavaCompletionProposals(
int pos, Filter<String> filter, CompilationUnit astRoot) {
Iterable<String> result = super.getJavaCompletionProposals(pos, filter, astRoot);
if (! CollectionTools.isEmpty(result)) {
return result;
}
if (this.xmlDiscriminatorNode != null) {
result = this.xmlDiscriminatorNode.getJavaCompletionProposals(pos, filter, astRoot);
if (! CollectionTools.isEmpty(result)) {
return result;
}
}
return EmptyIterable.instance();
}
// ***** validation *****
@Override
public void validate(List<IMessage> messages, IReporter reporter, CompilationUnit astRoot) {
super.validate(messages, reporter, astRoot);
if (this.xmlDiscriminatorNode != null) {
this.xmlDiscriminatorNode.validate(messages, reporter, astRoot);
}
if (this.xmlDiscriminatorValue != null) {
this.xmlDiscriminatorValue.validate(messages, reporter, astRoot);
}
}
}