diff --git a/src/main/java/ai/AIDiagramCoherency.java b/src/main/java/ai/AIDiagramCoherency.java index 5573fc73fe3bf01b260ac717034da222483c1636..993dd13a02d4aa4e6f5b8e96cd130ad95b8ef76b 100644 --- a/src/main/java/ai/AIDiagramCoherency.java +++ b/src/main/java/ai/AIDiagramCoherency.java @@ -57,7 +57,8 @@ public class AIDiagramCoherency extends AIInteract { private static String KNOWLEDGE_ON_JSON_FOR_INCOHERENCIES = "When you are asked to identify all the relevant incoherencies between two " + "diagrams," + " return them as a JSON specification formatted as follows:" + - "{incoherencies: [{ \"description\": \"description of the incoherency\"...]}" + "{incoherencies: [{ \"diagram\" : \"diagram1 or diagram2\", \"description\": \"description of the incoherency\"}..." + + "]}" ; diff --git a/src/main/java/ai/AISoftwareBlock.java b/src/main/java/ai/AISoftwareBlock.java index 39c3c2a11c368455d5e8533d8c8ec318fc59d1af..3915eba4fa6ab877322c594cd464816b3dbff62f 100644 --- a/src/main/java/ai/AISoftwareBlock.java +++ b/src/main/java/ai/AISoftwareBlock.java @@ -144,7 +144,7 @@ public class AISoftwareBlock extends AIInteract { } if ((errors != null) && (errors.size() > 0)) { - questionT = "Your answer was not correct because of the following errors:"; + questionT = "Update your answer because your answer has the following errors:"; for (String s : errors) { questionT += "\n- " + s; } diff --git a/src/main/java/ai/AIUseCaseDiagram.java b/src/main/java/ai/AIUseCaseDiagram.java index b530b5e7b364189828ce6c0cd92484faba525352..1fa761115c741f26d832950db005d878b2386b80 100644 --- a/src/main/java/ai/AIUseCaseDiagram.java +++ b/src/main/java/ai/AIUseCaseDiagram.java @@ -76,14 +76,15 @@ public class AIUseCaseDiagram extends AIInteract { "# Respect: each use case must start with a verb describing the point of view of the system. " + "# Respect: Any identifier of use cases must not contain any space. Use \"_\" instead."; + public static String KNOWLEDGE_ON_JSON_FOR_CONNECTIONS = "When you are asked to identify connections between use cases and actors, " + "return them as a JSON specification " + "formatted as follows:" + "{connections: [{ \"element1\": \"usecase or actor name\", \"element2\": \"usecase or actor name\" ...]} " + "# Respect: two actors cannot be connected together. " + "# Respect: only include relations are supported between use cases" + - "# Respect: in an include relation, the use case including the other one must be \"element1\" in the json" - ; + "# Respect: in an include relation, the use case including the other one must be \"element1\" in the json" + + "# Respect: All actors must be connected to at least one use case"; @@ -162,6 +163,7 @@ public class AIUseCaseDiagram extends AIInteract { ad = getConnections(json, errors); TraceManager.addDev("Obtained use case diagram: " + ad.toString()); + TraceManager.addDev("" + errors.size() + " errors found"); /*specification = AvatarSpecification.fromJSON(json, "design", null, true); if (specification != null) { specification.addSignalsAndConnection(specification0); @@ -282,6 +284,7 @@ public class AIUseCaseDiagram extends AIInteract { ad.addAllUseCases(namesOfUseCases); _errors.addAll(ad.makeConnectionsFromJson(_spec)); + return ad; } diff --git a/src/main/java/avatartranslator/AvatarBlock.java b/src/main/java/avatartranslator/AvatarBlock.java index 5d77ff15976147ad6a8836b484e5fad76bfc46fa..92bed46d2d14315b30f5b9cea6de4ede94563d1b 100644 --- a/src/main/java/avatartranslator/AvatarBlock.java +++ b/src/main/java/avatartranslator/AvatarBlock.java @@ -378,7 +378,7 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne return sb.toString(); } - public String toTextFormat() { + public String toTextFormat(boolean putSMD) { StringBuffer sb = new StringBuffer("block:" + getName() + " \n"); if (getFather() != null) { sb.append(" subblock of: " + getFather().getName() + "\n"); @@ -392,11 +392,14 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne for (AvatarSignal signal : signals) { sb.append(" signal: " + signal.toString() + "\n"); } - if (asm != null) { - sb.append("State machine:\n"); - sb.append(asm.toStringRecursive()); - } else { - sb.append("No state machine"); + + if (putSMD) { + if (asm != null) { + sb.append("State machine:\n"); + sb.append(asm.toStringRecursive()); + } else { + sb.append("No state machine"); + } } return sb.toString(); diff --git a/src/main/java/avatartranslator/AvatarSpecification.java b/src/main/java/avatartranslator/AvatarSpecification.java index 2e7e65dd44bf4013986ced4059982d62e98ae88c..1edc4a6ca960045b773ab24edd61ac03bf3745c9 100644 --- a/src/main/java/avatartranslator/AvatarSpecification.java +++ b/src/main/java/avatartranslator/AvatarSpecification.java @@ -817,12 +817,12 @@ public class AvatarSpecification extends AvatarElement implements IBSParamSpec { return sb.toString(); } - public String toTextFormat() { + public String toTextFormat(boolean putSMD, boolean putPragmas, boolean putConstants) { //Thread.currentThread().dumpStack(); StringBuffer sb = new StringBuffer("Blocks:\n"); //TraceManager.addDev("TS Block"); for (AvatarBlock block : blocks) { - sb.append("*** " + block.toTextFormat() + "\n"); + sb.append("*** " + block.toTextFormat(putSMD) + "\n"); } //TraceManager.addDev("TS Relations"); @@ -830,12 +830,17 @@ public class AvatarSpecification extends AvatarElement implements IBSParamSpec { for (AvatarRelation relation : relations) { sb.append("\tRelation:" + relation.toString() + "\n"); } - sb.append("\nPragmas:\n"); - for (AvatarPragma pragma : pragmas) { - sb.append("\tPragma:" + pragma.toString() + "\n"); + if (putPragmas) { + sb.append("\nPragmas:\n"); + for (AvatarPragma pragma : pragmas) { + sb.append("\tPragma:" + pragma.toString() + "\n"); + } } - for (AvatarConstant constant : constants) { - sb.append("\tConstant:" + constant.toString() + "\n"); + + if (putConstants) { + for (AvatarConstant constant : constants) { + sb.append("\tConstant:" + constant.toString() + "\n"); + } } //TraceManager.addDev("TS All done"); diff --git a/src/main/java/avatartranslator/avatarucd/AvatarUCDConnection.java b/src/main/java/avatartranslator/avatarucd/AvatarUCDConnection.java index fe6051cbd954ff1586ac96b80ebf31180ef17a4e..26762785238993707c4bf579200a8483fe998af7 100644 --- a/src/main/java/avatartranslator/avatarucd/AvatarUCDConnection.java +++ b/src/main/java/avatartranslator/avatarucd/AvatarUCDConnection.java @@ -70,4 +70,12 @@ public class AvatarUCDConnection extends AvatarElement { super(_name, _name); } + public boolean has(AvatarElement ae) { + return (ae == origin) || (ae == destination); + } + + public boolean hasSameElementsAs(AvatarUCDConnection _conn) { + return has(_conn.origin) &&has(_conn.destination); + } + } diff --git a/src/main/java/avatartranslator/avatarucd/AvatarUseCaseDiagram.java b/src/main/java/avatartranslator/avatarucd/AvatarUseCaseDiagram.java index 29421238005ebae5a186984533980717ccce451f..330f0a0c45f5c2cd27233ffe9f4d0b363e0eb53f 100644 --- a/src/main/java/avatartranslator/avatarucd/AvatarUseCaseDiagram.java +++ b/src/main/java/avatartranslator/avatarucd/AvatarUseCaseDiagram.java @@ -233,6 +233,33 @@ public class AvatarUseCaseDiagram extends AvatarElement { } } + // Check that all actors are connected to at least one use case + for(AvatarActor aa: actors) { + boolean found = false; + for(AvatarUCDConnection conn: connections) { + if (conn.has(aa)) { + found = true; + break; + } + } + if (!found) { + errors.add("Actor \"" + aa.getName() + "\" must be connected to at least one use case"); + } + } + + // Only one connection between the same elements + AvatarUCDConnection c1, c2; + for(int i=0; i<connections.size(); i++) { + c1 = connections.get(i); + for(int j=i+1; j<connections.size(); j++) { + c2 = connections.get(j); + if (c1.hasSameElementsAs(c2)) { + errors.add(c1.getName() + " and " + c2.getName() + " are connected with multiple connections: use only one connection between " + + "the" + + " same elements"); + } + } + } return errors; } @@ -259,6 +286,8 @@ public class AvatarUseCaseDiagram extends AvatarElement { } } + + return sb.toString(); } @@ -390,6 +419,7 @@ public class AvatarUseCaseDiagram extends AvatarElement { return connection; } + } diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java index aaa8d1f222f21ea326c2c14ae76c207314e25c43..cead56b7f5e644a25eb7702addb748b9761e8acf 100644 --- a/src/main/java/ui/GTURTLEModeling.java +++ b/src/main/java/ui/GTURTLEModeling.java @@ -10437,7 +10437,7 @@ public class GTURTLEModeling { } else if (_tdp instanceof AvatarBDPanel) { if (avatarspec != null) { - return avatarspec.toTextFormat(); + return avatarspec.toTextFormat(false, false, false); } } diff --git a/src/main/java/ui/window/JFrameAI.java b/src/main/java/ui/window/JFrameAI.java index 8cd4c935b233aa6618e668b2087e16613fa58966..1e2aa1a62b2912296449b89f9f49b939c34b577c 100644 --- a/src/main/java/ui/window/JFrameAI.java +++ b/src/main/java/ui/window/JFrameAI.java @@ -59,10 +59,7 @@ import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; +import java.awt.event.*; import java.util.ArrayList; import java.util.HashMap; @@ -223,18 +220,19 @@ public class JFrameAI extends JFrame implements ActionListener { JPanel questionPanel = new JPanel(new BorderLayout()); questionPanel.setBorder(new javax.swing.border.TitledBorder("Question")); - questionPanel.setPreferredSize(new Dimension(450, 550)); + //questionPanel.setMinimumSize(new Dimension(450, 550)); + question = new JTextPane(); //question.setPreferredSize(new Dimension(400, 500)); setOptionsJTextPane(question, true); JScrollPane scrollPane = new JScrollPane(question); - scrollPane.setPreferredSize(new Dimension(420, 500)); + //scrollPane.setMinimumSize(new Dimension(420, 500)); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); questionPanel.add(scrollPane, BorderLayout.CENTER); JPanel answerPanel = new JPanel(new BorderLayout()); answerPanel.setBorder(new javax.swing.border.TitledBorder("Answer")); - answerPanel.setPreferredSize(new Dimension(550, 550)); + //answerPanel.setMinimumSize(new Dimension(550, 550)); answerPane = new JTabbedPane(); answerPane.addChangeListener(new ChangeListener() { @Override @@ -245,7 +243,7 @@ public class JFrameAI extends JFrame implements ActionListener { }); ; answerPane.addMouseListener(new JFrameAI.PopupListener(this)); - answerPane.setPreferredSize(new Dimension(500, 500)); + //answerPane.setMinimumSize(new Dimension(500, 500)); addChat(getChatName()); answerPanel.add(answerPane, BorderLayout.CENTER); @@ -255,14 +253,26 @@ public class JFrameAI extends JFrame implements ActionListener { //console.setPreferredSize(new Dimension(900, 150)); inform("Select options and click on \"start\"\n"); scrollPane = new JScrollPane(console); - scrollPane.setPreferredSize(new Dimension(900, 150)); + //scrollPane.setMinimumSize(new Dimension(900, 150)); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); consolePanel.add(scrollPane, BorderLayout.CENTER); JPanel middlePanel = new JPanel(new BorderLayout()); - JPanel intermediate = new JPanel(); - intermediate.add(questionPanel); - intermediate.add(answerPanel); + JSplitPane intermediate = new JSplitPane(); + intermediate.setLeftComponent(questionPanel); + intermediate.setRightComponent(answerPanel); + //intermediate.setDividerLocation(0.5); + + addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + intermediate.setDividerLocation(0.5); + } + }); + + /*JPanel intermediate = new JPanel(new BorderLayout()); + intermediate.add(questionPanel, BorderLayout.WEST); + intermediate.add(answerPanel, BorderLayout.EAST);*/ middlePanel.add(intermediate, BorderLayout.CENTER); middlePanel.add(consolePanel, BorderLayout.SOUTH);