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

This page was automatically generated by Maven