| 1 | /* |
| 2 | * Copyright 2007, SDQ, IPD, University of Karlsruhe |
| 3 | */ |
| 4 | package de.uka.ipd.sdq.pcm.gmf.usage.part; |
| 5 | |
| 6 | import java.lang.reflect.InvocationTargetException; |
| 7 | import java.util.ArrayList; |
| 8 | import java.util.HashSet; |
| 9 | import java.util.Iterator; |
| 10 | import java.util.List; |
| 11 | import java.util.Set; |
| 12 | |
| 13 | import org.eclipse.core.resources.IFile; |
| 14 | import org.eclipse.core.runtime.IProgressMonitor; |
| 15 | import org.eclipse.core.runtime.IStatus; |
| 16 | import org.eclipse.core.runtime.NullProgressMonitor; |
| 17 | import org.eclipse.emf.common.util.Diagnostic; |
| 18 | import org.eclipse.emf.ecore.EObject; |
| 19 | import org.eclipse.emf.ecore.util.Diagnostician; |
| 20 | import org.eclipse.emf.transaction.TransactionalEditingDomain; |
| 21 | import org.eclipse.emf.transaction.util.TransactionUtil; |
| 22 | import org.eclipse.emf.validation.model.EvaluationMode; |
| 23 | import org.eclipse.emf.validation.model.IConstraintStatus; |
| 24 | import org.eclipse.emf.validation.service.IBatchValidator; |
| 25 | import org.eclipse.emf.validation.service.ModelValidationService; |
| 26 | import org.eclipse.emf.workspace.util.WorkspaceSynchronizer; |
| 27 | import org.eclipse.gef.EditPartViewer; |
| 28 | import org.eclipse.gmf.runtime.diagram.ui.OffscreenEditPartFactory; |
| 29 | import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; |
| 30 | import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart; |
| 31 | import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil; |
| 32 | import org.eclipse.gmf.runtime.notation.View; |
| 33 | import org.eclipse.jface.action.Action; |
| 34 | import org.eclipse.jface.operation.IRunnableWithProgress; |
| 35 | import org.eclipse.ui.IEditorPart; |
| 36 | import org.eclipse.ui.IWorkbenchPage; |
| 37 | import org.eclipse.ui.IWorkbenchPart; |
| 38 | import org.eclipse.ui.PlatformUI; |
| 39 | import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation; |
| 40 | |
| 41 | import de.uka.ipd.sdq.pcm.gmf.usage.providers.PalladioComponentModelMarkerNavigationProvider; |
| 42 | import de.uka.ipd.sdq.pcm.gmf.usage.providers.PalladioComponentModelValidationProvider; |
| 43 | |
| 44 | /** |
| 45 | * @generated |
| 46 | */ |
| 47 | public class ValidateAction extends Action { |
| 48 | |
| 49 | /** |
| 50 | * @generated |
| 51 | */ |
| 52 | private IWorkbenchPage page; |
| 53 | |
| 54 | /** |
| 55 | * @generated |
| 56 | */ |
| 57 | public ValidateAction(IWorkbenchPage page) { |
| 58 | setText(Messages.ValidateActionMessage); |
| 59 | this.page = page; |
| 60 | } |
| 61 | |
| 62 | /** |
| 63 | * @generated |
| 64 | */ |
| 65 | public void run() { |
| 66 | IWorkbenchPart workbenchPart = page.getActivePart(); |
| 67 | if (workbenchPart instanceof IDiagramWorkbenchPart) { |
| 68 | final IDiagramWorkbenchPart part = (IDiagramWorkbenchPart) workbenchPart; |
| 69 | try { |
| 70 | new WorkspaceModifyDelegatingOperation( |
| 71 | new IRunnableWithProgress() { |
| 72 | |
| 73 | public void run(IProgressMonitor monitor) |
| 74 | throws InterruptedException, |
| 75 | InvocationTargetException { |
| 76 | runValidation(part.getDiagramEditPart(), part |
| 77 | .getDiagram()); |
| 78 | } |
| 79 | }).run(new NullProgressMonitor()); |
| 80 | } catch (Exception e) { |
| 81 | PalladioComponentModelUsageDiagramEditorPlugin.getInstance() |
| 82 | .logError("Validation action failed", e); //$NON-NLS-1$ |
| 83 | } |
| 84 | } |
| 85 | } |
| 86 | |
| 87 | /** |
| 88 | * @generated |
| 89 | */ |
| 90 | public static void runValidation(View view) { |
| 91 | try { |
| 92 | if (PalladioComponentModelDiagramEditorUtil.openDiagram(view |
| 93 | .eResource())) { |
| 94 | IEditorPart editorPart = PlatformUI.getWorkbench() |
| 95 | .getActiveWorkbenchWindow().getActivePage() |
| 96 | .getActiveEditor(); |
| 97 | if (editorPart instanceof IDiagramWorkbenchPart) { |
| 98 | runValidation(((IDiagramWorkbenchPart) editorPart) |
| 99 | .getDiagramEditPart(), view); |
| 100 | } else { |
| 101 | runNonUIValidation(view); |
| 102 | } |
| 103 | } |
| 104 | } catch (Exception e) { |
| 105 | PalladioComponentModelUsageDiagramEditorPlugin.getInstance() |
| 106 | .logError("Validation action failed", e); //$NON-NLS-1$ |
| 107 | } |
| 108 | } |
| 109 | |
| 110 | /** |
| 111 | * @generated |
| 112 | */ |
| 113 | public static void runNonUIValidation(View view) { |
| 114 | DiagramEditPart diagramEditPart = OffscreenEditPartFactory |
| 115 | .getInstance().createDiagramEditPart(view.getDiagram()); |
| 116 | runValidation(diagramEditPart, view); |
| 117 | } |
| 118 | |
| 119 | /** |
| 120 | * @generated |
| 121 | */ |
| 122 | public static void runValidation(DiagramEditPart diagramEditPart, View view) { |
| 123 | final DiagramEditPart fpart = diagramEditPart; |
| 124 | final View fview = view; |
| 125 | TransactionalEditingDomain txDomain = TransactionUtil |
| 126 | .getEditingDomain(view); |
| 127 | PalladioComponentModelValidationProvider.runWithConstraints(txDomain, |
| 128 | new Runnable() { |
| 129 | |
| 130 | public void run() { |
| 131 | validate(fpart, fview); |
| 132 | } |
| 133 | }); |
| 134 | } |
| 135 | |
| 136 | /** |
| 137 | * @generated |
| 138 | */ |
| 139 | private static Diagnostic runEMFValidator(View target) { |
| 140 | if (target.isSetElement() && target.getElement() != null) { |
| 141 | return new Diagnostician() { |
| 142 | |
| 143 | public String getObjectLabel(EObject eObject) { |
| 144 | return EMFCoreUtil.getQualifiedName(eObject, true); |
| 145 | } |
| 146 | }.validate(target.getElement()); |
| 147 | } |
| 148 | return Diagnostic.OK_INSTANCE; |
| 149 | } |
| 150 | |
| 151 | /** |
| 152 | * @generated |
| 153 | */ |
| 154 | private static void validate(DiagramEditPart diagramEditPart, View view) { |
| 155 | IFile target = view.eResource() != null ? WorkspaceSynchronizer |
| 156 | .getFile(view.eResource()) : null; |
| 157 | if (target != null) { |
| 158 | PalladioComponentModelMarkerNavigationProvider |
| 159 | .deleteMarkers(target); |
| 160 | } |
| 161 | Diagnostic diagnostic = runEMFValidator(view); |
| 162 | createMarkers(target, diagnostic, diagramEditPart); |
| 163 | IBatchValidator validator = (IBatchValidator) ModelValidationService |
| 164 | .getInstance().newValidator(EvaluationMode.BATCH); |
| 165 | validator.setIncludeLiveConstraints(true); |
| 166 | if (view.isSetElement() && view.getElement() != null) { |
| 167 | IStatus status = validator.validate(view.getElement()); |
| 168 | createMarkers(target, status, diagramEditPart); |
| 169 | } |
| 170 | } |
| 171 | |
| 172 | /** |
| 173 | * @generated |
| 174 | */ |
| 175 | private static void createMarkers(IFile target, IStatus validationStatus, |
| 176 | DiagramEditPart diagramEditPart) { |
| 177 | if (validationStatus.isOK()) { |
| 178 | return; |
| 179 | } |
| 180 | final IStatus rootStatus = validationStatus; |
| 181 | List allStatuses = new ArrayList(); |
| 182 | PalladioComponentModelDiagramEditorUtil.LazyElement2ViewMap element2ViewMap = new PalladioComponentModelDiagramEditorUtil.LazyElement2ViewMap( |
| 183 | diagramEditPart.getDiagramView(), collectTargetElements( |
| 184 | rootStatus, new HashSet(), allStatuses)); |
| 185 | for (Iterator it = allStatuses.iterator(); it.hasNext();) { |
| 186 | IConstraintStatus nextStatus = (IConstraintStatus) it.next(); |
| 187 | View view = PalladioComponentModelDiagramEditorUtil.findView( |
| 188 | diagramEditPart, nextStatus.getTarget(), element2ViewMap); |
| 189 | addMarker(diagramEditPart.getViewer(), target, view.eResource() |
| 190 | .getURIFragment(view), EMFCoreUtil.getQualifiedName( |
| 191 | nextStatus.getTarget(), true), nextStatus.getMessage(), |
| 192 | nextStatus.getSeverity()); |
| 193 | } |
| 194 | } |
| 195 | |
| 196 | /** |
| 197 | * @generated |
| 198 | */ |
| 199 | private static void createMarkers(IFile target, |
| 200 | Diagnostic emfValidationStatus, DiagramEditPart diagramEditPart) { |
| 201 | if (emfValidationStatus.getSeverity() == Diagnostic.OK) { |
| 202 | return; |
| 203 | } |
| 204 | final Diagnostic rootStatus = emfValidationStatus; |
| 205 | List allDiagnostics = new ArrayList(); |
| 206 | PalladioComponentModelDiagramEditorUtil.LazyElement2ViewMap element2ViewMap = new PalladioComponentModelDiagramEditorUtil.LazyElement2ViewMap( |
| 207 | diagramEditPart.getDiagramView(), collectTargetElements( |
| 208 | rootStatus, new HashSet(), allDiagnostics)); |
| 209 | for (Iterator it = emfValidationStatus.getChildren().iterator(); it |
| 210 | .hasNext();) { |
| 211 | Diagnostic nextDiagnostic = (Diagnostic) it.next(); |
| 212 | List data = nextDiagnostic.getData(); |
| 213 | if (data != null && !data.isEmpty() |
| 214 | && data.get(0) instanceof EObject) { |
| 215 | EObject element = (EObject) data.get(0); |
| 216 | View view = PalladioComponentModelDiagramEditorUtil.findView( |
| 217 | diagramEditPart, element, element2ViewMap); |
| 218 | addMarker( |
| 219 | diagramEditPart.getViewer(), |
| 220 | target, |
| 221 | view.eResource().getURIFragment(view), |
| 222 | EMFCoreUtil.getQualifiedName(element, true), |
| 223 | nextDiagnostic.getMessage(), |
| 224 | diagnosticToStatusSeverity(nextDiagnostic.getSeverity())); |
| 225 | } |
| 226 | } |
| 227 | } |
| 228 | |
| 229 | /** |
| 230 | * @generated |
| 231 | */ |
| 232 | private static void addMarker(EditPartViewer viewer, IFile target, |
| 233 | String elementId, String location, String message, |
| 234 | int statusSeverity) { |
| 235 | if (target == null) { |
| 236 | return; |
| 237 | } |
| 238 | PalladioComponentModelMarkerNavigationProvider.addMarker(target, |
| 239 | elementId, location, message, statusSeverity); |
| 240 | } |
| 241 | |
| 242 | /** |
| 243 | * @generated |
| 244 | */ |
| 245 | private static int diagnosticToStatusSeverity(int diagnosticSeverity) { |
| 246 | if (diagnosticSeverity == Diagnostic.OK) { |
| 247 | return IStatus.OK; |
| 248 | } else if (diagnosticSeverity == Diagnostic.INFO) { |
| 249 | return IStatus.INFO; |
| 250 | } else if (diagnosticSeverity == Diagnostic.WARNING) { |
| 251 | return IStatus.WARNING; |
| 252 | } else if (diagnosticSeverity == Diagnostic.ERROR |
| 253 | || diagnosticSeverity == Diagnostic.CANCEL) { |
| 254 | return IStatus.ERROR; |
| 255 | } |
| 256 | return IStatus.INFO; |
| 257 | } |
| 258 | |
| 259 | /** |
| 260 | * @generated |
| 261 | */ |
| 262 | private static Set collectTargetElements(IStatus status, |
| 263 | Set targetElementCollector, List allConstraintStatuses) { |
| 264 | if (status instanceof IConstraintStatus) { |
| 265 | targetElementCollector |
| 266 | .add(((IConstraintStatus) status).getTarget()); |
| 267 | allConstraintStatuses.add(status); |
| 268 | } |
| 269 | if (status.isMultiStatus()) { |
| 270 | IStatus[] children = status.getChildren(); |
| 271 | for (int i = 0; i < children.length; i++) { |
| 272 | collectTargetElements(children[i], targetElementCollector, |
| 273 | allConstraintStatuses); |
| 274 | } |
| 275 | } |
| 276 | return targetElementCollector; |
| 277 | } |
| 278 | |
| 279 | /** |
| 280 | * @generated |
| 281 | */ |
| 282 | private static Set collectTargetElements(Diagnostic diagnostic, |
| 283 | Set targetElementCollector, List allDiagnostics) { |
| 284 | List data = diagnostic.getData(); |
| 285 | EObject target = null; |
| 286 | if (data != null && !data.isEmpty() && data.get(0) instanceof EObject) { |
| 287 | target = (EObject) data.get(0); |
| 288 | targetElementCollector.add(target); |
| 289 | allDiagnostics.add(diagnostic); |
| 290 | } |
| 291 | if (diagnostic.getChildren() != null |
| 292 | && !diagnostic.getChildren().isEmpty()) { |
| 293 | for (Iterator it = diagnostic.getChildren().iterator(); it |
| 294 | .hasNext();) { |
| 295 | collectTargetElements((Diagnostic) it.next(), |
| 296 | targetElementCollector, allDiagnostics); |
| 297 | } |
| 298 | } |
| 299 | return targetElementCollector; |
| 300 | } |
| 301 | } |