/***************************************************************************** * Copyright (c) 2011 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: * Tristan FAURE (Atos) tristan.faure@atos.net - Initial API and implementation *****************************************************************************/ package org.eclipse.papyrus.uml.diagram.common.service.palette; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.gef.Request; import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest; import org.eclipse.papyrus.uml.diagram.common.service.AspectUnspecifiedTypeCreationTool; /** * Annotation to apply to Aspect Actions which modify references * * @author tristan.faure@atos.net * */ public interface IFeatureSetterAspectAction { public EStructuralFeature[] getAllImpactedFeatures(); public static class IFeatureSetterAspectActionUtil { /** * Return all the impacted features for a given request the array of int * represents the ids * * @param request * @return never null */ public static Set<EStructuralFeature> getAllImpactedFeatures( Request request) { return getAllImpactedFeatures(request.getExtendedData()); } /** * Return all the impacted Features from a map given by a request * @param map * @return the features impacted by an action */ public static Set<EStructuralFeature> getAllImpactedFeatures( Map map) { Set<EStructuralFeature> result = new HashSet<EStructuralFeature>(); List<IAspectAction> aspectActions = AspectUnspecifiedTypeCreationTool .getAspectActions(map); if (aspectActions != null) { for (IAspectAction a : aspectActions) { if (a instanceof IFeatureSetterAspectAction) { IFeatureSetterAspectAction featureSetter = (IFeatureSetterAspectAction) a; result.addAll(Arrays.asList(featureSetter.getAllImpactedFeatures())); } } } return result; } /** * Return all the impacted features in a {@link IEditCommandRequest} containing Pre and Post actions * @param request * @return */ public static Set<EStructuralFeature> getAllImpactedFeatures( IEditCommandRequest request) { return getAllImpactedFeatures(request.getParameters()); } /** * Determine if the features in parameters are managed by Pre/Post * Action in the request * @param request * @param features * @return true if they are ALL managed */ public static boolean areFeaturesManaged(Request request, EStructuralFeature... features) { return request != null && areFeaturesManaged(request.getExtendedData(), features); } /** * Determine if the features in parameters are managed by Pre/Post * Action in the request * @param request * @param features * @return true if they are ALL managed */ public static boolean areFeaturesManaged(IEditCommandRequest request, EStructuralFeature features) { return request != null && areFeaturesManaged(request.getParameters(), features); } private static boolean areFeaturesManaged(Map map, EStructuralFeature... feature) { Set<EStructuralFeature> impacted = getAllImpactedFeatures(map); for (EStructuralFeature f : feature) { if (!impacted.contains(f)) { return false ; } } return true ; } } }