From 2cd6cfcc403f1fd088a4ae1c90a109c371843cc2 Mon Sep 17 00:00:00 2001 From: Luis <1105281+lpenap@users.noreply.github.com> Date: Tue, 17 Jun 2025 11:30:44 -0300 Subject: [PATCH 1/9] Add side panel with example buttons --- .../example/constructs/app/ui/MainWindow.java | 81 ++++++++++++++++--- 1 file changed, 68 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java index a112fd3..aa60075 100644 --- a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java +++ b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java @@ -8,6 +8,7 @@ import java.io.IOException; import javax.imageio.ImageIO; +import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; @@ -19,10 +20,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import com.penapereira.example.constructs.app.properties.ApplicationProperties; import com.penapereira.example.constructs.app.properties.Messages; +import com.penapereira.example.constructs.app.ExampleRunnerInterface; @Component public class MainWindow extends JFrame { @@ -36,8 +39,13 @@ public class MainWindow extends JFrame { @Autowired Messages msg; - @Autowired - ApplicationProperties props; + @Autowired + ApplicationProperties props; + + @Autowired + ApplicationContext ctx; + + private java.util.Map examples; public MainWindow() { super(); @@ -73,19 +81,21 @@ private void loadIcon() { private JPanel getMainComponent() { JPanel mainPanel = new JPanel(new BorderLayout()); - JPanel infoPanel = new JPanel(new GridLayout(4, 1)); - createCenteredTitle(msg.getGreeting(), infoPanel); - createCenteredLabelOnPanel(msg.getInfo(), infoPanel); - createCenteredHyperlink(msg.getHomeUrl(), infoPanel); - mainPanel.add(infoPanel, BorderLayout.NORTH); + JPanel infoPanel = new JPanel(new GridLayout(4, 1)); + createCenteredTitle(msg.getGreeting(), infoPanel); + createCenteredLabelOnPanel(msg.getInfo(), infoPanel); + createCenteredHyperlink(msg.getHomeUrl(), infoPanel); + mainPanel.add(infoPanel, BorderLayout.NORTH); - outputArea = new JTextArea(10, 40); - outputArea.setEditable(false); - JScrollPane scrollPane = new JScrollPane(outputArea); - scrollPane.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getOutputTitle())); - mainPanel.add(scrollPane, BorderLayout.CENTER); + mainPanel.add(createExamplesPanel(), BorderLayout.WEST); - return mainPanel; + outputArea = new JTextArea(10, 40); + outputArea.setEditable(false); + JScrollPane scrollPane = new JScrollPane(outputArea); + scrollPane.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getOutputTitle())); + mainPanel.add(scrollPane, BorderLayout.CENTER); + + return mainPanel; } private void createCenteredTitle(String text, JPanel panel) { @@ -117,4 +127,49 @@ public void appendOutput(String text) { } } + private JPanel createExamplesPanel() { + examples = ctx.getBeansOfType(ExampleRunnerInterface.class); + + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getExamplesFound())); + + javax.swing.JButton allButton = new javax.swing.JButton("Run All"); + allButton.addActionListener(e -> runAllExamples()); + panel.add(allButton); + + examples.forEach((name, runner) -> { + String clean = name.replaceFirst("ExampleRunner", ""); + javax.swing.JButton btn = new javax.swing.JButton(clean); + btn.addActionListener(e -> runExample(runner)); + panel.add(btn); + }); + + return panel; + } + + private void runExample(ExampleRunnerInterface runner) { + new Thread(() -> { + try { + log.trace(msg.getSeparator()); + runner.runExample(); + } catch (Exception e) { + log.error("Error executing example", e); + } + }).start(); + } + + private void runAllExamples() { + new Thread(() -> { + examples.values().forEach(r -> { + try { + log.trace(msg.getSeparator()); + r.runExample(); + } catch (Exception e) { + log.error("Error executing example", e); + } + }); + }).start(); + } + } From 6cd4b94c9447667717187fbbf2ba909305650439 Mon Sep 17 00:00:00 2001 From: Luis <1105281+lpenap@users.noreply.github.com> Date: Tue, 17 Jun 2025 12:46:21 -0300 Subject: [PATCH 2/9] feat: add preserve log checkbox --- .../constructs/app/properties/Messages.java | 1 + .../example/constructs/app/ui/MainWindow.java | 19 +++++++++++++++++-- src/main/resources/application.properties | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java b/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java index 3c46b0a..7d89040 100644 --- a/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java +++ b/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java @@ -19,4 +19,5 @@ public class Messages { protected String enableDebugToSeeExamplesList; protected String separator; protected String outputTitle; + protected String preserveLog; } diff --git a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java index aa60075..aed7bfe 100644 --- a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java +++ b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java @@ -15,6 +15,7 @@ import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JTextArea; +import javax.swing.JCheckBox; import javax.swing.SwingConstants; import org.slf4j.Logger; @@ -34,7 +35,8 @@ public class MainWindow extends JFrame { private static final long serialVersionUID = 1L; - private JTextArea outputArea; + private JTextArea outputArea; + private JCheckBox preserveLogCheck; @Autowired Messages msg; @@ -93,7 +95,14 @@ private JPanel getMainComponent() { outputArea.setEditable(false); JScrollPane scrollPane = new JScrollPane(outputArea); scrollPane.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getOutputTitle())); - mainPanel.add(scrollPane, BorderLayout.CENTER); + + preserveLogCheck = new JCheckBox(msg.getPreserveLog()); + + JPanel outputPanel = new JPanel(new BorderLayout()); + outputPanel.add(preserveLogCheck, BorderLayout.NORTH); + outputPanel.add(scrollPane, BorderLayout.CENTER); + + mainPanel.add(outputPanel, BorderLayout.CENTER); return mainPanel; } @@ -149,6 +158,9 @@ private JPanel createExamplesPanel() { } private void runExample(ExampleRunnerInterface runner) { + if (!preserveLogCheck.isSelected()) { + outputArea.setText(""); + } new Thread(() -> { try { log.trace(msg.getSeparator()); @@ -160,6 +172,9 @@ private void runExample(ExampleRunnerInterface runner) { } private void runAllExamples() { + if (!preserveLogCheck.isSelected()) { + outputArea.setText(""); + } new Thread(() -> { examples.values().forEach(r -> { try { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5fb1a0c..5544824 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -19,5 +19,6 @@ msg.examplesFound=Implemented examples found msg.enableTraceToSeeExamplesDetails= [*] Please enable TRACE log level if you want to see examples output msg.enableDebugToSeeExamplesList= [*] Please enable DEBUG log level if you want to see the examples list msg.outputTitle=Output +msg.preserveLog=Preserve log msg.separator=------------------------------------------------------------- \ No newline at end of file From 7a34a84d5dfa633ab4c41e4dacf55ac00c6c7d98 Mon Sep 17 00:00:00 2001 From: Luis <1105281+lpenap@users.noreply.github.com> Date: Tue, 17 Jun 2025 12:48:49 -0300 Subject: [PATCH 3/9] Remove binary image for chain of responsibility --- README.md | 1 + .../AbstractHandler.java | 18 +++++++++++ .../ChainOfResponsibilityExampleRunner.java | 30 +++++++++++++++++++ .../chainofresponsibility/Handler.java | 6 ++++ .../NegativeHandler.java | 11 +++++++ .../PositiveHandler.java | 11 +++++++ .../chainofresponsibility/README.md | 23 ++++++++++++++ .../chainofresponsibility/ZeroHandler.java | 11 +++++++ ...ainOfResponsibilityExampleRunnerTests.java | 10 +++++++ .../chainofresponsibility/ChainTests.java | 20 +++++++++++++ 10 files changed, 141 insertions(+) create mode 100644 src/main/java/com/penapereira/example/constructs/chainofresponsibility/AbstractHandler.java create mode 100644 src/main/java/com/penapereira/example/constructs/chainofresponsibility/ChainOfResponsibilityExampleRunner.java create mode 100644 src/main/java/com/penapereira/example/constructs/chainofresponsibility/Handler.java create mode 100644 src/main/java/com/penapereira/example/constructs/chainofresponsibility/NegativeHandler.java create mode 100644 src/main/java/com/penapereira/example/constructs/chainofresponsibility/PositiveHandler.java create mode 100644 src/main/java/com/penapereira/example/constructs/chainofresponsibility/README.md create mode 100644 src/main/java/com/penapereira/example/constructs/chainofresponsibility/ZeroHandler.java create mode 100644 src/test/java/com/penapereira/example/constructs/chainofresponsibility/ChainOfResponsibilityExampleRunnerTests.java create mode 100644 src/test/java/com/penapereira/example/constructs/chainofresponsibility/ChainTests.java diff --git a/README.md b/README.md index d046e0c..59c44f8 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ cd java-patterns-and-constructs ### Patterns * [Abstract Factory](src/main/java/com/penapereira/example/constructs/abstractfactory/) * [Adapter](src/main/java/com/penapereira/example/constructs/adapter/) +* [Chain of Responsibility](src/main/java/com/penapereira/example/constructs/chainofresponsibility/) * [Decorator](src/main/java/com/penapereira/example/constructs/decorator/) * [Factory](src/main/java/com/penapereira/example/constructs/factory/) * [Factory Method](src/main/java/com/penapereira/example/constructs/factorymethod/) diff --git a/src/main/java/com/penapereira/example/constructs/chainofresponsibility/AbstractHandler.java b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/AbstractHandler.java new file mode 100644 index 0000000..df48194 --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/AbstractHandler.java @@ -0,0 +1,18 @@ +package com.penapereira.example.constructs.chainofresponsibility; + +public abstract class AbstractHandler implements Handler { + private Handler next; + + @Override + public void setNext(Handler next) { + this.next = next; + } + + @Override + public String handle(int request) { + if (next != null) { + return next.handle(request); + } + return "unhandled"; + } +} diff --git a/src/main/java/com/penapereira/example/constructs/chainofresponsibility/ChainOfResponsibilityExampleRunner.java b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/ChainOfResponsibilityExampleRunner.java new file mode 100644 index 0000000..e2b2f4c --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/ChainOfResponsibilityExampleRunner.java @@ -0,0 +1,30 @@ +package com.penapereira.example.constructs.chainofresponsibility; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import com.penapereira.example.constructs.app.ExampleRunnerInterface; + +@Component +public class ChainOfResponsibilityExampleRunner implements ExampleRunnerInterface { + + private static final Logger log = LoggerFactory.getLogger(ChainOfResponsibilityExampleRunner.class); + + @Override + public void runExample() throws Exception { + log.trace("Executing Chain of Responsibility Pattern Implementation"); + + Handler negative = new NegativeHandler(); + Handler zero = new ZeroHandler(); + Handler positive = new PositiveHandler(); + + negative.setNext(zero); + zero.setNext(positive); + + int[] requests = { -1, 0, 1 }; + for (int r : requests) { + log.trace(" " + r + " is " + negative.handle(r)); + } + } +} diff --git a/src/main/java/com/penapereira/example/constructs/chainofresponsibility/Handler.java b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/Handler.java new file mode 100644 index 0000000..fecec82 --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/Handler.java @@ -0,0 +1,6 @@ +package com.penapereira.example.constructs.chainofresponsibility; + +public interface Handler { + void setNext(Handler next); + String handle(int request); +} diff --git a/src/main/java/com/penapereira/example/constructs/chainofresponsibility/NegativeHandler.java b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/NegativeHandler.java new file mode 100644 index 0000000..d915f05 --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/NegativeHandler.java @@ -0,0 +1,11 @@ +package com.penapereira.example.constructs.chainofresponsibility; + +public class NegativeHandler extends AbstractHandler { + @Override + public String handle(int request) { + if (request < 0) { + return "negative"; + } + return super.handle(request); + } +} diff --git a/src/main/java/com/penapereira/example/constructs/chainofresponsibility/PositiveHandler.java b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/PositiveHandler.java new file mode 100644 index 0000000..4f928f8 --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/PositiveHandler.java @@ -0,0 +1,11 @@ +package com.penapereira.example.constructs.chainofresponsibility; + +public class PositiveHandler extends AbstractHandler { + @Override + public String handle(int request) { + if (request > 0) { + return "positive"; + } + return super.handle(request); + } +} diff --git a/src/main/java/com/penapereira/example/constructs/chainofresponsibility/README.md b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/README.md new file mode 100644 index 0000000..3953a2c --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/README.md @@ -0,0 +1,23 @@ +# Chain of Responsibility Pattern + +The chain of responsibility pattern passes a request along a chain of handlers until one of them deals with it. + +## Class diagram + + +```plantuml +@startuml +interface Handler { + +setNext(h) + +handle(request) +} +abstract class AbstractHandler implements Handler { + -next : Handler +} +class NegativeHandler extends AbstractHandler +class ZeroHandler extends AbstractHandler +class PositiveHandler extends AbstractHandler +Handler <|.. AbstractHandler +AbstractHandler --> Handler : next +@enduml +``` diff --git a/src/main/java/com/penapereira/example/constructs/chainofresponsibility/ZeroHandler.java b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/ZeroHandler.java new file mode 100644 index 0000000..0381f77 --- /dev/null +++ b/src/main/java/com/penapereira/example/constructs/chainofresponsibility/ZeroHandler.java @@ -0,0 +1,11 @@ +package com.penapereira.example.constructs.chainofresponsibility; + +public class ZeroHandler extends AbstractHandler { + @Override + public String handle(int request) { + if (request == 0) { + return "zero"; + } + return super.handle(request); + } +} diff --git a/src/test/java/com/penapereira/example/constructs/chainofresponsibility/ChainOfResponsibilityExampleRunnerTests.java b/src/test/java/com/penapereira/example/constructs/chainofresponsibility/ChainOfResponsibilityExampleRunnerTests.java new file mode 100644 index 0000000..377bb62 --- /dev/null +++ b/src/test/java/com/penapereira/example/constructs/chainofresponsibility/ChainOfResponsibilityExampleRunnerTests.java @@ -0,0 +1,10 @@ +package com.penapereira.example.constructs.chainofresponsibility; + +import org.junit.jupiter.api.Test; + +class ChainOfResponsibilityExampleRunnerTests { + @Test + void runExampleRuns() throws Exception { + new ChainOfResponsibilityExampleRunner().runExample(); + } +} diff --git a/src/test/java/com/penapereira/example/constructs/chainofresponsibility/ChainTests.java b/src/test/java/com/penapereira/example/constructs/chainofresponsibility/ChainTests.java new file mode 100644 index 0000000..ae4b36d --- /dev/null +++ b/src/test/java/com/penapereira/example/constructs/chainofresponsibility/ChainTests.java @@ -0,0 +1,20 @@ +package com.penapereira.example.constructs.chainofresponsibility; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class ChainTests { + @Test + void chainProcessesNumbers() { + Handler negative = new NegativeHandler(); + Handler zero = new ZeroHandler(); + Handler positive = new PositiveHandler(); + negative.setNext(zero); + zero.setNext(positive); + + assertEquals("negative", negative.handle(-10)); + assertEquals("zero", negative.handle(0)); + assertEquals("positive", negative.handle(5)); + } +} From 0ac62eb12f7b44e8f9390a9b00ab70f3a3e9d27e Mon Sep 17 00:00:00 2001 From: Luis <1105281+lpenap@users.noreply.github.com> Date: Tue, 17 Jun 2025 11:30:44 -0300 Subject: [PATCH 4/9] Add side panel with example buttons --- .../example/constructs/app/ui/MainWindow.java | 81 ++++++++++++++++--- 1 file changed, 68 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java index a112fd3..aa60075 100644 --- a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java +++ b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java @@ -8,6 +8,7 @@ import java.io.IOException; import javax.imageio.ImageIO; +import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; @@ -19,10 +20,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import com.penapereira.example.constructs.app.properties.ApplicationProperties; import com.penapereira.example.constructs.app.properties.Messages; +import com.penapereira.example.constructs.app.ExampleRunnerInterface; @Component public class MainWindow extends JFrame { @@ -36,8 +39,13 @@ public class MainWindow extends JFrame { @Autowired Messages msg; - @Autowired - ApplicationProperties props; + @Autowired + ApplicationProperties props; + + @Autowired + ApplicationContext ctx; + + private java.util.Map examples; public MainWindow() { super(); @@ -73,19 +81,21 @@ private void loadIcon() { private JPanel getMainComponent() { JPanel mainPanel = new JPanel(new BorderLayout()); - JPanel infoPanel = new JPanel(new GridLayout(4, 1)); - createCenteredTitle(msg.getGreeting(), infoPanel); - createCenteredLabelOnPanel(msg.getInfo(), infoPanel); - createCenteredHyperlink(msg.getHomeUrl(), infoPanel); - mainPanel.add(infoPanel, BorderLayout.NORTH); + JPanel infoPanel = new JPanel(new GridLayout(4, 1)); + createCenteredTitle(msg.getGreeting(), infoPanel); + createCenteredLabelOnPanel(msg.getInfo(), infoPanel); + createCenteredHyperlink(msg.getHomeUrl(), infoPanel); + mainPanel.add(infoPanel, BorderLayout.NORTH); - outputArea = new JTextArea(10, 40); - outputArea.setEditable(false); - JScrollPane scrollPane = new JScrollPane(outputArea); - scrollPane.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getOutputTitle())); - mainPanel.add(scrollPane, BorderLayout.CENTER); + mainPanel.add(createExamplesPanel(), BorderLayout.WEST); - return mainPanel; + outputArea = new JTextArea(10, 40); + outputArea.setEditable(false); + JScrollPane scrollPane = new JScrollPane(outputArea); + scrollPane.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getOutputTitle())); + mainPanel.add(scrollPane, BorderLayout.CENTER); + + return mainPanel; } private void createCenteredTitle(String text, JPanel panel) { @@ -117,4 +127,49 @@ public void appendOutput(String text) { } } + private JPanel createExamplesPanel() { + examples = ctx.getBeansOfType(ExampleRunnerInterface.class); + + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + panel.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getExamplesFound())); + + javax.swing.JButton allButton = new javax.swing.JButton("Run All"); + allButton.addActionListener(e -> runAllExamples()); + panel.add(allButton); + + examples.forEach((name, runner) -> { + String clean = name.replaceFirst("ExampleRunner", ""); + javax.swing.JButton btn = new javax.swing.JButton(clean); + btn.addActionListener(e -> runExample(runner)); + panel.add(btn); + }); + + return panel; + } + + private void runExample(ExampleRunnerInterface runner) { + new Thread(() -> { + try { + log.trace(msg.getSeparator()); + runner.runExample(); + } catch (Exception e) { + log.error("Error executing example", e); + } + }).start(); + } + + private void runAllExamples() { + new Thread(() -> { + examples.values().forEach(r -> { + try { + log.trace(msg.getSeparator()); + r.runExample(); + } catch (Exception e) { + log.error("Error executing example", e); + } + }); + }).start(); + } + } From 9bb615f79d8b73e05fa5978b4b13d9fe159f406c Mon Sep 17 00:00:00 2001 From: Luis <1105281+lpenap@users.noreply.github.com> Date: Tue, 17 Jun 2025 12:46:21 -0300 Subject: [PATCH 5/9] feat: add preserve log checkbox --- .../constructs/app/properties/Messages.java | 1 + .../example/constructs/app/ui/MainWindow.java | 19 +++++++++++++++++-- src/main/resources/application.properties | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java b/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java index 3c46b0a..7d89040 100644 --- a/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java +++ b/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java @@ -19,4 +19,5 @@ public class Messages { protected String enableDebugToSeeExamplesList; protected String separator; protected String outputTitle; + protected String preserveLog; } diff --git a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java index aa60075..aed7bfe 100644 --- a/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java +++ b/src/main/java/com/penapereira/example/constructs/app/ui/MainWindow.java @@ -15,6 +15,7 @@ import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JTextArea; +import javax.swing.JCheckBox; import javax.swing.SwingConstants; import org.slf4j.Logger; @@ -34,7 +35,8 @@ public class MainWindow extends JFrame { private static final long serialVersionUID = 1L; - private JTextArea outputArea; + private JTextArea outputArea; + private JCheckBox preserveLogCheck; @Autowired Messages msg; @@ -93,7 +95,14 @@ private JPanel getMainComponent() { outputArea.setEditable(false); JScrollPane scrollPane = new JScrollPane(outputArea); scrollPane.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.getOutputTitle())); - mainPanel.add(scrollPane, BorderLayout.CENTER); + + preserveLogCheck = new JCheckBox(msg.getPreserveLog()); + + JPanel outputPanel = new JPanel(new BorderLayout()); + outputPanel.add(preserveLogCheck, BorderLayout.NORTH); + outputPanel.add(scrollPane, BorderLayout.CENTER); + + mainPanel.add(outputPanel, BorderLayout.CENTER); return mainPanel; } @@ -149,6 +158,9 @@ private JPanel createExamplesPanel() { } private void runExample(ExampleRunnerInterface runner) { + if (!preserveLogCheck.isSelected()) { + outputArea.setText(""); + } new Thread(() -> { try { log.trace(msg.getSeparator()); @@ -160,6 +172,9 @@ private void runExample(ExampleRunnerInterface runner) { } private void runAllExamples() { + if (!preserveLogCheck.isSelected()) { + outputArea.setText(""); + } new Thread(() -> { examples.values().forEach(r -> { try { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5fb1a0c..5544824 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -19,5 +19,6 @@ msg.examplesFound=Implemented examples found msg.enableTraceToSeeExamplesDetails= [*] Please enable TRACE log level if you want to see examples output msg.enableDebugToSeeExamplesList= [*] Please enable DEBUG log level if you want to see the examples list msg.outputTitle=Output +msg.preserveLog=Preserve log msg.separator=------------------------------------------------------------- \ No newline at end of file From 1a95e021fbf876b26cfa4586a965661ceaa79010 Mon Sep 17 00:00:00 2001 From: Luis <1105281+lpenap@users.noreply.github.com> Date: Tue, 17 Jun 2025 13:54:29 -0300 Subject: [PATCH 6/9] Removing unused imports --- .../example/constructs/decorator/DecoratorExampleRunner.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunner.java b/src/main/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunner.java index 9316a9e..97662bf 100644 --- a/src/main/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunner.java +++ b/src/main/java/com/penapereira/example/constructs/decorator/DecoratorExampleRunner.java @@ -6,8 +6,6 @@ import com.penapereira.example.constructs.app.ExampleRunnerInterface; -import com.penapereira.example.constructs.decorator.ComponentIF; - @Component public class DecoratorExampleRunner implements ExampleRunnerInterface { From d322697b3ddd8daec6e78faa1fc8316a87ab4213 Mon Sep 17 00:00:00 2001 From: Luis <1105281+lpenap@users.noreply.github.com> Date: Tue, 17 Jun 2025 13:55:10 -0300 Subject: [PATCH 7/9] Removing command line runner at the first launch --- .../example/constructs/app/AppCommandLineRunner.java | 6 ++++-- .../constructs/app/ExamplesCommandLineRunner.java | 9 ++++++++- .../constructs/app/properties/ApplicationProperties.java | 2 ++ .../example/constructs/app/properties/Messages.java | 9 +++++---- src/main/resources/application.properties | 6 ++++-- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/penapereira/example/constructs/app/AppCommandLineRunner.java b/src/main/java/com/penapereira/example/constructs/app/AppCommandLineRunner.java index c5842d8..83b4e9d 100644 --- a/src/main/java/com/penapereira/example/constructs/app/AppCommandLineRunner.java +++ b/src/main/java/com/penapereira/example/constructs/app/AppCommandLineRunner.java @@ -23,12 +23,14 @@ public class AppCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { - log.info(msg.getGreeting()); - log.info(msg.getHomeUrl()); EventQueue.invokeLater(() -> { main.initializeFrame(); main.setVisible(true); }); + log.info(msg.getSeparator()); + log.info(msg.getGreeting()); + log.info(msg.getHomeUrl()); + log.info(msg.getInstructions()); } } diff --git a/src/main/java/com/penapereira/example/constructs/app/ExamplesCommandLineRunner.java b/src/main/java/com/penapereira/example/constructs/app/ExamplesCommandLineRunner.java index a90d9ab..902e9b0 100644 --- a/src/main/java/com/penapereira/example/constructs/app/ExamplesCommandLineRunner.java +++ b/src/main/java/com/penapereira/example/constructs/app/ExamplesCommandLineRunner.java @@ -10,6 +10,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; +import com.penapereira.example.constructs.app.properties.ApplicationProperties; import com.penapereira.example.constructs.app.properties.Messages; @Component @@ -23,12 +24,18 @@ public class ExamplesCommandLineRunner implements CommandLineRunner { @Autowired Messages msg; + @Autowired + ApplicationProperties props; + @Override public void run(String... args) throws Exception { List beanNames = Arrays.asList(ctx.getBeanNamesForType(ExampleRunnerInterface.class)); listExamples(beanNames); - executeExamples(beanNames); + + if (props.getEnableCommandLineRunner()) { + executeExamples(beanNames); + } } private void listExamples(List beanNames) { diff --git a/src/main/java/com/penapereira/example/constructs/app/properties/ApplicationProperties.java b/src/main/java/com/penapereira/example/constructs/app/properties/ApplicationProperties.java index c0a59ef..f624d48 100644 --- a/src/main/java/com/penapereira/example/constructs/app/properties/ApplicationProperties.java +++ b/src/main/java/com/penapereira/example/constructs/app/properties/ApplicationProperties.java @@ -20,4 +20,6 @@ public class ApplicationProperties { @Value("classpath:icon.png") protected Resource appIcon; + + protected Boolean enableCommandLineRunner; } diff --git a/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java b/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java index 7d89040..d6bbb3b 100644 --- a/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java +++ b/src/main/java/com/penapereira/example/constructs/app/properties/Messages.java @@ -16,8 +16,9 @@ public class Messages { protected String info; protected String examplesFound; protected String enableTraceToSeeExamplesDetails; - protected String enableDebugToSeeExamplesList; - protected String separator; - protected String outputTitle; - protected String preserveLog; + protected String enableDebugToSeeExamplesList; + protected String separator; + protected String outputTitle; + protected String preserveLog; + protected String instructions; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5544824..5633902 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -7,6 +7,7 @@ app.windowMarginX=50 app.windowMarginY=50 app.linkColor=#0645AD app.linkColorHover=#3366BB +app.enableCommandLineRunner=false # Messages @@ -14,11 +15,12 @@ msg.windowTitle=Java Patterns and Constructs msg.greeting=Welcome to Java Patterns and Constructs msg.info=You can check documentation, examples and diagrams at: msg.homeUrl=https://github.com/lpenap/java-patterns-and-constructs -msg.examplesFound=Implemented examples found +msg.examplesFound=Examples +msg.instructions=To run an example, click on the button for the desired example. msg.enableTraceToSeeExamplesDetails= [*] Please enable TRACE log level if you want to see examples output msg.enableDebugToSeeExamplesList= [*] Please enable DEBUG log level if you want to see the examples list -msg.outputTitle=Output +msg.outputTitle=Logger Output msg.preserveLog=Preserve log msg.separator=------------------------------------------------------------- \ No newline at end of file From 3c5638a5889bc8be1be9806ae3afb075b32d988a Mon Sep 17 00:00:00 2001 From: Luis <1105281+lpenap@users.noreply.github.com> Date: Tue, 17 Jun 2025 14:03:15 -0300 Subject: [PATCH 8/9] Remove showing list of implemented examples on first time command line runner --- .../example/constructs/app/ExamplesCommandLineRunner.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/penapereira/example/constructs/app/ExamplesCommandLineRunner.java b/src/main/java/com/penapereira/example/constructs/app/ExamplesCommandLineRunner.java index 902e9b0..42946c9 100644 --- a/src/main/java/com/penapereira/example/constructs/app/ExamplesCommandLineRunner.java +++ b/src/main/java/com/penapereira/example/constructs/app/ExamplesCommandLineRunner.java @@ -30,10 +30,9 @@ public class ExamplesCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { List beanNames = Arrays.asList(ctx.getBeanNamesForType(ExampleRunnerInterface.class)); - - listExamples(beanNames); - + if (props.getEnableCommandLineRunner()) { + listExamples(beanNames); executeExamples(beanNames); } } From a9ee8e6f456b60b072d657d7957a802e4fe036a5 Mon Sep 17 00:00:00 2001 From: Luis Date: Tue, 17 Jun 2025 18:53:44 +0000 Subject: [PATCH 9/9] Autogenerated JaCoCo coverage badge --- .github/badges/branches.svg | 2 +- .github/badges/jacoco.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/badges/branches.svg b/.github/badges/branches.svg index af316de..4de1414 100644 --- a/.github/badges/branches.svg +++ b/.github/badges/branches.svg @@ -1 +1 @@ -branches85.7% \ No newline at end of file +branches80% \ No newline at end of file diff --git a/.github/badges/jacoco.svg b/.github/badges/jacoco.svg index 737c552..d314160 100644 --- a/.github/badges/jacoco.svg +++ b/.github/badges/jacoco.svg @@ -1 +1 @@ -coverage94.9% \ No newline at end of file +coverage93.9% \ No newline at end of file