/***************************************************************************** * Copyright (c) 2010 Atos Origin. * * * 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: * Atos Origin - Initial API and implementation * *****************************************************************************/ package org.eclipse.papyrus.uml.diagram.activity.providers; import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; import java.util.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.validation.AbstractModelConstraint; import org.eclipse.emf.validation.IValidationContext; import org.eclipse.emf.validation.model.IClientSelector; import org.eclipse.emf.validation.model.IConstraintStatus; import org.eclipse.emf.validation.service.IValidationListener; import org.eclipse.emf.validation.service.ModelValidationService; import org.eclipse.emf.validation.service.ValidationEvent; import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.papyrus.infra.core.resource.ModelSet; import org.eclipse.papyrus.uml.diagram.activity.edit.parts.ActivityDiagramEditPart; import org.eclipse.papyrus.uml.diagram.activity.helper.SafeDialogOpenerDuringValidation; import org.eclipse.papyrus.uml.diagram.activity.helper.UMLValidationHelper; import org.eclipse.papyrus.uml.diagram.activity.part.Messages; import org.eclipse.papyrus.uml.diagram.activity.part.UMLDiagramEditorPlugin; import org.eclipse.papyrus.uml.diagram.activity.part.UMLVisualIDRegistry; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.uml2.uml.ActivityEdge; import org.eclipse.uml2.uml.DecisionNode; import org.eclipse.uml2.uml.ExceptionHandler; import org.eclipse.uml2.uml.ObjectFlow; import org.eclipse.uml2.uml.ObjectNode; import org.eclipse.uml2.uml.ValuePin; /** * @generated */ public class UMLValidationProvider { /** * @generated */ private static boolean constraintsActive = false; /** * Ids of constraints which report is already managed by themselves. * * @generated NOT */ protected static final Collection<String> SELF_MANAGING_CONSTRAINTS = Arrays.asList("org.eclipse.papyrus.uml.diagram.activity.helper.PinAndParameterSynchronizer", "org.eclipse.papyrus.uml.diagram.activity.helper.ActivityParameterAndParameterSynchronizer"); /** * Validation listener which reports problems to the user * * @generated NOT */ private static class ValidationReportListener implements IValidationListener { /** * Report the validation result to the user in case operation did not fully succeed * * @see org.eclipse.emf.validation.service.IValidationListener#validationOccurred(org.eclipse.emf.validation.service.ValidationEvent) * * @param event * provides the validation operation results * @generated NOT */ public void validationOccurred(ValidationEvent event) { boolean needReport = false; if(event.getSeverity() >= IStatus.WARNING) { needReport = true; } if(needReport && event.getEvaluationMode().isLive()) { StringBuffer messageBuff = new StringBuffer(); List<String> handledConstraints = new LinkedList<String>(SELF_MANAGING_CONSTRAINTS); for(IConstraintStatus status : event.getValidationResults()) { // report only major problems if(status.getSeverity() >= event.getSeverity()) { String constraintId = status.getConstraint().getDescriptor().getId(); String constraintPlugin = status.getConstraint().getDescriptor().getPluginId(); if(UMLDiagramEditorPlugin.ID.equals(constraintPlugin) && !handledConstraints.contains(constraintId)) { handledConstraints.add(constraintId); messageBuff.append(status.getMessage()); } } } if(messageBuff.length() == 0) { // no error to report return; } final String message = messageBuff.toString(); if(event.getSeverity() >= IStatus.ERROR) { SafeDialogOpenerDuringValidation<Void> opener = new SafeDialogOpenerDuringValidation<Void>() { protected Void openDialog() { MessageDialog.openWarning(new Shell(Display.getDefault()), Messages.UMLValidation_ErrorTitle, message); return null; } }; opener.execute(); } else { SafeDialogOpenerDuringValidation<Void> opener = new SafeDialogOpenerDuringValidation<Void>() { protected Void openDialog() { MessageDialog.openInformation(new Shell(Display.getDefault()), Messages.UMLValidation_WarningTitle, message); return null; } }; opener.execute(); } } } } /** * Add a validation listener to report problems * * @generated NOT */ static { ModelValidationService.getInstance().addValidationListener(new ValidationReportListener()); } /** * @generated */ public static boolean shouldConstraintsBePrivate() { return false; } /** * @generated */ public static void runWithConstraints(TransactionalEditingDomain editingDomain, Runnable operation) { final Runnable op = operation; Runnable task = new Runnable() { public void run() { try { constraintsActive = true; op.run(); } finally { constraintsActive = false; } } }; if(editingDomain != null) { try { editingDomain.runExclusive(task); } catch (Exception e) { UMLDiagramEditorPlugin.getInstance().logError("Validation failed", e); //$NON-NLS-1$ } } else { task.run(); } } /** * @generated NOT filter for Papyrus editor only */ static boolean isInDefaultEditorContext(Object object) { if(shouldConstraintsBePrivate() && !constraintsActive) { return false; } if(object instanceof View) { return constraintsActive && ActivityDiagramEditPart.MODEL_ID.equals(UMLVisualIDRegistry.getModelID((View)object)); } // filter for Papyrus editor only if(object instanceof EObject) { EObject eObj = (EObject)object; Resource resource = eObj.eResource(); if(resource != null) { ResourceSet set = resource.getResourceSet(); return set instanceof ModelSet; } } return false; } /** * @generated */ public static class DefaultCtx implements IClientSelector { /** * @generated */ public boolean selects(Object object) { return isInDefaultEditorContext(object); } } /** * @generated */ public static class Adapter7 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ObjectNode context = (ObjectNode)ctx.getTarget(); return UMLValidationHelper.validateInputOutputParameter(context, ctx); } } /** * @generated */ public static class Adapter13 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ValuePin context = (ValuePin)ctx.getTarget(); return UMLValidationHelper.validateCompatibleType(context, ctx); } } /** * @generated */ public static class Adapter16 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ActivityEdge context = (ActivityEdge)ctx.getTarget(); return UMLValidationHelper.validateSourceAndTarget(context, ctx); } } /** * @generated */ public static class Adapter21 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ObjectFlow context = (ObjectFlow)ctx.getTarget(); return UMLValidationHelper.validateCompatibleTypes(context, ctx); } } /** * @generated */ public static class Adapter22 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ObjectFlow context = (ObjectFlow)ctx.getTarget(); return UMLValidationHelper.validateSameUpperBounds(context, ctx); } } /** * @generated */ public static class Adapter23 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ObjectFlow context = (ObjectFlow)ctx.getTarget(); return UMLValidationHelper.validateTarget(context, ctx); } } /** * @generated */ public static class Adapter24 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ObjectFlow context = (ObjectFlow)ctx.getTarget(); return UMLValidationHelper.validateTransformationBehaviour(context, ctx); } } /** * @generated */ public static class Adapter26 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ObjectFlow context = (ObjectFlow)ctx.getTarget(); return UMLValidationHelper.validateInputAndOutputParameter(context, ctx); } } /** * @generated */ public static class Adapter34 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { DecisionNode context = (DecisionNode)ctx.getTarget(); return UMLValidationHelper.validateIncomingObjectOneInputParameter(context, ctx); } } /** * @generated */ public static class Adapter35 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { DecisionNode context = (DecisionNode)ctx.getTarget(); return UMLValidationHelper.validateIncomingControlOneInputParameter(context, ctx); } } /** * @generated */ public static class Adapter36 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { DecisionNode context = (DecisionNode)ctx.getTarget(); return UMLValidationHelper.validateTwoInputParameters(context, ctx); } } /** * @generated */ public static class Adapter62 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ExceptionHandler context = (ExceptionHandler)ctx.getTarget(); return UMLValidationHelper.validateException_HandlerBody_Constraint4(context, ctx); } } /** * @generated */ public static class Adapter63 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ActivityEdge context = (ActivityEdge)ctx.getTarget(); return UMLValidationHelper.validateInterruptibleEdge(context, ctx); } } /** * @generated */ public static class Adapter64 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ExceptionHandler context = (ExceptionHandler)ctx.getTarget(); return UMLValidationHelper.validateException_StructuredActivityNode_Constraint3(context, ctx); } } /** * @generated */ public static class Adapter65 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ExceptionHandler context = (ExceptionHandler)ctx.getTarget(); return UMLValidationHelper.validateException_SourceAndTargetEdge_Constraint1(context, ctx); } } /** * @generated */ public static class Adapter66 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { ActivityEdge context = (ActivityEdge)ctx.getTarget(); return UMLValidationHelper.validateException_StructuredActivityNode_Constraint2(context, ctx); } } /** * @generated */ static String formatElement(EObject object) { return EMFCoreUtil.getQualifiedName(object, true); } }