From 2ed1bd4184de4a79e81234a2ba146fd5db4cbdaa Mon Sep 17 00:00:00 2001
From: Letitia Li <letitia.li@telecom-paristech.fr>
Date: Thu, 12 Jul 2018 16:29:59 +0200
Subject: [PATCH] Show proverif result trace in primitive ports and latency
 panel scrollbars added

---
 src/main/java/tmltranslator/TMLModeling.java  | 62 +++++++++++++++++-
 .../tmltranslator/toavatar/TML2Avatar.java    |  2 +-
 src/main/java/ui/GTURTLEModeling.java         |  2 +-
 src/main/java/ui/MainGUI.java                 |  4 +-
 src/main/java/ui/TDiagramPanel.java           | 21 +++++-
 .../JFrameAvatarInteractiveSimulation.java    |  6 +-
 .../JFrameInteractiveSimulation.java          |  5 +-
 .../java/ui/tmlcompd/TMLCPrimitivePort.java   | 65 +++++++++++++++++++
 8 files changed, 154 insertions(+), 13 deletions(-)

diff --git a/src/main/java/tmltranslator/TMLModeling.java b/src/main/java/tmltranslator/TMLModeling.java
index 31b7ead148..408f74b0e1 100755
--- a/src/main/java/tmltranslator/TMLModeling.java
+++ b/src/main/java/tmltranslator/TMLModeling.java
@@ -50,6 +50,7 @@ import myutil.TraceManager;
 import proverifspec.ProVerifOutputAnalyzer;
 import proverifspec.ProVerifQueryAuthResult;
 import proverifspec.ProVerifQueryResult;
+import proverifspec.ProVerifResultTrace;
 import ui.TAttribute;
 import ui.tmlcompd.TMLCPrimitiveComponent;
 import ui.tmlcompd.TMLCPrimitivePort;
@@ -806,6 +807,12 @@ public class TMLModeling<E> {
                     if (port.checkConf && !invalidate){
                         port.checkConfStatus = r;
                         port.mappingName= mappingName;
+                        //Add Result Trace also
+                        ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace();
+                        if (trace !=null){
+                        	port.setResultTrace(trace);
+                        	port.setPragmaString(pragma.toString());
+                        }
                     }
                 }
             }
@@ -857,14 +864,16 @@ public class TMLModeling<E> {
                 }
             }*/
         }
+        //
     }
 	public TGComponent getTGComponent(){
 		return (TGComponent) getTasks().get(0).getReferenceObject();
 	}
 
 
-    public void backtraceAuthenticity(Map<AvatarPragmaAuthenticity, ProVerifQueryAuthResult> authenticityResults, String mappingName) {
+    public void backtraceAuthenticity(ProVerifOutputAnalyzer pvoa, String mappingName) {
         //        TraceManager.addDev("Backtracing Authenticity");
+        Map<AvatarPragmaAuthenticity, ProVerifQueryAuthResult> authenticityResults = pvoa.getAuthenticityResults();
         for (AvatarPragmaAuthenticity pragma: authenticityResults.keySet()) {
             ProVerifQueryAuthResult result = authenticityResults.get(pragma);
             // TODO: deal directly with pragma instead of s
@@ -885,6 +894,11 @@ public class TMLModeling<E> {
                         if (port.checkAuth){
                             port.checkStrongAuthStatus = 3;
                             port.mappingName= mappingName;
+                            ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace();
+                        	if (trace !=null){
+                        		port.setResultTrace(trace);
+                        		port.setPragmaString(pragma.toString());
+                        	}
                         }
                     }
                 }
@@ -932,6 +946,11 @@ public class TMLModeling<E> {
                                     port.checkStrongAuthStatus = 3;
                                     TraceManager.addDev("not verified " + signalName);
                                     port.secName= signalName;
+                                    ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace();
+                        			if (trace !=null){
+                        				port.setResultTrace(trace);
+                        				port.setPragmaString(pragma.toString());
+                        			}
                                 }
                             }
                         }
@@ -958,6 +977,11 @@ public class TMLModeling<E> {
                                     if (port.checkAuth){
                                         port.checkWeakAuthStatus = 3;
                                         port.secName= signalName;
+                                        ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace();
+                        				if (trace !=null){
+                        					port.setResultTrace(trace);
+                        					port.setPragmaString(pragma.toString());
+  					                      }
                                     }
                                 }
                             }
@@ -976,7 +1000,12 @@ public class TMLModeling<E> {
                             if (port.checkAuth){
                                 port.checkWeakAuthStatus = 2;
                                 port.mappingName= mappingName;
-                            }
+                                ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace();
+                        		if (trace !=null){
+                        			port.setResultTrace(trace);
+                        			port.setPragmaString(pragma.toString());
+                        		}
+	                        }
                         }
                     }
                     signalName = s.split("_reqData")[0];
