blob: 837d56b23880b054f7779bf2f437fce30a0b8256 [file] [log] [blame]
/*
* 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:
* Richard Gronback (Borland) - initial API and implementation
*/
package org.eclipse.gmf.examples.mindmap.rcp.providers;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.emf.validation.model.EvaluationMode;
import org.eclipse.emf.validation.model.IConstraintStatus;
import org.eclipse.emf.validation.service.IBatchValidator;
import org.eclipse.emf.validation.service.ModelValidationService;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gmf.examples.mindmap.rcp.part.Messages;
import org.eclipse.gmf.examples.mindmap.rcp.part.MindmapDiagramEditor;
import org.eclipse.gmf.examples.mindmap.rcp.part.MindmapDiagramEditorPlugin;
import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.EditPartRegistryBasedViewService;
import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.IViewService;
import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.NaiveViewService;
import org.eclipse.gmf.runtime.lite.validation.IValidationStateUpdater;
import org.eclipse.gmf.runtime.lite.validation.ValidationState;
import org.eclipse.gmf.runtime.lite.validation.ViolationDescriptor;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.ui.IWorkbenchPart;
/**
* @generated
*/
public class ValidateAction extends Action {
/**
* @generated
*/
public static final String VALIDATE_ACTION_KEY = "validateAction"; //$NON-NLS-1$
/**
* @generated
*/
private IWorkbenchPart myWorkbenchPart;
/**
* @generated
*/
public ValidateAction(IWorkbenchPart part) {
setId(VALIDATE_ACTION_KEY);
setText(Messages.ValidateAction_ActionName);
myWorkbenchPart = part;
setEnabled(myWorkbenchPart instanceof MindmapDiagramEditor);
}
/**
* @generated
*/
public void run() {
if (!isEnabled()) {
return;
}
final MindmapDiagramEditor part = (MindmapDiagramEditor) myWorkbenchPart;
try {
new IRunnableWithProgress() {
public void run(IProgressMonitor monitor)
throws InterruptedException, InvocationTargetException {
GraphicalViewer viewer = (GraphicalViewer) part
.getAdapter(GraphicalViewer.class);
Diagram diagram = part.getDiagram();
IViewService viewService;
if (viewer == null) {
viewService = new NaiveViewService(diagram);
} else {
viewService = new EditPartRegistryBasedViewService(
viewer);
}
runValidation(diagram, viewService);
}
}.run(new NullProgressMonitor());
} catch (Exception e) {
MindmapDiagramEditorPlugin.getInstance().logError(
"Validation action failed", e); //$NON-NLS-1$
}
}
/**
* @generated
*/
public static void runValidation(View view, IViewService service) {
final View target = view;
final IViewService viewService = service;
TransactionalEditingDomain txDomain = TransactionUtil
.getEditingDomain(target);
MindmapValidationProvider.runWithConstraints(txDomain, new Runnable() {
public void run() {
validate(target, viewService);
}
});
}
/**
* @generated
*/
private static Diagnostic runEMFValidator(View target) {
if (target.isSetElement() && target.getElement() != null) {
return new Diagnostician().validate(target.getElement());
}
return Diagnostic.OK_INSTANCE;
}
/**
* @generated
*/
private static void validate(View target, IViewService viewService) {
URI diagramUri = (target.getDiagram() != null) ? EcoreUtil
.getURI(target.getDiagram()) : null;
if (diagramUri != null) {
ValidationState validationState = MindmapDiagramEditorPlugin
.getInstance().getValidationStateManager()
.getValidationState(diagramUri);
IValidationStateUpdater updater = validationState.startUpdate();
try {
Diagnostic diagnostic = runEMFValidator(target);
update(updater, diagnostic, viewService);
IBatchValidator validator = (IBatchValidator) ModelValidationService
.getInstance().newValidator(EvaluationMode.BATCH);
validator.setIncludeLiveConstraints(true);
if (target.isSetElement() && target.getElement() != null) {
IStatus status = validator.validate(target.getElement());
update(updater, status, viewService);
}
updater.commitChanges();
} catch (Exception e) {
updater.discardChanges();
}
}
}
/**
* @generated
*/
private static void update(IValidationStateUpdater updater,
Diagnostic emfValidationStatus, IViewService viewService) {
if (emfValidationStatus.getSeverity() == Diagnostic.OK) {
return;
}
final Diagnostic rootStatus = emfValidationStatus;
List allDiagnostics = new ArrayList();
collectTargetElements(rootStatus, new HashSet(), allDiagnostics);
for (Iterator it = emfValidationStatus.getChildren().iterator(); it
.hasNext();) {
Diagnostic nextDiagnostic = (Diagnostic) it.next();
List data = nextDiagnostic.getData();
if (data != null && !data.isEmpty()
&& data.get(0) instanceof EObject) {
EObject element = (EObject) data.get(0);
View view = viewService.findView(element);
if (view != null) {
ViolationDescriptor next = ViolationDescriptor.create(view,
nextDiagnostic);
if (next != null) {
updater.addViolation(next);
}
}
}
}
}
/**
* @generated
*/
private static Set collectTargetElements(Diagnostic diagnostic,
Set targetElementCollector, List allDiagnostics) {
List data = diagnostic.getData();
EObject target = null;
if (data != null && !data.isEmpty() && data.get(0) instanceof EObject) {
target = (EObject) data.get(0);
targetElementCollector.add(target);
allDiagnostics.add(diagnostic);
}
if (diagnostic.getChildren() != null
&& !diagnostic.getChildren().isEmpty()) {
for (Iterator it = diagnostic.getChildren().iterator(); it
.hasNext();) {
collectTargetElements((Diagnostic) it.next(),
targetElementCollector, allDiagnostics);
}
}
return targetElementCollector;
}
/**
* @generated
*/
private static void update(IValidationStateUpdater updater,
IStatus validationStatus, IViewService viewService) {
if (validationStatus.isOK()) {
return;
}
final IStatus rootStatus = validationStatus;
List allStatuses = new ArrayList();
collectTargetElements(rootStatus, new HashSet(), allStatuses);
for (Iterator it = allStatuses.iterator(); it.hasNext();) {
IConstraintStatus nextStatus = (IConstraintStatus) it.next();
View view = viewService.findView(nextStatus.getTarget());
if (view != null) {
ViolationDescriptor next = ViolationDescriptor.create(view,
nextStatus);
if (next != null) {
updater.addViolation(next);
}
}
}
}
/**
* @generated
*/
private static Set collectTargetElements(IStatus status,
Set targetElementCollector, List allConstraintStatuses) {
if (status instanceof IConstraintStatus) {
targetElementCollector
.add(((IConstraintStatus) status).getTarget());
allConstraintStatuses.add(status);
}
if (status.isMultiStatus()) {
IStatus[] children = status.getChildren();
for (int i = 0; i < children.length; i++) {
collectTargetElements(children[i], targetElementCollector,
allConstraintStatuses);
}
}
return targetElementCollector;
}
}