1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.bcel.verifier;
18
19 import java.awt.AWTEvent;
20 import java.awt.CardLayout;
21 import java.awt.Color;
22 import java.awt.Dimension;
23 import java.awt.GridLayout;
24 import java.awt.event.ActionEvent;
25 import java.awt.event.WindowEvent;
26 import javax.swing.BorderFactory;
27 import javax.swing.JFrame;
28 import javax.swing.JList;
29 import javax.swing.JMenu;
30 import javax.swing.JMenuBar;
31 import javax.swing.JMenuItem;
32 import javax.swing.JOptionPane;
33 import javax.swing.JPanel;
34 import javax.swing.JScrollPane;
35 import javax.swing.JSplitPane;
36 import javax.swing.JTextPane;
37 import javax.swing.ListSelectionModel;
38 import javax.swing.event.ListSelectionEvent;
39 import org.apache.bcel.Repository;
40 import org.apache.bcel.classfile.JavaClass;
41
42 /***
43 * This class implements a machine-generated frame for use with
44 * the GraphicalVerfifier.
45 *
46 * @version $Id: VerifierAppFrame.java 386056 2006-03-15 11:31:56Z tcurdt $
47 * @author Enver Haase
48 * @see GraphicalVerifier
49 */
50 public class VerifierAppFrame extends JFrame {
51
52 JPanel contentPane;
53 JSplitPane jSplitPane1 = new JSplitPane();
54 JPanel jPanel1 = new JPanel();
55 JPanel jPanel2 = new JPanel();
56 JSplitPane jSplitPane2 = new JSplitPane();
57 JPanel jPanel3 = new JPanel();
58 JList classNamesJList = new JList();
59 GridLayout gridLayout1 = new GridLayout();
60 JPanel messagesPanel = new JPanel();
61 GridLayout gridLayout2 = new GridLayout();
62 JMenuBar jMenuBar1 = new JMenuBar();
63 JMenu jMenu1 = new JMenu();
64 JScrollPane jScrollPane1 = new JScrollPane();
65 JScrollPane messagesScrollPane = new JScrollPane();
66 JScrollPane jScrollPane3 = new JScrollPane();
67 GridLayout gridLayout4 = new GridLayout();
68 JScrollPane jScrollPane4 = new JScrollPane();
69 CardLayout cardLayout1 = new CardLayout();
70 private String JUSTICE_VERSION = "JustIce by Enver Haase";
71 private String current_class;
72 GridLayout gridLayout3 = new GridLayout();
73 JTextPane pass1TextPane = new JTextPane();
74 JTextPane pass2TextPane = new JTextPane();
75 JTextPane messagesTextPane = new JTextPane();
76 JMenuItem newFileMenuItem = new JMenuItem();
77 JSplitPane jSplitPane3 = new JSplitPane();
78 JSplitPane jSplitPane4 = new JSplitPane();
79 JScrollPane jScrollPane2 = new JScrollPane();
80 JScrollPane jScrollPane5 = new JScrollPane();
81 JScrollPane jScrollPane6 = new JScrollPane();
82 JScrollPane jScrollPane7 = new JScrollPane();
83 JList pass3aJList = new JList();
84 JList pass3bJList = new JList();
85 JTextPane pass3aTextPane = new JTextPane();
86 JTextPane pass3bTextPane = new JTextPane();
87 JMenu jMenu2 = new JMenu();
88 JMenuItem whatisMenuItem = new JMenuItem();
89 JMenuItem aboutMenuItem = new JMenuItem();
90
91
92 /*** Constructor. */
93 public VerifierAppFrame() {
94 enableEvents(AWTEvent.WINDOW_EVENT_MASK);
95 try {
96 jbInit();
97 } catch (Exception e) {
98 e.printStackTrace();
99 }
100 }
101
102
103 /*** Initizalization of the components. */
104 private void jbInit() throws Exception {
105
106 contentPane = (JPanel) this.getContentPane();
107 contentPane.setLayout(cardLayout1);
108 this.setJMenuBar(jMenuBar1);
109 this.setSize(new Dimension(708, 451));
110 this.setTitle("JustIce");
111 jPanel1.setMinimumSize(new Dimension(100, 100));
112 jPanel1.setPreferredSize(new Dimension(100, 100));
113 jPanel1.setLayout(gridLayout1);
114 jSplitPane2.setOrientation(JSplitPane.VERTICAL_SPLIT);
115 jPanel2.setLayout(gridLayout2);
116 jPanel3.setMinimumSize(new Dimension(200, 100));
117 jPanel3.setPreferredSize(new Dimension(400, 400));
118 jPanel3.setLayout(gridLayout4);
119 messagesPanel.setMinimumSize(new Dimension(100, 100));
120 messagesPanel.setLayout(gridLayout3);
121 jPanel2.setMinimumSize(new Dimension(200, 100));
122 jMenu1.setText("File");
123 jScrollPane1.getViewport().setBackground(Color.red);
124 messagesScrollPane.getViewport().setBackground(Color.red);
125 messagesScrollPane.setPreferredSize(new Dimension(10, 10));
126 classNamesJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
127
128 public void valueChanged( ListSelectionEvent e ) {
129 classNamesJList_valueChanged(e);
130 }
131 });
132 classNamesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
133 jScrollPane3.setBorder(BorderFactory.createLineBorder(Color.black));
134 jScrollPane3.setPreferredSize(new Dimension(100, 100));
135 gridLayout4.setRows(4);
136 gridLayout4.setColumns(1);
137 gridLayout4.setHgap(1);
138 jScrollPane4.setBorder(BorderFactory.createLineBorder(Color.black));
139 jScrollPane4.setPreferredSize(new Dimension(100, 100));
140 pass1TextPane.setBorder(BorderFactory.createRaisedBevelBorder());
141 pass1TextPane.setToolTipText("");
142 pass1TextPane.setEditable(false);
143 pass2TextPane.setBorder(BorderFactory.createRaisedBevelBorder());
144 pass2TextPane.setEditable(false);
145 messagesTextPane.setBorder(BorderFactory.createRaisedBevelBorder());
146 messagesTextPane.setEditable(false);
147 newFileMenuItem.setText("New...");
148 newFileMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(78,
149 java.awt.event.KeyEvent.CTRL_MASK, true));
150 newFileMenuItem.addActionListener(new java.awt.event.ActionListener() {
151
152 public void actionPerformed( ActionEvent e ) {
153 newFileMenuItem_actionPerformed(e);
154 }
155 });
156 pass3aTextPane.setEditable(false);
157 pass3bTextPane.setEditable(false);
158 pass3aJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
159
160 public void valueChanged( ListSelectionEvent e ) {
161 pass3aJList_valueChanged(e);
162 }
163 });
164 pass3bJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
165
166 public void valueChanged( ListSelectionEvent e ) {
167 pass3bJList_valueChanged(e);
168 }
169 });
170 jMenu2.setText("Help");
171 whatisMenuItem.setText("What is...");
172 whatisMenuItem.addActionListener(new java.awt.event.ActionListener() {
173
174 public void actionPerformed( ActionEvent e ) {
175 whatisMenuItem_actionPerformed(e);
176 }
177 });
178 aboutMenuItem.setText("About");
179 aboutMenuItem.addActionListener(new java.awt.event.ActionListener() {
180
181 public void actionPerformed( ActionEvent e ) {
182 aboutMenuItem_actionPerformed(e);
183 }
184 });
185 jSplitPane2.add(messagesPanel, JSplitPane.BOTTOM);
186 messagesPanel.add(messagesScrollPane, null);
187 messagesScrollPane.getViewport().add(messagesTextPane, null);
188 jSplitPane2.add(jPanel3, JSplitPane.TOP);
189 jPanel3.add(jScrollPane3, null);
190 jScrollPane3.getViewport().add(pass1TextPane, null);
191 jPanel3.add(jScrollPane4, null);
192 jPanel3.add(jSplitPane3, null);
193 jSplitPane3.add(jScrollPane2, JSplitPane.LEFT);
194 jScrollPane2.getViewport().add(pass3aJList, null);
195 jSplitPane3.add(jScrollPane5, JSplitPane.RIGHT);
196 jScrollPane5.getViewport().add(pass3aTextPane, null);
197 jPanel3.add(jSplitPane4, null);
198 jSplitPane4.add(jScrollPane6, JSplitPane.LEFT);
199 jScrollPane6.getViewport().add(pass3bJList, null);
200 jSplitPane4.add(jScrollPane7, JSplitPane.RIGHT);
201 jScrollPane7.getViewport().add(pass3bTextPane, null);
202 jScrollPane4.getViewport().add(pass2TextPane, null);
203 jSplitPane1.add(jPanel2, JSplitPane.TOP);
204 jPanel2.add(jScrollPane1, null);
205 jSplitPane1.add(jPanel1, JSplitPane.BOTTOM);
206 jPanel1.add(jSplitPane2, null);
207 jScrollPane1.getViewport().add(classNamesJList, null);
208 jMenuBar1.add(jMenu1);
209 jMenuBar1.add(jMenu2);
210 contentPane.add(jSplitPane1, "jSplitPane1");
211 jMenu1.add(newFileMenuItem);
212 jMenu2.add(whatisMenuItem);
213 jMenu2.add(aboutMenuItem);
214 jSplitPane2.setDividerLocation(300);
215 jSplitPane3.setDividerLocation(150);
216 jSplitPane4.setDividerLocation(150);
217 }
218
219
220 /*** Overridden to stop the application on a closing window. */
221 protected void processWindowEvent( WindowEvent e ) {
222 super.processWindowEvent(e);
223 if (e.getID() == WindowEvent.WINDOW_CLOSING) {
224 System.exit(0);
225 }
226 }
227
228
229 synchronized void classNamesJList_valueChanged( ListSelectionEvent e ) {
230 if (e.getValueIsAdjusting()) {
231 return;
232 }
233 current_class = classNamesJList.getSelectedValue().toString();
234 try {
235 verify();
236 } catch (ClassNotFoundException ex) {
237
238 ex.printStackTrace();
239 }
240 classNamesJList.setSelectedValue(current_class, true);
241 }
242
243
244 private void verify() throws ClassNotFoundException {
245 setTitle("PLEASE WAIT");
246 Verifier v = VerifierFactory.getVerifier(current_class);
247 v.flush();
248 VerificationResult vr;
249 vr = v.doPass1();
250 if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) {
251 pass1TextPane.setText(vr.getMessage());
252 pass1TextPane.setBackground(Color.red);
253 pass2TextPane.setText("");
254 pass2TextPane.setBackground(Color.yellow);
255 pass3aTextPane.setText("");
256 pass3aJList.setListData(new Object[0]);
257 pass3aTextPane.setBackground(Color.yellow);
258 pass3bTextPane.setText("");
259 pass3bJList.setListData(new Object[0]);
260 pass3bTextPane.setBackground(Color.yellow);
261 } else {
262 pass1TextPane.setBackground(Color.green);
263 pass1TextPane.setText(vr.getMessage());
264 vr = v.doPass2();
265 if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) {
266 pass2TextPane.setText(vr.getMessage());
267 pass2TextPane.setBackground(Color.red);
268 pass3aTextPane.setText("");
269 pass3aTextPane.setBackground(Color.yellow);
270 pass3aJList.setListData(new Object[0]);
271 pass3bTextPane.setText("");
272 pass3bTextPane.setBackground(Color.yellow);
273 pass3bJList.setListData(new Object[0]);
274 } else {
275 pass2TextPane.setText(vr.getMessage());
276 pass2TextPane.setBackground(Color.green);
277 JavaClass jc = Repository.lookupClass(current_class);
278
279
280
281
282
283
284 String[] methodnames = new String[jc.getMethods().length];
285 for (int i = 0; i < jc.getMethods().length; i++) {
286 methodnames[i] = jc.getMethods()[i].toString().replace('\n', ' ').replace('\t',
287 ' ');
288 }
289 pass3aJList.setListData(methodnames);
290 pass3aJList.setSelectionInterval(0, jc.getMethods().length - 1);
291 pass3bJList.setListData(methodnames);
292 pass3bJList.setSelectionInterval(0, jc.getMethods().length - 1);
293 }
294 }
295 String[] msgs = v.getMessages();
296 messagesTextPane.setBackground(msgs.length == 0 ? Color.green : Color.yellow);
297 String allmsgs = "";
298 for (int i = 0; i < msgs.length; i++) {
299 msgs[i] = msgs[i].replace('\n', ' ');
300 allmsgs += msgs[i] + "\n\n";
301 }
302 messagesTextPane.setText(allmsgs);
303 setTitle(current_class + " - " + JUSTICE_VERSION);
304 }
305
306
307 void newFileMenuItem_actionPerformed( ActionEvent e ) {
308 String classname = JOptionPane
309 .showInputDialog("Please enter the fully qualified name of a class or interface to verify:");
310 if ((classname == null) || (classname.equals(""))) {
311 return;
312 }
313 VerifierFactory.getVerifier(classname);
314 classNamesJList.setSelectedValue(classname, true);
315 }
316
317
318 synchronized void pass3aJList_valueChanged( ListSelectionEvent e ) {
319 if (e.getValueIsAdjusting()) {
320 return;
321 }
322 Verifier v = VerifierFactory.getVerifier(current_class);
323 String all3amsg = "";
324 boolean all3aok = true;
325 boolean rejected = false;
326 for (int i = 0; i < pass3aJList.getModel().getSize(); i++) {
327 if (pass3aJList.isSelectedIndex(i)) {
328 VerificationResult vr = v.doPass3a(i);
329 if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) {
330 all3aok = false;
331 rejected = true;
332 }
333 JavaClass jc = null;
334 try {
335 jc = Repository.lookupClass(v.getClassName());
336 all3amsg += "Method '" + jc.getMethods()[i] + "': "
337 + vr.getMessage().replace('\n', ' ') + "\n\n";
338 } catch (ClassNotFoundException ex) {
339
340 ex.printStackTrace();
341 }
342 }
343 }
344 pass3aTextPane.setText(all3amsg);
345 pass3aTextPane.setBackground(all3aok ? Color.green : (rejected ? Color.red : Color.yellow));
346 }
347
348
349 synchronized void pass3bJList_valueChanged( ListSelectionEvent e ) {
350 if (e.getValueIsAdjusting()) {
351 return;
352 }
353 Verifier v = VerifierFactory.getVerifier(current_class);
354 String all3bmsg = "";
355 boolean all3bok = true;
356 boolean rejected = false;
357 for (int i = 0; i < pass3bJList.getModel().getSize(); i++) {
358 if (pass3bJList.isSelectedIndex(i)) {
359 VerificationResult vr = v.doPass3b(i);
360 if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) {
361 all3bok = false;
362 rejected = true;
363 }
364 JavaClass jc = null;
365 try {
366 jc = Repository.lookupClass(v.getClassName());
367 all3bmsg += "Method '" + jc.getMethods()[i] + "': "
368 + vr.getMessage().replace('\n', ' ') + "\n\n";
369 } catch (ClassNotFoundException ex) {
370
371 ex.printStackTrace();
372 }
373 }
374 }
375 pass3bTextPane.setText(all3bmsg);
376 pass3bTextPane.setBackground(all3bok ? Color.green : (rejected ? Color.red : Color.yellow));
377 }
378
379
380 void aboutMenuItem_actionPerformed( ActionEvent e ) {
381 JOptionPane
382 .showMessageDialog(
383 this,
384 "JustIce is a Java class file verifier.\nIt was implemented by Enver Haase in 2001, 2002.\n<http://jakarta.apache.org/bcel/index.html>",
385 JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE);
386 }
387
388
389 void whatisMenuItem_actionPerformed( ActionEvent e ) {
390 JOptionPane
391 .showMessageDialog(
392 this,
393 "The upper four boxes to the right reflect verification passes according to The Java Virtual Machine Specification.\nThese are (in that order): Pass one, Pass two, Pass three (before data flow analysis), Pass three (data flow analysis).\nThe bottom box to the right shows (warning) messages; warnings do not cause a class to be rejected.",
394 JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE);
395 }
396 }