/******************************************************************************* * Copyright (c) 2010-2015 Henshin developers. 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: * TU Berlin, University of Luxembourg, SES S.A. *******************************************************************************/ package de.tub.tfs.henshin.tggeditor; import java.util.HashMap; import java.util.List; import javax.lang.model.type.ErrorType; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.common.command.CommandStack; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.henshin.model.Edge; import org.eclipse.emf.henshin.model.Mapping; import org.eclipse.emf.henshin.model.Module; import org.eclipse.emf.henshin.model.Node; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.IMarkerResolution; import org.eclipse.ui.IMarkerResolution2; import org.eclipse.ui.IMarkerResolutionGenerator; import de.tub.tfs.henshin.tgg.TAttribute; import de.tub.tfs.henshin.tgg.TEdge; import de.tub.tfs.henshin.tgg.TNode; import de.tub.tfs.henshin.tgg.interpreter.util.RuleUtil; import de.tub.tfs.henshin.tggeditor.commands.create.rule.MarkCommand; import de.tub.tfs.muvitor.commands.SimpleDeleteEObjectCommand; import de.tub.tfs.muvitor.ui.IDUtil; import de.tub.tfs.muvitor.ui.utils.EMFModelManager; public class TGGEditorMarkerResolutionGenerator implements IMarkerResolutionGenerator{ public static class TGGMarkerAttributes { public static final String errorType = "de.tub.tfs.tgg.editor.marker.type"; public static final String errorObject = "de.tub.tfs.tgg.editor.marker.object"; } public static HashMap<String,Node> nodes = new HashMap<String,Node>(); /* * * "MissingMarker" * "NodeDeleted" * "EdgeDeleted" */ public enum ErrorTypes { MissingMarker(){ @Override IMarkerResolution[] getFixes(IMarker marker) { return new IMarkerResolution[]{ new IMarkerResolution() { @Override public void run(IMarker marker) { try { String source_ID = (String) marker.getAttribute(IMarker.SOURCE_ID); EObject n = IDUtil.getModelForID(source_ID); if (n == null || !(EcoreUtil.getRootContainer(n) instanceof Module)){ marker.delete(); return; } if (n instanceof TNode){ ((TNode)n).setMarkerType(RuleUtil.NEW); } if (n instanceof TEdge){ ((TEdge)n).setMarkerType(RuleUtil.NEW); } if (n instanceof TAttribute){ ((TAttribute)n).setMarkerType(RuleUtil.NEW); } marker.delete(); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public String getLabel() { // TODO Auto-generated method stub return "Add the missing marker."; } } }; } }, NodeDeleted(){ @Override IMarkerResolution[] getFixes(IMarker marker) { // TODO Auto-generated method stub return new IMarkerResolution[]{ new IMarkerResolution() { @Override public void run(IMarker marker) { Node n; try { String source_ID = (String) marker.getAttribute(IMarker.SOURCE_ID); n = (Node) IDUtil.getModelForID(source_ID); if (n == null || !(EcoreUtil.getRootContainer(n) instanceof Module)){ marker.delete(); return; } SimpleDeleteEObjectCommand c = new SimpleDeleteEObjectCommand(n); c.execute(); //marker.delete(); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public String getLabel() { // TODO Auto-generated method stub return "Delete the node causing this problem."; } } }; } }, EdgeDeleted(){ @Override IMarkerResolution[] getFixes(IMarker marker) { // TODO Auto-generated method stub return new IMarkerResolution[]{ new IMarkerResolution() { @Override public void run(IMarker marker) { Edge n; try { String source_ID = (String) marker.getAttribute(IMarker.SOURCE_ID); n = (Edge) IDUtil.getModelForID(source_ID); if (n == null || !(EcoreUtil.getRootContainer(n) instanceof Module)){ marker.delete(); return; } SimpleDeleteEObjectCommand c = new SimpleDeleteEObjectCommand(n); c.execute(); //marker.delete(); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public String getLabel() { // TODO Auto-generated method stub return "Delete the edge causing this problem."; } } }; } }, MissingType(){ @Override IMarkerResolution[] getFixes(IMarker marker) { // TODO Auto-generated method stub return super.getFixes(marker); } }, InconsistentMapping(){ @Override IMarkerResolution[] getFixes(IMarker marker) { return new IMarkerResolution[]{ new IMarkerResolution() { @Override public void run(IMarker marker) { try { String source_ID = (String) marker.getAttribute(IMarker.SOURCE_ID); EObject n = IDUtil.getModelForID(source_ID); if (n == null || !(EcoreUtil.getRootContainer(n) instanceof Module)){ marker.delete(); return; } if (n instanceof Mapping){ ((List)n.eContainer().eGet(n.eContainingFeature())).remove(n); } marker.delete(); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public String getLabel() { // TODO Auto-generated method stub return "Remove the wrong Mapping."; } } }; } }, WrongMarker(){ @Override IMarkerResolution[] getFixes(IMarker marker) { return new IMarkerResolution[]{ new IMarkerResolution() { @Override public void run(IMarker marker) { try { String source_ID = (String) marker.getAttribute(IMarker.SOURCE_ID); EObject n = IDUtil.getModelForID(source_ID); if (n == null || !(EcoreUtil.getRootContainer(n) instanceof Module)){ marker.delete(); return; } if (n instanceof TNode){ ((TNode)n).setMarkerType(null); } if (n instanceof TEdge){ ((TEdge)n).setMarkerType(null); } if (n instanceof TAttribute){ ((TAttribute)n).setMarkerType(null); } marker.delete(); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public String getLabel() { // TODO Auto-generated method stub return "Remove the wrong marker."; } } }; } }, ; IMarkerResolution[] getFixes(IMarker marker){ return new IMarkerResolution[0]; } } @Override public IMarkerResolution[] getResolutions(IMarker marker) { ErrorTypes errorType; try { String s = (String) marker.getAttribute(TGGMarkerAttributes.errorType); if (s == null) return new IMarkerResolution[0]; errorType = ErrorTypes.valueOf(s); return errorType.getFixes(marker); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } return new IMarkerResolution[0]; } }