FindBugsViewerTask.java :  » Code-Analyzer » findbugs-1.3.9 » edu » umd » cs » findbugs » anttask » Java Open Source

Java Open Source » Code Analyzer » findbugs 1.3.9 
findbugs 1.3.9 » edu » umd » cs » findbugs » anttask » FindBugsViewerTask.java
/*
 * FindBugs - Find bugs in Java programs
 * Copyright (C) 2006 University of Maryland
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307, USA
 */

package edu.umd.cs.findbugs.anttask;


import java.io.File;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.Java;
import org.apache.tools.ant.taskdefs.Ant.Reference;
import org.apache.tools.ant.types.Path;

import edu.umd.cs.findbugs.ExitCodes;

/**
 * FindBugsViewerTask.java -- Ant Task to launch the FindBugsFrame
 * 
 * To use, create a new task that refrences the ant task
 * (such as "findbugs-viewer"). Then call this task while
 * passing in parameters to modify it's behaviour. It
 * supports several options that are the same as the
 * findbugs task:
 *
 * -projectFile
 * -debug
 * -jvmargs
 * -home
 * -classpath
 * -pluginList
 * -timeout
 *
 * It also adds some new options:
 *
 * -look: string name representing look and feel. Can be
 * "native", "plastic" or "gtk"
 * -loadbugs: file name of bug report to load
 *
 * The below is an example of how this could be done in an
 * ant script:
 *
 * <taskdef name="findbugs"
 * classname="edu.umd.cs.findbugs.anttask.FindBugsTask"
 * classpath="C:\dev\cvs.sourceforge.net\findbugs\lib\findbugs-ant.jar" />
 * <taskdef name="findbugs-viewer"
 * classname="edu.umd.cs.findbugs.anttask.FindBugsViewerTask"
 * classpath="C:\dev\cvs.sourceforge.net\findbugs\lib\findbugs-ant.jar" />
 *
 * <property name="findbugs.home"
 * location="C:\dev\cvs.sourceforge.net\findbugs" />
 * <property name="findbugs.bugReport"
 * location="bcel-fb.xml" />
 *
 * <target name="findbugs-viewer" depends="jar">
 * <findbugs-viewer home="${findbugs.home}"
 * look="native" loadbugs="${findbugs.bugReport}"/>
 * </target>
 *
 * Created on March 21, 2006, 12:57 PM
 * @author Mark McKay, mark@kitfox.com
 */
public class FindBugsViewerTask extends Task {

  private static final long DEFAULT_TIMEOUT = -1; // ten minutes

  //location to load bug report from
  private boolean debug = false;
  private File projectFile = null;
  private File loadbugs = null;
  private long timeout = DEFAULT_TIMEOUT;
  private String jvmargs = "";
  private String look = "native";
  private File homeDir = null;
  private Path classpath = null;
  private Path pluginList = null;

  private Java findbugsEngine = null;

  /** Creates a new instance of FindBugsViewerTask */
  public FindBugsViewerTask() {
  }

  /**
   * Sets the file that contains the XML output of a findbugs report.
   *
   * @param bugReport XML output from a findbugs session
   */
  public void setLoadbugs(File loadbugs)   {
    this.loadbugs = loadbugs;
  }

  /**
   * Set the project file
   */
  public void setProjectFile(File projectFile) {
    this.projectFile = projectFile;
  }

  /**
   * Set the debug flag
   */
  public void setDebug(boolean flag) {
    this.debug = flag;
  }

  /**
   * Set any specific jvm args
   */
  public void setJvmargs(String args) {
    this.jvmargs = args;
  }

  /**
   * Set look.  One of "native", "gtk" or "plastic"
   */
  public void setLook(String look) {
    this.look = look;
  }


  /**
   * Set the home directory into which findbugs was installed
   */
  public void setHome(File homeDir) {
    this.homeDir = homeDir;
  }


