blob: e5a3302fc666d78f88724addb3a2fdb0ecda1e12 [file] [log] [blame]
/*******************************************************************************
* 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();
}
}