package gov.nasa.jpl.mbee.mdk.model;

import com.nomagic.magicdraw.core.Application;
import com.nomagic.magicdraw.openapi.uml.SessionManager;
import com.nomagic.magicdraw.simulation.SimulationManager;
import com.nomagic.magicdraw.simulation.execution.session.SimulationSession;
import com.nomagic.uml2.ext.jmi.helpers.StereotypesHelper;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Element;
import gov.nasa.jpl.mbee.mdk.docgen.DocGenProfile;
import gov.nasa.jpl.mbee.mdk.docgen.docbook.DocumentElement;

import java.text.NumberFormat;
import java.util.Collections;
import java.util.List;

/**
 * Created by igomes on 12/2/16.
 */
public class Simulate extends Query {
    // TODO pull default from profile
    private Integer timeout = 60;

    @Override
    public List<DocumentElement> visit(boolean forViewEditor, String outputDir) {
        super.visit(forViewEditor, outputDir);

        for (Object o : getTargets()) {
            if (o instanceof Element) {
                long startTime = System.currentTimeMillis();
                Application.getInstance().getGUILog().log("[INFO] Simulation of " + ((Element) o).getHumanName() + " started.");
                SimulationSession simulationSession;
                try {
                    simulationSession = SimulationManager.execute((Element) o, true, true);
                } catch (Exception e) {
                    e.printStackTrace();
                    Application.getInstance().getGUILog().log("[ERROR] Simulation of " + ((Element) o).getHumanName() + " encountered an unexpected exception: \"" + e.getMessage() + ".\" Terminating.");
                    if (SessionManager.getInstance().isSessionCreated()) {
                        SessionManager.getInstance().cancelSession();
                    }
                    continue;
                }
                while (!simulationSession.isClosed() && (timeout < 0 || System.currentTimeMillis() - startTime < timeout * 1000)) {
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException ignored) {
                    }
                }
                if (!simulationSession.isClosed()) {
                    Application.getInstance().getGUILog().log("[WARNING] Simulation of " + ((Element) o).getHumanName() + " timed out after " + NumberFormat.getInstance().format(timeout) + " seconds. Terminating.");
                    SimulationManager.terminateSession(simulationSession);
                    if (SessionManager.getInstance().isSessionCreated()) {
                        SessionManager.getInstance().cancelSession();
                    }
                }
                else {
                    Application.getInstance().getGUILog().log("[INFO] Simulation of " + ((Element) o).getHumanName() + " completed.");
                }
            }
        }

        return Collections.emptyList();
    }

    @Override
    public void initialize() {
        super.initialize();
        Object o = StereotypesHelper.getStereotypePropertyFirst(dgElement, DocGenProfile.simulateStereotype, "timeout");
        if (o != null && o instanceof Integer) {
            timeout = (Integer) o;
        }
    }
}

@@ -887,16 +887,24 @@
 utDir);%0A
+        
 %0A       
@@ -2857,24 +2857,25 @@
 %7D%0A        %7D%0A
+ 
 %0A        ret

Update Simulate.java