001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018package org.apache.bcel.verifier; 019 020import java.awt.Color; 021 022import org.apache.bcel.Repository; 023import org.apache.bcel.classfile.JavaClass; 024 025/** 026 * A class for simple graphical class file verification. 027 * Use the main(String []) method with fully qualified 028 * class names as arguments to use it as a stand-alone 029 * application. 030 * Use the VerifyDialog(String) constructor to use this 031 * class in your application. 032 * [This class was created using VisualAge for Java, 033 * but it does not work under VAJ itself (Version 3.02 JDK 1.2)] 034 * @see #main(String[]) 035 * @see #VerifyDialog(String) 036 */ 037public class VerifyDialog extends javax.swing.JDialog { 038 039 private static final long serialVersionUID = -6374807677043142313L; 040 /** Machine-generated. */ 041 private javax.swing.JPanel ivjJDialogContentPane = null; 042 /** Machine-generated. */ 043 private javax.swing.JPanel ivjPass1Panel = null; 044 /** Machine-generated. */ 045 private javax.swing.JPanel ivjPass2Panel = null; 046 /** Machine-generated. */ 047 private javax.swing.JPanel ivjPass3Panel = null; 048 /** Machine-generated. */ 049 private javax.swing.JButton ivjPass1Button = null; 050 /** Machine-generated. */ 051 private javax.swing.JButton ivjPass2Button = null; 052 /** Machine-generated. */ 053 private javax.swing.JButton ivjPass3Button = null; 054 /** Machine-generated. */ 055 private final IvjEventHandler ivjEventHandler = new IvjEventHandler(); 056 /** 057 * The class to verify. Default set to 'java.lang.Object' 058 * in case this class is instantiated via one of the many 059 * machine-generated constructors. 060 */ 061 private String class_name = "java.lang.Object"; 062 /** 063 * This field is here to count the number of open VerifyDialog 064 * instances so the JVM can be exited afer every Dialog had been 065 * closed. 066 */ 067 private static int classes_to_verify; 068 069 /** Machine-generated. */ 070 class IvjEventHandler implements java.awt.event.ActionListener { 071 072 @Override 073 public void actionPerformed( final java.awt.event.ActionEvent e ) { 074 if (e.getSource() == VerifyDialog.this.getPass1Button()) { 075 connEtoC1(e); 076 } 077 if (e.getSource() == VerifyDialog.this.getPass2Button()) { 078 connEtoC2(e); 079 } 080 if (e.getSource() == VerifyDialog.this.getPass3Button()) { 081 connEtoC3(e); 082 } 083 if (e.getSource() == VerifyDialog.this.getFlushButton()) { 084 connEtoC4(e); 085 } 086 } 087 } 088 089 /** Machine-generated. */ 090 private javax.swing.JButton ivjFlushButton = null; 091 092 093 /** Machine-generated. */ 094 public VerifyDialog() { 095 super(); 096 initialize(); 097 } 098 099 100 /** Machine-generated. */ 101 public VerifyDialog(final java.awt.Dialog owner) { 102 super(owner); 103 } 104 105 106 /** Machine-generated. */ 107 public VerifyDialog(final java.awt.Dialog owner, final String title) { 108 super(owner, title); 109 } 110 111 112 /** Machine-generated. */ 113 public VerifyDialog(final java.awt.Dialog owner, final String title, final boolean modal) { 114 super(owner, title, modal); 115 } 116 117 118 /** Machine-generated. */ 119 public VerifyDialog(final java.awt.Dialog owner, final boolean modal) { 120 super(owner, modal); 121 } 122 123 124 /** Machine-generated. */ 125 public VerifyDialog(final java.awt.Frame owner) { 126 super(owner); 127 } 128 129 130 /** Machine-generated. */ 131 public VerifyDialog(final java.awt.Frame owner, final String title) { 132 super(owner, title); 133 } 134 135 136 /** Machine-generated. */ 137 public VerifyDialog(final java.awt.Frame owner, final String title, final boolean modal) { 138 super(owner, title, modal); 139 } 140 141 142 /** Machine-generated. */ 143 public VerifyDialog(final java.awt.Frame owner, final boolean modal) { 144 super(owner, modal); 145 } 146 147 148 /** 149 * Use this constructor if you want a possibility to verify other 150 * class files than java.lang.Object. 151 * @param fully_qualified_class_name java.lang.String 152 */ 153 public VerifyDialog(String fully_qualified_class_name) { 154 super(); 155 final int dotclasspos = fully_qualified_class_name.lastIndexOf(".class"); 156 if (dotclasspos != -1) { 157 fully_qualified_class_name = fully_qualified_class_name.substring(0, dotclasspos); 158 } 159 fully_qualified_class_name = fully_qualified_class_name.replace('/', '.'); 160 class_name = fully_qualified_class_name; 161 initialize(); 162 } 163 164 165 /** Machine-generated. */ 166 private void connEtoC1( final java.awt.event.ActionEvent arg1 ) { 167 try { 168 // user code begin {1} 169 // user code end 170 this.pass1Button_ActionPerformed(arg1); 171 // user code begin {2} 172 // user code end 173 } catch (final java.lang.Throwable ivjExc) { 174 // user code begin {3} 175 // user code end 176 handleException(ivjExc); 177 } 178 } 179 180 181 /** Machine-generated. */ 182 private void connEtoC2( final java.awt.event.ActionEvent arg1 ) { 183 try { 184 // user code begin {1} 185 // user code end 186 this.pass2Button_ActionPerformed(arg1); 187 // user code begin {2} 188 // user code end 189 } catch (final java.lang.Throwable ivjExc) { 190 // user code begin {3} 191 // user code end 192 handleException(ivjExc); 193 } 194 } 195 196 197 /** Machine-generated. */ 198 private void connEtoC3( final java.awt.event.ActionEvent arg1 ) { 199 try { 200 // user code begin {1} 201 // user code end 202 this.pass4Button_ActionPerformed(arg1); 203 // user code begin {2} 204 // user code end 205 } catch (final java.lang.Throwable ivjExc) { 206 // user code begin {3} 207 // user code end 208 handleException(ivjExc); 209 } 210 } 211 212 213 /** Machine-generated. */ 214 private void connEtoC4( final java.awt.event.ActionEvent arg1 ) { 215 try { 216 // user code begin {1} 217 // user code end 218 this.flushButton_ActionPerformed(arg1); 219 // user code begin {2} 220 // user code end 221 } catch (final java.lang.Throwable ivjExc) { 222 // user code begin {3} 223 // user code end 224 handleException(ivjExc); 225 } 226 } 227 228 229 /** Machine-generated. */ 230 public void flushButton_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { 231 VerifierFactory.getVerifier(class_name).flush(); 232 Repository.removeClass(class_name); // Make sure it will be reloaded. 233 getPass1Panel().setBackground(Color.gray); 234 getPass1Panel().repaint(); 235 getPass2Panel().setBackground(Color.gray); 236 getPass2Panel().repaint(); 237 getPass3Panel().setBackground(Color.gray); 238 getPass3Panel().repaint(); 239 } 240 241 242 /** Machine-generated. */ 243 private javax.swing.JButton getFlushButton() { 244 if (ivjFlushButton == null) { 245 try { 246 ivjFlushButton = new javax.swing.JButton(); 247 ivjFlushButton.setName("FlushButton"); 248 ivjFlushButton.setText("Flush: Forget old verification results"); 249 ivjFlushButton.setBackground(java.awt.SystemColor.controlHighlight); 250 ivjFlushButton.setBounds(60, 215, 300, 30); 251 ivjFlushButton.setForeground(java.awt.Color.red); 252 ivjFlushButton.setActionCommand("FlushButton"); 253 // user code begin {1} 254 // user code end 255 } catch (final java.lang.Throwable ivjExc) { 256 // user code begin {2} 257 // user code end 258 handleException(ivjExc); 259 } 260 } 261 return ivjFlushButton; 262 } 263 264 265 /** Machine-generated. */ 266 private javax.swing.JPanel getJDialogContentPane() { 267 if (ivjJDialogContentPane == null) { 268 try { 269 ivjJDialogContentPane = new javax.swing.JPanel(); 270 ivjJDialogContentPane.setName("JDialogContentPane"); 271 ivjJDialogContentPane.setLayout(null); 272 getJDialogContentPane().add(getPass1Panel(), getPass1Panel().getName()); 273 getJDialogContentPane().add(getPass3Panel(), getPass3Panel().getName()); 274 getJDialogContentPane().add(getPass2Panel(), getPass2Panel().getName()); 275 getJDialogContentPane().add(getPass1Button(), getPass1Button().getName()); 276 getJDialogContentPane().add(getPass2Button(), getPass2Button().getName()); 277 getJDialogContentPane().add(getPass3Button(), getPass3Button().getName()); 278 getJDialogContentPane().add(getFlushButton(), getFlushButton().getName()); 279 // user code begin {1} 280 // user code end 281 } catch (final java.lang.Throwable ivjExc) { 282 // user code begin {2} 283 // user code end 284 handleException(ivjExc); 285 } 286 } 287 return ivjJDialogContentPane; 288 } 289 290 291 /** Machine-generated. */ 292 private javax.swing.JButton getPass1Button() { 293 if (ivjPass1Button == null) { 294 try { 295 ivjPass1Button = new javax.swing.JButton(); 296 ivjPass1Button.setName("Pass1Button"); 297 ivjPass1Button.setText("Pass1: Verify binary layout of .class file"); 298 ivjPass1Button.setBackground(java.awt.SystemColor.controlHighlight); 299 ivjPass1Button.setBounds(100, 40, 300, 30); 300 ivjPass1Button.setActionCommand("Button1"); 301 // user code begin {1} 302 // user code end 303 } catch (final java.lang.Throwable ivjExc) { 304 // user code begin {2} 305 // user code end 306 handleException(ivjExc); 307 } 308 } 309 return ivjPass1Button; 310 } 311 312 313 /** Machine-generated. */ 314 private javax.swing.JPanel getPass1Panel() { 315 if (ivjPass1Panel == null) { 316 try { 317 ivjPass1Panel = new javax.swing.JPanel(); 318 ivjPass1Panel.setName("Pass1Panel"); 319 ivjPass1Panel.setLayout(null); 320 ivjPass1Panel.setBackground(java.awt.SystemColor.controlShadow); 321 ivjPass1Panel.setBounds(30, 30, 50, 50); 322 // user code begin {1} 323 // user code end 324 } catch (final java.lang.Throwable ivjExc) { 325 // user code begin {2} 326 // user code end 327 handleException(ivjExc); 328 } 329 } 330 return ivjPass1Panel; 331 } 332 333 334 /** Machine-generated. */ 335 private javax.swing.JButton getPass2Button() { 336 if (ivjPass2Button == null) { 337 try { 338 ivjPass2Button = new javax.swing.JButton(); 339 ivjPass2Button.setName("Pass2Button"); 340 ivjPass2Button.setText("Pass 2: Verify static .class file constraints"); 341 ivjPass2Button.setBackground(java.awt.SystemColor.controlHighlight); 342 ivjPass2Button.setBounds(100, 100, 300, 30); 343 ivjPass2Button.setActionCommand("Button2"); 344 // user code begin {1} 345 // user code end 346 } catch (final java.lang.Throwable ivjExc) { 347 // user code begin {2} 348 // user code end 349 handleException(ivjExc); 350 } 351 } 352 return ivjPass2Button; 353 } 354 355 356 /** Machine-generated. */ 357 private javax.swing.JPanel getPass2Panel() { 358 if (ivjPass2Panel == null) { 359 try { 360 ivjPass2Panel = new javax.swing.JPanel(); 361 ivjPass2Panel.setName("Pass2Panel"); 362 ivjPass2Panel.setLayout(null); 363 ivjPass2Panel.setBackground(java.awt.SystemColor.controlShadow); 364 ivjPass2Panel.setBounds(30, 90, 50, 50); 365 // user code begin {1} 366 // user code end 367 } catch (final java.lang.Throwable ivjExc) { 368 // user code begin {2} 369 // user code end 370 handleException(ivjExc); 371 } 372 } 373 return ivjPass2Panel; 374 } 375 376 377 /** Machine-generated. */ 378 private javax.swing.JButton getPass3Button() { 379 if (ivjPass3Button == null) { 380 try { 381 ivjPass3Button = new javax.swing.JButton(); 382 ivjPass3Button.setName("Pass3Button"); 383 ivjPass3Button.setText("Passes 3a+3b: Verify code arrays"); 384 ivjPass3Button.setBackground(java.awt.SystemColor.controlHighlight); 385 ivjPass3Button.setBounds(100, 160, 300, 30); 386 ivjPass3Button.setActionCommand("Button2"); 387 // user code begin {1} 388 // user code end 389 } catch (final java.lang.Throwable ivjExc) { 390 // user code begin {2} 391 // user code end 392 handleException(ivjExc); 393 } 394 } 395 return ivjPass3Button; 396 } 397 398 399 /** Machine-generated. */ 400 private javax.swing.JPanel getPass3Panel() { 401 if (ivjPass3Panel == null) { 402 try { 403 ivjPass3Panel = new javax.swing.JPanel(); 404 ivjPass3Panel.setName("Pass3Panel"); 405 ivjPass3Panel.setLayout(null); 406 ivjPass3Panel.setBackground(java.awt.SystemColor.controlShadow); 407 ivjPass3Panel.setBounds(30, 150, 50, 50); 408 // user code begin {1} 409 // user code end 410 } catch (final java.lang.Throwable ivjExc) { 411 // user code begin {2} 412 // user code end 413 handleException(ivjExc); 414 } 415 } 416 return ivjPass3Panel; 417 } 418 419 420 /** Machine-generated. */ 421 private void handleException( final java.lang.Throwable exception ) { 422 /* Uncomment the following lines to print uncaught exceptions to stdout */ 423 System.out.println("--------- UNCAUGHT EXCEPTION ---------"); 424 exception.printStackTrace(System.out); 425 // manually added code 426 if (exception instanceof ThreadDeath) { 427 throw (ThreadDeath) exception; 428 } 429 if (exception instanceof VirtualMachineError) { 430 throw (VirtualMachineError) exception; 431 } 432 } 433 434 435 /** Machine-generated. */ 436 private void initConnections() throws java.lang.Exception { 437 // user code begin {1} 438 // user code end 439 getPass1Button().addActionListener(ivjEventHandler); 440 getPass2Button().addActionListener(ivjEventHandler); 441 getPass3Button().addActionListener(ivjEventHandler); 442 getFlushButton().addActionListener(ivjEventHandler); 443 } 444 445 446 /** Machine-generated. */ 447 private void initialize() { 448 try { 449 // user code begin {1} 450 // user code end 451 setName("VerifyDialog"); 452 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); 453 setSize(430, 280); 454 setVisible(true); 455 setModal(true); 456 setResizable(false); 457 setContentPane(getJDialogContentPane()); 458 initConnections(); 459 } catch (final java.lang.Throwable ivjExc) { 460 handleException(ivjExc); 461 } 462 // user code begin {2} 463 setTitle("'" + class_name + "' verification - JustIce / BCEL"); 464 // user code end 465 } 466 467 468 /** 469 * Verifies one or more class files. 470 * Verification results are presented graphically: Red means 'rejected', 471 * green means 'passed' while yellow means 'could not be verified yet'. 472 * @param args java.lang.String[] fully qualified names of classes to verify. 473 */ 474 public static void main( final java.lang.String[] args ) { 475 classes_to_verify = args.length; 476 for (final String arg : args) { 477 try { 478 VerifyDialog aVerifyDialog; 479 aVerifyDialog = new VerifyDialog(arg); 480 aVerifyDialog.setModal(true); 481 aVerifyDialog.addWindowListener(new java.awt.event.WindowAdapter() { 482 483 @Override 484 public void windowClosing( final java.awt.event.WindowEvent e ) { 485 classes_to_verify--; 486 if (classes_to_verify == 0) { 487 System.exit(0); 488 } 489 } 490 }); 491 aVerifyDialog.setVisible(true); 492 } catch (final Throwable exception) { 493 System.err.println("Exception occurred in main() of javax.swing.JDialog"); 494 exception.printStackTrace(System.out); 495 } 496 } 497 } 498 499 500 /** Machine-generated. */ 501 public void pass1Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { 502 final Verifier v = VerifierFactory.getVerifier(class_name); 503 final VerificationResult vr = v.doPass1(); 504 if (vr.getStatus() == VerificationResult.VERIFIED_OK) { 505 getPass1Panel().setBackground(Color.green); 506 getPass1Panel().repaint(); 507 } 508 if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { 509 getPass1Panel().setBackground(Color.red); 510 getPass1Panel().repaint(); 511 } 512 } 513 514 515 /** Machine-generated. */ 516 public void pass2Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { 517 pass1Button_ActionPerformed(actionEvent); 518 final Verifier v = VerifierFactory.getVerifier(class_name); 519 final VerificationResult vr = v.doPass2(); 520 if (vr.getStatus() == VerificationResult.VERIFIED_OK) { 521 getPass2Panel().setBackground(Color.green); 522 getPass2Panel().repaint(); 523 } 524 if (vr.getStatus() == VerificationResult.VERIFIED_NOTYET) { 525 getPass2Panel().setBackground(Color.yellow); 526 getPass2Panel().repaint(); 527 } 528 if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { 529 getPass2Panel().setBackground(Color.red); 530 getPass2Panel().repaint(); 531 } 532 } 533 534 535 /** Machine-generated. */ 536 public void pass4Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { 537 pass2Button_ActionPerformed(actionEvent); 538 Color color = Color.green; 539 final Verifier v = VerifierFactory.getVerifier(class_name); 540 VerificationResult vr = v.doPass2(); 541 if (vr.getStatus() == VerificationResult.VERIFIED_OK) { 542 JavaClass jc = null; 543 try { 544 jc = Repository.lookupClass(class_name); 545 final int nr = jc.getMethods().length; 546 for (int i = 0; i < nr; i++) { 547 vr = v.doPass3b(i); 548 if (vr.getStatus() != VerificationResult.VERIFIED_OK) { 549 color = Color.red; 550 break; 551 } 552 } 553 } catch (final ClassNotFoundException ex) { 554 // FIXME: report the error 555 ex.printStackTrace(); 556 } 557 } else { 558 color = Color.yellow; 559 } 560 getPass3Panel().setBackground(color); 561 getPass3Panel().repaint(); 562 } 563}