From 689db8f5e81e3f79e49abacc08fe7e7f12552abb Mon Sep 17 00:00:00 2001
From: tempiaa <tempiaa@eurecom.fr>
Date: Fri, 15 May 2020 14:23:47 +0200
Subject: [PATCH] Added safety pragma selection in model-checker verification
 window

---
 .../ui/window/JDialogAvatarModelChecker.java  | 143 ++++++++++++++++--
 1 file changed, 133 insertions(+), 10 deletions(-)

diff --git a/src/main/java/ui/window/JDialogAvatarModelChecker.java b/src/main/java/ui/window/JDialogAvatarModelChecker.java
index c9c5edd630..2c3d9bb562 100644
--- a/src/main/java/ui/window/JDialogAvatarModelChecker.java
+++ b/src/main/java/ui/window/JDialogAvatarModelChecker.java
@@ -62,6 +62,7 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.TimerTask;
 import java.util.concurrent.TimeUnit;
@@ -151,6 +152,8 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
     protected JTextField timeLimitField;
     protected JCheckBox noDeadlocks;
     protected JCheckBox safety;
+    protected JButton checkUncheckAllPragmas;
+    protected java.util.List<JCheckBox> customChecks;
 
     protected JCheckBox saveGraphAUT, saveGraphDot, ignoreEmptyTransitions, ignoreInternalStates,
             ignoreConcurrenceBetweenInternalActions, generateDesign;
@@ -190,6 +193,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
 
         //showLiveness = _showLiveness;
         showLiveness = true;
+        customChecks = new LinkedList<JCheckBox>();
         
         initComponents();
         myInitComponents();
@@ -287,7 +291,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
         GridBagLayout gridbagbasic = new GridBagLayout();
         GridBagConstraints cbasic = new GridBagConstraints();
         jpbasic.setLayout(gridbagbasic);
-        jpbasic.setBorder(new javax.swing.border.TitledBorder("Properties verification"));
+        jpbasic.setBorder(new javax.swing.border.TitledBorder("Basic properties"));
 
         cbasic.gridwidth = 1;
         cbasic.gridheight = 1;
@@ -361,18 +365,88 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
         livenessAllStates.setSelected(livenessSelected == LIVENESS_ALL);
         
         
+        JPanel jpadvanced = new JPanel();
+        GridBagLayout gridbagadvanced = new GridBagLayout();
+        GridBagConstraints cadvanced = new GridBagConstraints();
+        jpadvanced.setLayout(gridbagadvanced);
+        jpadvanced.setBorder(new javax.swing.border.TitledBorder("Advanced properties"));
+        
+        cadvanced.anchor = GridBagConstraints.WEST;
+        cadvanced.gridwidth = 1;
+        cadvanced.gridheight = 1;
+        cadvanced.weighty = 1.0;
+        cadvanced.weightx = 1.0;
+        cadvanced.fill = GridBagConstraints.HORIZONTAL; 
+        cadvanced.gridwidth = GridBagConstraints.REMAINDER; //end row
+
+        GridBagConstraints cadvanced2 = new GridBagConstraints();
+        cadvanced2.anchor = GridBagConstraints.EAST;
+        cadvanced2.gridwidth = 1;
+        cadvanced2.gridheight = 1;
+        cadvanced2.weighty = 1.0;
+        cadvanced2.weightx = 1.0;
+        cadvanced2.fill = GridBagConstraints.NONE; 
+        cadvanced2.gridwidth = GridBagConstraints.REMAINDER; //end row
+
+        
         //Safety pragmas
-        safety = new JCheckBox("Safety Pragmas", safetySelected);
+        cadvanced.gridwidth = 1;
+        safety = new JCheckBox("Safety pragmas", safetySelected);
         safety.addActionListener(this);
-        jpbasic.add(safety, cbasic);
+        jpadvanced.add(safety, cadvanced);
+        
+        cadvanced.gridwidth = GridBagConstraints.REMAINDER;
+        checkUncheckAllPragmas = new JButton("Check / uncheck all");
+        checkUncheckAllPragmas.addActionListener(this);
         
         if (spec.getSafetyPragmas() == null || spec.getSafetyPragmas().isEmpty()) {
             safety.setEnabled(false);
             safety.setSelected(false);
+            //checkUncheckAllPragmas.setEnabled(false);
+        } else {
+            cadvanced.anchor = GridBagConstraints.EAST;
+            cadvanced.fill = GridBagConstraints.NONE; 
+            cadvanced.gridwidth = GridBagConstraints.REMAINDER; //end row
+            jpadvanced.add(checkUncheckAllPragmas, cadvanced);
+            cadvanced.gridwidth = GridBagConstraints.REMAINDER;
+
+            JPanel jpadvancedQ = new JPanel();
+            GridBagConstraints cadvancedQ = new GridBagConstraints();
+            GridBagLayout gridbagadvancedQ = new GridBagLayout();
+            cadvancedQ.anchor = GridBagConstraints.WEST;
+            cadvancedQ.gridheight = 1;
+            cadvancedQ.weighty = 1.0;
+            cadvancedQ.weightx = 1.0;
+            jpadvancedQ.setLayout(gridbagadvancedQ);
+            cadvancedQ.fill = GridBagConstraints.BOTH;
+
+
+            for (String s : spec.getSafetyPragmas()) {
+                cadvancedQ.gridwidth = GridBagConstraints.RELATIVE;
+                JLabel space = new JLabel("   ");
+                cadvancedQ.weightx = 0.0;
+                jpadvancedQ.add(space, cadvancedQ);
+                cadvancedQ.gridwidth = GridBagConstraints.REMAINDER; //end row
+                JCheckBox cqb = new JCheckBox(s);
+                cqb.addActionListener(this);
+                cadvancedQ.weightx = 1.0;
+                cqb.setSelected(true);
+                jpadvancedQ.add(cqb, cadvancedQ);
+                customChecks.add(cqb);
+            }
+            JScrollPane jsp = new JScrollPane(jpadvancedQ, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+            jsp.setPreferredSize(new Dimension(500, 150));
+            cadvanced.gridheight = 10;
+            cadvanced.anchor = GridBagConstraints.WEST;
+            cadvanced.fill = GridBagConstraints.HORIZONTAL; 
+            cadvanced.gridwidth = GridBagConstraints.REMAINDER; //end row
+            jpadvanced.add(jsp, cadvanced);
         }
         
         jpopt.add(jp01, c01);
         jpopt.add(jpbasic, cbasic);
+        jpopt.add(jpadvanced, cadvanced);
+        
         
         // RG
         saveGraphAUT = new JCheckBox("Reachability Graph Generation", graphSelected);
@@ -508,6 +582,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
 
     }
 
