diff options
author | Eike Stepper | 2016-12-13 10:50:32 +0000 |
---|---|---|
committer | Eike Stepper | 2016-12-13 10:50:32 +0000 |
commit | 27d9fe36b46524b7d285fd53a416f510c9224263 (patch) | |
tree | 38ed6851f9452e88366c667043e8d3153d21771d /plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view | |
parent | 7b509f423332eb4199e3a07b3e13f0ece39d50a9 (diff) | |
download | cdo-27d9fe36b46524b7d285fd53a416f510c9224263.tar.gz cdo-27d9fe36b46524b7d285fd53a416f510c9224263.tar.xz cdo-27d9fe36b46524b7d285fd53a416f510c9224263.zip |
[509141] Provide CDORegistrationHandler callbacks
https://bugs.eclipse.org/bugs/show_bug.cgi?id=509141
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view')
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java | 181 | ||||
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java | 10 |
2 files changed, 165 insertions, 26 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java index c502eaae3d..5562d069da 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java @@ -66,6 +66,7 @@ import org.eclipse.emf.cdo.util.ReadOnlyException; import org.eclipse.emf.cdo.view.CDOAdapterPolicy; import org.eclipse.emf.cdo.view.CDOObjectHandler; import org.eclipse.emf.cdo.view.CDOQuery; +import org.eclipse.emf.cdo.view.CDORegistrationHandler; import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.emf.cdo.view.CDOViewAdaptersNotifiedEvent; import org.eclipse.emf.cdo.view.CDOViewEvent; @@ -81,6 +82,7 @@ import org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl; import org.eclipse.net4j.util.AdapterUtil; import org.eclipse.net4j.util.CheckUtil; import org.eclipse.net4j.util.ImplementationError; +import org.eclipse.net4j.util.ReflectUtil; import org.eclipse.net4j.util.ReflectUtil.ExcludeFromDump; import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.WrappedException; @@ -127,6 +129,7 @@ import org.eclipse.emf.spi.cdo.InternalCDOViewSet; import org.eclipse.core.runtime.IProgressMonitor; import java.io.IOException; +import java.lang.reflect.Method; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; @@ -186,6 +189,15 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb } }; + private final ConcurrentArray<CDORegistrationHandler> registrationHandlers = new ConcurrentArray<CDORegistrationHandler>() + { + @Override + protected CDORegistrationHandler[] newArray(int length) + { + return new CDORegistrationHandler[length]; + } + }; + private final IRegistry<String, Object> properties = new HashMapRegistry<String, Object>() { @Override @@ -294,6 +306,18 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb } } + public int purgeUnusedObjects() + { + if (objects instanceof ReferenceValueMap2) + { + ReferenceValueMap2<CDOID, InternalCDOObject> map = (ReferenceValueMap2<CDOID, InternalCDOObject>)objects; + Method method = ReflectUtil.getMethod(ReferenceValueMap2.class, "internalPurgeQueue"); + return (Integer)ReflectUtil.invokeMethod(method, map); + } + + return 0; + } + public Map<CDOID, InternalCDOObject> getObjects() { synchronized (getViewMonitor()) @@ -347,7 +371,15 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb } Map<CDOID, KeyedReference<CDOID, InternalCDOObject>> map = CDOIDUtil.createMap(); - newObjects = new ReferenceValueMap2.Strong<CDOID, InternalCDOObject>(map); + newObjects = new ReferenceValueMap2.Strong<CDOID, InternalCDOObject>(map) + { + @Override + protected void purged(CDOID id) + { + objectCollected(id); + } + }; + break; } @@ -359,7 +391,15 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb } Map<CDOID, KeyedReference<CDOID, InternalCDOObject>> map = CDOIDUtil.createMap(); - newObjects = new ReferenceValueMap2.Soft<CDOID, InternalCDOObject>(map); + newObjects = new ReferenceValueMap2.Soft<CDOID, InternalCDOObject>(map) + { + @Override + protected void purged(CDOID id) + { + objectCollected(id); + } + }; + break; } @@ -371,7 +411,15 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb } Map<CDOID, KeyedReference<CDOID, InternalCDOObject>> map = CDOIDUtil.createMap(); - newObjects = new ReferenceValueMap2.Weak<CDOID, InternalCDOObject>(map); + newObjects = new ReferenceValueMap2.Weak<CDOID, InternalCDOObject>(map) + { + @Override + protected void purged(CDOID id) + { + objectCollected(id); + } + }; + break; } @@ -1948,11 +1996,6 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb } } - protected void objectDeregistered(InternalCDOObject object) - { - // Subclasses may override. - } - /** * @return Never <code>null</code> */ @@ -2432,11 +2475,6 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb } } - protected void objectRegistered(InternalCDOObject object) - { - // Subclasses may override. - } - public void deregisterObject(InternalCDOObject object) { synchronized (getViewMonitor()) @@ -2459,6 +2497,81 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb } } + protected void objectRegistered(InternalCDOObject object) + { + CDORegistrationHandler[] handlers = getRegistrationHandlers(); + if (handlers.length != 0) + { + synchronized (getViewMonitor()) + { + lockView(); + + try + { + for (int i = 0; i < handlers.length; i++) + { + CDORegistrationHandler handler = handlers[i]; + handler.objectRegistered(this, object); + } + } + finally + { + unlockView(); + } + } + } + } + + protected void objectDeregistered(InternalCDOObject object) + { + CDORegistrationHandler[] handlers = getRegistrationHandlers(); + if (handlers.length != 0) + { + synchronized (getViewMonitor()) + { + lockView(); + + try + { + for (int i = 0; i < handlers.length; i++) + { + CDORegistrationHandler handler = handlers[i]; + handler.objectDeregistered(this, object); + } + } + finally + { + unlockView(); + } + } + } + } + + protected void objectCollected(CDOID id) + { + CDORegistrationHandler[] handlers = getRegistrationHandlers(); + if (handlers.length != 0) + { + synchronized (getViewMonitor()) + { + lockView(); + + try + { + for (int i = 0; i < handlers.length; i++) + { + CDORegistrationHandler handler = handlers[i]; + handler.objectCollected(this, id); + } + } + finally + { + unlockView(); + } + } + } + } + public void remapObject(CDOID oldID) { synchronized (getViewMonitor()) @@ -2508,26 +2621,44 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb public void handleObjectStateChanged(InternalCDOObject object, CDOState oldState, CDOState newState) { - synchronized (getViewMonitor()) + CDOObjectHandler[] handlers = getObjectHandlers(); + if (handlers.length != 0) { - lockView(); - - try + synchronized (getViewMonitor()) { - CDOObjectHandler[] handlers = getObjectHandlers(); - for (int i = 0; i < handlers.length; i++) + lockView(); + + try { - CDOObjectHandler handler = handlers[i]; - handler.objectStateChanged(this, object, oldState, newState); + for (int i = 0; i < handlers.length; i++) + { + CDOObjectHandler handler = handlers[i]; + handler.objectStateChanged(this, object, oldState, newState); + } + } + finally + { + unlockView(); } - } - finally - { - unlockView(); } } } + public void addRegistrationHandler(CDORegistrationHandler handler) + { + registrationHandlers.add(handler); + } + + public void removeRegistrationHandler(CDORegistrationHandler handler) + { + registrationHandlers.remove(handler); + } + + public CDORegistrationHandler[] getRegistrationHandlers() + { + return registrationHandlers.get(); + } + /* * Synchronized through InvalidationRunner.run() */ diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java index 601aa997a0..b68084b1d8 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java @@ -12,6 +12,7 @@ */ package org.eclipse.emf.internal.cdo.view; +import org.eclipse.emf.cdo.CDOLocalAdapter; import org.eclipse.emf.cdo.CDONotification; import org.eclipse.emf.cdo.CDOObject; import org.eclipse.emf.cdo.common.CDOCommonView; @@ -970,6 +971,7 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv @Override protected void objectRegistered(InternalCDOObject object) { + super.objectRegistered(object); unitManager.addObject(object); } @@ -977,6 +979,7 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv protected void objectDeregistered(InternalCDOObject object) { removeLockState(object); + super.objectDeregistered(object); } public CDOLockState[] getLockStates(Collection<CDOID> ids) @@ -1379,7 +1382,7 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv } } - getChangeSubscriptionManager().handleDetachedObjects(detachedObjects); + changeSubscriptionManager.handleDetachedObjects(detachedObjects); } } finally @@ -2529,6 +2532,11 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv private boolean shouldSubscribe(EObject eObject, Adapter adapter) { + if (adapter instanceof CDOLocalAdapter) + { + return false; + } + if (unitManager.getOpenUnitUnsynced(eObject) != null) { return false; |