From df9e84a5455e1a7c750f6618dc6881d87a497390 Mon Sep 17 00:00:00 2001 From: Ansgar Radermacher Date: Fri, 23 Oct 2015 14:34:57 +0200 Subject: 480511 - [ServiceEdit] Enhance utility functions Change-Id: I5edd3f05abc5402fc0a941402323a3af37f9a1a7 --- .../infra/newchild/CreationMenuFactory.java | 61 +--------- .../messages.properties | 1 + .../infra/services/edit/messages/Messages.java | 1 + .../edit/service/ElementEditServiceUtils.java | 125 +++++++++++++++++++++ 4 files changed, 131 insertions(+), 57 deletions(-) diff --git a/plugins/infra/org.eclipse.papyrus.infra.newchild/src/org/eclipse/papyrus/infra/newchild/CreationMenuFactory.java b/plugins/infra/org.eclipse.papyrus.infra.newchild/src/org/eclipse/papyrus/infra/newchild/CreationMenuFactory.java index be072a00c2b..7f61e14c5e0 100644 --- a/plugins/infra/org.eclipse.papyrus.infra.newchild/src/org/eclipse/papyrus/infra/newchild/CreationMenuFactory.java +++ b/plugins/infra/org.eclipse.papyrus.infra.newchild/src/org/eclipse/papyrus/infra/newchild/CreationMenuFactory.java @@ -16,12 +16,9 @@ package org.eclipse.papyrus.infra.newchild; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.UnexecutableCommand; import org.eclipse.emf.common.util.EList; @@ -30,29 +27,22 @@ import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.transaction.RollbackException; -import org.eclipse.emf.transaction.Transaction; import org.eclipse.emf.transaction.TransactionalEditingDomain; -import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain; import org.eclipse.gmf.runtime.common.core.command.ICommand; import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry; import org.eclipse.gmf.runtime.emf.type.core.IElementType; import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest; import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest; -import org.eclipse.gmf.runtime.emf.type.core.requests.GetEditContextRequest; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.papyrus.infra.core.services.ServiceException; import org.eclipse.papyrus.infra.emf.utils.EMFHelper; import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject; import org.eclipse.papyrus.infra.filters.Filter; import org.eclipse.papyrus.infra.newchild.elementcreationmenumodel.CreateRelationshipMenu; import org.eclipse.papyrus.infra.newchild.elementcreationmenumodel.CreationMenu; import org.eclipse.papyrus.infra.newchild.elementcreationmenumodel.Folder; -import org.eclipse.papyrus.infra.services.edit.internal.context.TypeContext; import org.eclipse.papyrus.infra.services.edit.service.ElementEditServiceUtils; import org.eclipse.papyrus.infra.services.edit.service.IElementEditService; -import org.eclipse.papyrus.infra.services.edit.utils.IRequestCacheEntries; import org.eclipse.papyrus.infra.services.edit.utils.RequestCacheEntries; import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService; import org.eclipse.papyrus.infra.widgets.editors.TreeSelectorDialog; @@ -180,55 +170,12 @@ public class CreationMenuFactory { */ protected boolean constructMenu(EObject selectedObject, Menu menu, CreationMenu currentCreationMenu, Map adviceCache) { // find the destination owner - GetEditContextRequest editContextRequest = new GetEditContextRequest(editingDomain, buildRequest(null, selectedObject, currentCreationMenu, adviceCache), selectedObject); - - editContextRequest.setParameter(IRequestCacheEntries.Cache_Maps, adviceCache); - editContextRequest.setEditContext(selectedObject); - try { - editContextRequest.setClientContext(TypeContext.getContext()); - } catch (ServiceException e) { - Activator.log.error(e); + final EObject target = ElementEditServiceUtils.getTargetFromContext(editingDomain, selectedObject, + buildRequest(null, selectedObject, currentCreationMenu, adviceCache)); + if (target == null) { return false; } - IElementEditService provider = ElementEditServiceUtils.getCommandProvider(selectedObject); - if (provider == null) { - return false; - } - - EObject target = selectedObject; - Object result = null; - final ICommand getEditContextCommand = provider.getEditCommand(editContextRequest); - if (getEditContextCommand != null) { - IStatus status = null; - try { - // this command could run in an unprotected transaction, it is not supposed to modify the model - InternalTransactionalEditingDomain domain = (InternalTransactionalEditingDomain) editingDomain; - Map options = new HashMap(); - options.put(Transaction.OPTION_NO_NOTIFICATIONS, true); - options.put(Transaction.OPTION_NO_VALIDATION, true); - options.put(Transaction.OPTION_NO_TRIGGERS, true); - Transaction transaction = domain.startTransaction(false, options); - try { - status = getEditContextCommand.execute(null, null); - } finally { - transaction.commit(); - } - } catch (InterruptedException e) { - Activator.log.error(e); - } catch (ExecutionException e) { - Activator.log.error(e); - } catch (RollbackException e) { - Activator.log.error(e); - } - if (!(status == null || !status.isOK())) { - result = getEditContextCommand.getCommandResult().getReturnValue(); - } - if (result instanceof EObject) { - target = (EObject) result; - } - } - // find the feature between children and owner ArrayList possibleEFeatures = getEreferences(target, currentCreationMenu); @@ -273,7 +220,7 @@ public class CreationMenuFactory { } /** - * display an icon from a specified url or from Element type + * display an icon from a specified URL or from Element type * * @param currentCreationMenu * @param item diff --git a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/messages.properties b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/messages.properties index fed94c61004..61324862b68 100644 --- a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/messages.properties +++ b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/messages.properties @@ -9,3 +9,4 @@ ElementEditServiceProvider_NoIElementTypeFound=No IElementType bound to Papyrus ElementEditServiceUtils_UnableToFindElementType=Unable to get ElementType edit service for {0}. ElementEditServiceUtils_UnableToFindServiceProvider=Unable to get ElementType edit service provider. +ElementEditServiceUtils_CantGetEditingDomainProvider=Impossible to get the editing domain provider. diff --git a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/messages/Messages.java b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/messages/Messages.java index 19183497ab5..3cdbf69dcaa 100644 --- a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/messages/Messages.java +++ b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/messages/Messages.java @@ -31,6 +31,7 @@ public class Messages extends NLS { public static String ElementEditServiceUtils_UnableToFindElementType; public static String ElementEditServiceUtils_UnableToFindServiceProvider; + public static String ElementEditServiceUtils_CantGetEditingDomainProvider; static { NLS.initializeMessages("messages", Messages.class); //$NON-NLS-1$ diff --git a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/service/ElementEditServiceUtils.java b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/service/ElementEditServiceUtils.java index 148b306ec7d..bd7fcfe4eb4 100644 --- a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/service/ElementEditServiceUtils.java +++ b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/service/ElementEditServiceUtils.java @@ -14,13 +14,31 @@ *****************************************************************************/ package org.eclipse.papyrus.infra.services.edit.service; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.transaction.RollbackException; +import org.eclipse.emf.transaction.Transaction; +import org.eclipse.emf.transaction.TransactionalEditingDomain; +import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain; +import org.eclipse.emf.transaction.util.TransactionUtil; +import org.eclipse.gmf.runtime.common.core.command.ICommand; import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry; +import org.eclipse.gmf.runtime.emf.type.core.IHintedType; +import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest; +import org.eclipse.gmf.runtime.emf.type.core.requests.GetEditContextRequest; +import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest; import org.eclipse.osgi.util.NLS; import org.eclipse.papyrus.infra.core.services.ServiceException; import org.eclipse.papyrus.infra.core.utils.ServiceUtils; import org.eclipse.papyrus.infra.services.edit.Activator; import org.eclipse.papyrus.infra.services.edit.internal.ElementEditServiceProvider; +import org.eclipse.papyrus.infra.services.edit.internal.context.TypeContext; import org.eclipse.papyrus.infra.services.edit.messages.Messages; +import org.eclipse.papyrus.infra.services.edit.utils.IRequestCacheEntries; /** *
@@ -104,4 +122,111 @@ public class ElementEditServiceUtils {
 		return ElementEditServiceProvider.getInstance();
 	}
 
+	/**
+	 * Return a target after executing a passed context request
+	 *
+	 * @param editingDomain
+	 *            the editing domain
+	 * @param owner
+	 *            the parent object in which we want to create an element
+	 * @param hintedType
+	 *            The information which element to create.
+	 * @return the resulting target object or null in case of a failure
+	 */
+	public static EObject getTargetFromContext(TransactionalEditingDomain editingDomain, EObject owner, IEditCommandRequest editRequest) {
+		GetEditContextRequest editContextRequest = new GetEditContextRequest(editingDomain, editRequest, owner);
+
+		editContextRequest.setParameter(IRequestCacheEntries.Cache_Maps, new HashMap());
+		editContextRequest.setEditContext(owner);
+		try {
+			editContextRequest.setClientContext(TypeContext.getContext());
+		} catch (ServiceException e) {
+			Activator.log.error(e);
+			return null;
+		}
+
+		IElementEditService provider = ElementEditServiceUtils.getCommandProvider(owner);
+		if (provider == null) {
+			Activator.log.debug(Messages.ElementEditServiceUtils_CantGetEditingDomainProvider);
+			return null;
+		}
+
+		EObject target = owner;
+		Object result = null;
+		final ICommand getEditContextCommand = provider.getEditCommand(editContextRequest);
+		if (getEditContextCommand != null) {
+			IStatus status = null;
+			try {
+				// this command could run in an unprotected transaction, it is not supposed to modify the model
+				InternalTransactionalEditingDomain domain = (InternalTransactionalEditingDomain) editingDomain;
+				Map options = new HashMap();
+				options.put(Transaction.OPTION_NO_NOTIFICATIONS, true);
+				options.put(Transaction.OPTION_NO_VALIDATION, true);
+				options.put(Transaction.OPTION_NO_TRIGGERS, true);
+				Transaction transaction = domain.startTransaction(false, options);
+				try {
+					status = getEditContextCommand.execute(null, null);
+				} finally {
+					transaction.commit();
+				}
+			} catch (InterruptedException e) {
+				Activator.log.error(e);
+			} catch (ExecutionException e) {
+				Activator.log.error(e);
+			} catch (RollbackException e) {
+				Activator.log.error(e);
+			}
+			if (status != null && status.isOK()) {
+				result = getEditContextCommand.getCommandResult().getReturnValue();
+			}
+			if (result instanceof EObject) {
+				target = (EObject) result;
+			}
+		}
+		return target;
+	}
+
+	/**
+	 * Convenience function that determines editing domain automatically.
+	 * 
+	 * @see {@link #getTargetFromContext(TransactionalEditingDomain, EObject, IEditCommandRequest)}
+	 */
+	public static EObject getTargetFromContext(EObject owner, IEditCommandRequest editRequest) {
+		return getTargetFromContext(TransactionUtil.getEditingDomain(owner), owner, editRequest);
+
+	}
+
+	/**
+	 * Support creation of a child within another object with a (default) context
+	 *
+	 * @param editingDomain
+	 *            the editing domain
+	 * @param owner
+	 *            the parent object in which we want to create an element
+	 * @param hintedType
+	 *            The information which element to create.
+	 * @return a GMF command that will create child
+	 */
+	public static ICommand getCreateChildCommandWithContext(TransactionalEditingDomain editingDomain, EObject owner, IHintedType hintedType) {
+		TransactionalEditingDomain transactionalEditingDomain = TransactionUtil.getEditingDomain(owner);
+		final EObject target = getTargetFromContext(transactionalEditingDomain, owner,
+				new CreateElementRequest(transactionalEditingDomain, owner, hintedType));
+
+		IElementEditService provider = ElementEditServiceUtils.getCommandProvider(target);
+		if (provider == null) {
+			return org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand.INSTANCE;
+		}
+
+		ICommand createGMFCommand = provider.getEditCommand(new CreateElementRequest(transactionalEditingDomain, target, hintedType));
+		return createGMFCommand;
+	}
+
+	/**
+	 * Convenience function that determines editing domain automatically
+	 * 
+	 * @see {@link #getCreateChildCommandWithContext(TransactionalEditingDomain, EObject, IHintedType)}
+	 */
+	public static ICommand getCreateChildCommandWithContext(EObject owner, IHintedType hintedType) {
+		return getCreateChildCommandWithContext(TransactionUtil.getEditingDomain(owner), owner, hintedType);
+	}
 }
-- 
cgit v1.2.3