1 package org.apache.bcel.verifier;
2
3 /* ====================================================================
4 * The Apache Software License, Version 1.1
5 *
6 * Copyright (c) 2001 The Apache Software Foundation. All rights
7 * reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in
18 * the documentation and/or other materials provided with the
19 * distribution.
20 *
21 * 3. The end-user documentation included with the redistribution,
22 * if any, must include the following acknowledgment:
23 * "This product includes software developed by the
24 * Apache Software Foundation (http://www.apache.org/)."
25 * Alternately, this acknowledgment may appear in the software itself,
26 * if and wherever such third-party acknowledgments normally appear.
27 *
28 * 4. The names "Apache" and "Apache Software Foundation" and
29 * "Apache BCEL" must not be used to endorse or promote products
30 * derived from this software without prior written permission. For
31 * written permission, please contact apache@apache.org.
32 *
33 * 5. Products derived from this software may not be called "Apache",
34 * "Apache BCEL", nor may "Apache" appear in their name, without
35 * prior written permission of the Apache Software Foundation.
36 *
37 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
41 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48 * SUCH DAMAGE.
49 * ====================================================================
50 *
51 * This software consists of voluntary contributions made by many
52 * individuals on behalf of the Apache Software Foundation. For more
53 * information on the Apache Software Foundation, please see
54 * <http://www.apache.org/>.
55 */
56
57 import org.apache.bcel.*;
58 import org.apache.bcel.classfile.*;
59 import org.apache.bcel.verifier.*;
60 import java.awt.Color;
61
62 /***
63 * A class for simple graphical class file verification.
64 * Use the main(String []) method with fully qualified
65 * class names as arguments to use it as a stand-alone
66 * application.
67 * Use the VerifyDialog(String) constructor to use this
68 * class in your application.
69 * [This class was created using VisualAge for Java,
70 * but it does not work under VAJ itself (Version 3.02 JDK 1.2)]
71 * @version $Id: VerifyDialog.java,v 1.1.1.1 2001/10/29 20:00:33 jvanzyl Exp $
72 * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
73 * @see #main(String[])
74 * @see #VerifyDialog(String)
75 */
76 public class VerifyDialog extends javax.swing.JDialog {
77 /*** Machine-generated. */
78 private javax.swing.JPanel ivjJDialogContentPane = null;
79 /*** Machine-generated. */
80 private javax.swing.JPanel ivjPass1Panel = null;
81 /*** Machine-generated. */
82 private javax.swing.JPanel ivjPass2Panel = null;
83 /*** Machine-generated. */
84 private javax.swing.JPanel ivjPass3Panel = null;
85 /*** Machine-generated. */
86 private javax.swing.JButton ivjPass1Button = null;
87 /*** Machine-generated. */
88 private javax.swing.JButton ivjPass2Button = null;
89 /*** Machine-generated. */
90 private javax.swing.JButton ivjPass3Button = null;
91 /*** Machine-generated. */
92 IvjEventHandler ivjEventHandler = new IvjEventHandler();
93
94 /***
95 * The class to verify. Default set to 'java.lang.Object'
96 * in case this class is instantiated via one of the many
97 * machine-generated constructors.
98 */
99 private String class_name = "java.lang.Object";
100
101 /***
102 * This field is here to count the number of open VerifyDialog
103 * instances so the JVM can be exited afer every Dialog had been
104 * closed.
105 */
106 private static int classes_to_verify;
107
108 /*** Machine-generated. */
109 class IvjEventHandler implements java.awt.event.ActionListener {
110 public void actionPerformed(java.awt.event.ActionEvent e) {
111 if (e.getSource() == VerifyDialog.this.getPass1Button())
112 connEtoC1(e);
113 if (e.getSource() == VerifyDialog.this.getPass2Button())
114 connEtoC2(e);
115 if (e.getSource() == VerifyDialog.this.getPass3Button())
116 connEtoC3(e);
117 if (e.getSource() == VerifyDialog.this.getFlushButton())
118 connEtoC4(e);
119 };
120 };
121 /*** Machine-generated. */
122 private javax.swing.JButton ivjFlushButton = null;
123 /*** Machine-generated. */
124 public VerifyDialog() {
125 super();
126 initialize();
127 }
128
129 /*** Machine-generated. */
130 public VerifyDialog(java.awt.Dialog owner) {
131 super(owner);
132 }
133
134 /*** Machine-generated. */
135 public VerifyDialog(java.awt.Dialog owner, String title) {
136 super(owner, title);
137 }
138
139 /*** Machine-generated. */
140 public VerifyDialog(java.awt.Dialog owner, String title, boolean modal) {
141 super(owner, title, modal);
142 }
143
144 /*** Machine-generated. */
145 public VerifyDialog(java.awt.Dialog owner, boolean modal) {
146 super(owner, modal);
147 }
148
149 /*** Machine-generated. */
150 public VerifyDialog(java.awt.Frame owner) {
151 super(owner);
152 }
153
154 /*** Machine-generated. */
155 public VerifyDialog(java.awt.Frame owner, String title) {
156 super(owner, title);
157 }
158
159 /*** Machine-generated. */
160 public VerifyDialog(java.awt.Frame owner, String title, boolean modal) {
161 super(owner, title, modal);
162 }
163
164 /*** Machine-generated. */
165 public VerifyDialog(java.awt.Frame owner, boolean modal) {
166 super(owner, modal);
167 }
168
169 /***
170 * Use this constructor if you want a possibility to verify other
171 * class files than java.lang.Object.
172 * @param fully_qualified_class_name java.lang.String
173 */
174 public VerifyDialog(String fully_qualified_class_name) {
175 super();
176
177 int dotclasspos = fully_qualified_class_name.lastIndexOf(".class");
178 if (dotclasspos != -1) fully_qualified_class_name = fully_qualified_class_name.substring(0,dotclasspos);
179 fully_qualified_class_name = fully_qualified_class_name.replace('/', '.');
180
181 class_name = fully_qualified_class_name;
182 initialize();
183 }
184
185
186 /*** Machine-generated. */
187 private void connEtoC1(java.awt.event.ActionEvent arg1) {
188 try {
189 // user code begin {1}
190 // user code end
191 this.pass1Button_ActionPerformed(arg1);
192 // user code begin {2}
193 // user code end
194 } catch (java.lang.Throwable ivjExc) {
195 // user code begin {3}
196 // user code end
197 handleException(ivjExc);
198 }
199 }
200
201 /*** Machine-generated. */
202 private void connEtoC2(java.awt.event.ActionEvent arg1) {
203 try {
204 // user code begin {1}
205 // user code end
206 this.pass2Button_ActionPerformed(arg1);
207 // user code begin {2}
208 // user code end
209 } catch (java.lang.Throwable ivjExc) {
210 // user code begin {3}
211 // user code end
212 handleException(ivjExc);
213 }
214 }
215
216 /*** Machine-generated. */
217 private void connEtoC3(java.awt.event.ActionEvent arg1) {
218 try {
219 // user code begin {1}
220 // user code end
221 this.pass4Button_ActionPerformed(arg1);
222 // user code begin {2}
223 // user code end
224 } catch (java.lang.Throwable ivjExc) {
225 // user code begin {3}
226 // user code end
227 handleException(ivjExc);
228 }
229 }
230
231 /*** Machine-generated. */
232 private void connEtoC4(java.awt.event.ActionEvent arg1) {
233 try {
234 // user code begin {1}
235 // user code end
236 this.flushButton_ActionPerformed(arg1);
237 // user code begin {2}
238 // user code end
239 } catch (java.lang.Throwable ivjExc) {
240 // user code begin {3}
241 // user code end
242 handleException(ivjExc);
243 }
244 }
245
246 /*** Machine-generated. */
247 public void flushButton_ActionPerformed(java.awt.event.ActionEvent actionEvent) {
248 VerifierFactory.getVerifier(class_name).flush();
249 Repository.removeClass(class_name); // Make sure it will be reloaded.
250 getPass1Panel().setBackground(Color.gray);
251 getPass1Panel().repaint();
252 getPass2Panel().setBackground(Color.gray);
253 getPass2Panel().repaint();
254 getPass3Panel().setBackground(Color.gray);
255 getPass3Panel().repaint();
256 }
257
258 /*** Machine-generated. */
259 private javax.swing.JButton getFlushButton() {
260 if (ivjFlushButton == null) {
261 try {
262 ivjFlushButton = new javax.swing.JButton();
263 ivjFlushButton.setName("FlushButton");
264 ivjFlushButton.setText("Flush: Forget old verification results");
265 ivjFlushButton.setBackground(java.awt.SystemColor.controlHighlight);
266 ivjFlushButton.setBounds(60, 215, 300, 30);
267 ivjFlushButton.setForeground(java.awt.Color.red);
268 ivjFlushButton.setActionCommand("FlushButton");
269 // user code begin {1}
270 // user code end
271 } catch (java.lang.Throwable ivjExc) {
272 // user code begin {2}
273 // user code end
274 handleException(ivjExc);
275 }
276 }
277 return ivjFlushButton;
278 }
279
280 /*** Machine-generated. */
281 private javax.swing.JPanel getJDialogContentPane() {
282 if (ivjJDialogContentPane == null) {
283 try {
284 ivjJDialogContentPane = new javax.swing.JPanel();
285 ivjJDialogContentPane.setName("JDialogContentPane");
286 ivjJDialogContentPane.setLayout(null);
287 getJDialogContentPane().add(getPass1Panel(), getPass1Panel().getName());
288 getJDialogContentPane().add(getPass3Panel(), getPass3Panel().getName());
289 getJDialogContentPane().add(getPass2Panel(), getPass2Panel().getName());
290 getJDialogContentPane().add(getPass1Button(), getPass1Button().getName());
291 getJDialogContentPane().add(getPass2Button(), getPass2Button().getName());
292 getJDialogContentPane().add(getPass3Button(), getPass3Button().getName());
293 getJDialogContentPane().add(getFlushButton(), getFlushButton().getName());
294 // user code begin {1}
295 // user code end
296 } catch (java.lang.Throwable ivjExc) {
297 // user code begin {2}
298 // user code end
299 handleException(ivjExc);
300 }
301 }
302 return ivjJDialogContentPane;
303 }
304
305 /*** Machine-generated. */
306 private javax.swing.JButton getPass1Button() {
307 if (ivjPass1Button == null) {
308 try {
309 ivjPass1Button = new javax.swing.JButton();
310 ivjPass1Button.setName("Pass1Button");
311 ivjPass1Button.setText("Pass1: Verify binary layout of .class file");
312 ivjPass1Button.setBackground(java.awt.SystemColor.controlHighlight);
313 ivjPass1Button.setBounds(100, 40, 300, 30);
314 ivjPass1Button.setActionCommand("Button1");
315 // user code begin {1}
316 // user code end
317 } catch (java.lang.Throwable ivjExc) {
318 // user code begin {2}
319 // user code end
320 handleException(ivjExc);
321 }
322 }
323 return ivjPass1Button;
324 }
325
326 /*** Machine-generated. */
327 private javax.swing.JPanel getPass1Panel() {
328 if (ivjPass1Panel == null) {
329 try {
330 ivjPass1Panel = new javax.swing.JPanel();
331 ivjPass1Panel.setName("Pass1Panel");
332 ivjPass1Panel.setLayout(null);
333 ivjPass1Panel.setBackground(java.awt.SystemColor.controlShadow);
334 ivjPass1Panel.setBounds(30, 30, 50, 50);
335 // user code begin {1}
336 // user code end
337 } catch (java.lang.Throwable ivjExc) {
338 // user code begin {2}
339 // user code end
340 handleException(ivjExc);
341 }
342 }
343 return ivjPass1Panel;
344 }
345
346 /*** Machine-generated. */
347 private javax.swing.JButton getPass2Button() {
348 if (ivjPass2Button == null) {
349 try {
350 ivjPass2Button = new javax.swing.JButton();
351 ivjPass2Button.setName("Pass2Button");
352 ivjPass2Button.setText("Pass 2: Verify static .class file constraints");
353 ivjPass2Button.setBackground(java.awt.SystemColor.controlHighlight);
354 ivjPass2Button.setBounds(100, 100, 300, 30);
355 ivjPass2Button.setActionCommand("Button2");
356 // user code begin {1}
357 // user code end
358 } catch (java.lang.Throwable ivjExc) {
359 // user code begin {2}
360 // user code end
361 handleException(ivjExc);
362 }
363 }
364 return ivjPass2Button;
365 }
366
367 /*** Machine-generated. */
368 private javax.swing.JPanel getPass2Panel() {
369 if (ivjPass2Panel == null) {
370 try {
371 ivjPass2Panel = new javax.swing.JPanel();
372 ivjPass2Panel.setName("Pass2Panel");
373 ivjPass2Panel.setLayout(null);
374 ivjPass2Panel.setBackground(java.awt.SystemColor.controlShadow);
375 ivjPass2Panel.setBounds(30, 90, 50, 50);
376 // user code begin {1}
377 // user code end
378 } catch (java.lang.Throwable ivjExc) {
379 // user code begin {2}
380 // user code end
381 handleException(ivjExc);
382 }
383 }
384 return ivjPass2Panel;
385 }
386
387 /*** Machine-generated. */
388 private javax.swing.JButton getPass3Button() {
389 if (ivjPass3Button == null) {
390 try {
391 ivjPass3Button = new javax.swing.JButton();
392 ivjPass3Button.setName("Pass3Button");
393 ivjPass3Button.setText("Passes 3a+3b: Verify code arrays");
394 ivjPass3Button.setBackground(java.awt.SystemColor.controlHighlight);
395 ivjPass3Button.setBounds(100, 160, 300, 30);
396 ivjPass3Button.setActionCommand("Button2");
397 // user code begin {1}
398 // user code end
399 } catch (java.lang.Throwable ivjExc) {
400 // user code begin {2}
401 // user code end
402 handleException(ivjExc);
403 }
404 }
405 return ivjPass3Button;
406 }
407
408 /*** Machine-generated. */
409 private javax.swing.JPanel getPass3Panel() {
410 if (ivjPass3Panel == null) {
411 try {
412 ivjPass3Panel = new javax.swing.JPanel();
413 ivjPass3Panel.setName("Pass3Panel");
414 ivjPass3Panel.setLayout(null);
415 ivjPass3Panel.setBackground(java.awt.SystemColor.controlShadow);
416 ivjPass3Panel.setBounds(30, 150, 50, 50);
417 // user code begin {1}
418 // user code end
419 } catch (java.lang.Throwable ivjExc) {
420 // user code begin {2}
421 // user code end
422 handleException(ivjExc);
423 }
424 }
425 return ivjPass3Panel;
426 }
427
428 /*** Machine-generated. */
429 private void handleException(java.lang.Throwable exception) {
430
431 /* Uncomment the following lines to print uncaught exceptions to stdout */
432 System.out.println("--------- UNCAUGHT EXCEPTION ---------");
433 exception.printStackTrace(System.out);
434 }
435
436
437 /*** Machine-generated. */
438 private void initConnections() throws java.lang.Exception {
439 // user code begin {1}
440 // user code end
441 getPass1Button().addActionListener(ivjEventHandler);
442 getPass2Button().addActionListener(ivjEventHandler);
443 getPass3Button().addActionListener(ivjEventHandler);
444 getFlushButton().addActionListener(ivjEventHandler);
445 }
446
447 /*** Machine-generated. */
448 private void initialize() {
449 try {
450 // user code begin {1}
451 // user code end
452 setName("VerifyDialog");
453 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
454 setSize(430, 280);
455 setVisible(true);
456 setModal(true);
457 setResizable(false);
458 setContentPane(getJDialogContentPane());
459 initConnections();
460 } catch (java.lang.Throwable ivjExc) {
461 handleException(ivjExc);
462 }
463 // user code begin {2}
464 setTitle("'"+class_name+"' verification - JustIce / BCEL");
465 // user code end
466 }
467 /***
468 * Verifies one or more class files.
469 * Verification results are presented graphically: Red means 'rejected',
470 * green means 'passed' while yellow means 'could not be verified yet'.
471 * @param args java.lang.String[] fully qualified names of classes to verify.
472 */
473 public static void main(java.lang.String[] args) {
474 classes_to_verify = args.length;
475
476 for (int i=0; i<args.length; i++){
477
478 try {
479 VerifyDialog aVerifyDialog;
480 aVerifyDialog = new VerifyDialog(args[i]);
481 aVerifyDialog.setModal(true);
482 aVerifyDialog.addWindowListener(new java.awt.event.WindowAdapter() {
483 public void windowClosing(java.awt.event.WindowEvent e) {
484 classes_to_verify--;
485 if (classes_to_verify == 0) System.exit(0);
486 };
487 });
488 aVerifyDialog.setVisible(true);
489 } catch (Throwable exception) {
490 System.err.println("Exception occurred in main() of javax.swing.JDialog");
491 exception.printStackTrace(System.out);
492 }
493
494 }
495 }
496
497 /*** Machine-generated. */
498 public void pass1Button_ActionPerformed(java.awt.event.ActionEvent actionEvent) {
499 Verifier v = VerifierFactory.getVerifier(class_name);
500 VerificationResult vr = v.doPass1();
501 if (vr.getStatus() == VerificationResult.VERIFIED_OK){
502 getPass1Panel().setBackground(Color.green);
503 getPass1Panel().repaint();
504 }
505 if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED){
506 getPass1Panel().setBackground(Color.red);
507 getPass1Panel().repaint();
508 }
509 }
510
511 /*** Machine-generated. */
512 public void pass2Button_ActionPerformed(java.awt.event.ActionEvent actionEvent) {
513 pass1Button_ActionPerformed(actionEvent);
514
515 Verifier v = VerifierFactory.getVerifier(class_name);
516 VerificationResult vr = v.doPass2();
517 if (vr.getStatus() == VerificationResult.VERIFIED_OK){
518 getPass2Panel().setBackground(Color.green);
519 getPass2Panel().repaint();
520 }
521 if (vr.getStatus() == VerificationResult.VERIFIED_NOTYET){
522 getPass2Panel().setBackground(Color.yellow);
523 getPass2Panel().repaint();
524 }
525 if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED){
526 getPass2Panel().setBackground(Color.red);
527 getPass2Panel().repaint();
528 }
529 }
530
531 /*** Machine-generated. */
532 public void pass4Button_ActionPerformed(java.awt.event.ActionEvent actionEvent) {
533
534 pass2Button_ActionPerformed(actionEvent);
535
536
537 Color color = Color.green;
538
539 Verifier v = VerifierFactory.getVerifier(class_name);
540 VerificationResult vr = v.doPass2();
541 if (vr.getStatus() == VerificationResult.VERIFIED_OK){
542 JavaClass jc = Repository.lookupClass(class_name);
543 int nr = jc.getMethods().length;
544 for (int i=0; i<nr; i++) {
545 vr = v.doPass3b(i);
546 if (vr.getStatus() != VerificationResult.VERIFIED_OK){
547 color = Color.red;
548 break;
549 }
550 }
551 }
552 else{
553 color = Color.yellow;
554 }
555
556 getPass3Panel().setBackground(color);
557 getPass3Panel().repaint();
558 }
559 }
This page was automatically generated by Maven