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