package gov.nasa.jpl.mbee.mdk.mms.sync.manual;
import com.nomagic.actions.NMAction;
import com.nomagic.magicdraw.annotation.Annotation;
import com.nomagic.magicdraw.annotation.AnnotationAction;
import com.nomagic.magicdraw.core.Application;
import com.nomagic.magicdraw.core.Project;
import com.nomagic.task.ProgressStatus;
import com.nomagic.task.RunnableWithProgress;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Element;
import gov.nasa.jpl.mbee.mdk.mms.sync.manual.ManualSyncRunner;
import java.text.NumberFormat;
import java.util.*;
import java.util.stream.Collectors;
public class ManualSyncActionRunner<A extends NMAction & AnnotationAction> implements RunnableWithProgress {
private final Class<A> actionClass;
private final Project project;
private final ManualSyncRunner manualSyncRunner;
public ManualSyncActionRunner(Class<A> actionClass, Collection<Element> rootElements, Project project, int depth) {
this.actionClass = actionClass;
this.project = project;
manualSyncRunner = new ManualSyncRunner(rootElements, project, depth);
}
@Override
public void run(ProgressStatus progressStatus) {
manualSyncRunner.run(progressStatus);
if (manualSyncRunner.getValidationSuite() != null && manualSyncRunner.getValidationSuite().hasErrors()) {
List<Annotation> annotations = manualSyncRunner.getValidationSuite().getValidationRules().stream()
.flatMap(validationRule -> validationRule.getViolations().stream())
.flatMap(violation -> violation.getActions().stream()).filter(action -> actionClass.isAssignableFrom(action.getClass()))
.map(action -> new Annotation(Annotation.getSeverityLevel(project, Annotation.ERROR), action.toString(), "", null, Collections.singletonList(action))).collect(Collectors.toCollection(LinkedList::new));
if (annotations.isEmpty()) {
Application.getInstance().getGUILog().log("[INFO] No manual sync validation actions of type " + actionClass.getSimpleName() + ".");
return;
}
AnnotationAction annotationAction = ((AnnotationAction) annotations.get(0).getActions().get(0));
if (!annotationAction.canExecute(annotations)) {
Application.getInstance().getGUILog().log("[WARNING] Cannot execute " + actionClass.getSimpleName() + ". Aborting action.");
return;
}
annotationAction.execute(annotations);
Application.getInstance().getGUILog().log("[INFO] Executed " + NumberFormat.getInstance().format(annotations.size()) + " " + actionClass.getSimpleName() + " actions.");
}
else {
Application.getInstance().getGUILog().log("[INFO] All validated elements are equivalent.");
}
}
}