@@ -1028,6 +1057,11 @@ public class TMLModeling<E> {
                                     if (port.checkAuth){
                                         port.checkWeakAuthStatus = 2;
                                         port.secName= signalName;
+                                        ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace();
+                        				if (trace !=null){
+                        					port.setResultTrace(trace);
+                				        	port.setPragmaString(pragma.toString());
+ 				                       }
                                     }
                                 }
                             }
@@ -1054,6 +1088,11 @@ public class TMLModeling<E> {
                                         if (port.checkAuth){
                                             port.checkWeakAuthStatus = 2;
                                             port.secName= signalName;
+                                            ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace();
+                       						if (trace !=null){
+                        						port.setResultTrace(trace);
+                        						port.setPragmaString(pragma.toString());
+                        					}
                                         }
                                     }
                                 }
@@ -1076,6 +1115,11 @@ public class TMLModeling<E> {
                         if (port.checkAuth){
                             port.checkStrongAuthStatus = 2;
                             port.mappingName= mappingName;
+                            ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace();
+                        	if (trace !=null){
+                        		port.setResultTrace(trace);
+                        		port.setPragmaString(pragma.toString());
+                        	}
                         }
                     }
                 }
@@ -1128,9 +1172,14 @@ public class TMLModeling<E> {
                         if (channel!=null){
                             for (TMLCPrimitivePort port:channel.ports){
                              //   TraceManager.addDev("adding to port " + channelName);
-                                if (port.checkAuth){
+                            	if (port.checkAuth){
                                     port.checkStrongAuthStatus = 2;
                                     port.secName= signalName;
+                                    ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace();
+                        			if (trace !=null){
+                        				port.setResultTrace(trace);
+                        				port.setPragmaString(pragma.toString());
+                        			}
                                 }
                             }
                         }
@@ -1158,6 +1207,11 @@ public class TMLModeling<E> {
                                     if (port.checkAuth){
                                         port.checkStrongAuthStatus = 2;
                                         port.secName= signalName;
+                        				ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace();
+                        				if (trace !=null){
+                        					port.setResultTrace(trace);
+                        					port.setPragmaString(pragma.toString());
+                        				}                                        
                                     }
                                 }
                             }
@@ -1181,6 +1235,8 @@ public class TMLModeling<E> {
                     port.checkStrongAuthStatus = 1;
                     port.checkWeakAuthStatus=1;
                 }
+                port.setResultTrace(null);
+                port.setPragmaString("");
             }
         }
         for (TMLRequest req: getRequests()){
diff --git a/src/main/java/tmltranslator/toavatar/TML2Avatar.java b/src/main/java/tmltranslator/toavatar/TML2Avatar.java
index f82f2a6bde..945c824752 100644
--- a/src/main/java/tmltranslator/toavatar/TML2Avatar.java
+++ b/src/main/java/tmltranslator/toavatar/TML2Avatar.java
@@ -1481,7 +1481,7 @@ public class TML2Avatar {
             this.avspec = new AvatarSpecification("spec", null);
         }
         attrsToCheck.clear();
-        //tmlmodel.removeForksAndJoins();
+        tmlmodel.removeForksAndJoins();
         //Only set the loop limit if it's a number
         String pattern = "^[0-9]{1,2}$";
         Pattern r = Pattern.compile(pattern);
diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java
index ec035b63bf..af83b0ad73 100644
--- a/src/main/java/ui/GTURTLEModeling.java
+++ b/src/main/java/ui/GTURTLEModeling.java
@@ -1712,7 +1712,7 @@ memloop:
 			} else if (tmap != null) {
 				t2a = new TML2Avatar(tmap, false, true);
 				avatarspec = t2a.generateAvatarSpec(loopLimit);
-				// drawPanel(avatarspec, mgui.getFirstAvatarDesignPanelFound());
+			//	drawPanel(avatarspec, mgui.getFirstAvatarDesignPanelFound());
 
 			} else if (tmlm != null) {
 				//Generate default mapping
diff --git a/src/main/java/ui/MainGUI.java b/src/main/java/ui/MainGUI.java
index bf3fd49ab2..8d624c4a52 100644
--- a/src/main/java/ui/MainGUI.java
+++ b/src/main/java/ui/MainGUI.java
@@ -4469,12 +4469,12 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Per
             gtm.getTMLMapping().getTMLModeling().clearBacktracing();
             gtm.getTMLMapping().getTMLModeling().backtrace(pvoa, getTabName(tp));
             gtm.getTML2Avatar().backtraceReachability(pvoa.getReachabilityResults());
-            gtm.getTMLMapping().getTMLModeling().backtraceAuthenticity(pvoa.getAuthenticityResults(), getTabName(tp));
+            gtm.getTMLMapping().getTMLModeling().backtraceAuthenticity(pvoa, getTabName(tp));
         } else if (tp instanceof TMLComponentDesignPanel) {
             gtm.getTMLMapping().getTMLModeling().clearBacktracing();
             gtm.getTMLMapping().getTMLModeling().backtrace(pvoa, "Default Mapping");
             gtm.getTML2Avatar().backtraceReachability(pvoa.getReachabilityResults());
-            gtm.getTMLMapping().getTMLModeling().backtraceAuthenticity(pvoa.getAuthenticityResults(), "Default Mapping");
+            gtm.getTMLMapping().getTMLModeling().backtraceAuthenticity(pvoa, "Default Mapping");
         }
         return;
     }
