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.bcel.verifier; 19 20 import java.awt.Color; 21 22 import org.apache.bcel.Repository; 23 import org.apache.bcel.classfile.JavaClass; 24 25 /** 26 * A class for simple graphical class file verification. 27 * Use the main(String []) method with fully qualified 28 * class names as arguments to use it as a stand-alone 29 * application. 30 * Use the VerifyDialog(String) constructor to use this 31 * class in your application. 32 * [This class was created using VisualAge for Java, 33 * but it does not work under VAJ itself (Version 3.02 JDK 1.2)] 34 * @version $Id$ 35 * @see #main(String[]) 36 * @see #VerifyDialog(String) 37 */ 38 public class VerifyDialog extends javax.swing.JDialog { 39 40 private static final long serialVersionUID = -6374807677043142313L; 41 /** Machine-generated. */ 42 private javax.swing.JPanel ivjJDialogContentPane = null; 43 /** Machine-generated. */ 44 private javax.swing.JPanel ivjPass1Panel = null; 45 /** Machine-generated. */ 46 private javax.swing.JPanel ivjPass2Panel = null; 47 /** Machine-generated. */ 48 private javax.swing.JPanel ivjPass3Panel = null; 49 /** Machine-generated. */ 50 private javax.swing.JButton ivjPass1Button = null; 51 /** Machine-generated. */ 52 private javax.swing.JButton ivjPass2Button = null; 53 /** Machine-generated. */ 54 private javax.swing.JButton ivjPass3Button = null; 55 /** Machine-generated. */ 56 private final IvjEventHandler ivjEventHandler = new IvjEventHandler(); 57 /** 58 * The class to verify. Default set to 'java.lang.Object' 59 * in case this class is instantiated via one of the many 60 * machine-generated constructors. 61 */ 62 private String class_name = "java.lang.Object"; 63 /** 64 * This field is here to count the number of open VerifyDialog 65 * instances so the JVM can be exited afer every Dialog had been 66 * closed. 67 */ 68 private static int classes_to_verify; 69 70 /** Machine-generated. */ 71 class IvjEventHandler implements java.awt.event.ActionListener { 72 73 @Override actionPerformed( final java.awt.event.ActionEvent e )74 public void actionPerformed( final java.awt.event.ActionEvent e ) { 75 if (e.getSource() == VerifyDialog.this.getPass1Button()) { 76 connEtoC1(e); 77 } 78 if (e.getSource() == VerifyDialog.this.getPass2Button()) { 79 connEtoC2(e); 80 } 81 if (e.getSource() == VerifyDialog.this.getPass3Button()) { 82 connEtoC3(e); 83 } 84 if (e.getSource() == VerifyDialog.this.getFlushButton()) { 85 connEtoC4(e); 86 } 87 } 88 } 89 90 /** Machine-generated. */ 91 private javax.swing.JButton ivjFlushButton = null; 92 93 94 /** Machine-generated. */ VerifyDialog()95 public VerifyDialog() { 96 super(); 97 initialize(); 98 } 99 100 101 /** Machine-generated. */ VerifyDialog(final java.awt.Dialog owner)102 public VerifyDialog(final java.awt.Dialog owner) { 103 super(owner); 104 } 105 106 107 /** Machine-generated. */ VerifyDialog(final java.awt.Dialog owner, final String title)108 public VerifyDialog(final java.awt.Dialog owner, final String title) { 109 super(owner, title); 110 } 111 112 113 /** Machine-generated. */ VerifyDialog(final java.awt.Dialog owner, final String title, final boolean modal)114 public VerifyDialog(final java.awt.Dialog owner, final String title, final boolean modal) { 115 super(owner, title, modal); 116 } 117 118 119 /** Machine-generated. */ VerifyDialog(final java.awt.Dialog owner, final boolean modal)120 public VerifyDialog(final java.awt.Dialog owner, final boolean modal) { 121 super(owner, modal); 122 } 123 124 125 /** Machine-generated. */ VerifyDialog(final java.awt.Frame owner)126 public VerifyDialog(final java.awt.Frame owner) { 127 super(owner); 128 } 129 130 131 /** Machine-generated. */ VerifyDialog(final java.awt.Frame owner, final String title)132 public VerifyDialog(final java.awt.Frame owner, final String title) { 133 super(owner, title); 134 } 135 136 137 /** Machine-generated. */ VerifyDialog(final java.awt.Frame owner, final String title, final boolean modal)138 public VerifyDialog(final java.awt.Frame owner, final String title, final boolean modal) { 139 super(owner, title, modal); 140 } 141 142 143 /** Machine-generated. */ VerifyDialog(final java.awt.Frame owner, final boolean modal)144 public VerifyDialog(final java.awt.Frame owner, final boolean modal) { 145 super(owner, modal); 146 } 147 148 149 /** 150 * Use this constructor if you want a possibility to verify other 151 * class files than java.lang.Object. 152 * @param fully_qualified_class_name java.lang.String 153 */ VerifyDialog(String fully_qualified_class_name)154 public VerifyDialog(String fully_qualified_class_name) { 155 super(); 156 final int dotclasspos = fully_qualified_class_name.lastIndexOf(".class"); 157 if (dotclasspos != -1) { 158 fully_qualified_class_name = fully_qualified_class_name.substring(0, dotclasspos); 159 } 160 fully_qualified_class_name = fully_qualified_class_name.replace('/', '.'); 161 class_name = fully_qualified_class_name; 162 initialize(); 163 } 164 165 166 /** Machine-generated. */ connEtoC1( final java.awt.event.ActionEvent arg1 )167 private void connEtoC1( final java.awt.event.ActionEvent arg1 ) { 168 try { 169 // user code begin {1} 170 // user code end 171 this.pass1Button_ActionPerformed(arg1); 172 // user code begin {2} 173 // user code end 174 } catch (final java.lang.Throwable ivjExc) { 175 // user code begin {3} 176 // user code end 177 handleException(ivjExc); 178 } 179 } 180 181 182 /** Machine-generated. */ connEtoC2( final java.awt.event.ActionEvent arg1 )183 private void connEtoC2( final java.awt.event.ActionEvent arg1 ) { 184 try { 185 // user code begin {1} 186 // user code end 187 this.pass2Button_ActionPerformed(arg1); 188 // user code begin {2} 189 // user code end 190 } catch (final java.lang.Throwable ivjExc) { 191 // user code begin {3} 192 // user code end 193 handleException(ivjExc); 194 } 195 } 196 197 198 /** Machine-generated. */ connEtoC3( final java.awt.event.ActionEvent arg1 )199 private void connEtoC3( final java.awt.event.ActionEvent arg1 ) { 200 try { 201 // user code begin {1} 202 // user code end 203 this.pass4Button_ActionPerformed(arg1); 204 // user code begin {2} 205 // user code end 206 } catch (final java.lang.Throwable ivjExc) { 207 // user code begin {3} 208 // user code end 209 handleException(ivjExc); 210 } 211 } 212 213 214 /** Machine-generated. */ connEtoC4( final java.awt.event.ActionEvent arg1 )215 private void connEtoC4( final java.awt.event.ActionEvent arg1 ) { 216 try { 217 // user code begin {1} 218 // user code end 219 this.flushButton_ActionPerformed(arg1); 220 // user code begin {2} 221 // user code end 222 } catch (final java.lang.Throwable ivjExc) { 223 // user code begin {3} 224 // user code end 225 handleException(ivjExc); 226 } 227 } 228 229 230 /** Machine-generated. */ flushButton_ActionPerformed( final java.awt.event.ActionEvent actionEvent )231 public void flushButton_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { 232 VerifierFactory.getVerifier(class_name).flush(); 233 Repository.removeClass(class_name); // Make sure it will be reloaded. 234 getPass1Panel().setBackground(Color.gray); 235 getPass1Panel().repaint(); 236 getPass2Panel().setBackground(Color.gray); 237 getPass2Panel().repaint(); 238 getPass3Panel().setBackground(Color.gray); 239 getPass3Panel().repaint(); 240 } 241 242 243 /** Machine-generated. */ getFlushButton()244 private javax.swing.JButton getFlushButton() { 245 if (ivjFlushButton == null) { 246 try { 247 ivjFlushButton = new javax.swing.JButton(); 248 ivjFlushButton.setName("FlushButton"); 249 ivjFlushButton.setText("Flush: Forget old verification results"); 250 ivjFlushButton.setBackground(java.awt.SystemColor.controlHighlight); 251 ivjFlushButton.setBounds(60, 215, 300, 30); 252 ivjFlushButton.setForeground(java.awt.Color.red); 253 ivjFlushButton.setActionCommand("FlushButton"); 254 // user code begin {1} 255 // user code end 256 } catch (final java.lang.Throwable ivjExc) { 257 // user code begin {2} 258 // user code end 259 handleException(ivjExc); 260 } 261 } 262 return ivjFlushButton; 263 } 264 265 266 /** Machine-generated. */ getJDialogContentPane()267 private javax.swing.JPanel getJDialogContentPane() { 268 if (ivjJDialogContentPane == null) { 269 try { 270 ivjJDialogContentPane = new javax.swing.JPanel(); 271 ivjJDialogContentPane.setName("JDialogContentPane"); 272 ivjJDialogContentPane.setLayout(null); 273 getJDialogContentPane().add(getPass1Panel(), getPass1Panel().getName()); 274 getJDialogContentPane().add(getPass3Panel(), getPass3Panel().getName()); 275 getJDialogContentPane().add(getPass2Panel(), getPass2Panel().getName()); 276 getJDialogContentPane().add(getPass1Button(), getPass1Button().getName()); 277 getJDialogContentPane().add(getPass2Button(), getPass2Button().getName()); 278 getJDialogContentPane().add(getPass3Button(), getPass3Button().getName()); 279 getJDialogContentPane().add(getFlushButton(), getFlushButton().getName()); 280 // user code begin {1} 281 // user code end 282 } catch (final java.lang.Throwable ivjExc) { 283 // user code begin {2} 284 // user code end 285 handleException(ivjExc); 286 } 287 } 288 return ivjJDialogContentPane; 289 } 290 291 292 /** Machine-generated. */ getPass1Button()293 private javax.swing.JButton getPass1Button() { 294 if (ivjPass1Button == null) { 295 try { 296 ivjPass1Button = new javax.swing.JButton(); 297 ivjPass1Button.setName("Pass1Button"); 298 ivjPass1Button.setText("Pass1: Verify binary layout of .class file"); 299 ivjPass1Button.setBackground(java.awt.SystemColor.controlHighlight); 300 ivjPass1Button.setBounds(100, 40, 300, 30); 301 ivjPass1Button.setActionCommand("Button1"); 302 // user code begin {1} 303 // user code end 304 } catch (final java.lang.Throwable ivjExc) { 305 // user code begin {2} 306 // user code end 307 handleException(ivjExc); 308 } 309 } 310 return ivjPass1Button; 311 } 312 313 314 /** Machine-generated. */ getPass1Panel()315 private javax.swing.JPanel getPass1Panel() { 316 if (ivjPass1Panel == null) { 317 try { 318 ivjPass1Panel = new javax.swing.JPanel(); 319 ivjPass1Panel.setName("Pass1Panel"); 320 ivjPass1Panel.setLayout(null); 321 ivjPass1Panel.setBackground(java.awt.SystemColor.controlShadow); 322 ivjPass1Panel.setBounds(30, 30, 50, 50); 323 // user code begin {1} 324 // user code end 325 } catch (final java.lang.Throwable ivjExc) { 326 // user code begin {2} 327 // user code end 328 handleException(ivjExc); 329 } 330 } 331 return ivjPass1Panel; 332 } 333 334 335 /** Machine-generated. */ getPass2Button()336 private javax.swing.JButton getPass2Button() { 337 if (ivjPass2Button == null) { 338 try { 339 ivjPass2Button = new javax.swing.JButton(); 340 ivjPass2Button.setName("Pass2Button"); 341 ivjPass2Button.setText("Pass 2: Verify static .class file constraints"); 342 ivjPass2Button.setBackground(java.awt.SystemColor.controlHighlight); 343 ivjPass2Button.setBounds(100, 100, 300, 30); 344 ivjPass2Button.setActionCommand("Button2"); 345 // user code begin {1} 346 // user code end 347 } catch (final java.lang.Throwable ivjExc) { 348 // user code begin {2} 349 // user code end 350 handleException(ivjExc); 351 } 352 } 353 return ivjPass2Button; 354 } 355 356 357 /** Machine-generated. */ getPass2Panel()358 private javax.swing.JPanel getPass2Panel() { 359 if (ivjPass2Panel == null) { 360 try { 361 ivjPass2Panel = new javax.swing.JPanel(); 362 ivjPass2Panel.setName("Pass2Panel"); 363 ivjPass2Panel.setLayout(null); 364 ivjPass2Panel.setBackground(java.awt.SystemColor.controlShadow); 365 ivjPass2Panel.setBounds(30, 90, 50, 50); 366 // user code begin {1} 367 // user code end 368 } catch (final java.lang.Throwable ivjExc) { 369 // user code begin {2} 370 // user code end 371 handleException(ivjExc); 372 } 373 } 374 return ivjPass2Panel; 375 } 376 377 378 /** Machine-generated. */ getPass3Button()379 private javax.swing.JButton getPass3Button() { 380 if (ivjPass3Button == null) { 381 try { 382 ivjPass3Button = new javax.swing.JButton(); 383 ivjPass3Button.setName("Pass3Button"); 384 ivjPass3Button.setText("Passes 3a+3b: Verify code arrays"); 385 ivjPass3Button.setBackground(java.awt.SystemColor.controlHighlight); 386 ivjPass3Button.setBounds(100, 160, 300, 30); 387 ivjPass3Button.setActionCommand("Button2"); 388 // user code begin {1} 389 // user code end 390 } catch (final java.lang.Throwable ivjExc) { 391 // user code begin {2} 392 // user code end 393 handleException(ivjExc); 394 } 395 } 396 return ivjPass3Button; 397 } 398 399 400 /** Machine-generated. */ getPass3Panel()401 private javax.swing.JPanel getPass3Panel() { 402 if (ivjPass3Panel == null) { 403 try { 404 ivjPass3Panel = new javax.swing.JPanel(); 405 ivjPass3Panel.setName("Pass3Panel"); 406 ivjPass3Panel.setLayout(null); 407 ivjPass3Panel.setBackground(java.awt.SystemColor.controlShadow); 408 ivjPass3Panel.setBounds(30, 150, 50, 50); 409 // user code begin {1} 410 // user code end 411 } catch (final java.lang.Throwable ivjExc) { 412 // user code begin {2} 413 // user code end 414 handleException(ivjExc); 415 } 416 } 417 return ivjPass3Panel; 418 } 419 420 421 /** Machine-generated. */ handleException( final java.lang.Throwable exception )422 private void handleException( final java.lang.Throwable exception ) { 423 /* Uncomment the following lines to print uncaught exceptions to stdout */ 424 System.out.println("--------- UNCAUGHT EXCEPTION ---------"); 425 exception.printStackTrace(System.out); 426 // manually added code 427 if (exception instanceof ThreadDeath) { 428 throw (ThreadDeath) exception; 429 } 430 if (exception instanceof VirtualMachineError) { 431 throw (VirtualMachineError) exception; 432 } 433 } 434 435 436 /** Machine-generated. */ initConnections()437 private void initConnections() throws java.lang.Exception { 438 // user code begin {1} 439 // user code end 440 getPass1Button().addActionListener(ivjEventHandler); 441 getPass2Button().addActionListener(ivjEventHandler); 442 getPass3Button().addActionListener(ivjEventHandler); 443 getFlushButton().addActionListener(ivjEventHandler); 444 } 445 446 447 /** Machine-generated. */ initialize()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 (final 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 469 /** 470 * Verifies one or more class files. 471 * Verification results are presented graphically: Red means 'rejected', 472 * green means 'passed' while yellow means 'could not be verified yet'. 473 * @param args java.lang.String[] fully qualified names of classes to verify. 474 */ main( final java.lang.String[] args )475 public static void main( final java.lang.String[] args ) { 476 classes_to_verify = args.length; 477 for (final String arg : args) { 478 try { 479 VerifyDialog aVerifyDialog; 480 aVerifyDialog = new VerifyDialog(arg); 481 aVerifyDialog.setModal(true); 482 aVerifyDialog.addWindowListener(new java.awt.event.WindowAdapter() { 483 484 @Override 485 public void windowClosing( final java.awt.event.WindowEvent e ) { 486 classes_to_verify--; 487 if (classes_to_verify == 0) { 488 System.exit(0); 489 } 490 } 491 }); 492 aVerifyDialog.setVisible(true); 493 } catch (final Throwable exception) { 494 System.err.println("Exception occurred in main() of javax.swing.JDialog"); 495 exception.printStackTrace(System.out); 496 } 497 } 498 } 499 500 501 /** Machine-generated. */ pass1Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent )502 public void pass1Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { 503 final Verifier v = VerifierFactory.getVerifier(class_name); 504 final VerificationResult vr = v.doPass1(); 505 if (vr.getStatus() == VerificationResult.VERIFIED_OK) { 506 getPass1Panel().setBackground(Color.green); 507 getPass1Panel().repaint(); 508 } 509 if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { 510 getPass1Panel().setBackground(Color.red); 511 getPass1Panel().repaint(); 512 } 513 } 514 515 516 /** Machine-generated. */ pass2Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent )517 public void pass2Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { 518 pass1Button_ActionPerformed(actionEvent); 519 final Verifier v = VerifierFactory.getVerifier(class_name); 520 final VerificationResult vr = v.doPass2(); 521 if (vr.getStatus() == VerificationResult.VERIFIED_OK) { 522 getPass2Panel().setBackground(Color.green); 523 getPass2Panel().repaint(); 524 } 525 if (vr.getStatus() == VerificationResult.VERIFIED_NOTYET) { 526 getPass2Panel().setBackground(Color.yellow); 527 getPass2Panel().repaint(); 528 } 529 if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { 530 getPass2Panel().setBackground(Color.red); 531 getPass2Panel().repaint(); 532 } 533 } 534 535 536 /** Machine-generated. */ pass4Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent )537 public void pass4Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { 538 pass2Button_ActionPerformed(actionEvent); 539 Color color = Color.green; 540 final Verifier v = VerifierFactory.getVerifier(class_name); 541 VerificationResult vr = v.doPass2(); 542 if (vr.getStatus() == VerificationResult.VERIFIED_OK) { 543 JavaClass jc = null; 544 try { 545 jc = Repository.lookupClass(class_name); 546 final int nr = jc.getMethods().length; 547 for (int i = 0; i < nr; i++) { 548 vr = v.doPass3b(i); 549 if (vr.getStatus() != VerificationResult.VERIFIED_OK) { 550 color = Color.red; 551 break; 552 } 553 } 554 } catch (final ClassNotFoundException ex) { 555 // FIXME: report the error 556 ex.printStackTrace(); 557 } 558 } else { 559 color = Color.yellow; 560 } 561 getPass3Panel().setBackground(color); 562 getPass3Panel().repaint(); 563 } 564 } 565