blob: 972e0bb4c4c4aa97f79b75e178d238e7d10c50c9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache license, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the license for the specific language governing permissions and
* limitations under the license.
*/
package org.apache.logging.log4j.jmx.gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import org.apache.logging.log4j.core.jmx.LoggerContextAdminMBean;
/**
* Panel for editing Log4j configurations.
*/
public class ClientEditConfigPanel extends JPanel {
private static final long serialVersionUID = -7544651740950723394L;
private static final int HORIZONTAL_GAP = 20;
private static final int ERR_MSG_INITIAL_BUFFER_SIZE = 2048;
private static final int LOCATION_TEXT_COLS = 50;
private static final int CONFIG_TEXT_COLS = 60;
private static final int CONFIG_TEXT_ROWS = 20;
private static final int BUFFER_SIZE = 2048;
private JTextField locationTextField;
private JLabel locationLabel;
private JButton buttonSendLocation;
private JButton buttonSendConfigText;
private JTextArea configTextArea;
private final LoggerContextAdminMBean contextAdmin;
private final AbstractAction actionReconfigureFromLocation = new AbstractAction(
"Reconfigure from Location") {
private static final long serialVersionUID = 6995219797596745774L;
@Override
public void actionPerformed(final ActionEvent e) {
try {
contextAdmin.setConfigLocationUri(locationTextField.getText());
populateWidgets();
showConfirmation();
} catch (final Exception ex) {
populateWidgets();
handle("Could not reconfigure from location", ex);
}
}
};
private final AbstractAction actionReconfigureFromText = new AbstractAction(
"Reconfigure with XML Below") {
private static final long serialVersionUID = -2846103707134292312L;
@Override
public void actionPerformed(final ActionEvent e) {
final String encoding = System.getProperty("file.encoding");
try {
contextAdmin.setConfigText(configTextArea.getText(), encoding);
populateWidgets();
showConfirmation();
} catch (final Exception ex) {
populateWidgets();
handle("Could not reconfigure from XML", ex);
}
}
};
public ClientEditConfigPanel(final LoggerContextAdminMBean contextAdmin) {
this.contextAdmin = contextAdmin;
createWidgets();
populateWidgets();
}
private void handle(final String msg, final Exception ex) {
final StringWriter sr = new StringWriter(BUFFER_SIZE);
final PrintWriter pw = new PrintWriter(sr);
pw.println("Please check the StatusLogger tab for details");
pw.println();
ex.printStackTrace(pw);
JOptionPane.showMessageDialog(this, sr.toString(), msg,
JOptionPane.ERROR_MESSAGE);
}
private void showConfirmation() {
JOptionPane.showMessageDialog(this, "Reconfiguration complete.",
"Reconfiguration complete", JOptionPane.INFORMATION_MESSAGE);
}
private void populateWidgets() {
try {
configTextArea.setText(contextAdmin.getConfigText());
} catch (final Exception ex) {
final StringWriter sw = new StringWriter(ERR_MSG_INITIAL_BUFFER_SIZE);
ex.printStackTrace(new PrintWriter(sw));
configTextArea.setText(sw.toString());
}
final String uri = contextAdmin.getConfigLocationUri();
locationTextField.setText(uri);
}
private void createWidgets() {
configTextArea = new JTextArea(CONFIG_TEXT_ROWS, CONFIG_TEXT_COLS);
// configTextArea.setEditable(false);
configTextArea.setBackground(Color.white);
configTextArea.setForeground(Color.black);
configTextArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, configTextArea.getFont().getSize()));
final JScrollPane scrollConfig = new JScrollPane(configTextArea);
locationTextField = new JTextField(LOCATION_TEXT_COLS);
locationLabel = new JLabel("Location: ");
locationLabel.setLabelFor(locationTextField);
buttonSendLocation = new JButton(actionReconfigureFromLocation);
buttonSendConfigText = new JButton(actionReconfigureFromText);
final JPanel north = new JPanel();
north.setLayout(new BoxLayout(north, BoxLayout.LINE_AXIS));
north.add(locationLabel);
north.add(locationTextField);
north.add(buttonSendLocation);
north.add(Box.createRigidArea(new Dimension(HORIZONTAL_GAP, 0)));
north.add(buttonSendConfigText);
this.setLayout(new BorderLayout());
this.add(north, BorderLayout.NORTH);
this.add(scrollConfig, BorderLayout.CENTER);
}
}