From 9b6392f3ffa6e68e3076b5a43300e5a1bebae1aa Mon Sep 17 00:00:00 2001 From: Eike Stepper Date: Thu, 8 Nov 2012 19:28:58 +0100 Subject: [393910] Stabilize state management in SynchronizableRepositories https://bugs.eclipse.org/bugs/show_bug.cgi?id=393910 --- .../cdo/examples/client/offline/AbstractView.java | 5 - .../examples/client/offline/ClientPerspective.java | 9 +- .../cdo/examples/client/offline/ClientView.java | 141 +++++++++++++++++++++ .../client/offline/NormalRepositoryView.java | 15 --- .../cdo/examples/client/offline/nodes/Node.java | 11 ++ .../examples/client/offline/nodes/NodeManager.java | 11 +- .../examples/client/offline/nodes/NodeType.java | 66 +++++++++- 7 files changed, 224 insertions(+), 34 deletions(-) create mode 100644 plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/ClientView.java (limited to 'plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples') diff --git a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/AbstractView.java b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/AbstractView.java index cddad8ec48..3f5b46b771 100644 --- a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/AbstractView.java +++ b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/AbstractView.java @@ -78,11 +78,6 @@ public abstract class AbstractView> extends ViewPart public void run() { String text = events.getText(); - // if (text.length() != 0) - // { - // text += StringUtil.NL; - // } - // events.setText(event + StringUtil.NL + text); } }); diff --git a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/ClientPerspective.java b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/ClientPerspective.java index 40503b9a6d..61a102709f 100644 --- a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/ClientPerspective.java +++ b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/ClientPerspective.java @@ -21,9 +21,10 @@ public class ClientPerspective implements IPerspectiveFactory public void createInitialLayout(IPageLayout layout) { layout.setFixed(true); - layout.addView("org.eclipse.emf.cdo.ui.CDOSessionsView", IPageLayout.LEFT, 0.5f, IPageLayout.ID_EDITOR_AREA); - layout.addView("org.eclipse.emf.cdo.examples.client.offline.CloneRepositoryView", IPageLayout.BOTTOM, 0.37f, - "org.eclipse.emf.cdo.ui.CDOSessionsView"); - layout.addView("org.eclipse.ui.views.PropertySheet", IPageLayout.BOTTOM, 0.61f, IPageLayout.ID_EDITOR_AREA); + layout.addView("org.eclipse.emf.cdo.examples.client.offline.ClientView", IPageLayout.LEFT, 0.5f, + IPageLayout.ID_EDITOR_AREA); + layout.addView("org.eclipse.emf.cdo.examples.client.offline.CloneRepositoryView", IPageLayout.BOTTOM, 0.46f, + "org.eclipse.emf.cdo.examples.client.offline.ClientView"); + layout.addView("org.eclipse.ui.views.PropertySheet", IPageLayout.BOTTOM, 0.67f, IPageLayout.ID_EDITOR_AREA); } } diff --git a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/ClientView.java b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/ClientView.java new file mode 100644 index 0000000000..85749e4a6a --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/ClientView.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2004 - 2012 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.examples.client.offline; + +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.ui.CDOItemProvider; + +import org.eclipse.net4j.util.event.IEvent; +import org.eclipse.net4j.util.ui.UIUtil; +import org.eclipse.net4j.util.ui.views.ContainerItemProvider; + +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.ITreeSelection; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.ui.IWorkbenchActionConstants; +import org.eclipse.ui.PartInitException; + +/** + * @author Eike Stepper + */ +public class ClientView extends AbstractView +{ + public static final String ID = "org.eclipse.emf.cdo.examples.client.offline.ClientView"; //$NON-NLS-1$ + + private CDOItemProvider itemProvider; + + private TreeViewer treeViewer; + + public ClientView() + { + super(CDOSession.class); + } + + @Override + protected void createPane(Composite parent, CDOSession session) + { + itemProvider = new CDOItemProvider(getSite().getPage()) + { + @Override + protected void handleElementEvent(final IEvent event) + { + addEvent(event); + } + }; + + treeViewer = new TreeViewer(parent, SWT.BORDER); + treeViewer.setLabelProvider(itemProvider); + treeViewer.setContentProvider(itemProvider); + treeViewer.setInput(session); + + hookDoubleClick(); + hookContextMenu(); + } + + protected void hookDoubleClick() + { + treeViewer.addDoubleClickListener(new IDoubleClickListener() + { + public void doubleClick(DoubleClickEvent event) + { + ITreeSelection selection = (ITreeSelection)treeViewer.getSelection(); + Object object = selection.getFirstElement(); + if (object instanceof ContainerItemProvider.ErrorElement) + { + try + { + UIUtil.getActiveWorkbenchPage().showView(UIUtil.ERROR_LOG_ID); + } + catch (PartInitException ex) + { + ex.printStackTrace(); + } + } + else if (object != null && treeViewer.isExpandable(object)) + { + if (treeViewer.getExpandedState(object)) + { + treeViewer.collapseToLevel(object, TreeViewer.ALL_LEVELS); + } + else + { + treeViewer.expandToLevel(object, 1); + } + } + } + }); + } + + protected void hookContextMenu() + { + MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(new IMenuListener() + { + public void menuAboutToShow(IMenuManager manager) + { + ITreeSelection selection = (ITreeSelection)treeViewer.getSelection(); + fillContextMenu(manager, selection); + } + }); + + Menu menu = menuMgr.createContextMenu(treeViewer.getControl()); + treeViewer.getControl().setMenu(menu); + getSite().registerContextMenu(menuMgr, treeViewer); + } + + protected void fillContextMenu(IMenuManager manager, ITreeSelection selection) + { + itemProvider.fillContextMenu(manager, selection); + manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); + } + + @Override + public void setFocus() + { + treeViewer.getTree().setFocus(); + } + + @Override + public void dispose() + { + itemProvider.dispose(); + super.dispose(); + } +} diff --git a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/NormalRepositoryView.java b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/NormalRepositoryView.java index e6ea12b1fd..70daafc1fc 100644 --- a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/NormalRepositoryView.java +++ b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/NormalRepositoryView.java @@ -23,8 +23,6 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.wb.swt.ExampleResourceManager; -import java.util.concurrent.ExecutorService; - /** * @author Eike Stepper */ @@ -48,17 +46,6 @@ public class NormalRepositoryView extends AbstractView { private Image bean = ExampleResourceManager.getPluginImage(Application.PLUGIN_ID, "icons/Bean.gif"); - @Override - public String getText(Object obj) - { - if (obj instanceof ExecutorService) - { - return "ExecutorService"; - } - - return super.getText(obj); - } - @Override public Image getImage(Object obj) { @@ -79,8 +66,6 @@ public class NormalRepositoryView extends AbstractView treeViewer.setContentProvider(itemProvider); treeViewer.setInput(repository); - // ScrolledComposite scrolledComposite = new ScrolledComposite(sash, SWT.NONE); - // scrolledComposite.setContent(new RepositoryDetails(scrolledComposite, repository)); new RepositoryDetails(sash, repository); sash.setWeights(new int[] { 1, 1 }); diff --git a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/Node.java b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/Node.java index a3e42743d7..6e33e230f0 100644 --- a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/Node.java +++ b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/Node.java @@ -96,6 +96,17 @@ public final class Node implements IElement, Comparable return (T)objects.get(type); } + @SuppressWarnings("unchecked") + public T setObject(Class type, T object) + { + if (object == null) + { + return (T)objects.remove(type); + } + + return (T)objects.put(type, object); + } + public void start() { type.start(this); diff --git a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/NodeManager.java b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/NodeManager.java index aa1422768a..debfda1739 100644 --- a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/NodeManager.java +++ b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/NodeManager.java @@ -153,9 +153,16 @@ public class NodeManager extends Container return elements; } - public Node createNode(NodeType nodeType) + Node createNode(NodeType nodeType) { Node node = new Node(nodeType); + saveNode(node); + + return addNode(node); + } + + void saveNode(Node node) + { OutputStream out = null; try @@ -175,8 +182,6 @@ public class NodeManager extends Container { IOUtil.close(out); } - - return addNode(node); } private Node addNode(Node node) diff --git a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/NodeType.java b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/NodeType.java index 96076aca50..1820dc0df6 100644 --- a/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/NodeType.java +++ b/plugins/org.eclipse.emf.cdo.examples.client.offline/src/org/eclipse/emf/cdo/examples/client/offline/nodes/NodeType.java @@ -10,6 +10,8 @@ */ package org.eclipse.emf.cdo.examples.client.offline.nodes; +import org.eclipse.emf.cdo.common.CDOCommonRepository.State; +import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.model.CDOPackageRegistryPopulator; import org.eclipse.emf.cdo.common.revision.CDORevisionCache; import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; @@ -26,6 +28,8 @@ import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy; import org.eclipse.emf.cdo.server.net4j.FailoverAgent; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.session.CDOSessionConfigurationFactory; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.view.CDOViewTargetChangedEvent; import org.eclipse.net4j.Net4jUtil; import org.eclipse.net4j.acceptor.IAcceptor; @@ -36,6 +40,8 @@ import org.eclipse.net4j.db.IDBConnectionProvider; import org.eclipse.net4j.db.h2.H2Adapter; import org.eclipse.net4j.util.container.IPluginContainer; import org.eclipse.net4j.util.container.SetContainer; +import org.eclipse.net4j.util.event.IEvent; +import org.eclipse.net4j.util.event.IListener; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.eclipse.jface.viewers.ComboViewer; @@ -89,6 +95,8 @@ public abstract class NodeType extends SetContainer implements IElement public static final String MONITOR_PROPERTY = "Monitor"; + public static final String BRANCH_PROPERTY = "branch"; + private static final String REPOSITORY_NAME = "repository"; private final NodeManager manager; @@ -208,10 +216,10 @@ public abstract class NodeType extends SetContainer implements IElement public void start(Node node) { IRepository repository = createRepository(node); - node.getObjects().put(IRepository.class, repository); + node.setObject(IRepository.class, repository); IAcceptor acceptor = createAcceptor(node); - node.getObjects().put(IAcceptor.class, acceptor); + node.setObject(IAcceptor.class, acceptor); } public void stop(Node node) @@ -510,15 +518,34 @@ public abstract class NodeType extends SetContainer implements IElement } @Override - public void start(Node node) + public void start(final Node node) { super.start(node); - CDOSession session = (CDOSession)IPluginContainer.INSTANCE.getElement("org.eclipse.emf.cdo.sessions", "cdo", - "jvm://example?repositoryName=" + REPOSITORY_NAME); + final CDOSession session = (CDOSession)IPluginContainer.INSTANCE.getElement("org.eclipse.emf.cdo.sessions", + "cdo", "jvm://example?repositoryName=" + REPOSITORY_NAME); CDOPackageRegistryPopulator.populate(session.getPackageRegistry()); - node.getObjects().put(CDOSession.class, session); + node.setObject(CDOSession.class, session); + + if (session.getRepositoryInfo().getState() == State.INITIAL) + { + session.addListener(new IListener() + { + public void notifyEvent(IEvent event) + { + if (session.getRepositoryInfo().getState() != State.INITIAL) + { + session.removeListener(this); + createTransaction(node); + } + } + }); + } + else + { + createTransaction(node); + } } @Override @@ -579,6 +606,31 @@ public abstract class NodeType extends SetContainer implements IElement return (IAcceptor)IPluginContainer.INSTANCE.getElement("org.eclipse.net4j.acceptors", "jvm", "example"); } + protected void createTransaction(final Node node) + { + CDOSession session = node.getObject(CDOSession.class); + + int branchID = Integer.parseInt(node.getSettings().getProperty(BRANCH_PROPERTY, "0")); + CDOBranch branch = session.getBranchManager().getBranch(branchID); + + CDOTransaction transaction = session.openTransaction(branch); + transaction.addListener(new IListener() + { + public void notifyEvent(IEvent event) + { + if (event instanceof CDOViewTargetChangedEvent) + { + CDOViewTargetChangedEvent e = (CDOViewTargetChangedEvent)event; + int branchID = e.getBranchPoint().getBranch().getID(); + node.getSettings().setProperty(BRANCH_PROPERTY, Integer.toString(branchID)); + getManager().saveNode(node); + } + } + }); + + node.setObject(CDOTransaction.class, transaction); + } + @Override public String toString() { @@ -718,7 +770,7 @@ public abstract class NodeType extends SetContainer implements IElement org.eclipse.emf.cdo.server.net4j.FailoverMonitor monitor = (org.eclipse.emf.cdo.server.net4j.FailoverMonitor)IPluginContainer.INSTANCE .getElement(org.eclipse.emf.cdo.server.net4j.FailoverMonitor.PRODUCT_GROUP, org.eclipse.emf.cdo.server.net4j.FailoverMonitor.Factory.TYPE, node.getName()); - node.getObjects().put(org.eclipse.emf.cdo.server.net4j.FailoverMonitor.class, monitor); + node.setObject(org.eclipse.emf.cdo.server.net4j.FailoverMonitor.class, monitor); } @Override -- cgit v1.2.3