Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public class Messages {
protected String info;
protected String examplesFound;
protected String enableTraceToSeeExamplesDetails;
protected String enableDebugToSeeExamplesList;
protected String separator;
protected String enableDebugToSeeExamplesList;
protected String separator;
protected String outputTitle;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.penapereira.example.constructs.app.ui;

import java.awt.EventQueue;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;

@Component
public class GuiAppender extends AppenderBase<ILoggingEvent> implements InitializingBean {

@Autowired
private MainWindow mainWindow;

@Override
public void afterPropertiesSet() throws Exception {
((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).addAppender(this);
start();
}

@Override
protected void append(ILoggingEvent eventObject) {
EventQueue.invokeLater(() -> mainWindow.appendOutput(eventObject.getFormattedMessage() + System.lineSeparator()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;

import org.slf4j.Logger;
Expand All @@ -26,7 +29,9 @@ public class MainWindow extends JFrame {

private static final Logger log = LoggerFactory.getLogger(MainWindow.class);

private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;

private JTextArea outputArea;

@Autowired
Messages msg;
Expand Down Expand Up @@ -65,13 +70,23 @@ private void loadIcon() {
}
}

private JPanel getMainComponent() {
JPanel mainPanel = new JPanel(new GridLayout(4, 1));
createCenteredTitle(msg.getGreeting(), mainPanel);
createCenteredLabelOnPanel(msg.getInfo(), mainPanel);
createCenteredHyperlink(msg.getHomeUrl(), mainPanel);
return mainPanel;
}
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);

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) {
JLabel title = new JLabel(text, JLabel.CENTER);
Expand All @@ -89,10 +104,17 @@ private void createCenteredHyperlink(String text, JPanel panel) {
panel.add(hyperlink);
}

private void createCenteredLabelOnPanel(String text, JPanel panel) {
JLabel label = new JLabel(text);
label.setHorizontalAlignment(JLabel.CENTER);
panel.add(label);
}
private void createCenteredLabelOnPanel(String text, JPanel panel) {
JLabel label = new JLabel(text);
label.setHorizontalAlignment(JLabel.CENTER);
panel.add(label);
}

public void appendOutput(String text) {
if (outputArea != null) {
outputArea.append(text);
outputArea.setCaretPosition(outputArea.getDocument().getLength());
}
}

}
1 change: 1 addition & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,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.separator=-------------------------------------------------------------
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ void settersAndGettersWork() {
m.setEnableTraceToSeeExamplesDetails("TD");
m.setEnableDebugToSeeExamplesList("DL");
m.setSeparator("-");
m.setOutputTitle("OT");

assertEquals("G", m.getGreeting());
assertEquals("T", m.getWindowTitle());
Expand All @@ -25,6 +26,7 @@ void settersAndGettersWork() {
assertEquals("TD", m.getEnableTraceToSeeExamplesDetails());
assertEquals("DL", m.getEnableDebugToSeeExamplesList());
assertEquals("-", m.getSeparator());
assertEquals("OT", m.getOutputTitle());

String s = m.toString();
assertTrue(s.contains("G"));
Expand All @@ -40,6 +42,7 @@ void settersAndGettersWork() {
other.setEnableTraceToSeeExamplesDetails("TD");
other.setEnableDebugToSeeExamplesList("DL");
other.setSeparator("-");
other.setOutputTitle("OT");
assertEquals(m, other);
assertEquals(m.hashCode(), other.hashCode());
assertNotEquals(m, "foo");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.penapereira.example.constructs.app.ui;

import static org.junit.jupiter.api.Assertions.*;

import java.awt.EventQueue;
import java.lang.reflect.Field;

import javax.swing.JTextArea;

import org.junit.jupiter.api.Test;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.LoggingEvent;

class GuiAppenderTests {
@Test
void appendsMessageToTextArea() throws Exception {
// Allocate a MainWindow instance without triggering the JFrame constructor
Field theUnsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeField.setAccessible(true);
sun.misc.Unsafe unsafe = (sun.misc.Unsafe) theUnsafeField.get(null);

MainWindow window = (MainWindow) unsafe.allocateInstance(MainWindow.class);
JTextArea area = new JTextArea();
Field f = MainWindow.class.getDeclaredField("outputArea");
f.setAccessible(true);
f.set(window, area);

GuiAppender appender = new GuiAppender();
Field mw = GuiAppender.class.getDeclaredField("mainWindow");
mw.setAccessible(true);
mw.set(appender, window);
appender.start();

LoggingEvent event = new LoggingEvent();
event.setLevel(Level.INFO);
event.setMessage("test message");

appender.doAppend(event);
EventQueue.invokeAndWait(() -> {});

assertEquals("test message" + System.lineSeparator(), area.getText());
}
}