001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache license, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the license for the specific language governing permissions and 015 * limitations under the license. 016 */ 017package org.apache.logging.log4j.jmx.gui; 018 019import java.awt.BorderLayout; 020import java.awt.Color; 021import java.awt.Dimension; 022import java.awt.Font; 023import java.awt.event.ActionEvent; 024import java.io.PrintWriter; 025import java.io.StringWriter; 026 027import javax.swing.AbstractAction; 028import javax.swing.Box; 029import javax.swing.BoxLayout; 030import javax.swing.JButton; 031import javax.swing.JLabel; 032import javax.swing.JOptionPane; 033import javax.swing.JPanel; 034import javax.swing.JScrollPane; 035import javax.swing.JTextArea; 036import javax.swing.JTextField; 037 038import org.apache.logging.log4j.core.jmx.LoggerContextAdminMBean; 039 040/** 041 * Panel for editing Log4j configurations. 042 */ 043public class ClientEditConfigPanel extends JPanel { 044 private static final long serialVersionUID = -7544651740950723394L; 045 private static final int HORIZONTAL_GAP = 20; 046 private static final int ERR_MSG_INITIAL_BUFFER_SIZE = 2048; 047 private static final int LOCATION_TEXT_COLS = 50; 048 private static final int CONFIG_TEXT_COLS = 60; 049 private static final int CONFIG_TEXT_ROWS = 20; 050 private static final int BUFFER_SIZE = 2048; 051 052 private JTextField locationTextField; 053 private JLabel locationLabel; 054 private JButton buttonSendLocation; 055 private JButton buttonSendConfigText; 056 private JTextArea configTextArea; 057 private final LoggerContextAdminMBean contextAdmin; 058 059 private final AbstractAction actionReconfigureFromLocation = new AbstractAction( 060 "Reconfigure from Location") { 061 private static final long serialVersionUID = 6995219797596745774L; 062 063 @Override 064 public void actionPerformed(final ActionEvent e) { 065 try { 066 contextAdmin.setConfigLocationUri(locationTextField.getText()); 067 populateWidgets(); 068 showConfirmation(); 069 } catch (final Exception ex) { 070 populateWidgets(); 071 handle("Could not reconfigure from location", ex); 072 } 073 } 074 }; 075 private final AbstractAction actionReconfigureFromText = new AbstractAction( 076 "Reconfigure with XML Below") { 077 private static final long serialVersionUID = -2846103707134292312L; 078 079 @Override 080 public void actionPerformed(final ActionEvent e) { 081 final String encoding = System.getProperty("file.encoding"); 082 try { 083 contextAdmin.setConfigText(configTextArea.getText(), encoding); 084 populateWidgets(); 085 showConfirmation(); 086 } catch (final Exception ex) { 087 populateWidgets(); 088 handle("Could not reconfigure from XML", ex); 089 } 090 } 091 }; 092 093 public ClientEditConfigPanel(final LoggerContextAdminMBean contextAdmin) { 094 this.contextAdmin = contextAdmin; 095 createWidgets(); 096 populateWidgets(); 097 } 098 099 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 // configTextArea.setEditable(false); 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}