diff --git a/src/main/java/ui/TDiagramPanel.java b/src/main/java/ui/TDiagramPanel.java
index 249f3f5e6e..832e888d50 100755
--- a/src/main/java/ui/TDiagramPanel.java
+++ b/src/main/java/ui/TDiagramPanel.java
@@ -65,6 +65,7 @@ import ui.syscams.SysCAMSRecordComponent;
 import ui.tmlcd.TMLTaskOperator;
 import ui.tmlcompd.TMLCCompositeComponent;
 import ui.tmlcompd.TMLCPrimitiveComponent;
+import ui.tmlcompd.TMLCPrimitivePort;
 import ui.tmlcompd.TMLCRecordComponent;
 import ui.window.JDialogCode;
 import ui.window.JDialogNote;
@@ -131,6 +132,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
     protected JMenuItem remove, edit, clone, bringFront, bringBack, makeSquare, setJavaCode, removeJavaCode, setInternalComment, removeInternalComment, attach, detach, hide, unhide, search, enableDisable, setAsCryptoBlock, setAsRegularBlock;
     protected JMenuItem checkAccessibility, checkInvariant, checkMasterMutex, checkLatency;
     protected JMenuItem gotoReference;
+    protected JMenuItem showProVerifTrace;
     protected JMenuItem breakpoint;
     protected JMenuItem paste, insertLibrary, upX, upY, downX, downY, fitToContent, backToMainDiagram;
     protected JMenuItem cut, copy, saveAsLibrary, captureSelected;
@@ -1454,6 +1456,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         componentMenu.add(checkInvariant);
         componentMenu.add(checkLatency);
         componentMenu.add(gotoReference);
+        componentMenu.add(showProVerifTrace);
         componentMenu.add(checkMasterMutex);
         componentMenu.add(breakpoint);
 
@@ -1569,6 +1572,9 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
 
         gotoReference = new JMenuItem("Go to reference");
         gotoReference.addActionListener(menuAL);
+        
+        showProVerifTrace= new JMenuItem("Show ProVerif Trace");
+        showProVerifTrace.addActionListener(menuAL);
 
         search = new JMenuItem("External Search");
         search.addActionListener(menuAL);
@@ -1848,7 +1854,13 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
 
             }
         }
