/* * 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); } }