diff options
author | Eike Stepper | 2015-04-27 16:53:25 +0000 |
---|---|---|
committer | Eike Stepper | 2015-04-28 06:49:03 +0000 |
commit | 78e1c324c06816ca50cb2947c7e582103757bd4d (patch) | |
tree | d9da1edc0cdd63d0e9b486a113b53f800dd76b25 /plugins/org.eclipse.emf.cdo | |
parent | d2c5b0ee9d0634fb6c79d99e6952ee0d7c752dd7 (diff) | |
download | cdo-78e1c324c06816ca50cb2947c7e582103757bd4d.tar.gz cdo-78e1c324c06816ca50cb2947c7e582103757bd4d.tar.xz cdo-78e1c324c06816ca50cb2947c7e582103757bd4d.zip |
[458349] Consolidate UI
Change-Id: Iea0e1cf37bfc35a67f589c265fcb2e9d92e67581
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=458349
Signed-off-by: Eike Stepper <stepper@esc-net.de>
Diffstat (limited to 'plugins/org.eclipse.emf.cdo')
16 files changed, 457 insertions, 75 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceFactoryImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceFactoryImpl.java index a73b9cba72..7315972e7e 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceFactoryImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceFactoryImpl.java @@ -55,8 +55,10 @@ public class CDOResourceFactoryImpl implements CDOResourceFactory public Resource createResource(URI uri) { + boolean existing = isGetResource(); + CDOResourceImpl resource = createCDOResource(uri); - resource.setExisting(isGetResource()); + resource.setExisting(existing); return resource; } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java index 187db1f85f..e1e98752bc 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java @@ -25,7 +25,6 @@ import org.eclipse.emf.cdo.util.CDOModificationTrackingAdapter; import org.eclipse.emf.cdo.util.CDOURIUtil; import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.cdo.util.CommitException; -import org.eclipse.emf.cdo.util.ReadOnlyException; import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.emf.cdo.view.CDOViewProvider; import org.eclipse.emf.cdo.view.CDOViewProviderRegistry; @@ -61,10 +60,13 @@ import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.util.EcoreUtil.ContentTreeIterator; import org.eclipse.emf.ecore.util.EcoreUtil.ProperContentIterator; import org.eclipse.emf.ecore.util.InternalEList; +import org.eclipse.emf.ecore.xmi.DOMHandler; +import org.eclipse.emf.ecore.xmi.DOMHelper; import org.eclipse.emf.ecore.xmi.XMIResource; import org.eclipse.emf.ecore.xmi.XMLHelper; import org.eclipse.emf.ecore.xmi.impl.XMIHelperImpl; import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl; +import org.eclipse.emf.ecore.xml.type.AnyType; import org.eclipse.emf.spi.cdo.FSMUtil; import org.eclipse.emf.spi.cdo.InternalCDOObject; import org.eclipse.emf.spi.cdo.InternalCDOResource; @@ -74,9 +76,14 @@ import org.eclipse.emf.spi.cdo.InternalCDOViewSet; import org.eclipse.core.runtime.IProgressMonitor; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.xml.sax.InputSource; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -130,6 +137,11 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements CDOResource, private URI initialURI; /** + * @ADDED + */ + private URI uri; + + /** * TODO Set to true in commit()? * * @ADDED @@ -308,6 +320,11 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements CDOResource, @Override public URI getURI() { + if (uri != null) + { + return uri; + } + if ((cdoID() == null || cdoView() == null || cdoView().isClosed()) && initialURI != null) { return initialURI; @@ -343,12 +360,15 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements CDOResource, */ public void setURI(URI newURI) { - URI uri = getURI(); + boolean notificationRequired = eNotificationRequired(); + URI oldURI = notificationRequired ? getURI() : null; + String newPath = CDOURIUtil.extractResourcePath(newURI); setPath(newPath); - if (eNotificationRequired()) + + if (notificationRequired) { - Notification notification = new NotificationImpl(Notification.SET, uri, newURI) + Notification notification = new NotificationImpl(Notification.SET, oldURI, newURI) { @Override public Object getNotifier() @@ -362,10 +382,21 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements CDOResource, return RESOURCE__URI; } }; + eNotify(notification); } } + /** + * @ADDED + */ + @Override + public void setPath(String newPath) + { + super.setPath(newPath); + uri = CDOURIUtil.createResourceURI(cdoView(), newPath); + } + @Override public Object eGet(int featureID, boolean resolve, boolean coreType) { @@ -531,7 +562,7 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements CDOResource, { if (cdoView().isReadOnly()) { - throw new ReadOnlyException("Underlying view is read-only"); + return; } if (newTrackingModification == isTrackingModification()) @@ -1210,16 +1241,16 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements CDOResource, IProgressMonitor progressMonitor = options != null ? (IProgressMonitor)options.get(CDOResource.OPTION_SAVE_PROGRESS_MONITOR) : null; - try - { - transaction.commit(progressMonitor); - } - catch (CommitException ex) - { - throw new TransactionException(ex); - } + try + { + transaction.commit(progressMonitor); + } + catch (CommitException ex) + { + throw new TransactionException(ex); + } - setModified(false); + setModified(false); } /** @@ -1230,20 +1261,20 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements CDOResource, CDOTransaction transaction = options != null ? (CDOTransaction)options.get(CDOResource.OPTION_SAVE_OVERRIDE_TRANSACTION) : null; - if (transaction == null) - { - CDOView view = cdoView(); - if (view instanceof CDOTransaction) - { - transaction = (CDOTransaction)view; - } - else - { - throw new IllegalStateException("No transaction available"); - } - } + if (transaction == null) + { + CDOView view = cdoView(); + if (view instanceof CDOTransaction) + { + transaction = (CDOTransaction)view; + } + else + { + throw new IllegalStateException("No transaction available"); + } + } - return transaction; + return transaction; } /** @@ -1478,10 +1509,20 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements CDOResource, InternalCDOTransaction transaction = (InternalCDOTransaction)view; InternalCDOObject cdoObject = FSMUtil.adapt(object, transaction); - if (CDOUtil.isLegacyObject(cdoObject) && FSMUtil.isClean(cdoObject)) + if (CDOUtil.isLegacyObject(cdoObject)) { - // Bug 352204 - return; + if (FSMUtil.isClean(cdoObject)) + { + // Bug 352204 + return; + } + + int xxx; + // EReference containmentFeature = object.eContainmentFeature(); + // if (!EMFUtil.isPersistent(containmentFeature)) + // { + // return; + // } } attached(cdoObject, transaction); @@ -1698,6 +1739,178 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements CDOResource, // } // } + /* XML STUFF BEGIN */ + + /** + * @since 4.4 + */ + public String getID(EObject eObject) + { + return getURIFragment(eObject); + } + + /** + * @since 4.4 + */ + public void setID(EObject eObject, String id) + { + // Do nothing. + } + + /** + * @since 4.4 + */ + public boolean useZip() + { + return false; + } + + /** + * @since 4.4 + */ + public void setUseZip(boolean useZip) + { + // Do nothing. + } + + /** + * @since 4.4 + */ + public String getPublicId() + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + public String getSystemId() + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + public DOMHelper getDOMHelper() + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + public Map<Object, Object> getDefaultLoadOptions() + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + public Map<Object, Object> getDefaultSaveOptions() + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + public Map<EObject, AnyType> getEObjectToExtensionMap() + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + public String getEncoding() + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + public void setEncoding(String encoding) + { + // Do nothing. + } + + /** + * @since 4.4 + */ + public String getXMLVersion() + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + public void setXMLVersion(String version) + { + // Do nothing. + } + + /** + * @since 4.4 + */ + public void setDoctypeInfo(String publicId, String systemId) + { + // Do nothing. + } + + /** + * @since 4.4 + */ + public void load(Node node, Map<?, ?> options) throws IOException + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + public void load(InputSource inputSource, Map<?, ?> options) throws IOException + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + public void save(Writer writer, Map<?, ?> options) throws IOException + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + public Document save(Document document, Map<?, ?> options, DOMHandler handler) + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + @Deprecated + public Map<String, EObject> getIDToEObjectMap() + { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.4 + */ + @Deprecated + public Map<EObject, String> getEObjectToIDMap() + { + throw new UnsupportedOperationException(); + } + /** * An implementation of a CDO specific '<em><b>contents</b></em>' list. * diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceNodeImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceNodeImpl.java index 81693a5237..0bade87d33 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceNodeImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceNodeImpl.java @@ -325,7 +325,13 @@ public abstract class CDOResourceNodeImpl extends CDOObjectImpl implements CDORe InternalCDORevision revision = cdoRevision(); if (revision != null) { - string += "(\"" + revision.getResourceNodeName() + "\")"; + String name = revision.getResourceNodeName(); + if (name == null) + { + name = "/"; + } + + string += "(\"" + name + "\")"; } return string; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java index 7d832015d4..641f3a8a6d 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java @@ -68,6 +68,7 @@ import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.common.util.Logger; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; @@ -368,15 +369,6 @@ public final class CDOUtil return (CDOViewSet)notifier; } - EList<Adapter> adapters = notifier.eAdapters(); - for (Adapter adapter : adapters) - { - if (adapter instanceof CDOViewSet) - { - return (CDOViewSet)adapter; - } - } - if (notifier instanceof Resource) { Resource resource = (Resource)notifier; @@ -391,6 +383,15 @@ public final class CDOUtil } } + EList<Adapter> adapters = notifier.eAdapters(); + for (Adapter adapter : adapters) + { + if (adapter instanceof CDOViewSet) + { + return (CDOViewSet)adapter; + } + } + if (notifier instanceof InternalEObject) { InternalEObject object = (InternalEObject)notifier; @@ -419,11 +420,40 @@ public final class CDOUtil } /** + * @since 4.4 + */ + public static CDOView getView(Notifier notifier) + { + CDOViewSet viewSet = getViewSet(notifier); + if (viewSet != null) + { + CDOView[] views = viewSet.getViews(); + if (views != null && views.length != 0) + { + return views[0]; + } + } + + return null; + } + + /** * @since 3.0 */ public static boolean isStaleObject(Object object) { - return object instanceof CDOStaleObject; + if (object instanceof CDOStaleObject) + { + return true; + } + + if (object instanceof Logger) + { + // See org.eclipse.emf.cdo.view.CDOStaleReferencePolicy.DynamicProxy + return true; + } + + return false; } /** diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/AbstractCDOViewProvider.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/AbstractCDOViewProvider.java index bbd7f29ca4..d38c45f6fd 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/AbstractCDOViewProvider.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/AbstractCDOViewProvider.java @@ -11,6 +11,8 @@ */ package org.eclipse.emf.cdo.view; +import org.eclipse.emf.cdo.view.CDOViewProvider.CDOViewProvider2; + import org.eclipse.net4j.util.ReflectUtil.ExcludeFromDump; import org.eclipse.emf.common.util.URI; @@ -25,7 +27,7 @@ import java.util.regex.Pattern; * @since 2.0 * @apiviz.exclude */ -public abstract class AbstractCDOViewProvider implements CDOViewProvider +public abstract class AbstractCDOViewProvider implements CDOViewProvider2 { private String regex; @@ -96,4 +98,14 @@ public abstract class AbstractCDOViewProvider implements CDOViewProvider { return null; } + + /** + * Must be overwritten for non-canonical URI formats! + * + * @since 4.4 + */ + public String getPath(URI uri) + { + return null; + } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOStaleReferencePolicy.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOStaleReferencePolicy.java index fb1a807c89..2a8b28ba06 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOStaleReferencePolicy.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOStaleReferencePolicy.java @@ -26,6 +26,8 @@ import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.notify.impl.BasicNotifierImpl.EAdapterList; import org.eclipse.emf.common.util.BasicEList; +import org.eclipse.emf.common.util.Logger; +import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; @@ -238,14 +240,30 @@ public interface CDOStaleReferencePolicy // Be sure to have only interface if (instanceClass.isInterface()) { - interfaces = new Class<?>[] { instanceClass, InternalEObject.class, CDOStaleObject.class }; + interfaces = new Class<?>[] { InternalEObject.class, CDOStaleObject.class, instanceClass }; } else { interfaces = new Class<?>[] { InternalEObject.class, CDOStaleObject.class }; } - return Proxy.newProxyInstance(instanceClass.getClassLoader(), interfaces, handler); + try + { + return Proxy.newProxyInstance(instanceClass.getClassLoader(), interfaces, handler); + } + catch (IllegalArgumentException ex) + { + String message = ex.getMessage(); + if (message != null && message.contains("CDOStaleObject")) + { + // Interface org.eclipse.emf.cdo.view.CDOStaleObject is not visible from class loader. + // Use org.eclipse.emf.common.util.Logger instead. + interfaces[1] = Logger.class; + return Proxy.newProxyInstance(instanceClass.getClassLoader(), interfaces, handler); + } + + throw ex; + } } protected EClassifier getType(EObject source, EStructuralFeature feature, int index, CDOID target) @@ -314,7 +332,12 @@ public interface CDOStaleReferencePolicy private void addType(CDOObject object) { - types.putIfAbsent(object.cdoID(), object.eClass()); + CDOID id = object.cdoID(); + EClass type = object.eClass(); + if (id != null && type != null) + { + types.putIfAbsent(id, type); + } } } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOViewProvider.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOViewProvider.java index 20bd6adb7e..9ec86d0809 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOViewProvider.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOViewProvider.java @@ -53,4 +53,13 @@ public interface CDOViewProvider * @since 4.0 */ public URI getResourceURI(CDOView view, String path); + + /** + * @author Eike Stepper + * @since 4.4 + */ + public interface CDOViewProvider2 extends CDOViewProvider + { + public String getPath(URI uri); + } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java index bb63b4b1a8..d02b7bb163 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java @@ -358,6 +358,15 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC } else { + if (this.revision != null) + { + CDOID objectID = this.revision.getID(); + if (objectID != null && objectID != revision.getID()) + { + throw new IllegalArgumentException("The revision " + revision + " does not match the object " + objectID); + } + } + this.revision = (InternalCDORevision)revision; } } @@ -760,7 +769,8 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC public final NotificationChain eBasicSetContainer(InternalEObject newContainer, int newContainerFeatureID, NotificationChain msgs) { - boolean isResourceRoot = this instanceof CDOResource && ((CDOResource)this).isRoot(); + boolean isResource = this instanceof CDOResource; + boolean isRootResource = isResource && ((CDOResource)this).isRoot(); InternalEObject oldContainer = eInternalContainer(); Resource.Internal oldResource = eDirectResource(); @@ -796,7 +806,7 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC : null; boolean moved = oldView != null && oldView == newView; - if (!moved && oldResource != null && oldResource != newResource && !isResourceRoot) + if (!moved && oldResource != null && oldResource != newResource && !isRootResource) { oldResource.detached(this); } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/messages/messages.properties b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/messages/messages.properties index 62439301db..82bcf62fe5 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/messages/messages.properties +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/messages/messages.properties @@ -57,8 +57,8 @@ CDOViewImpl.5=Node {0} not found CDOViewImpl.7=No top level ResourceNode with the name {0} CDOViewImpl.8=Duplicate top-level ResourceNodes CDOViewImpl.9=Cannot find revision with ID {0} -CDOViewProviderRegistryImpl.4=class not defined for extension {0} -CDOViewProviderRegistryImpl.6=regex not defined for extension {0} +CDOViewProviderRegistryImpl.4=Class not defined for extension {0} +CDOViewProviderRegistryImpl.6=Regex not defined for extension {0} CDOViewSetImpl.0=Cannot find associated CDOView for repository {0} CDOViewSetImpl.1=Do not know which CDOView to take since no authority has been specified CDOViewSetImpl.2=Only one view per repository can be open for the same resource set diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java index c2ad3d0bd5..b6a09cfe65 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java @@ -574,11 +574,14 @@ public abstract class CDOLegacyWrapper extends CDOObjectWrapper if (revision != null) { CDOID resourceID = revision.getResourceID(); - InternalEObject resource = getEObjectFromPotentialID(viewAndState.view, null, resourceID); - setInstanceResource((Resource.Internal)resource); - if (resource != null) + if (!CDOIDUtil.isNull(resourceID)) { - viewAndState.view.registerObject((InternalCDOObject)resource); + InternalEObject resource = getEObjectFromPotentialID(viewAndState.view, null, resourceID); + setInstanceResource((Resource.Internal)resource); + if (resource != null) + { + viewAndState.view.registerObject((InternalCDOObject)resource); + } } } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java index 6d21152b63..5eea5e796e 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java @@ -1292,6 +1292,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa { throw new OperationCanceledException("CDOTransactionImpl.7");//$NON-NLS-1$ } + throw new CommitException(t); } finally @@ -3193,8 +3194,11 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa ((InternalCDOPackageUnit)newPackageUnit).setState(CDOPackageUnit.State.LOADED); } - postCommit(getNewObjects(), result); - postCommit(getDirtyObjects(), result); + Map<CDOID, CDOObject> newObjects = getNewObjects(); + postCommit(newObjects, result); + + Map<CDOID, CDOObject> dirtyObjects = getDirtyObjects(); + postCommit(dirtyObjects, result); for (CDORevisionDelta delta : getRevisionDeltas().values()) { @@ -3220,12 +3224,12 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa CDOBranchPoint commitBranchPoint = CDOBranchUtil.copyBranchPoint(result); // Note: keyset() does not work because ID mappings are not applied there! - for (CDOObject object : getNewObjects().values()) + for (CDOObject object : newObjects.values()) { session.setCommittedSinceLastRefresh(object.cdoID(), commitBranchPoint); } - for (CDOID id : getDirtyObjects().keySet()) + for (CDOID id : dirtyObjects.keySet()) { session.setCommittedSinceLastRefresh(id, commitBranchPoint); } 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 92877852f3..3291bcc6f4 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 @@ -1172,6 +1172,13 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb CDOID id = object.cdoID(); InternalCDOObject contextified = getObject(id, true); + if (objectFromDifferentView instanceof CDOLegacyAdapter) + { + @SuppressWarnings("unchecked") + T cast = (T)contextified; + return cast; + } + @SuppressWarnings("unchecked") T cast = (T)CDOUtil.getEObject(contextified); return cast; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOURIHandler.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOURIHandler.java index 3d2e33cced..062654b853 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOURIHandler.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOURIHandler.java @@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.eresource.CDOResourceNode; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.util.CDOURIUtil; import org.eclipse.emf.cdo.view.CDOViewProvider; +import org.eclipse.emf.cdo.view.CDOViewProvider.CDOViewProvider2; import org.eclipse.emf.cdo.view.CDOViewProviderRegistry; import org.eclipse.net4j.util.io.IOUtil; @@ -68,7 +69,8 @@ public class CDOURIHandler implements URIHandler public boolean exists(URI uri, Map<?, ?> options) { - return view.hasResource(CDOURIUtil.extractResourcePath(uri)); + String path = getPath(uri); + return view.hasResource(path); } public void delete(URI uri, Map<?, ?> options) throws IOException @@ -146,4 +148,22 @@ public class CDOURIHandler implements URIHandler // ViK: We can't change any of the proposed attributes. Only TIME_STAMP, and I believe we are not // storing that attribute in the server. Due to CDOResouce distributed nature, changing it wouldn't make much sense. } + + private String getPath(URI uri) + { + if (CDO_URI_SCHEME.equals(uri.scheme())) + { + return CDOURIUtil.extractResourcePath(uri); + } + + for (CDOViewProvider viewProvider : CDOViewProviderRegistry.INSTANCE.getViewProviders(uri)) + { + if (viewProvider instanceof CDOViewProvider2) + { + return ((CDOViewProvider2)viewProvider).getPath(uri); + } + } + + return null; + } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java index 14f5847eb4..c8f32369f6 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java @@ -114,11 +114,15 @@ public class CDOViewProviderRegistryImpl extends Container<CDOViewProvider>imple public CDOViewProvider[] getViewProviders(URI uri) { List<CDOViewProvider> result = new ArrayList<CDOViewProvider>(); - for (CDOViewProvider viewProvider : viewProviders) + + synchronized (viewProviders) { - if (viewProvider.matchesRegex(uri)) + for (CDOViewProvider viewProvider : viewProviders) { - result.add(viewProvider); + if (viewProvider.matchesRegex(uri)) + { + result.add(viewProvider); + } } } @@ -235,7 +239,7 @@ public class CDOViewProviderRegistryImpl extends Container<CDOViewProvider>imple public CDOViewProviderDescriptor(IConfigurationElement element) { - super(element.getAttribute("regex"), Integer.parseInt(element.getAttribute("priority"))); //$NON-NLS-1$ //$NON-NLS-2$ + super(getRegex(element), getPriority(element)); this.element = element; if (StringUtil.isEmpty(element.getAttribute("class"))) //$NON-NLS-1$ @@ -243,12 +247,6 @@ public class CDOViewProviderRegistryImpl extends Container<CDOViewProvider>imple throw new IllegalArgumentException( MessageFormat.format(Messages.getString("CDOViewProviderRegistryImpl.4"), element)); //$NON-NLS-1$ } - - if (StringUtil.isEmpty(element.getAttribute("regex"))) //$NON-NLS-1$ - { - throw new IllegalArgumentException( - MessageFormat.format(Messages.getString("CDOViewProviderRegistryImpl.6"), element)); //$NON-NLS-1$ - } } public CDOView getView(URI uri, ResourceSet resourceSet) @@ -262,6 +260,18 @@ public class CDOViewProviderRegistryImpl extends Container<CDOViewProvider>imple return getViewProvider().getResourceURI(view, path); } + @Override + public String getPath(URI uri) + { + CDOViewProvider viewProvider = getViewProvider(); + if (viewProvider instanceof CDOViewProvider2) + { + return ((CDOViewProvider2)viewProvider).getPath(uri); + } + + return super.getPath(uri); + } + private CDOViewProvider getViewProvider() { try @@ -273,5 +283,30 @@ public class CDOViewProviderRegistryImpl extends Container<CDOViewProvider>imple throw WrappedException.wrap(ex); } } + + private static String getRegex(IConfigurationElement element) + { + String value = element.getAttribute("regex"); + if (StringUtil.isEmpty(value)) + { + throw new IllegalArgumentException( + MessageFormat.format(Messages.getString("CDOViewProviderRegistryImpl.6"), element)); //$NON-NLS-1$ + } + + return value; + } + + private static int getPriority(IConfigurationElement element) + { + try + { + String value = element.getAttribute("priority"); + return Integer.parseInt(value); + } + catch (Exception ex) + { + return DEFAULT_PRIORITY; + } + } } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewSetImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewSetImpl.java index 565afc67a2..d38c8af8c7 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewSetImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewSetImpl.java @@ -30,7 +30,6 @@ import org.eclipse.emf.common.notify.impl.NotificationImpl; import org.eclipse.emf.common.notify.impl.NotifierImpl; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.emf.ecore.resource.Resource.Factory.Registry; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.spi.cdo.InternalCDOObject; import org.eclipse.emf.spi.cdo.InternalCDOView; @@ -58,7 +57,7 @@ public class CDOViewSetImpl extends NotifierImpl implements InternalCDOViewSet private Map<String, InternalCDOView> mapOfViews = new HashMap<String, InternalCDOView>(); - private CDOResourceFactory resourceFactory = CDOResourceFactory.INSTANCE; + private CDOResourceFactory resourceFactory; private CDOViewSetPackageRegistryImpl packageRegistry; @@ -244,9 +243,17 @@ public class CDOViewSetImpl extends NotifierImpl implements InternalCDOViewSet packageRegistry = new CDOViewSetPackageRegistryImpl(this, oldPackageRegistry); resourceSet.setPackageRegistry(packageRegistry); - Registry registry = resourceSet.getResourceFactoryRegistry(); - Map<String, Object> map = registry.getProtocolToFactoryMap(); - map.put(CDOProtocolConstants.PROTOCOL_NAME, getResourceFactory()); + Map<String, Object> map = resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap(); + Resource.Factory resourceFactory = (Resource.Factory)map.get(CDOProtocolConstants.PROTOCOL_NAME); + if (resourceFactory instanceof CDOResourceFactory) + { + this.resourceFactory = (CDOResourceFactory)resourceFactory; + } + else if (resourceFactory == null) + { + this.resourceFactory = CDOResourceFactory.INSTANCE; + map.put(CDOProtocolConstants.PROTOCOL_NAME, this.resourceFactory); + } } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOResource.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOResource.java index 18f0ab1ce3..834401410d 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOResource.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOResource.java @@ -14,6 +14,7 @@ import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.xmi.XMLResource; /** * Internal protocol for the {@link CDOResource}. @@ -22,7 +23,7 @@ import org.eclipse.emf.ecore.resource.Resource; * @noextend This interface is not intended to be extended by clients. * @noimplement This interface is not intended to be implemented by clients. */ -public interface InternalCDOResource extends CDOResource, Resource.Internal +public interface InternalCDOResource extends CDOResource, Resource.Internal, XMLResource { /** * Informs the resource that an {@code object} contained within it is being loaded. |