1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.jmx.gui;
18
19 import java.awt.BorderLayout;
20 import java.awt.Color;
21 import java.awt.Dimension;
22 import java.awt.Font;
23 import java.awt.event.ActionEvent;
24 import java.io.PrintWriter;
25 import java.io.StringWriter;
26
27 import javax.swing.AbstractAction;
28 import javax.swing.Box;
29 import javax.swing.BoxLayout;
30 import javax.swing.JButton;
31 import javax.swing.JLabel;
32 import javax.swing.JOptionPane;
33 import javax.swing.JPanel;
34 import javax.swing.JScrollPane;
35 import javax.swing.JTextArea;
36 import javax.swing.JTextField;
37
38 import org.apache.logging.log4j.core.jmx.LoggerContextAdminMBean;
39
40
41
42
43 public class ClientEditConfigPanel extends JPanel {
44 private static final long serialVersionUID = -7544651740950723394L;
45 private static final int HORIZONTAL_GAP = 20;
46 private static final int ERR_MSG_INITIAL_BUFFER_SIZE = 2048;
47 private static final int LOCATION_TEXT_COLS = 50;
48 private static final int CONFIG_TEXT_COLS = 60;
49 private static final int CONFIG_TEXT_ROWS = 20;
50 private static final int BUFFER_SIZE = 2048;
51
52 private JTextField locationTextField;
53 private JLabel locationLabel;
54 private JButton buttonSendLocation;
55 private JButton buttonSendConfigText;
56 private JTextArea configTextArea;
57 private final LoggerContextAdminMBean contextAdmin;
58
59 private final AbstractAction actionReconfigureFromLocation = new AbstractAction(
60 "Reconfigure from Location") {
61 private static final long serialVersionUID = 6995219797596745774L;
62
63 @Override
64 public void actionPerformed(final ActionEvent e) {
65 try {
66 contextAdmin.setConfigLocationUri(locationTextField.getText());
67 populateWidgets();
68 showConfirmation();
69 } catch (final Exception ex) {
70 populateWidgets();
71 handle("Could not reconfigure from location", ex);
72 }
73 }
74 };
75 private final AbstractAction actionReconfigureFromText = new AbstractAction(
76 "Reconfigure with XML Below") {
77 private static final long serialVersionUID = -2846103707134292312L;
78
79 @Override
80 public void actionPerformed(final ActionEvent e) {
81 final String encoding = System.getProperty("file.encoding");
82 try {
83 contextAdmin.setConfigText(configTextArea.getText(), encoding);
84 populateWidgets();
85 showConfirmation();
86 } catch (final Exception ex) {
87 populateWidgets();
88 handle("Could not reconfigure from XML", ex);
89 }
90 }
91 };
92
93 public ClientEditConfigPanel(final LoggerContextAdminMBean contextAdmin) {
94 this.contextAdmin = contextAdmin;
95 createWidgets();
96 populateWidgets();
97 }
98
99 private void handle(final String msg, final Exception ex) {
100 final StringWriter sr = new StringWriter(BUFFER_SIZE);
101 final PrintWriter pw = new PrintWriter(sr);
102 pw.println("Please check the StatusLogger tab for details");
103 pw.println();
104 ex.printStackTrace(pw);
105 JOptionPane.showMessageDialog(this, sr.toString(), msg,
106 JOptionPane.ERROR_MESSAGE);
107 }
108
109 private void showConfirmation() {
110 JOptionPane.showMessageDialog(this, "Reconfiguration complete.",
111 "Reconfiguration complete", JOptionPane.INFORMATION_MESSAGE);
112 }
113
114 private void populateWidgets() {
115 try {
116 configTextArea.setText(contextAdmin.getConfigText());
117 } catch (final Exception ex) {
118 final StringWriter sw = new StringWriter(ERR_MSG_INITIAL_BUFFER_SIZE);
119 ex.printStackTrace(new PrintWriter(sw));
120 configTextArea.setText(sw.toString());
121 }
122 final String uri = contextAdmin.getConfigLocationUri();
123 locationTextField.setText(uri);
124 }
125
126 private void createWidgets() {
127 configTextArea = new JTextArea(CONFIG_TEXT_ROWS, CONFIG_TEXT_COLS);
128
129 configTextArea.setBackground(Color.white);
130 configTextArea.setForeground(Color.black);
131 configTextArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, configTextArea.getFont().getSize()));
132 final JScrollPane scrollConfig = new JScrollPane(configTextArea);
133
134 locationTextField = new JTextField(LOCATION_TEXT_COLS);
135 locationLabel = new JLabel("Location: ");
136 locationLabel.setLabelFor(locationTextField);
137 buttonSendLocation = new JButton(actionReconfigureFromLocation);
138 buttonSendConfigText = new JButton(actionReconfigureFromText);
139
140 final JPanel north = new JPanel();
141 north.setLayout(new BoxLayout(north, BoxLayout.LINE_AXIS));
142 north.add(locationLabel);
143 north.add(locationTextField);
144 north.add(buttonSendLocation);
145 north.add(Box.createRigidArea(new Dimension(HORIZONTAL_GAP, 0)));
146 north.add(buttonSendConfigText);
147
148 this.setLayout(new BorderLayout());
149 this.add(north, BorderLayout.NORTH);
150 this.add(scrollConfig, BorderLayout.CENTER);
151 }
152 }