+
     public void actionPerformed(ActionEvent evt) {
         String command = evt.getActionCommand();
 
@@ -517,6 +592,8 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
             stopProcess();
         } else if (command.equals("Close")) {
             closeDialog();
+        } else if (evt.getSource() == checkUncheckAllPragmas) {
+            checkUncheckAllPragmas();
         } else if (evt.getSource() == show) {
             showGraph();
         } else if (evt.getSource() == display) {
@@ -687,7 +764,15 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
             }
             
             if (safetySelected) {
-                res = amc.setSafetyAnalysis();
+                //res = amc.setSafetyAnalysis();
+                res = 0;
+                for(JCheckBox cc: customChecks) {
+                    if (cc.isSelected()) {
+                        if (amc.addSafety(cc.getText())) {
+                            res++;
+                        }
+                    }
+                }
                 jta.append("Analysis of " + res + " safety pragmas activated\n");
                 
                 handleSafety(amc.getSafeties());
@@ -810,9 +895,9 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
                     rg.name = f.getName();
                     mgui.addRG(rg);
                     FileUtils.saveFile(autfile, graphAUT);
-                    jta.append("Graph saved in " + autfile + "\n");
+                    jta.append("\nGraph saved in " + autfile + "\n");
                 } catch (Exception e) {
-                    jta.append("Graph could not be saved in " + autfile + "\n");
+                    jta.append("\nGraph could not be saved in " + autfile + "\n");
                 }
             }
             if (saveGraphDot.isSelected()) {
@@ -826,9 +911,9 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
                     String graph = amc.toDOT();
                     //TraceManager.addDev("graph AUT=\n" + graph);
                     FileUtils.saveFile(dotfile, graph);
-                    jta.append("Graph saved in " + dotfile + "\n");
+                    jta.append("\nGraph saved in " + dotfile + "\n");
                 } catch (Exception e) {
-                    jta.append("Graph could not be saved in " + dotfile + "\n");
+                    jta.append("\nGraph could not be saved in " + dotfile + "\n");
                 }
             }
 
@@ -894,6 +979,11 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
     
     protected void handleSafety(ArrayList<SafetyProperty> safeties) {
         int status;
+        
+        if (safeties == null) {
+            return;
+        }
+
         for (SafetyProperty sp : safeties) {
             if (sp.getPhase() == SpecificationPropertyPhase.SATISFIED) {
                 status = 1;
@@ -940,6 +1030,13 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
         }
         
         safetySelected = safety.isSelected();
+        
+        if (!customChecks.isEmpty()) {
+            for(JCheckBox cb: customChecks) {
+                cb.setEnabled(safetySelected);
+            }
+        }
+        
         stateLimitField.setEnabled(stateLimit.isSelected());
         limitStatesSelected = stateLimit.isSelected();
         timeLimitField.setEnabled(timeLimit.isSelected());
@@ -947,10 +1044,21 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
 
         switch (mode) {
             case NOT_STARTED:
-                if ((reachabilitySelected == REACHABILITY_SELECTED) || (reachabilitySelected == REACHABILITY_ALL) || (livenessSelected == LIVENESS_SELECTED) || (livenessSelected == LIVENESS_ALL) || safetySelected || checkNoDeadSelected || graphSelected || graphSelectedDot) {
+                if ((reachabilitySelected == REACHABILITY_SELECTED) || (reachabilitySelected == REACHABILITY_ALL) || (livenessSelected == LIVENESS_SELECTED) || (livenessSelected == LIVENESS_ALL) || checkNoDeadSelected || graphSelected || graphSelectedDot) {
                     start.setEnabled(true);
                 } else {
-                    start.setEnabled(false);
+                    if (safetySelected) {
+                        boolean sel = false;
+                        for(JCheckBox cb: customChecks) {
+                            if (cb.isSelected()) {
+                                sel = true;
+                                break;
+                            }
+                        }
+                        start.setEnabled(sel);
+                    } else {
+                        start.setEnabled(false);
+                    }
                 }
                 stop.setEnabled(false);
                 close.setEnabled(true);
@@ -1051,6 +1159,21 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
         } catch (Exception e) {
         }
     }
+    
+
+    private void checkUncheckAllPragmas() {
+        if (customChecks != null) {
+            int nb = 0;
+            for(JCheckBox cb: customChecks) {
+                nb = cb.isSelected() ? nb + 1 : nb ;
+            }
+            boolean check = (nb * 2) < customChecks.size();
+            for(JCheckBox cb: customChecks) {
+                cb.setSelected(check);
+            }
+            setButtons();
+        }
+    }
 
     public void reinitValues() {
         nbOfStates.setText("-");
-- 
GitLab