diff options
Diffstat (limited to 'src/java/org/apache/bcel/verifier/VerifyDialog.java')
-rw-r--r-- | src/java/org/apache/bcel/verifier/VerifyDialog.java | 559 |
1 files changed, 559 insertions, 0 deletions
diff --git a/src/java/org/apache/bcel/verifier/VerifyDialog.java b/src/java/org/apache/bcel/verifier/VerifyDialog.java new file mode 100644 index 00000000..9fe642d0 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/VerifyDialog.java @@ -0,0 +1,559 @@ +package org.apache.bcel.verifier; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + */ + +import org.apache.bcel.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.verifier.*; +import java.awt.Color; + +/** + * A class for simple graphical class file verification. + * Use the main(String []) method with fully qualified + * class names as arguments to use it as a stand-alone + * application. + * Use the VerifyDialog(String) constructor to use this + * class in your application. + * [This class was created using VisualAge for Java, + * but it does not work under VAJ itself (Version 3.02 JDK 1.2)] + * @version $Id$ + * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A> + * @see #main(String[]) + * @see #VerifyDialog(String) + */ +public class VerifyDialog extends javax.swing.JDialog { + /** Machine-generated. */ + private javax.swing.JPanel ivjJDialogContentPane = null; + /** Machine-generated. */ + private javax.swing.JPanel ivjPass1Panel = null; + /** Machine-generated. */ + private javax.swing.JPanel ivjPass2Panel = null; + /** Machine-generated. */ + private javax.swing.JPanel ivjPass3Panel = null; + /** Machine-generated. */ + private javax.swing.JButton ivjPass1Button = null; + /** Machine-generated. */ + private javax.swing.JButton ivjPass2Button = null; + /** Machine-generated. */ + private javax.swing.JButton ivjPass3Button = null; + /** Machine-generated. */ + IvjEventHandler ivjEventHandler = new IvjEventHandler(); + + /** + * The class to verify. Default set to 'java.lang.Object' + * in case this class is instantiated via one of the many + * machine-generated constructors. + */ + private String class_name = "java.lang.Object"; + + /** + * This field is here to count the number of open VerifyDialog + * instances so the JVM can be exited afer every Dialog had been + * closed. + */ + private static int classes_to_verify; + +/** Machine-generated. */ +class IvjEventHandler implements java.awt.event.ActionListener { + public void actionPerformed(java.awt.event.ActionEvent e) { + if (e.getSource() == VerifyDialog.this.getPass1Button()) + connEtoC1(e); + if (e.getSource() == VerifyDialog.this.getPass2Button()) + connEtoC2(e); + if (e.getSource() == VerifyDialog.this.getPass3Button()) + connEtoC3(e); + if (e.getSource() == VerifyDialog.this.getFlushButton()) + connEtoC4(e); + }; + }; + /** Machine-generated. */ + private javax.swing.JButton ivjFlushButton = null; +/** Machine-generated. */ +public VerifyDialog() { + super(); + initialize(); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Dialog owner) { + super(owner); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Dialog owner, String title) { + super(owner, title); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Dialog owner, String title, boolean modal) { + super(owner, title, modal); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Dialog owner, boolean modal) { + super(owner, modal); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Frame owner) { + super(owner); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Frame owner, String title) { + super(owner, title); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Frame owner, String title, boolean modal) { + super(owner, title, modal); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Frame owner, boolean modal) { + super(owner, modal); +} + +/** + * Use this constructor if you want a possibility to verify other + * class files than java.lang.Object. + * @param fully_qualified_class_name java.lang.String + */ +public VerifyDialog(String fully_qualified_class_name) { + super(); + + int dotclasspos = fully_qualified_class_name.lastIndexOf(".class"); + if (dotclasspos != -1) fully_qualified_class_name = fully_qualified_class_name.substring(0,dotclasspos); + fully_qualified_class_name = fully_qualified_class_name.replace('/', '.'); + + class_name = fully_qualified_class_name; + initialize(); +} + + +/** Machine-generated. */ +private void connEtoC1(java.awt.event.ActionEvent arg1) { + try { + // user code begin {1} + // user code end + this.pass1Button_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } +} + +/** Machine-generated. */ +private void connEtoC2(java.awt.event.ActionEvent arg1) { + try { + // user code begin {1} + // user code end + this.pass2Button_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } +} + +/** Machine-generated. */ +private void connEtoC3(java.awt.event.ActionEvent arg1) { + try { + // user code begin {1} + // user code end + this.pass4Button_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } +} + +/** Machine-generated. */ +private void connEtoC4(java.awt.event.ActionEvent arg1) { + try { + // user code begin {1} + // user code end + this.flushButton_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } +} + +/** Machine-generated. */ +public void flushButton_ActionPerformed(java.awt.event.ActionEvent actionEvent) { + VerifierFactory.getVerifier(class_name).flush(); + Repository.removeClass(class_name); // Make sure it will be reloaded. + getPass1Panel().setBackground(Color.gray); + getPass1Panel().repaint(); + getPass2Panel().setBackground(Color.gray); + getPass2Panel().repaint(); + getPass3Panel().setBackground(Color.gray); + getPass3Panel().repaint(); +} + +/** Machine-generated. */ +private javax.swing.JButton getFlushButton() { + if (ivjFlushButton == null) { + try { + ivjFlushButton = new javax.swing.JButton(); + ivjFlushButton.setName("FlushButton"); + ivjFlushButton.setText("Flush: Forget old verification results"); + ivjFlushButton.setBackground(java.awt.SystemColor.controlHighlight); + ivjFlushButton.setBounds(60, 215, 300, 30); + ivjFlushButton.setForeground(java.awt.Color.red); + ivjFlushButton.setActionCommand("FlushButton"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjFlushButton; +} + +/** Machine-generated. */ +private javax.swing.JPanel getJDialogContentPane() { + if (ivjJDialogContentPane == null) { + try { + ivjJDialogContentPane = new javax.swing.JPanel(); + ivjJDialogContentPane.setName("JDialogContentPane"); + ivjJDialogContentPane.setLayout(null); + getJDialogContentPane().add(getPass1Panel(), getPass1Panel().getName()); + getJDialogContentPane().add(getPass3Panel(), getPass3Panel().getName()); + getJDialogContentPane().add(getPass2Panel(), getPass2Panel().getName()); + getJDialogContentPane().add(getPass1Button(), getPass1Button().getName()); + getJDialogContentPane().add(getPass2Button(), getPass2Button().getName()); + getJDialogContentPane().add(getPass3Button(), getPass3Button().getName()); + getJDialogContentPane().add(getFlushButton(), getFlushButton().getName()); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjJDialogContentPane; +} + +/** Machine-generated. */ +private javax.swing.JButton getPass1Button() { + if (ivjPass1Button == null) { + try { + ivjPass1Button = new javax.swing.JButton(); + ivjPass1Button.setName("Pass1Button"); + ivjPass1Button.setText("Pass1: Verify binary layout of .class file"); + ivjPass1Button.setBackground(java.awt.SystemColor.controlHighlight); + ivjPass1Button.setBounds(100, 40, 300, 30); + ivjPass1Button.setActionCommand("Button1"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass1Button; +} + +/** Machine-generated. */ +private javax.swing.JPanel getPass1Panel() { + if (ivjPass1Panel == null) { + try { + ivjPass1Panel = new javax.swing.JPanel(); + ivjPass1Panel.setName("Pass1Panel"); + ivjPass1Panel.setLayout(null); + ivjPass1Panel.setBackground(java.awt.SystemColor.controlShadow); + ivjPass1Panel.setBounds(30, 30, 50, 50); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass1Panel; +} + +/** Machine-generated. */ +private javax.swing.JButton getPass2Button() { + if (ivjPass2Button == null) { + try { + ivjPass2Button = new javax.swing.JButton(); + ivjPass2Button.setName("Pass2Button"); + ivjPass2Button.setText("Pass 2: Verify static .class file constraints"); + ivjPass2Button.setBackground(java.awt.SystemColor.controlHighlight); + ivjPass2Button.setBounds(100, 100, 300, 30); + ivjPass2Button.setActionCommand("Button2"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass2Button; +} + +/** Machine-generated. */ +private javax.swing.JPanel getPass2Panel() { + if (ivjPass2Panel == null) { + try { + ivjPass2Panel = new javax.swing.JPanel(); + ivjPass2Panel.setName("Pass2Panel"); + ivjPass2Panel.setLayout(null); + ivjPass2Panel.setBackground(java.awt.SystemColor.controlShadow); + ivjPass2Panel.setBounds(30, 90, 50, 50); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass2Panel; +} + +/** Machine-generated. */ +private javax.swing.JButton getPass3Button() { + if (ivjPass3Button == null) { + try { + ivjPass3Button = new javax.swing.JButton(); + ivjPass3Button.setName("Pass3Button"); + ivjPass3Button.setText("Passes 3a+3b: Verify code arrays"); + ivjPass3Button.setBackground(java.awt.SystemColor.controlHighlight); + ivjPass3Button.setBounds(100, 160, 300, 30); + ivjPass3Button.setActionCommand("Button2"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass3Button; +} + +/** Machine-generated. */ +private javax.swing.JPanel getPass3Panel() { + if (ivjPass3Panel == null) { + try { + ivjPass3Panel = new javax.swing.JPanel(); + ivjPass3Panel.setName("Pass3Panel"); + ivjPass3Panel.setLayout(null); + ivjPass3Panel.setBackground(java.awt.SystemColor.controlShadow); + ivjPass3Panel.setBounds(30, 150, 50, 50); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass3Panel; +} + +/** Machine-generated. */ +private void handleException(java.lang.Throwable exception) { + + /* Uncomment the following lines to print uncaught exceptions to stdout */ + System.out.println("--------- UNCAUGHT EXCEPTION ---------"); + exception.printStackTrace(System.out); +} + + +/** Machine-generated. */ +private void initConnections() throws java.lang.Exception { + // user code begin {1} + // user code end + getPass1Button().addActionListener(ivjEventHandler); + getPass2Button().addActionListener(ivjEventHandler); + getPass3Button().addActionListener(ivjEventHandler); + getFlushButton().addActionListener(ivjEventHandler); +} + +/** Machine-generated. */ +private void initialize() { + try { + // user code begin {1} + // user code end + setName("VerifyDialog"); + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setSize(430, 280); + setVisible(true); + setModal(true); + setResizable(false); + setContentPane(getJDialogContentPane()); + initConnections(); + } catch (java.lang.Throwable ivjExc) { + handleException(ivjExc); + } + // user code begin {2} + setTitle("'"+class_name+"' verification - JustIce / BCEL"); + // user code end +} +/** + * Verifies one or more class files. + * Verification results are presented graphically: Red means 'rejected', + * green means 'passed' while yellow means 'could not be verified yet'. + * @param args java.lang.String[] fully qualified names of classes to verify. + */ +public static void main(java.lang.String[] args) { + classes_to_verify = args.length; + + for (int i=0; i<args.length; i++){ + + try { + VerifyDialog aVerifyDialog; + aVerifyDialog = new VerifyDialog(args[i]); + aVerifyDialog.setModal(true); + aVerifyDialog.addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent e) { + classes_to_verify--; + if (classes_to_verify == 0) System.exit(0); + }; + }); + aVerifyDialog.setVisible(true); + } catch (Throwable exception) { + System.err.println("Exception occurred in main() of javax.swing.JDialog"); + exception.printStackTrace(System.out); + } + + } +} + +/** Machine-generated. */ +public void pass1Button_ActionPerformed(java.awt.event.ActionEvent actionEvent) { + Verifier v = VerifierFactory.getVerifier(class_name); + VerificationResult vr = v.doPass1(); + if (vr.getStatus() == VerificationResult.VERIFIED_OK){ + getPass1Panel().setBackground(Color.green); + getPass1Panel().repaint(); + } + if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED){ + getPass1Panel().setBackground(Color.red); + getPass1Panel().repaint(); + } +} + +/** Machine-generated. */ +public void pass2Button_ActionPerformed(java.awt.event.ActionEvent actionEvent) { + pass1Button_ActionPerformed(actionEvent); + + Verifier v = VerifierFactory.getVerifier(class_name); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() == VerificationResult.VERIFIED_OK){ + getPass2Panel().setBackground(Color.green); + getPass2Panel().repaint(); + } + if (vr.getStatus() == VerificationResult.VERIFIED_NOTYET){ + getPass2Panel().setBackground(Color.yellow); + getPass2Panel().repaint(); + } + if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED){ + getPass2Panel().setBackground(Color.red); + getPass2Panel().repaint(); + } +} + +/** Machine-generated. */ +public void pass4Button_ActionPerformed(java.awt.event.ActionEvent actionEvent) { + + pass2Button_ActionPerformed(actionEvent); + + + Color color = Color.green; + + Verifier v = VerifierFactory.getVerifier(class_name); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() == VerificationResult.VERIFIED_OK){ + JavaClass jc = Repository.lookupClass(class_name); + int nr = jc.getMethods().length; + for (int i=0; i<nr; i++) { + vr = v.doPass3b(i); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + color = Color.red; + break; + } + } + } + else{ + color = Color.yellow; + } + + getPass3Panel().setBackground(color); + getPass3Panel().repaint(); +} +} |