-
+        
+        if (e.getSource() == showProVerifTrace) {
+        	if (componentPopup instanceof TMLCPrimitivePort){
+        		((TMLCPrimitivePort) componentPopup).showTrace();
+        	}
+        }
+        
         if (e.getSource() == checkMasterMutex) {
 
             if (componentPopup instanceof CheckableInvariant) {
@@ -2101,6 +2113,13 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
             gotoReference.setEnabled(false);
 
         }
+        
+        if (componentPointed instanceof TMLCPrimitivePort){
+        	showProVerifTrace.setEnabled(true);
+        } else {
+        	showProVerifTrace.setEnabled(false);
+        }
+        
 
         if (componentPointed instanceof CheckableInvariant) {
             checkInvariant.setEnabled(true);
diff --git a/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java b/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java
index 9cca0d125a..88098c5904 100755
--- a/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java
+++ b/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java
@@ -905,7 +905,7 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS
 
         // Latencies
         latencyPanel = new JPanel();
-        infoTab.addTab("Latencies", IconManager.imgic1202, latencyPanel, "Latencies");
+        infoTab.addTab("Latencies", IconManager.imgic1202, new JScrollPane(latencyPanel), "Latencies");
         GridBagLayout gridbag0 = new GridBagLayout();
         GridBagConstraints c0 = new GridBagConstraints();
         latencyPanel.setLayout(gridbag0);
@@ -955,8 +955,8 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS
         ((latTable.getColumnModel()).getColumn(3)).setPreferredWidth(100);
         ((latTable.getColumnModel()).getColumn(4)).setPreferredWidth(100);
         ((latTable.getColumnModel()).getColumn(5)).setPreferredWidth(100);
-        latTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
-        jspLatency = new JScrollPane(latTable);
+      //  latTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+        jspLatency = new JScrollPane(latTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
         jspLatency.setWheelScrollingEnabled(true);
         jspLatency.getVerticalScrollBar().setUnitIncrement(10);
         jspLatency.setMinimumSize(new Dimension(1200, 100));
diff --git a/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java b/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
index 6137d19b9e..0280a3ee7f 100755
--- a/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
+++ b/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
@@ -932,7 +932,7 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
         GridBagLayout gridbag0 = new GridBagLayout();
         GridBagConstraints c0 = new GridBagConstraints();
         latencyPanel.setLayout(gridbag0);
-        infoTab.addTab("Latency", null, latencyPanel, "Latency Measurements");
+        infoTab.addTab("Latency", null, new JScrollPane(latencyPanel), "Latency Measurements");
         c0.gridwidth = GridBagConstraints.REMAINDER;
 		latencyPanel.add(new JLabel("Latencies shown in number of cycles relative to the main clock"), c0);
 
@@ -1875,6 +1875,7 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
                             //                                  for (int i=0; i<elt.getAttributes().getLength(); i++){
                             //                                                  
                             //                                                  }
+                        //    System.out.println("element " + elt);
                             id = null;
                             name = null;
                             command = null;
@@ -1994,7 +1995,7 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
                         }
 
                         if (elt.getTagName().compareTo(SIMULATION_TRANS) == 0) {
-
+							//System.out.println("EL " + elt.getAttribute("messageid"));
                             SimulationTransaction st = new SimulationTransaction();
                             st.nodeType = elt.getAttribute("deviceid");
 
diff --git a/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java b/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java
index 7bff1cfa02..087baf4e4f 100755
--- a/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java
+++ b/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java
@@ -59,6 +59,18 @@ import ui.tmlad.TMLADNotifiedEvent;
 import ui.tmldd.TMLArchiCPNode;
 import ui.tmldd.TMLArchiPortArtifact;
 
+import proverifspec.ProVerifResultTrace;
+import proverifspec.ProVerifResultTraceStep;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import ui.interactivesimulation.JFrameSimulationSDPanel;
+
 import javax.swing.*;
 import java.awt.*;
 import java.util.Vector;
@@ -108,14 +120,22 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent
     public static int TOCHECK = 1;
     public static int CHECKED_CONF = 2;
     public static int CHECKED_UNCONF = 3;
+        
+    //ProVerifTrace
+    String pragma;
+    ProVerifResultTrace resTrace;
+    
 
     public String mappingName="???";
     protected int decPoint = 3;
 
+
     protected boolean conflict = false;
     protected String conflictMessage;
     protected String dataFlowType = "VOID";
     protected String associatedEvent = "VOID";
+    
+
 
     public int verification;
     
@@ -454,6 +474,8 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent
             g.drawRect(x-lockwidth*3/2, y+lockheight/2+yoffset, lockwidth, lockheight);
         }
     }
+    
+    
 
     public void manageMove() {
         //
@@ -624,8 +646,43 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent
 
         ((TMLComponentTaskDiagramPanel)tdp).updatePorts();
 
+
         return true;
     }
+    
+    public void showTrace(){
+    	//Show Result trace
+		PipedOutputStream pos = new PipedOutputStream();
+        try {
+        	PipedInputStream pis = new PipedInputStream(pos, 4096);
+            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(pos));
+
+            JFrameSimulationSDPanel jfssdp = new JFrameSimulationSDPanel(null, tdp.getMGUI(), pragma);
+            jfssdp.setIconImage(IconManager.img8);
+            GraphicLib.centerOnParent(jfssdp, 600, 600);
+            jfssdp.setFileReference(new BufferedReader(new InputStreamReader(pis)));
+            jfssdp.setVisible(true);
+                        //jfssdp.setModalExclusionType(ModalExclusionType
+                          //      .APPLICATION_EXCLUDE);
+            jfssdp.toFront();
+
+                        // TraceManager.addDev("\n--- Trace ---");
+            int i = 0;
+            for (ProVerifResultTraceStep step : resTrace.getTrace()) {
+            	step.describeAsTMLSDTransaction(bw, i);
+                i++;
+            }
+            bw.close();
+        } catch (IOException e) {
+        	TraceManager.addDev("Error when writing trace step SD transaction");
+        } finally {
+        	try {
+        		pos.close();
+            } catch (IOException ignored) {
+        	}
+        }
+
+    }
 
     protected String translateExtraParam() {
         TType a;
@@ -966,6 +1023,14 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent
         }
         return true;
     }
+    
+    public void setResultTrace(ProVerifResultTrace trace){
+    	resTrace = trace;
+    }
+
+	public void setPragmaString(String str){
+		pragma=str;
+	}
 
     public void setPortName(String s) {
         for (TURTLEPanel tp : tdp.getMainGUI().tabs) {
-- 
GitLab