Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2016-12-13 10:50:32 +0000
committerEike Stepper2016-12-13 10:50:32 +0000
commit27d9fe36b46524b7d285fd53a416f510c9224263 (patch)
tree38ed6851f9452e88366c667043e8d3153d21771d /plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view
parent7b509f423332eb4199e3a07b3e13f0ece39d50a9 (diff)
downloadcdo-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.java181
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java10
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;

Back to the top