Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentAttribute.java')
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentAttribute.java652
1 files changed, 652 insertions, 0 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentAttribute.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentAttribute.java
new file mode 100644
index 0000000000..e603fb9fda
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/content/java/JavaPersistentAttribute.java
@@ -0,0 +1,652 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2007 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0, which accompanies this distribution
+ * and is available at http://www.eclipse.org/legal/epl-v10.html.
+ *
+ * Contributors:
+ * Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.core.internal.content.java;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jpt.core.internal.IJpaContentNode;
+import org.eclipse.jpt.core.internal.IPersistentAttribute;
+import org.eclipse.jpt.core.internal.IPersistentType;
+import org.eclipse.jpt.core.internal.ITextRange;
+import org.eclipse.jpt.core.internal.ITypeMapping;
+import org.eclipse.jpt.core.internal.JpaCorePackage;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaBasicProvider;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaEmbeddedIdProvider;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaEmbeddedProvider;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaIdProvider;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaManyToManyProvider;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaManyToOneProvider;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaNullAttributeMappingProvider;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaOneToManyProvider;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaOneToOneProvider;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaTransientProvider;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaVersionProvider;
+import org.eclipse.jpt.core.internal.jdtutility.Attribute;
+import org.eclipse.jpt.core.internal.jdtutility.DeclarationAnnotationAdapter;
+import org.eclipse.jpt.core.internal.platform.DefaultsContext;
+import org.eclipse.jpt.utility.internal.iterators.ArrayIterator;
+import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Java Persistent Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ * <li>{@link org.eclipse.jpt.core.internal.content.java.JavaPersistentAttribute#getDefaultMapping <em>Default Mapping</em>}</li>
+ * <li>{@link org.eclipse.jpt.core.internal.content.java.JavaPersistentAttribute#getSpecifiedMapping <em>Specified Mapping</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.jpt.core.internal.content.java.JpaJavaPackage#getJavaPersistentAttribute()
+ * @model kind="class"
+ * @generated
+ */
+public class JavaPersistentAttribute extends JavaEObject
+ implements IPersistentAttribute
+{
+ /**
+ * The default value of the '{@link #getMappingKey() <em>Mapping Key</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getMappingKey()
+ * @generated
+ * @ordered
+ */
+ protected static final String MAPPING_KEY_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getMappingKey() <em>Mapping Key</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getMappingKey()
+ * @generated
+ * @ordered
+ */
+ protected String mappingKey = MAPPING_KEY_EDEFAULT;
+
+ /**
+ * The cached value of the '{@link #getDefaultMapping() <em>Default Mapping</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getDefaultMapping()
+ * @generated
+ * @ordered
+ */
+ protected IJavaAttributeMapping defaultMapping;
+
+ /**
+ * The cached value of the '{@link #getSpecifiedMapping() <em>Specified Mapping</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getSpecifiedMapping()
+ * @generated
+ * @ordered
+ */
+ protected IJavaAttributeMapping specifiedMapping;
+
+ private Attribute attribute;
+
+ // TODO move these to a singleton?
+ private IJavaAttributeMappingProvider[] attributeMappingProviders;
+
+ /**
+ * the "null" attribute mapping is used when the attribute is neither
+ * modified with a mapping annotation nor mapped by a "default" mapping
+ */
+ // TODO move this to a singleton?
+ private IJavaAttributeMappingProvider nullAttributeMappingProvider;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected JavaPersistentAttribute() {
+ super();
+ }
+
+ protected JavaPersistentAttribute(Attribute attribute) {
+ super();
+ this.attribute = attribute;
+ this.attributeMappingProviders = this.buildAttributeMappingProviders();
+ this.nullAttributeMappingProvider = this.buildNullAttributeMappingProvider();
+ }
+
+ private IJavaAttributeMappingProvider[] buildAttributeMappingProviders() {
+ ArrayList<IJavaAttributeMappingProvider> providers = new ArrayList<IJavaAttributeMappingProvider>();
+ this.addAttributeMappingProvidersTo(providers);
+ return providers.toArray(new IJavaAttributeMappingProvider[providers.size()]);
+ }
+
+ /**
+ * Override this to specify more or different attribute mapping providers.
+ * The default includes the JPA spec-defined type mappings of
+ * Basic, Id, OneToOne, OneToMany, ManyToOne, ManyToMany, Embeddable, EmbeddedId.
+ */
+ protected void addAttributeMappingProvidersTo(Collection<IJavaAttributeMappingProvider> providers) {
+ providers.add(JavaBasicProvider.instance());
+ providers.add(JavaIdProvider.instance());
+ providers.add(JavaTransientProvider.instance());
+ providers.add(JavaOneToManyProvider.instance());
+ providers.add(JavaManyToOneProvider.instance());
+ providers.add(JavaManyToManyProvider.instance());
+ providers.add(JavaOneToOneProvider.instance());
+ providers.add(JavaEmbeddedProvider.instance());
+ providers.add(JavaEmbeddedIdProvider.instance());
+ providers.add(JavaVersionProvider.instance());
+ }
+
+ protected IJavaAttributeMappingProvider buildNullAttributeMappingProvider() {
+ return JavaNullAttributeMappingProvider.instance();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return JpaJavaPackage.Literals.JAVA_PERSISTENT_ATTRIBUTE;
+ }
+
+ /**
+ * Returns the value of the '<em><b>Mapping Key</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Mapping Key</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Mapping Key</em>' attribute.
+ * @see org.eclipse.jpt.core.internal.content.java.JpaJavaPackage#getIPersistentAttribute_MappingKey()
+ * @model required="true" changeable="false"
+ * @generated
+ */
+ public String getMappingKey() {
+ return mappingKey;
+ }
+
+ /**
+ * Returns the value of the '<em><b>Default Mapping</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Default Mapping</em>' containment reference isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Default Mapping</em>' containment reference.
+ * @see #setDefaultMapping(IJavaAttributeMapping)
+ * @see org.eclipse.jpt.core.internal.content.java.JpaJavaPackage#getJavaPersistentAttribute_DefaultMapping()
+ * @model containment="true" required="true"
+ * @generated
+ */
+ public IJavaAttributeMapping getDefaultMapping() {
+ return defaultMapping;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetDefaultMapping(IJavaAttributeMapping newDefaultMapping, NotificationChain msgs) {
+ IJavaAttributeMapping oldDefaultMapping = defaultMapping;
+ defaultMapping = newDefaultMapping;
+ if (eNotificationRequired()) {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__DEFAULT_MAPPING, oldDefaultMapping, newDefaultMapping);
+ if (msgs == null)
+ msgs = notification;
+ else
+ msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.java.JavaPersistentAttribute#getDefaultMapping <em>Default Mapping</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Default Mapping</em>' containment reference.
+ * @see #getDefaultMapping()
+ * @generated
+ */
+ public void setDefaultMapping(IJavaAttributeMapping newDefaultMapping) {
+ if (newDefaultMapping != defaultMapping) {
+ NotificationChain msgs = null;
+ if (defaultMapping != null)
+ msgs = ((InternalEObject) defaultMapping).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__DEFAULT_MAPPING, null, msgs);
+ if (newDefaultMapping != null)
+ msgs = ((InternalEObject) newDefaultMapping).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__DEFAULT_MAPPING, null, msgs);
+ msgs = basicSetDefaultMapping(newDefaultMapping, msgs);
+ if (msgs != null)
+ msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__DEFAULT_MAPPING, newDefaultMapping, newDefaultMapping));
+ }
+
+ /**
+ * Returns the value of the '<em><b>Specified Mapping</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Specified Mapping</em>' containment reference isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Specified Mapping</em>' containment reference.
+ * @see #setSpecifiedMapping(IJavaAttributeMapping)
+ * @see org.eclipse.jpt.core.internal.content.java.JpaJavaPackage#getJavaPersistentAttribute_SpecifiedMapping()
+ * @model containment="true" required="true"
+ * @generated
+ */
+ public IJavaAttributeMapping getSpecifiedMapping() {
+ return specifiedMapping;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetSpecifiedMapping(IJavaAttributeMapping newSpecifiedMapping, NotificationChain msgs) {
+ IJavaAttributeMapping oldSpecifiedMapping = specifiedMapping;
+ specifiedMapping = newSpecifiedMapping;
+ if (eNotificationRequired()) {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__SPECIFIED_MAPPING, oldSpecifiedMapping, newSpecifiedMapping);
+ if (msgs == null)
+ msgs = notification;
+ else
+ msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * Sets the value of the '{@link org.eclipse.jpt.core.internal.content.java.JavaPersistentAttribute#getSpecifiedMapping <em>Specified Mapping</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Specified Mapping</em>' containment reference.
+ * @see #getSpecifiedMapping()
+ * @generated
+ */
+ public void setSpecifiedMappingGen(IJavaAttributeMapping newSpecifiedMapping) {
+ if (newSpecifiedMapping != specifiedMapping) {
+ NotificationChain msgs = null;
+ if (specifiedMapping != null)
+ msgs = ((InternalEObject) specifiedMapping).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__SPECIFIED_MAPPING, null, msgs);
+ if (newSpecifiedMapping != null)
+ msgs = ((InternalEObject) newSpecifiedMapping).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__SPECIFIED_MAPPING, null, msgs);
+ msgs = basicSetSpecifiedMapping(newSpecifiedMapping, msgs);
+ if (msgs != null)
+ msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__SPECIFIED_MAPPING, newSpecifiedMapping, newSpecifiedMapping));
+ }
+
+ /**
+ * This should not be called when updating the persistence model
+ * from the java model, it should only be called when going in the
+ * other direction. This will update the java code appropriately
+ * to the change in mapping in the persistence model.
+ */
+ public void setSpecifiedMapping(IJavaAttributeMapping newMapping) {
+ if (this.specifiedMapping != null) {
+ this.attribute.removeAnnotation(this.annotationAdapterForAttributeMappingKey(this.specifiedMapping.getKey()));
+ }
+ if (newMapping != null) {
+ this.attribute.newMarkerAnnotation(this.annotationAdapterForAttributeMappingKey(newMapping.getKey()));
+ }
+ this.setSpecifiedMappingGen(newMapping);
+ }
+
+ protected void setMappingKeyInternal(String newMappingKey) {
+ String oldMappingKey = mappingKey;
+ mappingKey = newMappingKey;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__MAPPING_KEY, oldMappingKey, mappingKey));
+ }
+
+ /**
+ * This should not be called when updating the persistence model
+ * from the java model, it should only be called when going in the
+ * other direction. This will update the java code appropriately
+ * to the change in mapping in the persistence model.
+ */
+ public void setMappingKey(String newMappingKey, boolean default_) {
+ if (default_) {
+ setSpecifiedMapping(null);
+ setMappingKeyInternal(newMappingKey);
+ return;
+ }
+ this.setSpecifiedMapping(this.buildMapping(newMappingKey));
+ if (this.specifiedMapping != null) {
+ this.specifiedMapping.initialize();
+ }
+ this.setMappingKeyInternal(newMappingKey);
+ //TODO need to support mapping morphing, copying common settings over
+ //to the new mapping. This can't be done in the same was as XmlAttributeMapping
+ //since we don't know all the possible mapping types
+ }
+
+ public IJavaAttributeMapping getMapping() {
+ return getSpecifiedMapping() != null ? getSpecifiedMapping() : getDefaultMapping();
+ }
+
+ public String getName() {
+ return getAttribute().attributeName();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__DEFAULT_MAPPING :
+ return basicSetDefaultMapping(null, msgs);
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__SPECIFIED_MAPPING :
+ return basicSetSpecifiedMapping(null, msgs);
+ }
+ return super.eInverseRemove(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType) {
+ switch (featureID) {
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__MAPPING_KEY :
+ return getMappingKey();
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__DEFAULT_MAPPING :
+ return getDefaultMapping();
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__SPECIFIED_MAPPING :
+ return getSpecifiedMapping();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue) {
+ switch (featureID) {
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__DEFAULT_MAPPING :
+ setDefaultMapping((IJavaAttributeMapping) newValue);
+ return;
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__SPECIFIED_MAPPING :
+ setSpecifiedMapping((IJavaAttributeMapping) newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__DEFAULT_MAPPING :
+ setDefaultMapping((IJavaAttributeMapping) null);
+ return;
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__SPECIFIED_MAPPING :
+ setSpecifiedMapping((IJavaAttributeMapping) null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__MAPPING_KEY :
+ return MAPPING_KEY_EDEFAULT == null ? mappingKey != null : !MAPPING_KEY_EDEFAULT.equals(mappingKey);
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__DEFAULT_MAPPING :
+ return defaultMapping != null;
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__SPECIFIED_MAPPING :
+ return specifiedMapping != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+ if (baseClass == IJpaContentNode.class) {
+ switch (derivedFeatureID) {
+ default :
+ return -1;
+ }
+ }
+ if (baseClass == IPersistentAttribute.class) {
+ switch (derivedFeatureID) {
+ case JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__MAPPING_KEY :
+ return JpaCorePackage.IPERSISTENT_ATTRIBUTE__MAPPING_KEY;
+ default :
+ return -1;
+ }
+ }
+ return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+ if (baseClass == IJpaContentNode.class) {
+ switch (baseFeatureID) {
+ default :
+ return -1;
+ }
+ }
+ if (baseClass == IPersistentAttribute.class) {
+ switch (baseFeatureID) {
+ case JpaCorePackage.IPERSISTENT_ATTRIBUTE__MAPPING_KEY :
+ return JpaJavaPackage.JAVA_PERSISTENT_ATTRIBUTE__MAPPING_KEY;
+ default :
+ return -1;
+ }
+ }
+ return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String toString() {
+ if (eIsProxy())
+ return super.toString();
+ StringBuffer result = new StringBuffer(super.toString());
+ result.append(" (mappingKey: ");
+ result.append(mappingKey);
+ result.append(')');
+ return result.toString();
+ }
+
+ public IPersistentType getPersistentType() {
+ return (IPersistentType) this.eContainer();
+ }
+
+ public ITypeMapping typeMapping() {
+ return this.getPersistentType().getMapping();
+ }
+
+ private IJavaAttributeMappingProvider attributeMappingProviderFor(String attributeMappingKey) {
+ for (IJavaAttributeMappingProvider provider : this.attributeMappingProviders) {
+ if (provider.key() == attributeMappingKey) {
+ return provider;
+ }
+ }
+ throw new IllegalArgumentException("Unsupported attribute mapping key: " + attributeMappingKey);
+ }
+
+ private DeclarationAnnotationAdapter annotationAdapterForAttributeMappingKey(String attributeMappingKey) {
+ return this.attributeMappingProviderFor(attributeMappingKey).declarationAnnotationAdapter();
+ }
+
+ public Iterator<String> candidateMappingKeys() {
+ return new TransformationIterator<IJavaAttributeMappingProvider, String>(new ArrayIterator<IJavaAttributeMappingProvider>(this.attributeMappingProviders)) {
+ protected String transform(IJavaAttributeMappingProvider next) {
+ return next.key();
+ }
+ };
+ }
+
+ public Object getId() {
+ return IJavaContentNodes.PERSISTENT_ATTRIBUTE_ID;
+ }
+
+ public Attribute getAttribute() {
+ return this.attribute;
+ }
+
+ public ITextRange getTextRange() {
+ return this.attribute.textRange();
+ }
+
+ public boolean isFor(IMember member) {
+ return this.attribute.wraps(member);
+ }
+
+ public void updateFromJava(CompilationUnit astRoot) {
+ String jpaKey = null;
+ if (this.specifiedMapping != null) {
+ jpaKey = this.specifiedMapping.getKey();
+ }
+ String javaKey = this.javaAttributeMappingKey(astRoot);
+ if (javaKey == null) { // no annotation
+ if (this.specifiedMapping != null) {
+ setSpecifiedMapping(null);
+ }
+ }
+ else if (jpaKey != javaKey) {
+ this.createAndSetMappingFromJava(javaKey);
+ }
+ if (getMapping() != null) {
+ getMapping().updateFromJava(astRoot);
+ }
+ }
+
+ private void createAndSetMappingFromJava(String key) {
+ this.setSpecifiedMappingGen(this.buildMapping(key));
+ this.specifiedMapping.initialize();
+ this.setMappingKeyInternal(this.specifiedMapping.getKey());
+ }
+
+ //A null key means there is no "mapping" annotation on the attribute.
+ //In this case check the attributeMappingProviders for one that the defaultApplies
+ //and create the mapping. If the key is not null then create the mapping
+ //based on the appropriate provider, otherwise return the a nullAttributeMapping
+ private IJavaAttributeMapping buildMapping(String key) {
+ if (key == null) {
+ return null;
+ }
+ for (IJavaAttributeMappingProvider provider : this.attributeMappingProviders) {
+ if (provider.key() == key) {
+ return provider.buildMapping(this.attribute);
+ }
+ }
+ return this.nullAttributeMappingProvider.buildMapping(this.attribute);
+ }
+
+ private String javaAttributeMappingKey(CompilationUnit astRoot) {
+ for (IJavaAttributeMappingProvider provider : this.attributeMappingProviders) {
+ if (this.attribute.containsAnnotation(provider.declarationAnnotationAdapter(), astRoot)) {
+ return provider.key();
+ }
+ }
+ return null;
+ }
+
+ public String defaultKey() {
+ if (this.defaultMapping != null) {
+ return this.defaultMapping.getKey();
+ }
+ return null;
+ }
+
+ public String primaryKeyColumnName() {
+ if (getMapping() != null) {
+ return getMapping().primaryKeyColumnName();
+ }
+ return null;
+ }
+
+ public boolean isAttributeMappingDefault() {
+ return this.specifiedMapping == null;
+ }
+
+ public List<String> candidateValuesFor(int pos, CompilationUnit astRoot) {
+ return Collections.emptyList();
+ }
+
+ public void refreshDefaults(DefaultsContext defaultsContext) {
+ for (IJavaAttributeMappingProvider provider : this.attributeMappingProviders) {
+ if (provider.defaultApplies(this.attribute, defaultsContext)) {
+ if (getDefaultMapping() != null) {
+ if (getDefaultMapping().getKey() == provider.key()) {
+ return;
+ }
+ }
+ setDefaultMapping(provider.buildMapping(this.attribute));
+ getDefaultMapping().updateFromJava(getAttribute().astRoot());
+ if (getSpecifiedMapping() == null) {
+ setMappingKeyInternal(getDefaultMapping().getKey());
+ }
+ return;
+ }
+ }
+ setDefaultMapping(this.nullAttributeMappingProvider.buildMapping(this.attribute));
+ getDefaultMapping().updateFromJava(getAttribute().astRoot());
+ if (getSpecifiedMapping() == null) {
+ setMappingKeyInternal(getDefaultMapping().getKey());
+ }
+ }
+} // JavaPersistentAttribute

Back to the top