/***************************************************************************** * Copyright (c) 2011-2012 Atos. * * * 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: * Mathieu Velten mathieu.velten@atos.net - Initial API and implementation * *****************************************************************************/ package org.eclipse.papyrus.infra.core.resource; import java.util.Collections; import java.util.LinkedList; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl; import org.eclipse.emf.workspace.IResourceUndoContextPolicy; import org.eclipse.emf.workspace.WorkspaceEditingDomainFactory; import org.eclipse.papyrus.commands.CheckedOperationHistory; import org.eclipse.papyrus.commands.NotifyingWorkspaceCommandStack; /** * Manager used to read transactionalEditingDomainProvider extension point * and providing an helper method to create an Editing Domain. * * @author mvelten * */ public class TransactionalEditingDomainManager { protected static final ITransactionalEditingDomainProvider[] orderedProvidersArray; protected static class ProviderPriorityPair implements Comparable<ProviderPriorityPair> { public ITransactionalEditingDomainProvider provider; public int priority; public int compareTo(ProviderPriorityPair o) { if (o.priority > priority) { return 1; } else if (o.priority < priority) { return -1; } else { return 0; } } } static { IConfigurationElement[] configElements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.papyrus.infra.core", "transactionalEditingDomainProvider"); LinkedList<ProviderPriorityPair> providerPriorityPairs = new LinkedList<ProviderPriorityPair>(); for(IConfigurationElement elem : configElements) { if ("transactionalEditingDomainProvider".equals(elem.getName())) { try { ProviderPriorityPair providerPriorityPair = new ProviderPriorityPair(); providerPriorityPair.provider = (ITransactionalEditingDomainProvider) elem.createExecutableExtension("class"); providerPriorityPair.priority = Integer.parseInt(elem.getAttribute("priority")); providerPriorityPairs.add(providerPriorityPair); } catch (Exception e) { } } } Collections.sort(providerPriorityPairs); orderedProvidersArray = new ITransactionalEditingDomainProvider[providerPriorityPairs.size()]; for (int i = 0; i < orderedProvidersArray.length; i++) { orderedProvidersArray[i] = providerPriorityPairs.get(i).provider; } } /** * Create an Editing Domain using the registered provider with the highest priority. * * @param resourceSet * @return */ public static TransactionalEditingDomain createTransactionalEditingDomain(ResourceSet resourceSet) { for (ITransactionalEditingDomainProvider provider : orderedProvidersArray) { TransactionalEditingDomain ed = provider.createTransactionalEditingDomain(resourceSet); if (ed != null) { return ed; } } return createDefaultTransactionalEditingDomain(resourceSet); } public static TransactionalEditingDomain createDefaultTransactionalEditingDomain(ResourceSet resourceSet) { NotifyingWorkspaceCommandStack stack = new NotifyingWorkspaceCommandStack(CheckedOperationHistory.getInstance()); stack.setResourceUndoContextPolicy(IResourceUndoContextPolicy.DEFAULT); TransactionalEditingDomain result = new TransactionalEditingDomainImpl( new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE), stack, resourceSet); WorkspaceEditingDomainFactory.INSTANCE.mapResourceSet(result); return result; } }