blob: e1718122f90a6da09b50b84c3dce4fad7eaf4e92 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2014, 2017 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* CEA LIST - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.cdo.core.resource;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.papyrus.infra.core.resource.ProxyModificationTrackingAdapter;
/**
* A specialization of the {@link ProxyModificationTrackingAdapter} that knows how to deal with
* CDO resources. In particular, that their dirty/save semantics is completely different from
* that of workspace resources.
*/
public class CDOAwareProxyModificationTrackingAdapter extends ProxyModificationTrackingAdapter {
public CDOAwareProxyModificationTrackingAdapter() {
super();
}
@Override
public boolean shouldSave(Resource resource) {
boolean result;
if (resource instanceof CDOResource) {
CDOView view = ((CDOResource) resource).cdoView();
if (view instanceof CDOTransaction) {
// Saving CDO resources is done by committing the transaction
result = ((CDOTransaction) view).isDirty();
} else {
// If there's no view or it's not a transaction, then saving is a non-starter
result = false;
}
} else {
result = super.shouldSave(resource);
}
return result;
}
@Override
public void notifyChanged(Notification msg) {
Object notifier = msg.getNotifier();
// Only for non-CDO resources do we care if the URI has changed or contents been added, because
// references within the repository use OIDs and are, therefore, not susceptible to URI changes
if (!(notifier instanceof CDOResource)) {
super.notifyChanged(msg);
}
}
}