diff options
author | Eike Stepper | 2015-02-20 10:11:12 +0000 |
---|---|---|
committer | Eike Stepper | 2015-02-20 13:34:31 +0000 |
commit | 3ecac9ab191d0abea9dfb3a28c4d5803620465f4 (patch) | |
tree | 82f21c28133f4e2ba4fb8b5189aba465398707b0 | |
parent | ce3df424d86c68f64716b07e9f646bf07df0550b (diff) | |
download | cdo-3ecac9ab191d0abea9dfb3a28c4d5803620465f4.tar.gz cdo-3ecac9ab191d0abea9dfb3a28c4d5803620465f4.tar.xz cdo-3ecac9ab191d0abea9dfb3a28c4d5803620465f4.zip |
[458349] Consolidate UI
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=458349
17 files changed, 258 insertions, 136 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/util/CDOCommonUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/util/CDOCommonUtil.java index dc045b9316..6c32488a7e 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/util/CDOCommonUtil.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/util/CDOCommonUtil.java @@ -27,6 +27,7 @@ import org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl; import org.eclipse.emf.cdo.spi.common.protocol.CDODataOutputImpl; import org.eclipse.emf.cdo.spi.common.revision.CDORevisionUnchunker; +import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.event.IEvent; import org.eclipse.net4j.util.event.IListener; import org.eclipse.net4j.util.event.INotifier; @@ -66,7 +67,9 @@ public final class CDOCommonUtil { public int compare(CDONameProvider o1, CDONameProvider o2) { - return o1.getName().compareTo(o2.getName()); + String n1 = StringUtil.safe(o1.getName()).toLowerCase(); + String n2 = StringUtil.safe(o2.getName()).toLowerCase(); + return n1.compareTo(n2); } }; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java index 93944767c9..b62c22ca21 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java @@ -99,6 +99,15 @@ public class CDOPackageInfoImpl implements InternalCDOPackageInfo } } + public InternalCDOPackageInfo copy() + { + InternalCDOPackageInfo packageInfo = (InternalCDOPackageInfo)CDOModelUtil.createPackageInfo(); + packageInfo.setPackageURI(getPackageURI()); + packageInfo.setParentURI(getParentURI()); + packageInfo.setEPackage(getEPackage()); + return packageInfo; + } + public EFactory getEFactory() { return getEPackage().getEFactoryInstance(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java index eb63803cd2..0440b8f50a 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java @@ -329,6 +329,25 @@ public class CDOPackageUnitImpl implements InternalCDOPackageUnit } } + public InternalCDOPackageUnit copy() + { + InternalCDOPackageUnit packageUnit = (InternalCDOPackageUnit)CDOModelUtil.createPackageUnit(); + + InternalCDOPackageInfo[] thesePackageInfos = getPackageInfos(); + InternalCDOPackageInfo[] packageInfos = new InternalCDOPackageInfo[thesePackageInfos.length]; + for (int i = 0; i < thesePackageInfos.length; i++) + { + packageInfos[i] = thesePackageInfos[i].copy(); + packageInfos[i].setPackageUnit(packageUnit); + } + + packageUnit.setPackageInfos(packageInfos); + packageUnit.setOriginalType(getOriginalType()); + packageUnit.setState(getState()); + packageUnit.setTimeStamp(getTimeStamp()); + return packageUnit; + } + public int compareTo(CDOPackageUnit o) { return getID().compareTo(o.getID()); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageInfo.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageInfo.java index dd195cf981..436204c3f6 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageInfo.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageInfo.java @@ -51,4 +51,9 @@ public interface InternalCDOPackageInfo extends CDOPackageInfo, Adapter.Internal * @since 3.0 */ public void read(CDODataInput in) throws IOException; + + /** + * @since 4.4 + */ + public InternalCDOPackageInfo copy(); } diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageUnit.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageUnit.java index 7daaff537d..92135dabce 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageUnit.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageUnit.java @@ -68,6 +68,11 @@ public interface InternalCDOPackageUnit extends CDOPackageUnit */ public void read(CDODataInput in, ResourceSet resourceSet) throws IOException; + /** + * @since 4.4 + */ + public InternalCDOPackageUnit copy(); + public void init(EPackage ePackage); public void dispose(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataInputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataInputImpl.java index d595d233e4..e12220e516 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataInputImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataInputImpl.java @@ -185,7 +185,13 @@ public abstract class CDODataInputImpl extends ExtendedDataInput.Delegating impl public CDOBranch readCDOBranch() throws IOException { int branchID = readInt(); - return getBranchManager().getBranch(branchID); + CDOBranch branch = getBranchManager().getBranch(branchID); + if (branch == null) + { + throw new IOException("Branch not found: " + branchID); + } + + return branch; } public CDOBranchPoint readCDOBranchPoint() throws IOException diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelDecorator.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelDecorator.java index 2854eb62ef..dd04ffede6 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelDecorator.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelDecorator.java @@ -16,8 +16,11 @@ import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.util.CDOCommonUtil; import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; import org.eclipse.emf.cdo.explorer.ui.BaseLabelDecorator; +import org.eclipse.emf.cdo.explorer.ui.bundle.OM; import org.eclipse.net4j.util.AdapterUtil; +import org.eclipse.net4j.util.lifecycle.LifecycleException; +import org.eclipse.net4j.util.lifecycle.LifecycleUtil; /** * @author Eike Stepper @@ -31,54 +34,69 @@ public class CDOCheckoutLabelDecorator extends BaseLabelDecorator @Override public String decorateText(String text, Object element) { - CDOElement cdoElement = AdapterUtil.adapt(element, CDOElement.class); - if (cdoElement != null) + try { - element = cdoElement.getDelegate(); - } - - if (element instanceof CDOCheckout) - { - CDOCheckout checkout = (CDOCheckout)element; - - if (checkout.isOpen()) + CDOElement cdoElement = AdapterUtil.adapt(element, CDOElement.class); + if (cdoElement != null) { - CDOBranch branch = checkout.getView().getBranch(); - String branchPath = branch.getPathName(); - if (branchPath.startsWith(CDOBranch.MAIN_BRANCH_NAME)) - { - branchPath = branchPath.substring(CDOBranch.MAIN_BRANCH_NAME.length()); - } + element = cdoElement.getDelegate(); + } - if (branchPath.startsWith(CDOBranch.PATH_SEPARATOR)) + if (element instanceof CDOCheckout) + { + CDOCheckout checkout = (CDOCheckout)element; + if (checkout.isOpen()) { - branchPath = branchPath.substring(CDOBranch.PATH_SEPARATOR.length()); - } + String branchPath = checkout.getBranchPath(); + if (branchPath != null) + { + if (branchPath.startsWith(CDOBranch.MAIN_BRANCH_NAME)) + { + branchPath = branchPath.substring(CDOBranch.MAIN_BRANCH_NAME.length()); + } - if (branchPath.length() != 0) - { - text += " " + branchPath; - } + if (branchPath.startsWith(CDOBranch.PATH_SEPARATOR)) + { + branchPath = branchPath.substring(CDOBranch.PATH_SEPARATOR.length()); + } - long timeStamp = checkout.getTimeStamp(); - if (timeStamp != CDOBranchPoint.UNSPECIFIED_DATE) - { - text += " " + CDOCommonUtil.formatTimeStamp(timeStamp); - } + if (branchPath.length() != 0) + { + text += " [" + branchPath + "]"; + } + } - if (checkout.isOffline()) - { - if (checkout.isDirty()) + long timeStamp = checkout.getTimeStamp(); + if (timeStamp != CDOBranchPoint.UNSPECIFIED_DATE) { - text += " dirty"; + text += " " + CDOCommonUtil.formatTimeStamp(timeStamp); } - else + + if (checkout.isOffline()) { - text += " clean"; + if (checkout.isDirty()) + { + text += " dirty"; + } + else + { + text += " clean"; + } } } } } + catch (LifecycleException ex) + { + //$FALL-THROUGH$ + } + catch (Throwable ex) + { + if (LifecycleUtil.isActive(element)) + { + OM.LOG.error(ex); + } + } return text; } diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/properties/ExplorerUIAdapterFactory.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/properties/ExplorerUIAdapterFactory.java index 74e088aa1b..b49687f83b 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/properties/ExplorerUIAdapterFactory.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/properties/ExplorerUIAdapterFactory.java @@ -82,7 +82,7 @@ public class ExplorerUIAdapterFactory implements IAdapterFactory { EObject eObject = (EObject)adaptableObject; CDOCheckout checkout = CDOExplorerUtil.getCheckout(eObject); - if (checkout instanceof StateProvider) + if (checkout != null) { return checkout; } diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoryItemProvider.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoryItemProvider.java index ffb63a8289..3f8eec66db 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoryItemProvider.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoryItemProvider.java @@ -12,7 +12,6 @@ package org.eclipse.emf.cdo.explorer.ui.repositories; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.util.CDOCommonUtil; -import org.eclipse.emf.cdo.common.util.CDONameProvider; import org.eclipse.emf.cdo.common.util.CDOTimeProvider; import org.eclipse.emf.cdo.explorer.CDOExplorerManager; import org.eclipse.emf.cdo.explorer.repositories.CDORepository; @@ -175,19 +174,19 @@ public class CDORepositoryItemProvider extends ContainerItemProvider<IContainer< } else if (element instanceof CDORepositoryManager) { - List<CDONameProvider> nameProviders = new ArrayList<CDONameProvider>(); + List<CDORepository> repositories = new ArrayList<CDORepository>(); Object[] children = super.getChildren(element); for (Object child : children) { - if (child instanceof CDONameProvider) + if (child instanceof CDORepository) { - nameProviders.add((CDONameProvider)child); + repositories.add((CDORepository)child); } } - Collections.sort(nameProviders, CDOCommonUtil.NAME_COMPARATOR); - return nameProviders.toArray(); + Collections.sort(repositories); + return repositories.toArray(); } List<CDOTimeProvider> timeProviders = new ArrayList<CDOTimeProvider>(); diff --git a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/checkouts/CDOCheckout.java b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/checkouts/CDOCheckout.java index 8de20b3977..c3a18b7362 100644 --- a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/checkouts/CDOCheckout.java +++ b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/checkouts/CDOCheckout.java @@ -47,6 +47,8 @@ public interface CDOCheckout extends CDOExplorerElement, CDOTimeProvider, StateP public void setBranchID(int branchID); + public String getBranchPath(); + public long getTimeStamp(); public void setTimeStamp(long timeStamp); diff --git a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/repositories/CDORepository.java b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/repositories/CDORepository.java index 8ed522ce9d..ec64434200 100644 --- a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/repositories/CDORepository.java +++ b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/repositories/CDORepository.java @@ -11,7 +11,6 @@ package org.eclipse.emf.cdo.explorer.repositories; import org.eclipse.emf.cdo.common.branch.CDOBranch; -import org.eclipse.emf.cdo.common.util.CDONameProvider; import org.eclipse.emf.cdo.explorer.CDOExplorerElement; import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; import org.eclipse.emf.cdo.session.CDOSession; @@ -25,7 +24,7 @@ import org.eclipse.net4j.util.container.IContainer; * @author Eike Stepper * @since 4.4 */ -public interface CDORepository extends CDOExplorerElement, IContainer<CDOBranch>, CDONameProvider, CDOSessionProvider +public interface CDORepository extends CDOExplorerElement, IContainer<CDOBranch>, CDOSessionProvider { public static final String TYPE_REMOTE = "remote"; diff --git a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/AbstractElement.java b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/AbstractElement.java index c5f80b9330..9a471323b2 100644 --- a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/AbstractElement.java +++ b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/AbstractElement.java @@ -10,6 +10,7 @@ */ package org.eclipse.emf.cdo.internal.explorer; +import org.eclipse.emf.cdo.common.util.CDONameProvider; import org.eclipse.emf.cdo.explorer.CDOExplorerElement; import org.eclipse.emf.cdo.internal.explorer.bundle.OM; @@ -144,6 +145,17 @@ public abstract class AbstractElement extends Notifier implements CDOExplorerEle @SuppressWarnings({ "unchecked", "rawtypes" }) public Object getAdapter(Class adapter) { + if (adapter == CDONameProvider.class) + { + return new CDONameProvider() + { + public String getName() + { + return label; + } + }; + } + return AdapterUtil.adapt(this, adapter, false); } @@ -204,8 +216,8 @@ public abstract class AbstractElement extends Notifier implements CDOExplorerEle public int compareTo(CDOExplorerElement o) { - String label1 = StringUtil.safe(label); - String label2 = StringUtil.safe(o.getLabel()); + String label1 = StringUtil.safe(label).toLowerCase(); + String label2 = StringUtil.safe(o.getLabel()).toLowerCase(); return label1.compareTo(label2); } 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 618496f3d9..de07d5a9c4 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 @@ -115,6 +115,25 @@ public abstract class CDOCheckoutImpl extends AbstractElement implements CDOChec this.branchID = branchID; } + public String getBranchPath() + { + if (view == null) + { + return null; + } + + if (view != null) + { + CDOBranch branch = view.getBranch(); + if (branch != null) + { + return branch.getPathName(); + } + } + + return null; + } + public final long getTimeStamp() { return timeStamp; diff --git a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutProperties.java b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutProperties.java index 1a24053ef9..5e58bd7523 100644 --- a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutProperties.java +++ b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutProperties.java @@ -16,7 +16,6 @@ import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout.ObjectType; import org.eclipse.emf.cdo.explorer.repositories.CDORepository; import org.eclipse.emf.cdo.internal.explorer.AbstractElement; import org.eclipse.emf.cdo.internal.explorer.repositories.CDORepositoryProperties; -import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.net4j.util.properties.DefaultPropertyTester; import org.eclipse.net4j.util.properties.IProperties; @@ -123,13 +122,7 @@ public class CDOCheckoutProperties extends Properties<CDOCheckout> @Override protected Object eval(CDOCheckout checkout) { - CDOView view = checkout.getView(); - if (view != null) - { - return view.getBranch(); - } - - return null; + return checkout.getBranchPath(); } }); diff --git a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/OfflineCDOCheckout.java b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/OfflineCDOCheckout.java index 64c866d0ad..1caf577f90 100644 --- a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/OfflineCDOCheckout.java +++ b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/OfflineCDOCheckout.java @@ -113,8 +113,24 @@ public class OfflineCDOCheckout extends CDOCheckoutImpl return workspace.isDirty(); } + @Override + public String getBranchPath() + { + if (workspace == null) + { + return null; + } + + return workspace.getBranchPath(); + } + public CDOState getState(Object object) { + if (object == this) + { + return isDirty() ? CDOState.DIRTY : CDOState.CLEAN; + } + if (workspace == null) { return null; diff --git a/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java b/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java index 3bd31266b7..f86d98aae5 100644 --- a/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java +++ b/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/CDOWorkspaceImpl.java @@ -134,9 +134,11 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace private InternalRepository localRepository; + private CDOBranchPoint localRepositoryHead; + private InternalCDOSession localSession; - private CDOBranchPoint head; + private CDOBranchPoint localSessionHead; private int branchID = NO_BRANCH_ID; @@ -194,26 +196,30 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace try { - localRepository.setRootResourceID(remoteSession.getRepositoryInfo().getRootResourceID()); + CDOID rootResourceID = remoteSession.getRepositoryInfo().getRootResourceID(); + localRepository.setRootResourceID(rootResourceID); - InternalCDOPackageUnit[] packageUnits = remoteSession.getPackageRegistry().getPackageUnits(true); - InternalCDOPackageRegistry packageRegistry = localRepository.getPackageRegistry(false); - for (InternalCDOPackageUnit packageUnit : packageUnits) + InternalCDOPackageRegistry localPackageRegistry = localRepository.getPackageRegistry(false); + InternalCDOPackageUnit[] remotePackageUnits = remoteSession.getPackageRegistry().getPackageUnits(true); + for (InternalCDOPackageUnit remotePackageUnit : remotePackageUnits) { - packageRegistry.putPackageUnit(packageUnit); + InternalCDOPackageUnit localPackageUnit = remotePackageUnit.copy(); + localPackageRegistry.putPackageUnit(localPackageUnit); } - accessor.rawStore(packageUnits, monitor); + accessor.rawStore(remotePackageUnits, monitor); CDORevisionHandler handler = new CDORevisionHandler() { - public boolean handleRevision(CDORevision revision) + public boolean handleRevision(CDORevision remoteRevision) { - InternalCDORevision rev = (InternalCDORevision)revision; - adjustRevisionBranch(rev, localRepository.getBranchManager()); - accessor.rawStore(rev, monitor); + // Local session revisions are not cached and can directly be modified and stored in the local repository. + InternalCDORevision repositoryRevision = (InternalCDORevision)remoteRevision; + repositoryRevision.setBranchPoint(localRepositoryHead); + + accessor.rawStore(repositoryRevision, monitor); - long commitTime = revision.getTimeStamp(); + long commitTime = remoteRevision.getTimeStamp(); if (commitTime > timeStamp) { timeStamp = commitTime; @@ -245,7 +251,6 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace } finally { - remoteSession.getPackageRegistry().clear(); closeRemoteSession(remoteSession); } @@ -270,6 +275,7 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace try { localRepository = createLocalRepository(localRepositoryName, local); + localRepositoryHead = localRepository.getBranchManager().getMainBranch().getHead(); this.base = base; this.base.init(this); @@ -565,7 +571,10 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace else { // Detached - base.registerChangedOrDetachedObject((InternalCDORevision)remoteRevision); + InternalCDORevision baseRevision = ((InternalCDORevision)remoteRevision).copy(); + baseRevision.setBranchPoint(localSessionHead); + + base.registerChangedOrDetachedObject(baseRevision); } } else @@ -584,7 +593,10 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace if (!delta.isEmpty()) { // Changed - base.registerChangedOrDetachedObject((InternalCDORevision)remoteRevision); + InternalCDORevision baseRevision = ((InternalCDORevision)remoteRevision).copy(); + baseRevision.setBranchPoint(localSessionHead); + + base.registerChangedOrDetachedObject(baseRevision); } } } @@ -656,7 +668,7 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace public void revert(CDOChangeSetData revertData) { - final CDOBranch localBranch = head.getBranch(); + final CDOBranch localBranch = localSessionHead.getBranch(); IStoreAccessor.Raw accessor = getLocalWriter(null); StoreThreadLocal.setAccessor(accessor); @@ -678,6 +690,7 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace accessor.rawDelete(id, v, localBranch, eClass, new Monitor()); } + // Base revisions have the correct branch point and can directly be stored in the local repository. accessor.rawStore(baseRevision, new Monitor()); } @@ -701,7 +714,8 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace SyntheticCDORevision[] synthetics = { null }; InternalCDORevisionManager revisionManager = localSession.getRevisionManager(); - revisionManager.getRevision(id, head, CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, true, synthetics); + revisionManager + .getRevision(id, localSessionHead, CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, true, synthetics); int max = synthetics[0].getVersion(); EClass eClass = synthetics[0].getEClass(); @@ -713,6 +727,7 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace accessor.rawDelete(id, version, localBranch, eClass, new Monitor()); } + // Base revisions have the correct branch point and can directly be stored in the local repository. accessor.rawStore(baseRevision, new Monitor()); } @@ -734,7 +749,7 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace if (revisions.containsKey(id)) { InternalCDORevision newRevision = baseRevision.copy(); - adjustRevisionBranch(newRevision, localSession.getBranchManager()); + newRevision.setBranchPoint(localSessionHead); result.addChangedObject(newRevision); } @@ -745,7 +760,6 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace result.addDetachedObject(key); } - localSession.getRevisionManager().getCache().clear(); return result; } }); @@ -771,8 +785,8 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace try { - InternalCDOBranch branch = remoteSession.getBranchManager().getBranch(branchPath); - InternalCDOTransaction transaction = (InternalCDOTransaction)remoteSession.openTransaction(branch); + InternalCDOBranch remoteBranch = remoteSession.getBranchManager().getBranch(branchPath); + InternalCDOTransaction remoteTransaction = (InternalCDOTransaction)remoteSession.openTransaction(remoteBranch); try { @@ -780,7 +794,7 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace try { - ApplyChangeSetResult result = transaction.applyChangeSet(changes, base, this, head, true); + ApplyChangeSetResult result = remoteTransaction.applyChangeSet(changes, base, this, localSessionHead, true); if (!result.getIDMappings().isEmpty()) { throw new IllegalStateException("Attaching new objects is only supported for IDGenerationLocation.CLIENT"); @@ -791,10 +805,10 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace throw new CommitException(ex); } - transaction.setCommitComment(comment); - CDOCommitInfo info = transaction.commit(); + remoteTransaction.setCommitComment(comment); + CDOCommitInfo info = remoteTransaction.commit(); - ids = adjustLocalRevisions(transaction, info.getChangedObjects()); + ids = checkinPostProcessing(remoteTransaction, info.getChangedObjects()); clearBase(); setTimeStamp(info.getTimeStamp()); @@ -808,7 +822,7 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace } finally { - transaction.close(); + remoteTransaction.close(); } } finally @@ -822,74 +836,73 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace } } - protected Set<CDOID> adjustLocalRevisions(InternalCDOTransaction transaction, List<CDORevisionKey> changedObjects) + protected Set<CDOID> checkinPostProcessing(InternalCDOTransaction remoteTransaction, + List<CDORevisionKey> changedObjects) { Set<CDOID> ids = new HashSet<CDOID>(); IStoreAccessor.Raw accessor = null; - for (CDORevisionKey key : changedObjects) + try { - CDOID id = key.getID(); - ids.add(id); + for (CDORevisionKey key : changedObjects) + { + CDOID id = key.getID(); + ids.add(id); - InternalCDORevision localRevision = (InternalCDORevision)getRevision(id); - CDORevision baseRevision = base.getRevision(id); - CDORevision remoteRevision = transaction.getObject(id).cdoRevision(); + InternalCDORevision localSessionRevision = (InternalCDORevision)getRevision(id); + CDOBranch localSessionBranch = localSessionHead.getBranch(); - CDOBranch localBranch = head.getBranch(); - EClass eClass = localRevision.getEClass(); + CDORevision baseRevision = base.getRevision(id); + CDORevision remoteRevision = remoteTransaction.getObject(id).cdoRevision(); - for (int v = baseRevision.getVersion(); v < localRevision.getVersion(); v++) - { - if (accessor == null) + EClass eClass = localSessionRevision.getEClass(); + + for (int v = baseRevision.getVersion(); v < localSessionRevision.getVersion(); v++) { - accessor = getLocalWriter(null); - StoreThreadLocal.setAccessor(accessor); - } + if (accessor == null) + { + accessor = getLocalWriter(null); + StoreThreadLocal.setAccessor(accessor); + } - accessor.rawDelete(id, v, localBranch, eClass, new Monitor()); - } + accessor.rawDelete(id, v, localSessionBranch, eClass, new Monitor()); + } - if (localRevision.getVersion() != remoteRevision.getVersion()) - { - if (accessor == null) + if (localSessionRevision.getVersion() != remoteRevision.getVersion()) { - accessor = getLocalWriter(null); - StoreThreadLocal.setAccessor(accessor); - } + if (accessor == null) + { + accessor = getLocalWriter(null); + StoreThreadLocal.setAccessor(accessor); + } + + accessor.rawDelete(id, localSessionRevision.getVersion(), localSessionBranch, eClass, new Monitor()); - accessor.rawDelete(id, localRevision.getVersion(), localBranch, eClass, new Monitor()); - localRevision.setVersion(remoteRevision.getVersion()); - adjustRevisionBranch(localRevision, localRepository.getBranchManager()); - accessor.rawStore(localRevision, new Monitor()); + // Local session revisions are not cached and can directly be modified and stored in the local repository. + localSessionRevision.setBranchPoint(localRepositoryHead); + localSessionRevision.setVersion(remoteRevision.getVersion()); + + accessor.rawStore(localSessionRevision, new Monitor()); + } } } - - if (accessor != null) + finally { - // TODO Should the accessor be released in finally{}? finishRawAccess(accessor); - localSession.getRevisionManager().getCache().clear(); } return ids; } - private void adjustRevisionBranch(InternalCDORevision revision, InternalCDOBranchManager forBranchManager) + private void finishRawAccess(IStoreAccessor.Raw accessor) { - InternalCDOBranch branch = revision.getBranch(); - if (branch.getBranchManager() != forBranchManager) + if (accessor != null) { - branch = forBranchManager.getBranch(branch.getID()); - revision.setBranchPoint(branch.getPoint(revision.getTimeStamp())); - } - } + accessor.rawCommit(1, new Monitor()); + StoreThreadLocal.release(); - private void finishRawAccess(IStoreAccessor.Raw accessor) - { - accessor.rawCommit(1, new Monitor()); - StoreThreadLocal.release(); - localRepository.getRevisionManager().getCache().clear(); + localRepository.getRevisionManager().getCache().clear(); + } } /** @@ -951,7 +964,7 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace { CDOID id = entry.getKey(); - InternalCDORevision revision = accessor.readRevision(id, head, CDORevision.UNCHUNKED, null); + InternalCDORevision revision = accessor.readRevision(id, localSessionHead, CDORevision.UNCHUNKED, null); int version = revision.getVersion(); CDOBranch branch = revision.getBranch(); EClass eClass = revision.getEClass(); @@ -967,7 +980,7 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace for (CDOID id : adjustedObjects) { - InternalCDORevision revision = accessor.readRevision(id, head, CDORevision.UNCHUNKED, null); + InternalCDORevision revision = accessor.readRevision(id, localSessionHead, CDORevision.UNCHUNKED, null); int version = revision.getVersion(); CDOBranch branch = revision.getBranch(); EClass eClass = revision.getEClass(); @@ -1008,9 +1021,11 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace { LifecycleUtil.deactivate(localSession); localSession = null; + localSessionHead = null; LifecycleUtil.deactivate(localRepository); localRepository = null; + localRepositoryHead = null; LifecycleUtil.deactivate(container); container = null; @@ -1025,7 +1040,7 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace { InternalCDOSession session = getLocalSession(); CDORevisionManager revisionManager = session.getRevisionManager(); - return revisionManager.getRevision(id, head, CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, true); + return revisionManager.getRevision(id, localSessionHead, CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, true); } public InternalRepository getLocalRepository() @@ -1153,7 +1168,10 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace configuration.setConnector(connector); configuration.setRepositoryName(repositoryName); configuration.setIDGenerator(idGenerator); - configuration.setRevisionManager(CDORevisionUtil.createRevisionManager(CDORevisionCache.NOOP)); // Use repo's cache + + // Use no revision cache. + // This is important because session revisions are modified and copied into the repository. + configuration.setRevisionManager(CDORevisionUtil.createRevisionManager(CDORevisionCache.NOOP)); if (idGenerationLocation == IDGenerationLocation.STORE) { @@ -1164,7 +1182,7 @@ public class CDOWorkspaceImpl extends Notifier implements InternalCDOWorkspace ((ISignalProtocol<?>)session.getSessionProtocol()).setTimeout(ISignalProtocol.NO_TIMEOUT); session.setPackageRegistry(localRepository.getPackageRegistry(false)); // Use repo's registry - head = session.getBranchManager().getMainBranch().getHead(); + localSessionHead = session.getBranchManager().getMainBranch().getHead(); return session; } diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/properties/Property.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/properties/Property.java index dc2178a06d..538debaecd 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/properties/Property.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/properties/Property.java @@ -11,7 +11,9 @@ */ package org.eclipse.net4j.util.properties; +import org.eclipse.net4j.internal.util.bundle.OM; import org.eclipse.net4j.util.ObjectUtil; +import org.eclipse.net4j.util.lifecycle.LifecycleException; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; /** @@ -140,18 +142,15 @@ public abstract class Property<RECEIVER> return value.toString(); } - catch (RuntimeException ex) + catch (LifecycleException ex) { - if (LifecycleUtil.isActive(receiver)) - { - throw ex; - } + //$FALL-THROUGH$ } - catch (Error ex) + catch (Throwable ex) { if (LifecycleUtil.isActive(receiver)) { - throw ex; + OM.LOG.error(ex); } } |