diff --git a/src/main/java/ai/AIUseCaseDiagram.java b/src/main/java/ai/AIUseCaseDiagram.java index e70608eff286e550dacaabc72655f9bf63f33cc9..99a8ff54bf7e0ace2b2eaeeed110408237e02be6 100644 --- a/src/main/java/ai/AIUseCaseDiagram.java +++ b/src/main/java/ai/AIUseCaseDiagram.java @@ -97,14 +97,20 @@ public class AIUseCaseDiagram extends AIInteract { "From the previous JSON and system specification, find the typical connections between actors and use case, " + "and between use cases. Do give them respecting the specified JSON format"}; - public String namesOfActors = ""; - public String namesOfUseCases = ""; - public String connections = ""; + private String namesOfActors = ""; + private String namesOfUseCases = ""; + private String connections = ""; + + private AvatarUseCaseDiagram ad; public AIUseCaseDiagram(AIChatData _chatData) { super(_chatData); } + public AvatarUseCaseDiagram getUseCaseDiagram() { + return ad; + } + public void internalRequest() { int stage = 0; @@ -150,7 +156,9 @@ public class AIUseCaseDiagram extends AIInteract { } else if (stage == 2) { connections = ""; errors = new ArrayList<>(); - connections = getConnections(json, errors); + ad = getConnections(json, errors); + + TraceManager.addDev("Obtained use case diagram: " + ad.toString()); /*specification = AvatarSpecification.fromJSON(json, "design", null, true); if (specification != null) { specification.addSignalsAndConnection(specification0); @@ -206,10 +214,10 @@ public class AIUseCaseDiagram extends AIInteract { public Object applyAnswer(Object input) { if (input == null) { - return specification; + return ad; } - return specification; + return ad; } @@ -262,14 +270,16 @@ public class AIUseCaseDiagram extends AIInteract { AvatarUseCaseDiagram ad = new AvatarUseCaseDiagram("", null); _errors.addAll(ad.makeUseCasesFromJson(_spec)); - return ad.getActorNames(); + return ad.getUseCaseNames(); } - private String getConnections(String _spec, ArrayList<String> _errors) throws org.json.JSONException { + private AvatarUseCaseDiagram getConnections(String _spec, ArrayList<String> _errors) throws org.json.JSONException { AvatarUseCaseDiagram ad = new AvatarUseCaseDiagram("", null); + ad.addAllActors(namesOfActors); + ad.addAllUseCases(namesOfUseCases); _errors.addAll(ad.makeConnectionsFromJson(_spec)); - return ad.getActorNames(); + return ad; } diff --git a/src/main/java/avatartranslator/avatarucd/AvatarUseCaseDiagram.java b/src/main/java/avatartranslator/avatarucd/AvatarUseCaseDiagram.java index dfe2866eb90e5869b6042c5d0f55077a775a8ca4..2f863b272ee6805d6b8ca67eb2c58b7a9ea5be34 100644 --- a/src/main/java/avatartranslator/avatarucd/AvatarUseCaseDiagram.java +++ b/src/main/java/avatartranslator/avatarucd/AvatarUseCaseDiagram.java @@ -147,7 +147,7 @@ public class AvatarUseCaseDiagram extends AvatarElement { errors.add("Usecase #" + i + " has no name"); } else { useCaseName = Conversion.replaceAllString(useCase.getString("name").trim(), " ", ""); - actors.add(new AvatarActor(useCaseName, null)); + useCases.add(new AvatarUseCase(useCaseName, null)); } } @@ -194,8 +194,13 @@ public class AvatarUseCaseDiagram extends AvatarElement { if (elt2 == null) { errors.add("element2 #" + i + " does not exist"); } else { - elt2 = Conversion.replaceAllString(elt2.getString("name").trim(), " ", ""); - + elt2 = Conversion.replaceAllString(elt2.trim(), " ", ""); + // We add the connection + try { + addConnection(elt1, elt2, true); + } catch (AvatarUseCaseDiagramException aucde) { + errors.add(aucde.getMessage()); + } } } } @@ -204,17 +209,29 @@ public class AvatarUseCaseDiagram extends AvatarElement { return errors; } + public void addAllActors(String _actors) { + for(String s: _actors.split(" ")) { + actors.add(new AvatarActor(s, null)); + } + } + + public void addAllUseCases(String _usecases) { + for(String s: _usecases.split(" ")) { + useCases.add(new AvatarUseCase(s, null)); + } + } + public String getActorNames() { StringBuffer sb = new StringBuffer(); for(AvatarActor actor: actors) { if (sb.length() == 0) { sb.append(actor.getName()); } else { - sb.append("" + actor.getName()); + sb.append(" " + actor.getName()); } } - return sb.toString().trim(); + return sb.toString(); } public String getUseCaseNames() { @@ -223,11 +240,35 @@ public class AvatarUseCaseDiagram extends AvatarElement { if (sb.length() == 0) { sb.append(useCase.getName()); } else { - sb.append("" + useCase.getName()); + sb.append(" " + useCase.getName()); } } - return sb.toString().trim(); + return sb.toString(); + } + + public String getConnectionsNames() { + StringBuffer sb = new StringBuffer(); + for(AvatarUCDConnection conn: connections) { + if (sb.length() == 0) { + sb.append("(" + conn.origin.getName() + "," + conn.destination.getName() + ")"); + } else { + sb.append(" (" + conn.origin.getName() + "," + conn.destination.getName() + ")"); + } + } + + return sb.toString(); + } + + + + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("actors: " + getActorNames() + "\n"); + sb.append("Use cases: " + getUseCaseNames() + "\n"); + sb.append("Connections: " + getConnectionsNames() + "\n"); + + return sb.toString(); } public AvatarActor getActorByName(String _name) { @@ -248,6 +289,7 @@ public class AvatarUseCaseDiagram extends AvatarElement { return null; } + public AvatarUCDConnection addConnection(String nameOrigin, String nameDestination, boolean force) throws AvatarUseCaseDiagramException { AvatarActor actor1 = getActorByName(nameOrigin); AvatarActor actor2 = getActorByName(nameDestination); diff --git a/src/main/java/ui/window/JFrameAI.java b/src/main/java/ui/window/JFrameAI.java index e1a93c912d92419b1924dadca4034b433e325122..9d4f01f69c1ea616b320fd25fceb2453a6b911c9 100644 --- a/src/main/java/ui/window/JFrameAI.java +++ b/src/main/java/ui/window/JFrameAI.java @@ -41,6 +41,7 @@ package ui.window; import ai.*; import avatartranslator.AvatarSpecification; +import avatartranslator.avatarucd.AvatarUseCaseDiagram; import common.ConfigurationTTool; import help.HelpEntry; import help.HelpManager; @@ -77,8 +78,8 @@ public class JFrameAI extends JFrame implements ActionListener { private static String[] POSSIBLE_ACTIONS = {"Chat - Chat on any topic you like, or help the AI give a better answer on a previous question", - "Identify requirements - Provide a system specification", "Classify requirements - select a" + - " requirement diagram first", + "Identify requirements - Provide a system specification", + "Classify requirements - select a requirement diagram first", "Identify use cases", "Identify properties - Select a block diagram first. You can also provide a system specification", "Identify system blocks (knowledge type #1) - Provide a system specification", @@ -136,9 +137,9 @@ public class JFrameAI extends JFrame implements ActionListener { mgui = _mgui; chats = new ArrayList<>(); makeComponents(); - - TraceManager.addDev("Selected TDP = " + mgui.getCurrentMainTDiagramPanel().getClass()); - + if (mgui.getCurrentMainTDiagramPanel() != null) { + TraceManager.addDev("Selected TDP = " + mgui.getCurrentMainTDiagramPanel().getClass()); + } } public void setIcon(ChatData _data, Icon newIcon) { @@ -465,7 +466,7 @@ public class JFrameAI extends JFrame implements ActionListener { } else if (selectedChat.aiInteract instanceof ai.AIReqIdent) { applyRequirementIdentification(); } else if (selectedChat.aiInteract instanceof ai.AIUseCaseDiagram) { - applyUseCaseIdentification(); + applyUseCaseIdentification(selectedChat.aiInteract.applyAnswer(null)); } else if (selectedChat.aiInteract instanceof ai.AIReqClassification) { applyRequirementClassification(); } else if (selectedChat.aiInteract instanceof ai.AIDesignPropertyIdentification) { @@ -487,9 +488,9 @@ public class JFrameAI extends JFrame implements ActionListener { applyRequirementClassification(); break; case 3: + applyUseCaseIdentification(selectedChat.aiInteract.applyAnswer(null)); break; case 4: - applyUseCaseIdentification(); break; case 5: applyIdentifySystemBlocks(selectedChat.aiInteract.applyAnswer(null)); @@ -552,7 +553,7 @@ public class JFrameAI extends JFrame implements ActionListener { inform("Enhancing requirement diagram with ai answer: done\n"); } - private void applyUseCaseIdentification() { + private void applyUseCaseIdentification(Object spec) { TDiagramPanel tdp = mgui.getCurrentTDiagramPanel(); if (!(tdp instanceof UseCaseDiagramPanel)) { @@ -560,10 +561,21 @@ public class JFrameAI extends JFrame implements ActionListener { return; } + if (spec == null) { + error("Empty use case diagram generated by AI"); + return; + } + + if (!(spec instanceof AvatarUseCaseDiagram)) { + error("Invalid use case diagram generated by AI"); + return; + } + UseCaseDiagramPanel ucdpanel = (UseCaseDiagramPanel) tdp; + AvatarUseCaseDiagram ad = (AvatarUseCaseDiagram) spec; - inform("Enhancing usecase diagram with ai answer, please wait\n"); - TraceManager.addDev("Considered JSON array: " + selectedChat().lastAnswer); + inform("Drawing use case diagram with ai answer, please wait\n"); + TraceManager.addDev("Considered UCD: " + ad.toString()); /*try { rdpanel.loadAndUpdateFromText(selectedChat().lastAnswer); } catch (org.json.JSONException e) {