/*
* Copyright (c) 2016 Eike Stepper (Berlin, Germany) and others.
* 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.view;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.lifecycle.ILifecycle;
import org.eclipse.net4j.util.lifecycle.LifecycleEventAdapter;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
import org.eclipse.emf.spi.cdo.InternalCDOObject;
import org.eclipse.emf.spi.cdo.InternalCDOView;
/**
* Call-back handler used by {@link CDOView views} to tell implementors of this interface about registrations and deregistrations
* of {@link CDOObject objects} with {@link CDOView views}.
*
* @author Eike Stepper
* @since 4.6
* @see CDOView#addRegistrationHandler(CDORegistrationHandler)
* @see CDOView#removeRegistrationHandler(CDORegistrationHandler)
* @see CDOView#isObjectRegistered(org.eclipse.emf.cdo.common.id.CDOID)
*/
public interface CDORegistrationHandler
{
public void objectRegistered(CDOView view, CDOObject object);
public void objectDeregistered(CDOView view, CDOObject object);
public void objectCollected(CDOView view, CDOID id);
/**
* @author Eike Stepper
*/
public static class Default implements CDORegistrationHandler
{
private final IListener deactivateListener = new LifecycleEventAdapter()
{
@Override
protected void onDeactivated(ILifecycle lifecycle)
{
dispose();
}
};
private CDOView view;
public Default(final CDOView view)
{
view.syncExec(new Runnable()
{
public void run()
{
doInitialize(view);
}
});
this.view = view;
}
public final CDOView getView()
{
return view;
}
public final boolean isDisposed()
{
return view == null;
}
public synchronized void dispose()
{
if (view != null)
{
final CDOView finalView = view;
view = null;
finalView.syncExec(new Runnable()
{
public void run()
{
doDispose(finalView);
}
});
}
}
/**
* Called by the view for each registered object.
* <p>
* Also called during initialization for already loaded objects;
* {@link #isDisposed()} returns <code>true</code> in these cases.
*/
public void objectRegistered(CDOView view, CDOObject object)
{
// Subclasses may override.
}
/**
* Called by the view for each deregistered object.
* <p>
* Also called during dispose for already loaded objects;
* {@link #isDisposed()} returns <code>true</code> in these cases.
*/
public void objectDeregistered(CDOView view, CDOObject object)
{
// Subclasses may override.
}
/**
* Called by the view for each garbage-collected object.
*/
public void objectCollected(CDOView view, CDOID id)
{
// Subclasses may override.
}
protected void doInitialize(CDOView view)
{
if (LifecycleUtil.isActive(view))
{
for (InternalCDOObject object : ((InternalCDOView)view).getObjects().values())
{
objectRegistered(view, object);
}
}
view.addRegistrationHandler(this);
view.addListener(deactivateListener);
}
protected void doDispose(CDOView view)
{
view.removeListener(deactivateListener);
view.removeRegistrationHandler(this);
if (LifecycleUtil.isActive(view))
{
for (InternalCDOObject object : ((InternalCDOView)view).getObjects().values())
{
objectDeregistered(view, object);
}
}
}
}
}