  /**
   * Path to use for classpath.
   */
  public Path createClasspath() {
    if (classpath == null) {
      classpath = new Path(getProject());
    }
    return classpath.createPath();
  }

  /**
   * Adds a reference to a classpath defined elsewhere.
   */
  public void setClasspathRef(Reference r) {
    createClasspath().setRefid(r);
  }


  /**
   * the plugin list to use.
   */
  public void setPluginList(Path src) {
    if (pluginList == null) {
      pluginList = src;
    }
    else {
      pluginList.append(src);
    }
  }

  /**
   * Path to use for plugin list.
   */
  public Path createPluginList() {
    if (pluginList == null) {
      pluginList = new Path(getProject());
    }
    return pluginList.createPath();
  }

  /**
   * Adds a reference to a plugin list defined elsewhere.
   */
  public void setPluginListRef(Reference r)   {
    createPluginList().setRefid(r);
  }

  /**
   * Set timeout in milliseconds.
   *
   * @param timeout the timeout
   */
  public void setTimeout(long timeout) {
    this.timeout = timeout;
  }

  /**
   * Add an argument to the JVM used to execute FindBugs.
   * @param arg the argument
   */
  private void addArg(String arg) {
    findbugsEngine.createArg().setValue(arg);
  }

  @Override
  public void execute() throws BuildException {
    findbugsEngine = (Java)getProject().createTask("java");

    findbugsEngine.setTaskName(getTaskName());
    findbugsEngine.setFork(true);

    if (timeout > 0) {
      findbugsEngine.setTimeout(timeout);
    }


    if (debug) {
      jvmargs = jvmargs + " -Dfindbugs.debug=true";
    }
    findbugsEngine.createJvmarg().setLine(jvmargs);

    if (homeDir != null) {
      // Use findbugs.home to locate findbugs.jar and the standard
      // plugins.  This is the usual means of initialization.
      File findbugsLib = new File(homeDir, "lib");
      
      File findbugsLibFindBugs = new File(findbugsLib, "findbugs.jar");
      File findBugsFindBugs =  new File(homeDir, "findbugs.jar");
      //log("executing using home dir [" + homeDir + "]");
      if (findbugsLibFindBugs.exists())
        findbugsEngine.setClasspath(new Path(getProject(), findbugsLibFindBugs.getPath()));
      else if (findBugsFindBugs.exists())
        findbugsEngine.setClasspath(new Path(getProject(), findBugsFindBugs.getPath()));
      else throw new IllegalArgumentException("Can't find findbugs.jar in " + homeDir);

      findbugsEngine.setClassname("edu.umd.cs.findbugs.LaunchAppropriateUI");
      findbugsEngine.createJvmarg().setValue("-Dfindbugs.home=" + homeDir.getPath());
    }
    else {
      // Use an explicitly specified classpath and list of plugin Jars
      // to initialize.  This is useful for other tools which may have
      // FindBugs installed using a non-standard directory layout.

      findbugsEngine.setClasspath(classpath);
      findbugsEngine.setClassname("edu.umd.cs.findbugs.LaunchAppropriateUI");

      addArg("-pluginList");
      addArg(pluginList.toString());
    }

    if (projectFile != null) {
      addArg("-project");
      addArg(projectFile.getPath());
    }

    if (loadbugs != null) {
      addArg("-loadbugs");
      addArg(loadbugs.getPath());
    }

    if (look != null) {
      addArg("-look:" + look);
      //addArg("-look");
      //addArg(look);
    }


    // findbugsEngine.setClassname("edu.umd.cs.findbugs.gui.FindBugsFrame");

    log("Launching FindBugs Viewer...");

    int rc = findbugsEngine.executeJava();

    if ((rc & ExitCodes.ERROR_FLAG) != 0) {
      throw new BuildException("Execution of findbugs failed.");
    }
    if ((rc & ExitCodes.MISSING_CLASS_FLAG) != 0)   {
      log("Classes needed for analysis were missing");
    }
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.