package gov.nasa.jpl.mbee.mdk.validation;
import com.nomagic.magicdraw.actions.MDAction;
import com.nomagic.magicdraw.annotation.Annotation;
import com.nomagic.magicdraw.annotation.AnnotationManager;
import com.nomagic.magicdraw.core.Application;
import com.nomagic.magicdraw.openapi.uml.ReadOnlyElementException;
import com.nomagic.magicdraw.openapi.uml.SessionManager;
import com.nomagic.magicdraw.validation.RuleViolationResult;
import gov.nasa.jpl.mbee.mdk.mms.actions.MMSAction;
import gov.nasa.jpl.mbee.mdk.util.Utils;
import gov.nasa.jpl.mbee.mdk.mms.sync.local.LocalSyncProjectEventListenerAdapter;
import gov.nasa.jpl.mbee.mdk.mms.sync.local.LocalSyncTransactionCommitListener;
import javax.swing.*;
import java.util.Collection;
import java.util.HashSet;
public abstract class RuleViolationAction extends MMSAction implements IRuleViolationAction {
private static final long serialVersionUID = 1L;
public RuleViolationAction(String paramString1, String paramString2,
KeyStroke paramKeyStroke, String paramString3) {
super(paramString1, paramString2, paramKeyStroke, paramString3);
// TODO Auto-generated constructor stub
}
protected Annotation annotation;
private RuleViolationResult rvr;
private ValidationWindowRun vwr;
public Annotation getAnnotation() {
return annotation;
}
@Override
public void setAnnotation(Annotation anno) {
annotation = anno;
}
@Override
public void setRuleViolationResult(RuleViolationResult rvr) {
this.rvr = rvr;
}
@Override
public void setValidationWindowRun(ValidationWindowRun vwr) {
this.vwr = vwr;
}
public void removeViolationAndUpdateWindow() {
if (vwr == null) {
return;
}
vwr.results.remove(rvr);
AnnotationManager.getInstance().remove(annotation);
AnnotationManager.getInstance().update();
//ValidationResultsWindowManager.updateValidationResultsWindow(vwr.id, vwr.title, vwr.runData, vwr.results);
}
public void removeViolationsAndUpdateWindow(Collection<Annotation> annos) {
for (Annotation anno : annos) {
vwr.results.remove(vwr.mapping.get(anno));
AnnotationManager.getInstance().remove(anno);
}
AnnotationManager.getInstance().update();
//ValidationResultsWindowManager.updateValidationResultsWindow(vwr.id, vwr.title, vwr.runData, vwr.results);
}
public void saySuccess() {
Application.getInstance().getGUILog().log("[INFO] Successful");
}
protected boolean doAction(Annotation anno) throws ReadOnlyElementException {
return true;
}
protected void doAfterSuccess() {
}
protected void executeMany(Collection<Annotation> annos, String sessionName) {
LocalSyncTransactionCommitListener listener = LocalSyncProjectEventListenerAdapter.getProjectMapping(Application.getInstance().getProject()).getLocalSyncTransactionCommitListener();
if (listener != null) {
listener.setDisabled(true);
}
SessionManager.getInstance().createSession(sessionName);
Collection<Annotation> toremove = new HashSet<Annotation>();
try {
boolean noneditable = false;
for (Annotation anno : annos) {
if (doAction(anno)) {
toremove.add(anno);
}
else {
noneditable = true;
}
}
SessionManager.getInstance().closeSession();
if (noneditable) {
Application.getInstance().getGUILog().log("[ERROR] There were some elements couldn't be imported");
}
else {
saySuccess();
}
//AnnotationManager.getInstance().update();
this.removeViolationsAndUpdateWindow(toremove);
} catch (Exception ex) {
SessionManager.getInstance().cancelSession();
Utils.printException(ex);
}
if (listener != null) {
listener.setDisabled(false);
}
}
protected void execute(String sessionName) {
LocalSyncTransactionCommitListener listener = LocalSyncProjectEventListenerAdapter.getProjectMapping(Application.getInstance().getProject()).getLocalSyncTransactionCommitListener();
if (listener != null) {
listener.setDisabled(true);
}
SessionManager.getInstance().createSession("Change Rel");
try {
if (doAction(null)) {
SessionManager.getInstance().closeSession();
saySuccess();
doAfterSuccess();
this.removeViolationAndUpdateWindow();
}
else {
SessionManager.getInstance().cancelSession();
}
//AnnotationManager.getInstance().remove(annotation);
//AnnotationManager.getInstance().update();
} catch (Exception ex) {
SessionManager.getInstance().cancelSession();
Utils.printException(ex);
}
if (listener != null) {
listener.setDisabled(false);
}
}
}