diff options
author | Eike Stepper | 2022-01-16 07:47:06 +0000 |
---|---|---|
committer | Eike Stepper | 2022-01-16 07:47:06 +0000 |
commit | 3a7c820b5467f88959a10d90ce668904741ac2a9 (patch) | |
tree | 9e25669b77ab2b3faa26f2783b3c3674eb041e1b /plugins | |
parent | 46fd38398dc3aa7f7cd63bfcb2798540f05f74f6 (diff) | |
download | cdo-3a7c820b5467f88959a10d90ce668904741ac2a9.tar.gz cdo-3a7c820b5467f88959a10d90ce668904741ac2a9.tar.xz cdo-3a7c820b5467f88959a10d90ce668904741ac2a9.zip |
[544670] Improve resolution of LOB features
https://bugs.eclipse.org/bugs/show_bug.cgi?id=544670
Diffstat (limited to 'plugins')
3 files changed, 26 insertions, 10 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOClassInfo.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOClassInfo.java index ace54e4779..fe42c829ce 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOClassInfo.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOClassInfo.java @@ -13,6 +13,7 @@ package org.eclipse.emf.cdo.common.model; import org.eclipse.emf.cdo.spi.common.model.InternalCDOClassInfo; import org.eclipse.emf.common.notify.Adapter; +import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; @@ -73,6 +74,11 @@ public interface CDOClassInfo extends Adapter public EStructuralFeature[] getAllPersistentMapFeatures(); /** + * @since 4.16 + */ + public EAttribute[] getAllPersistentLobAttributes(); + + /** * @deprecated As of 4.2 pushed down to {@link InternalCDOClassInfo#getPersistentFeatureIndex(EStructuralFeature)}. */ @Deprecated diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java index 8af925d42a..affa0975ab 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java @@ -28,6 +28,7 @@ import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; @@ -73,6 +74,8 @@ public final class CDOClassInfoImpl implements InternalCDOClassInfo, Adapter.Int private EStructuralFeature[] allPersistentMapFeatures; + private EAttribute[] allPersistentLobAttributes; + private int[] persistentFeatureIndices; private int settingsFeatureCount; @@ -213,6 +216,12 @@ public final class CDOClassInfoImpl implements InternalCDOClassInfo, Adapter.Int } @Override + public EAttribute[] getAllPersistentLobAttributes() + { + return allPersistentLobAttributes; + } + + @Override public int getPersistentFeatureIndex(EStructuralFeature feature) throws IllegalArgumentException { int featureID = eClass.getFeatureID(feature); @@ -305,6 +314,7 @@ public final class CDOClassInfoImpl implements InternalCDOClassInfo, Adapter.Int List<EReference> persistentReferences = new ArrayList<>(); List<EStructuralFeature> persistentContainments = new ArrayList<>(); List<EStructuralFeature> persistentMapFeatures = new ArrayList<>(); + List<EAttribute> persistentLobAttributes = new ArrayList<>(); // Used for tests for containment EStructuralFeature[] containments = ((EClassImpl.FeatureSubsetSupplier)eClass.getEAllStructuralFeatures()).containments(); @@ -338,6 +348,10 @@ public final class CDOClassInfoImpl implements InternalCDOClassInfo, Adapter.Int persistentOppositeBits.set(featureID); } } + else if (CDOModelUtil.isLob(feature.getEType())) + { + persistentLobAttributes.add((EAttribute)feature); + } if (isMap(feature)) { @@ -382,6 +396,7 @@ public final class CDOClassInfoImpl implements InternalCDOClassInfo, Adapter.Int allPersistentReferences = persistentReferences.toArray(new EReference[persistentReferences.size()]); allPersistentContainments = persistentContainments.toArray(new EStructuralFeature[persistentContainments.size()]); allPersistentMapFeatures = persistentMapFeatures.toArray(new EStructuralFeature[persistentMapFeatures.size()]); + allPersistentLobAttributes = persistentLobAttributes.toArray(new EAttribute[persistentLobAttributes.size()]); persistentFeatureIndices = new int[allFeatures.size()]; Arrays.fill(persistentFeatureIndices, NO_SLOT); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java index 0981774776..d84b3e1970 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java @@ -43,7 +43,6 @@ import org.eclipse.emf.cdo.common.lock.CDOLockDelta; import org.eclipse.emf.cdo.common.lock.CDOLockOwner; import org.eclipse.emf.cdo.common.lock.CDOLockState; import org.eclipse.emf.cdo.common.lock.CDOLockUtil; -import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.model.EMFUtil; @@ -167,6 +166,7 @@ import org.eclipse.emf.common.notify.NotificationChain; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; @@ -5165,17 +5165,12 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa private void collectLobs(InternalCDORevision revision, Map<ByteArrayWrapper, CDOLob<?>> lobs) { - EStructuralFeature[] features = revision.getClassInfo().getAllPersistentFeatures(); - for (int i = 0; i < features.length; i++) + for (EAttribute lobAttribute : revision.getClassInfo().getAllPersistentLobAttributes()) { - EStructuralFeature feature = features[i]; - if (CDOModelUtil.isLob(feature.getEType())) + CDOLob<?> lob = (CDOLob<?>)revision.getValue(lobAttribute); + if (lob != null) { - CDOLob<?> lob = (CDOLob<?>)revision.getValue(feature); - if (lob != null) - { - lobs.put(new ByteArrayWrapper(lob.getID()), lob); - } + lobs.put(new ByteArrayWrapper(lob.getID()), lob); } } } |