/******************************************************************************* | |
* Copyright (c) 2004-2008 Andras Schmidt, Andras Balogh, Istvan Rath and Daniel Varro | |
* 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: | |
* Andras Schmidt, Andras Balogh, Istvan Rath - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.viatra2.tags.impl; | |
import java.util.HashMap; | |
import java.util.HashSet; | |
import java.util.Set; | |
import org.eclipse.core.resources.IFile; | |
import org.eclipse.core.resources.IMarker; | |
import org.eclipse.core.resources.IResource; | |
import org.eclipse.core.resources.ResourcesPlugin; | |
import org.eclipse.core.runtime.CoreException; | |
import org.eclipse.core.runtime.Path; | |
import org.eclipse.viatra2.core.IModelElement; | |
import org.eclipse.viatra2.framework.IFramework; | |
import org.eclipse.viatra2.modelChecker.impl.ProblemManager; | |
import org.eclipse.viatra2.tags.ITag; | |
import org.eclipse.viatra2.tags.ITagManager; | |
import org.eclipse.viatra2.tags.TagKind; | |
/** | |
* Tag manager implementation. | |
* @author Istvan Rath | |
* | |
*/ | |
public class TagManager implements ITagManager | |
{ | |
private HashMap<IModelElement, HashSet<ITag>> mE_tags = new HashMap<IModelElement, HashSet<ITag>>(); | |
private HashSet<ITag> allTags = new HashSet<ITag>(); | |
private IFile iFile; | |
private IFramework fw; | |
private ProblemManager problemManager; | |
public void addTag(ITag tag) { | |
allTags.add(tag); | |
for (IModelElement me : tag.getAssociatedElements()) | |
{ | |
HashSet<ITag> me_tags = mE_tags.get(me); | |
if (me_tags==null) | |
{ | |
me_tags = new HashSet<ITag>(); | |
mE_tags.put(me, me_tags); | |
} | |
me_tags.add(tag); | |
} | |
// add marker | |
try | |
{ | |
String markerType; | |
int markerSeverity; | |
if (tag.getKind().equals(TagKind.MODELING_PROBLEM)) | |
{ | |
markerType = IMarker.PROBLEM; | |
markerSeverity = IMarker.SEVERITY_ERROR; | |
} | |
else //if (tag.getKind().equals(TagKind.MODELING_INFO)) | |
{ | |
markerType = IMarker.PROBLEM; | |
markerSeverity = IMarker.SEVERITY_INFO; | |
} | |
String affectedFQNs = ""; | |
for (IModelElement me : tag.getAssociatedElements()) | |
{ | |
affectedFQNs += me.getFullyQualifiedName()+";"; | |
} | |
IMarker marker = iFile.createMarker(markerType); | |
marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_NORMAL); | |
marker.setAttribute(IMarker.SEVERITY, markerSeverity); | |
marker.setAttribute(IMarker.MESSAGE, tag.getMessage()); | |
marker.setAttribute(IMarker.USER_EDITABLE, false); | |
marker.setAttribute(IMarker.LOCATION, affectedFQNs); | |
tag.setMarker(marker); | |
} | |
catch (CoreException e) | |
{ | |
fw.getLogger().error("[TagManager::clearAddTag()]"+e.getMessage()); | |
} | |
} | |
public void clearAllTags() | |
{ | |
this.fw.getTopmodel().getTransactionManager().beginTransaction(); | |
allTags.clear(); | |
for (IModelElement me : mE_tags.keySet()) | |
{ | |
mE_tags.get(me).clear(); | |
} | |
try { | |
iFile.deleteMarkers(IMarker.MARKER, true, IResource.DEPTH_INFINITE); | |
} catch (CoreException e) { | |
fw.getLogger().error("[TagManager::clearAllTags()]"+e.getMessage()); | |
} | |
this.fw.getTopmodel().getTransactionManager().commitTransaction(); | |
} | |
private void clearAllProblemTags() | |
{ | |
this.fw.getTopmodel().getTransactionManager().beginTransaction(); | |
try { | |
if (iFile!=null) | |
{ | |
iFile.deleteMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE); | |
} | |
} catch (CoreException e) { | |
fw.getLogger().error("[TagManager::clearAllProblemTags()]"+e.getMessage()); | |
} | |
this.fw.getTopmodel().getTransactionManager().commitTransaction(); | |
} | |
public void clearTag(ITag t) | |
{ | |
if (t!=null) | |
{ | |
try { | |
t.getMarker().delete(); | |
} catch (CoreException e) | |
{ | |
fw.getLogger().error("[TagManager::clearTag(t)]"+e.getMessage()); | |
} | |
allTags.remove(t); | |
for (IModelElement _me : t.getAssociatedElements()) | |
{ | |
mE_tags.get(_me).remove(t); | |
} | |
} | |
} | |
public void clearTags(IModelElement me) | |
{ | |
HashSet<ITag> t = mE_tags.get(me); | |
HashSet<ITag> filter = new HashSet<ITag>(); | |
if (t!=null) | |
{ | |
for (ITag tt : t) | |
{ | |
if (tt.getMarker()!=null) | |
{ | |
try { | |
tt.getMarker().delete(); | |
} catch (CoreException e) | |
{ | |
fw.getLogger().error("[TagManager::clearTags(me)]"+e.getMessage()); | |
} | |
} | |
filter.add(tt); | |
allTags.remove(tt); | |
} | |
t.clear(); | |
// clear tags from referenced model elements as well | |
for (ITag _t : filter) | |
{ | |
for (IModelElement _me : _t.getAssociatedElements()) | |
{ | |
mE_tags.get(_me).remove(_t); | |
} | |
} | |
} | |
} | |
public void clearTags(TagKind kind) | |
{ | |
HashSet<ITag> filter = new HashSet<ITag>(); | |
for (ITag t : allTags) | |
{ | |
if (t.getKind().equals(kind)) | |
{ | |
filter.add(t); | |
} | |
} | |
allTags.removeAll(filter); | |
filter.clear(); | |
for (IModelElement me : mE_tags.keySet()) | |
{ | |
for (ITag tt : mE_tags.get(me)) | |
{ | |
if (tt.getKind().equals(kind)) | |
{ | |
filter.add(tt); | |
} | |
} | |
mE_tags.get(me).removeAll(filter); | |
} | |
for (ITag ttt : filter) | |
{ | |
try { | |
if (ttt.getMarker().exists()) | |
ttt.getMarker().delete(); | |
} catch (CoreException e) { | |
fw.getLogger().error("[TagManager::clearTags(tagKind)] "+e.getMessage()); | |
} | |
} | |
} | |
public Set<ITag> getAllTags() { | |
return allTags; | |
} | |
public Set<ITag> getTagsForModelElement(IModelElement me) { | |
return mE_tags.get(me); | |
} | |
public void init(IFramework fw) | |
{ | |
//fw.getProperties().getRuntimeProperty(providerID, propid) | |
this.fw = fw; | |
iFile = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(fw.getCurrentFilename())); | |
clearAllProblemTags(); | |
problemManager = new ProblemManager(); | |
problemManager.init(fw); | |
} | |
public void resetProblemManager() | |
{ | |
problemManager.fullCheck(); | |
} | |
} |