View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.log4j.chainsaw.receivers;
19  
20  import java.awt.BorderLayout;
21  import java.awt.Dimension;
22  import java.awt.event.ActionEvent;
23  import java.awt.event.ActionListener;
24  import java.beans.PropertyChangeEvent;
25  import java.beans.PropertyChangeListener;
26  import java.io.IOException;
27  import java.net.URL;
28  
29  import javax.swing.JDialog;
30  import javax.swing.JEditorPane;
31  import javax.swing.JFrame;
32  import javax.swing.JPanel;
33  import javax.swing.JScrollPane;
34  import javax.swing.JSplitPane;
35  import javax.swing.UIManager;
36  
37  import org.apache.log4j.LogManager;
38  import org.apache.log4j.chainsaw.help.HelpManager;
39  import org.apache.log4j.chainsaw.helper.OkCancelPanel;
40  import org.apache.log4j.chainsaw.messages.MessageCenter;
41  import org.apache.log4j.net.SocketHubReceiver;
42  import org.apache.log4j.plugins.Plugin;
43  import org.apache.log4j.plugins.Receiver;
44  
45  
46  /**
47   * A panel that allows a user to configure a new Plugin, and
48   * view that plugins javadoc at the same time
49   *
50   * @author Paul Smith <psmith@apache.org>
51   *
52   */
53  public class NewReceiverDialogPanel extends JPanel {
54  
55      private PluginPropertyEditorPanel pluginEditorPanel =
56          new PluginPropertyEditorPanel();
57      private final OkCancelPanel okPanel = new OkCancelPanel();
58      private final JEditorPane javaDocPane = new JEditorPane();
59      private final JScrollPane javaDocScroller = new JScrollPane(javaDocPane);
60      private final JSplitPane splitter = new JSplitPane();
61  
62      private NewReceiverDialogPanel() {
63          setupComponents();
64          setupListeners();
65      }
66  
67      /**
68       *
69       */
70      private void setupListeners() {
71  
72          /**
73           * We listen for the plugin change, and modify the editor panes
74           * url to be the Help resource for that class
75           */
76          pluginEditorPanel.addPropertyChangeListener("plugin",
77              new PropertyChangeListener() {
78  
79                  public void propertyChange(PropertyChangeEvent evt) {
80  
81                      Plugin plugin = (Plugin) evt.getNewValue();
82                      URL url = HelpManager.getInstance().getHelpForClass(
83                              plugin.getClass());
84  
85                      try {
86                          javaDocPane.setPage(url);
87                      } catch (IOException e) {
88                          MessageCenter.getInstance().getLogger().error(
89                              "Failed to load the Help resource for " +
90                              plugin.getClass(), e);
91                      }
92                  }
93              });
94      }
95  
96      /**
97       *
98       */
99      private void setupComponents() {
100         setLayout(new BorderLayout());
101 
102         setupJavadoc();
103 
104         setupPluginPropertyPanel();
105 
106         setupSplitter();
107 
108         add(splitter, BorderLayout.CENTER);
109         add(okPanel, BorderLayout.SOUTH);
110         setMinimumSize(new Dimension(600, 600));
111         setPreferredSize(getMinimumSize());
112     }
113 
114     private void setupPluginPropertyPanel() {
115         pluginEditorPanel.setMinimumSize(new Dimension(320, 160));
116         pluginEditorPanel.setPreferredSize(pluginEditorPanel.getMinimumSize());
117     }
118 
119     private void setupSplitter() {
120         splitter.setTopComponent(javaDocScroller);
121         splitter.setBottomComponent(pluginEditorPanel);
122         splitter.setResizeWeight(0.8);
123         splitter.setOrientation(JSplitPane.VERTICAL_SPLIT);
124     }
125 
126     private void setupJavadoc() {
127         javaDocPane.setEditable(false);
128     }
129 
130     /**
131      * Creates a new panel, with the contents configured to allow the editing
132      * of a NEW instance of the specified class (which must implement the Receiver
133      * interface)
134      * @param receiverClass
135      * @return NewReceiverDialogPanel
136      * @throws IllegalArgumentException if the specified class is not a Receiver
137      */
138     public static NewReceiverDialogPanel create(Class receiverClass) {
139 
140         if (!Receiver.class.isAssignableFrom(receiverClass)) {
141             throw new IllegalArgumentException(receiverClass.getName() +
142                 " is not a Receiver");
143         }
144 
145         Receiver receiverInstance = null;
146 
147         try {
148             receiverInstance = (Receiver) receiverClass.newInstance();
149 
150         } catch (Exception e) {
151         	LogManager.getLogger(NewReceiverDialogPanel.class).error(
152                 "Failed to create a new Receiver instance, this exception is unexpected",
153                 e);
154         }
155 
156         NewReceiverDialogPanel panel = new NewReceiverDialogPanel();
157 
158         panel.pluginEditorPanel.setPlugin(receiverInstance);
159 
160         return panel;
161     }
162 
163     public static void main(String[] args) throws Exception {
164 
165         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
166 
167         NewReceiverDialogPanel panel = NewReceiverDialogPanel.create(
168                 SocketHubReceiver.class);
169 
170         JDialog dialog = new JDialog((JFrame) null, true);
171         dialog.getContentPane().add(panel);
172 
173         ActionListener al = new ActionListener() {
174                 public void actionPerformed(ActionEvent e) {
175                     System.exit(1);
176                 }
177             };
178 
179         panel.okPanel.getOkButton().addActionListener(al);
180         panel.okPanel.getCancelButton().addActionListener(al);
181 
182         dialog.pack();
183 
184         dialog.setVisible(true);
185     }
186 
187     /**
188      * @return Returns the okPanel.
189      */
190     public final OkCancelPanel getOkPanel() {
191 
192         return okPanel;
193     }
194 
195     /**
196      *
197      */
198     public Plugin getPlugin() {
199 
200         return this.pluginEditorPanel.getPlugin();
201     }
202 
203 }