/** * Copyright (c) 2012 committers of YAKINDU 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: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.base.xtext.utils.gmf.resource; import java.util.List; import java.util.Map; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.xmi.XMIResource; import org.eclipse.emf.transaction.NotificationFilter; import org.eclipse.emf.transaction.ResourceSetChangeEvent; import org.eclipse.emf.transaction.ResourceSetListener; import org.eclipse.emf.transaction.RollbackException; import org.eclipse.xtext.resource.IResourceServiceProvider; import org.eclipse.xtext.ui.editor.IDirtyResource; import org.eclipse.xtext.ui.editor.IDirtyStateManager; import org.eclipse.xtext.ui.shared.Access; import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * Some content of this class is initially copied from * org.eclipse.xtext.gmf.glue.concurrency.EditingDomainAdapter and adopted to * work on {@link XMIResource}s * * @author andreas muelder - Initial contribution and API * */ public class DirtyStateListener implements ResourceSetListener { private IDirtyStateManager dirtyStateManager; private Map<URI, IDirtyResource> uri2dirtyResource; public DirtyStateListener() { dirtyStateManager = Access.getIDirtyStateManager().get(); uri2dirtyResource = Maps.newHashMap(); } public void resourceSetChanged(ResourceSetChangeEvent event) { List<URI> remainingURIs = Lists .newArrayList(uri2dirtyResource.keySet()); for (Resource currentResource : event.getEditingDomain() .getResourceSet().getResources()) { if (currentResource instanceof XMIResource) { XMIResource resource = (XMIResource) currentResource; remainingURIs.remove(resource.getURI()); IDirtyResource dirtyResource = uri2dirtyResource.get(resource .getURI()); if (resource.isModified()) { if (dirtyResource == null) { createAndRegisterDirtyState(resource); } } else { if (dirtyResource != null) { uri2dirtyResource.remove(resource.getURI()); dirtyStateManager.discardDirtyState(dirtyResource); } } } } for (URI remainingURI : remainingURIs) { IDirtyResource dirtyResource = uri2dirtyResource.get(remainingURI); dirtyStateManager.discardDirtyState(dirtyResource); uri2dirtyResource.remove(remainingURI); } } protected boolean createAndRegisterDirtyState(XMIResource resource) { IDirtyResource dirtyResource = createDirtyResource(resource); if (dirtyResource == null) { return true; } else { boolean isSuccess = dirtyStateManager .manageDirtyState(dirtyResource); if (isSuccess) { uri2dirtyResource.put(resource.getURI(), dirtyResource); } return isSuccess; } } protected IDirtyResource createDirtyResource(XMIResource resource) { IResourceServiceProvider resourceServiceProvider = IResourceServiceProvider.Registry.INSTANCE .getResourceServiceProvider(resource.getURI()); if (resourceServiceProvider == null) { return null; } return new XMIDirtyResource(resource, resourceServiceProvider); } public void dispose() { if (uri2dirtyResource != null) { for (IDirtyResource dirtyResource : uri2dirtyResource.values()) { dirtyStateManager.discardDirtyState(dirtyResource); } uri2dirtyResource = null; } } public Command transactionAboutToCommit(ResourceSetChangeEvent event) throws RollbackException { return null; } public boolean isAggregatePrecommitListener() { return true; } public boolean isPostcommitOnly() { return false; } public boolean isPrecommitOnly() { return false; } public NotificationFilter getFilter() { return null; } }