Skip to content

Commit 4be4a16

Browse files
committed
beginning of GUI redesign; JMX client stub for eventual stream input from JMX beans
1 parent f49f75d commit 4be4a16

File tree

6 files changed

+244
-20
lines changed

6 files changed

+244
-20
lines changed

moa/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
<configuration>
7676
<source>1.6</source>
7777
<target>1.6</target>
78+
<encoding>UTF-8</encoding>
7879
</configuration>
7980
</plugin>
8081

moa/src/main/java/moa/gui/ClassOptionSelectionPanel.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,15 @@
2525
import java.awt.Window;
2626
import java.awt.event.ActionEvent;
2727
import java.awt.event.ActionListener;
28+
import java.util.logging.Level;
29+
import java.util.logging.Logger;
2830

2931
import javax.swing.JComboBox;
3032
import javax.swing.JComponent;
3133
import javax.swing.JDialog;
3234
import javax.swing.JOptionPane;
3335
import javax.swing.JPanel;
36+
import javax.swing.SwingUtilities;
3437

3538
import moa.core.AutoClassDiscovery;
3639
import moa.core.AutoExpandVector;
@@ -92,8 +95,21 @@ public ClassOptionSelectionPanel(Class<?> requiredType,
9295
@Override
9396
public void actionPerformed(ActionEvent arg0) {
9497
try {
98+
SwingUtilities.invokeLater(new Runnable() {
99+
100+
@Override
101+
public void run() {
102+
103+
try {
95104
Object chosen = ((Class<?>) ClassOptionSelectionPanel.this.classChoiceBox.getSelectedItem()).newInstance();
96105
classChoiceChanged(chosen);
106+
} catch (Exception ex) {
107+
Logger.getLogger(ClassOptionSelectionPanel.class.getName()).log(Level.SEVERE, null, ex);
108+
}
109+
110+
}
111+
112+
});
97113
} catch (Exception ex) {
98114
GUIUtils.showExceptionDialog(
99115
ClassOptionSelectionPanel.this, "Problem", ex);
@@ -124,10 +140,14 @@ public Class<?>[] findSuitableClasses(Class<?> requiredType) {
124140
return finalClasses.toArray(new Class<?>[finalClasses.size()]);
125141
}
126142

143+
public static ClassOptionSelectionPanel newSelectClassDialog(Class<?> requiredType, String initialCLIString, String nullString) {
144+
return new ClassOptionSelectionPanel(
145+
requiredType, initialCLIString, nullString);
146+
}
147+
127148
public static String showSelectClassDialog(Component parent, String title,
128149
Class<?> requiredType, String initialCLIString, String nullString) {
129-
ClassOptionSelectionPanel panel = new ClassOptionSelectionPanel(
130-
requiredType, initialCLIString, nullString);
150+
ClassOptionSelectionPanel panel = newSelectClassDialog(requiredType, initialCLIString, nullString);
131151
if (JOptionPane.showOptionDialog(parent, panel, title,
132152
JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null,
133153
null, null) == JOptionPane.OK_OPTION) {
@@ -166,5 +186,9 @@ public void classChoiceChanged(Object chosen) {
166186
Window window = (Window) component;
167187
window.pack();
168188
}
189+
else {
190+
updateUI();
191+
doLayout();
192+
}
169193
}
170194
}

moa/src/main/java/moa/gui/ClassificationTabPanel.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@
2020
package moa.gui;
2121

2222
import java.awt.BorderLayout;
23+
import javax.swing.JPanel;
2324

2425
/**
2526
* This panel allows the user to select and configure a task, and run it.
2627
*
2728
* @author Richard Kirkby ([email protected])
2829
* @version $Revision: 7 $
2930
*/
30-
public class ClassificationTabPanel extends AbstractTabPanel {
31+
public class ClassificationTabPanel extends AbstractTabPanel implements GUI.OptionPanelAware {
3132

3233
private static final long serialVersionUID = 1L;
3334

@@ -43,6 +44,10 @@ public ClassificationTabPanel() {
4344
add(this.taskManagerPanel, BorderLayout.NORTH);
4445
add(this.previewPanel, BorderLayout.CENTER);
4546
}
47+
@Override
48+
public void setOptionsPanel(JPanel p) {
49+
taskManagerPanel.setOptionsPanel(p);
50+
}
4651

4752
//returns the string to display as title of the tab
4853
@Override

moa/src/main/java/moa/gui/GUI.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@
2121
package moa.gui;
2222

2323
import java.awt.BorderLayout;
24-
import java.util.logging.Level;
25-
import java.util.logging.Logger;
24+
import static java.awt.BorderLayout.CENTER;
2625
import javax.swing.JFrame;
2726
import javax.swing.JPanel;
27+
import javax.swing.JSplitPane;
2828
import javax.swing.UIManager;
29-
import javax.swing.UIManager.LookAndFeelInfo;
30-
import javax.swing.UnsupportedLookAndFeelException;
3129
import moa.DoTask;
3230
import moa.core.WekaUtils;
3331

@@ -44,6 +42,7 @@ public class GUI extends JPanel {
4442
private static final long serialVersionUID = 1L;
4543

4644
private javax.swing.JTabbedPane panel;
45+
private JPanel optionPanel;
4746

4847
public GUI() {
4948
initGUI();
@@ -52,9 +51,15 @@ public GUI() {
5251
private void initGUI() {
5352
setLayout(new BorderLayout());
5453

54+
JSplitPane js = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
55+
add(js, CENTER);
56+
57+
58+
optionPanel = new JPanel();
59+
js.add(optionPanel);
5560
// Create and set up tabs
5661
panel = new javax.swing.JTabbedPane();
57-
add(panel, BorderLayout.CENTER);
62+
js.add(panel);
5863

5964
// initialize additional panels
6065
String[] tabs = GUIDefaults.getTabs();
@@ -65,6 +70,8 @@ private void initGUI() {
6570
String classname = optionsStr[0];
6671
// setup panel
6772
AbstractTabPanel tabPanel = (AbstractTabPanel) Class.forName(classname).newInstance();
73+
if (tabPanel instanceof OptionPanelAware)
74+
((OptionPanelAware)tabPanel).setOptionsPanel(optionPanel);
6875
panel.addTab(tabPanel.getTabTitle(), null, (JPanel) tabPanel, tabPanel.getDescription());
6976
} catch (Exception e) {
7077
e.printStackTrace();
@@ -73,6 +80,10 @@ private void initGUI() {
7380

7481
}
7582

83+
public interface OptionPanelAware {
84+
public void setOptionsPanel(JPanel p);
85+
}
86+
7687
public static void main(String[] args) {
7788
try {
7889
if (DoTask.isJavaVersionOK() == false || WekaUtils.isWekaVersionOK() == false) {
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
package moa.gui;
7+
8+
/**
9+
* FROM: https://web-gmazza.rhcloud.com/blog/entry/creating-jconsole-alternative
10+
* @author me
11+
*/
12+
13+
14+
15+
import javax.management.MBeanServerConnection;
16+
import javax.management.ObjectName;
17+
import javax.management.remote.JMXConnector;
18+
import javax.management.remote.JMXConnectorFactory;
19+
import javax.management.remote.JMXServiceURL;
20+
import java.io.IOException;
21+
import java.lang.management.ManagementFactory;
22+
import java.lang.management.MemoryMXBean;
23+
import java.lang.management.MemoryPoolMXBean;
24+
import java.util.Arrays;
25+
import java.util.List;
26+
import java.util.Set;
27+
import java.util.TreeSet;
28+
import javax.management.AttributeChangeNotification;
29+
import javax.management.Notification;
30+
import javax.management.NotificationListener;
31+
import javax.management.ObjectInstance;
32+
33+
public class JMXClient {
34+
35+
/**
36+
* Inner class that will handle the notifications.
37+
*/
38+
public static class ClientListener implements NotificationListener {
39+
public void handleNotification(Notification notification,
40+
Object handback) {
41+
echo("\nReceived notification:");
42+
echo("\tClassName: " + notification.getClass().getName());
43+
echo("\tSource: " + notification.getSource());
44+
echo("\tType: " + notification.getType());
45+
echo("\tMessage: " + notification.getMessage());
46+
if (notification instanceof AttributeChangeNotification) {
47+
AttributeChangeNotification acn =
48+
(AttributeChangeNotification) notification;
49+
echo("\tAttributeName: " + acn.getAttributeName());
50+
echo("\tAttributeType: " + acn.getAttributeType());
51+
echo("\tNewValue: " + acn.getNewValue());
52+
echo("\tOldValue: " + acn.getOldValue());
53+
}
54+
}
55+
}
56+
57+
/* For simplicity, we declare "throws Exception".
58+
Real programs will usually want finer-grained exception handling. */
59+
public static void main(String[] args) throws Exception {
60+
61+
62+
// Create an RMI connector client and
63+
// connect it to the RMI connector server
64+
//
65+
echo("\nCreate an RMI connector client and " +
66+
"connect it to the RMI connector server");
67+
JMXServiceURL url =
68+
new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:1617/jmxrmi");
69+
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
70+
71+
// Create listener
72+
//
73+
ClientListener listener = new ClientListener();
74+
75+
// Get an MBeanServerConnection
76+
//
77+
echo("\nGet an MBeanServerConnection");
78+
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
79+
waitForEnterPressed();
80+
81+
// Get domains from MBeanServer
82+
//
83+
echo("\nDomains:");
84+
String domains[] = mbsc.getDomains();
85+
Arrays.sort(domains);
86+
for (String domain : domains) {
87+
echo("\tDomain = " + domain);
88+
}
89+
waitForEnterPressed();
90+
91+
// Get MBeanServer's default domain
92+
//
93+
echo("\nMBeanServer default domain = " + mbsc.getDefaultDomain());
94+
95+
// Get MBean count
96+
//
97+
echo("\nMBean count = " + mbsc.getMBeanCount());
98+
99+
// Query MBean names
100+
//
101+
echo("\nQuery MBeanServer MBeans:");
102+
Set<ObjectName> names =
103+
new TreeSet<ObjectName>(mbsc.queryNames(null, null));
104+
for (ObjectName name : names) {
105+
echo("\tObjectName = " + name);
106+
}
107+
waitForEnterPressed();
108+
109+
// ----------------------
110+
// Manage the Hello MBean
111+
// ----------------------
112+
113+
echo("\n>>> Perform operations on Hello MBean <<<");
114+
115+
// Construct the ObjectName for the Hello MBean
116+
//
117+
ObjectName mbeanName = new ObjectName("com.example:type=Hello");
118+
119+
// Create a dedicated proxy for the MBean instead of
120+
// going directly through the MBean server connection
121+
//
122+
//HelloMBean mbeanProxy =
123+
// JMX.newMBeanProxy(mbsc, mbeanName, HelloMBean.class, true);
124+
125+
// Add notification listener on Hello MBean
126+
//
127+
echo("\nAdd notification listener...");
128+
mbsc.addNotificationListener(mbeanName, listener, null, null);
129+
130+
131+
waitForEnterPressed();
132+
133+
// Close MBeanServer connection
134+
//
135+
echo("\nClose the connection to the server");
136+
jmxc.close();
137+
echo("\nBye! Bye!");
138+
}
139+
140+
private static void echo(String msg) {
141+
System.out.println(msg);
142+
}
143+
144+
private static void sleep(int millis) {
145+
try {
146+
Thread.sleep(millis);
147+
} catch (InterruptedException e) {
148+
e.printStackTrace();
149+
}
150+
}
151+
152+
private static void waitForEnterPressed() {
153+
try {
154+
echo("\nPress <Enter> to continue...");
155+
System.in.read();
156+
} catch (IOException e) {
157+
e.printStackTrace();
158+
}
159+
}
160+
161+
}

0 commit comments

Comments
 (0)