diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.explorer')
3 files changed, 94 insertions, 53 deletions
diff --git a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/checkouts/CDOCheckoutManager.java b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/checkouts/CDOCheckoutManager.java index b4bb2d3685..8c61877829 100644 --- a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/checkouts/CDOCheckoutManager.java +++ b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/checkouts/CDOCheckoutManager.java @@ -37,12 +37,14 @@ public interface CDOCheckoutManager extends CDOExplorerManager<CDOCheckout> /** * @author Eike Stepper */ - public interface CheckoutOpenEvent extends IEvent + public interface CheckoutStateEvent extends IEvent { public CDOCheckoutManager getSource(); public CDOCheckout getCheckout(); - public boolean isOpen(); + public CDOCheckout.State getOldState(); + + public CDOCheckout.State getNewState(); } } diff --git a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutImpl.java b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutImpl.java index e282eeb6e4..0b90aa4e53 100644 --- a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutImpl.java +++ b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutImpl.java @@ -45,6 +45,7 @@ import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.emf.spi.cdo.InternalCDOObject; import org.eclipse.emf.spi.cdo.InternalCDOView; import java.io.File; @@ -360,58 +361,77 @@ public abstract class CDOCheckoutImpl extends AbstractElement implements CDOChec public final void open() { - boolean opened = false; + CDOCheckoutManagerImpl manager = getManager(); + State oldState = null; + State newState = null; - synchronized (this) + try { - if (!isOpen()) + synchronized (this) { - try - { - state = State.Opening; - - prepareOpen(); - CDOSession session = ((CDORepositoryImpl)repository).openCheckout(this); + oldState = state; - view = openView(session); - view.addListener(new LifecycleEventAdapter() + if (!isOpen()) + { + try { - @Override - protected void onDeactivated(ILifecycle lifecycle) + state = State.Opening; + if (manager != null) { - removeView(view); - close(); + manager.fireCheckoutOpenEvent(this, null, oldState, state); } - }); - configureView(view); + oldState = state; - rootObject = loadRootObject(); - rootObject.eAdapters().add(this); + prepareOpen(); + CDOSession session = ((CDORepositoryImpl)repository).openCheckout(this); - state = State.Open; - } - catch (RuntimeException ex) - { - state = State.Closed; - throw ex; - } - catch (Error ex) - { - state = State.Closed; - throw ex; + view = openView(session); + view.addListener(new LifecycleEventAdapter() + { + @Override + protected void onDeactivated(ILifecycle lifecycle) + { + removeView(view); + if (state != State.Closing) + { + close(); + } + } + }); + + configureView(view); + + rootObject = loadRootObject(); + rootObject.eAdapters().add(this); + + state = State.Open; + newState = state; + } + catch (RuntimeException ex) + { + view = null; + rootObject = null; + state = State.Closed; + newState = state; + throw ex; + } + catch (Error ex) + { + view = null; + rootObject = null; + state = State.Closed; + newState = state; + throw ex; + } } - - opened = true; } } - - if (opened) + finally { - CDOCheckoutManagerImpl manager = getManager(); - if (manager != null) + if (manager != null && oldState != null && newState != null && newState != oldState) { - manager.fireCheckoutOpenEvent(this, view, true); + manager.fireCheckoutOpenEvent(this, view, oldState, newState); } } } @@ -467,7 +487,7 @@ public abstract class CDOCheckoutImpl extends AbstractElement implements CDOChec CDOCheckoutManagerImpl manager = getManager(); if (manager != null) { - manager.fireCheckoutOpenEvent(this, oldView, false); + manager.fireCheckoutOpenEvent(this, oldView, State.Open, State.Closed); } } } @@ -800,7 +820,8 @@ public abstract class CDOCheckoutImpl extends AbstractElement implements CDOChec rootID = view.getSession().getRepositoryInfo().getRootResourceID(); } - return view.getObject(rootID); + InternalCDOObject cdoObject = (InternalCDOObject)view.getObject(rootID); + return cdoObject.cdoInternalInstance(); } protected abstract CDOView openView(CDOSession session); diff --git a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutManagerImpl.java b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutManagerImpl.java index dcf84a489d..31a176a09b 100644 --- a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutManagerImpl.java +++ b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutManagerImpl.java @@ -64,18 +64,21 @@ public class CDOCheckoutManagerImpl extends AbstractManager<CDOCheckout>implemen return newElement(properties); } - public void fireCheckoutOpenEvent(CDOCheckout checkout, CDOView view, boolean open) + public void fireCheckoutOpenEvent(CDOCheckout checkout, CDOView view, CDOCheckout.State oldState, + CDOCheckout.State newState) { - if (open) + switch (newState) { + case Open: viewMap.put(view, checkout); - } - else - { + break; + + case Closed: viewMap.remove(view); + break; } - fireEvent(new CheckoutOpenEventImpl(this, checkout, open)); + fireEvent(new CheckoutStateEventImpl(this, checkout, oldState, newState)); } @Override @@ -127,19 +130,23 @@ public class CDOCheckoutManagerImpl extends AbstractManager<CDOCheckout>implemen /** * @author Eike Stepper */ - private static final class CheckoutOpenEventImpl extends Event implements CheckoutOpenEvent + private static final class CheckoutStateEventImpl extends Event implements CheckoutStateEvent { private static final long serialVersionUID = 1L; private final CDOCheckout checkout; - private final boolean open; + private final CDOCheckout.State oldState; - public CheckoutOpenEventImpl(CDOCheckoutManager repositoryManager, CDOCheckout checkout, boolean open) + private final CDOCheckout.State newState; + + public CheckoutStateEventImpl(CDOCheckoutManager repositoryManager, CDOCheckout checkout, + CDOCheckout.State oldState, CDOCheckout.State newState) { super(repositoryManager); this.checkout = checkout; - this.open = open; + this.oldState = oldState; + this.newState = newState; } @Override @@ -153,9 +160,20 @@ public class CDOCheckoutManagerImpl extends AbstractManager<CDOCheckout>implemen return checkout; } - public boolean isOpen() + public CDOCheckout.State getOldState() + { + return oldState; + } + + public CDOCheckout.State getNewState() + { + return newState; + } + + @Override + public String toString() { - return open; + return "CDOCheckoutState[" + checkout + ", " + oldState + " --> " + newState + "]"; } } } |