/******************************************************************************* * Copyright (c) 2006-2012 * Software Technology Group, Dresden University of Technology * DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026 * * 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: * Software Technology Group - TU Dresden, Germany; * DevBoost GmbH - Berlin, Germany * - initial API and implementation ******************************************************************************/ /* * Copyright (c) 2006, 2007 Borland Software Corporation * * 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: * Dmitry Stadnik (Borland) - initial API and implementation */ package org.reuseware.application.taipan.gmf.editor.providers; import java.util.Arrays; import java.util.Collection; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.ecore.EObject; 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.service.IBatchValidator; import org.eclipse.emf.validation.service.ITraversalStrategy; import org.eclipse.gmf.runtime.common.ui.services.action.contributionitem.AbstractContributionItemProvider; import org.eclipse.gmf.runtime.common.ui.util.IWorkbenchPartDescriptor; import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jface.action.IAction; import org.reuseware.application.taipan.TaiPanPackage; import org.reuseware.application.taipan.gmf.editor.edit.parts.AquatoryEditPart; import org.reuseware.application.taipan.gmf.editor.edit.parts.ShipEditPart; import org.reuseware.application.taipan.gmf.editor.part.TaiPanDiagramEditorPlugin; import org.reuseware.application.taipan.gmf.editor.part.TaiPanVisualIDRegistry; import org.reuseware.application.taipan.gmf.editor.part.ValidateAction; /** * @generated */ public class TaiPanValidationProvider extends AbstractContributionItemProvider { /** * @generated */ private static boolean constraintsActive = false; /** * @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) { TaiPanDiagramEditorPlugin.getInstance().logError( "Validation failed", e); //$NON-NLS-1$ } } else { task.run(); } } /** * @generated */ protected IAction createAction(String actionId, IWorkbenchPartDescriptor partDescriptor) { if (ValidateAction.VALIDATE_ACTION_KEY.equals(actionId)) { return new ValidateAction(partDescriptor); } return super.createAction(actionId, partDescriptor); } /** * @generated */ static boolean isInDefaultEditorContext(Object object) { if (shouldConstraintsBePrivate() && !constraintsActive) { return false; } if (object instanceof View) { return constraintsActive && AquatoryEditPart.MODEL_ID.equals(TaiPanVisualIDRegistry .getModelID((View) object)); } return true; } /** * @generated */ public static class PortLocation implements IClientSelector { /** * @generated */ public boolean selects(Object object) { return isInDefaultEditorContext(object); } } /** * @generated */ public static class ShipName implements IClientSelector { /** * @generated */ public boolean selects(Object object) { return isInDefaultEditorContext(object); } } /** * @generated */ public static class LargeItemWeight implements IClientSelector { /** * @generated */ public boolean selects(Object object) { return isInDefaultEditorContext(object); } } /** * @generated */ public static class ShipType implements IClientSelector { /** * @generated */ public boolean selects(Object object) { if (isInDefaultEditorContext(object) && object instanceof View) { final int id = TaiPanVisualIDRegistry .getVisualID((View) object); boolean result = false; result = result || id == ShipEditPart.VISUAL_ID; return result; } return false; } } /** * @generated */ public static ITraversalStrategy getNotationTraversalStrategy( IBatchValidator validator) { return new CtxSwitchStrategy(validator); } /** * @generated */ private static class CtxSwitchStrategy implements ITraversalStrategy { /** * @generated */ private ITraversalStrategy defaultStrategy; /** * @generated */ private int currentSemanticCtxId = -1; /** * @generated */ private boolean ctxChanged = true; /** * @generated */ private EObject currentTarget; /** * @generated */ private EObject preFetchedNextTarget; /** * @generated */ private final int[] contextSwitchingIdentifiers; /** * @generated */ CtxSwitchStrategy(IBatchValidator validator) { this.defaultStrategy = validator.getDefaultTraversalStrategy(); this.contextSwitchingIdentifiers = new int[] { ShipEditPart.VISUAL_ID }; Arrays.sort(this.contextSwitchingIdentifiers); } /** * @generated */ public void elementValidated(EObject element, IStatus status) { defaultStrategy.elementValidated(element, status); } /** * @generated */ public boolean hasNext() { return defaultStrategy.hasNext(); } /** * @generated */ public boolean isClientContextChanged() { if (preFetchedNextTarget == null) { preFetchedNextTarget = next(); prepareNextClientContext(preFetchedNextTarget); } return ctxChanged; } /** * @generated */ public EObject next() { EObject nextTarget = preFetchedNextTarget; if (nextTarget == null) { nextTarget = defaultStrategy.next(); } this.preFetchedNextTarget = null; return this.currentTarget = nextTarget; } /** * @generated */ public void startTraversal(Collection traversalRoots, IProgressMonitor monitor) { defaultStrategy.startTraversal(traversalRoots, monitor); } /** * @generated */ private void prepareNextClientContext(EObject nextTarget) { if (nextTarget != null && currentTarget != null) { if (nextTarget instanceof View) { final int id = TaiPanVisualIDRegistry .getVisualID((View) nextTarget); int nextSemanticId = (id != -1 && Arrays.binarySearch( contextSwitchingIdentifiers, id) >= 0) ? id : -1; if ((currentSemanticCtxId != -1 && currentSemanticCtxId != nextSemanticId) || (nextSemanticId != -1 && nextSemanticId != currentSemanticCtxId)) { this.ctxChanged = true; } currentSemanticCtxId = nextSemanticId; } else { // context of domain model this.ctxChanged = currentSemanticCtxId != -1; currentSemanticCtxId = -1; } } else { this.ctxChanged = false; } } } /** * @generated */ public static class Adapter2 extends AbstractModelConstraint { /** * @generated */ public IStatus validate(IValidationContext ctx) { final Object context = ctx.getTarget().eGet( TaiPanPackage.eINSTANCE.getShip_Name()); if (context == null) { return ctx.createFailureStatus(new Object[] { formatElement(ctx .getTarget()) }); } // TODO: put validation code here // Ensure that you remove @generated tag or use @generated NOT // // To construct approprate return value, use ctx.createSuccessStatus() // or ctx.createFailureStatus(...) throw new UnsupportedOperationException( "No user java implementation provided for #validate(IValidationContext) operation");//$NON-NLS-1$ } } /** * @generated */ static String formatElement(EObject object) { return EMFCoreUtil.getQualifiedName(object, true); } }